162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Universal Interface for Intel High Definition Audio Codec
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * HD audio interface patch for Realtek ALC codecs
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
862306a36Sopenharmony_ci *                    PeiSen Hou <pshou@realtek.com.tw>
962306a36Sopenharmony_ci *                    Takashi Iwai <tiwai@suse.de>
1062306a36Sopenharmony_ci *                    Jonathan Woithe <jwoithe@just42.net>
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/init.h>
1462306a36Sopenharmony_ci#include <linux/delay.h>
1562306a36Sopenharmony_ci#include <linux/slab.h>
1662306a36Sopenharmony_ci#include <linux/pci.h>
1762306a36Sopenharmony_ci#include <linux/dmi.h>
1862306a36Sopenharmony_ci#include <linux/module.h>
1962306a36Sopenharmony_ci#include <linux/input.h>
2062306a36Sopenharmony_ci#include <linux/leds.h>
2162306a36Sopenharmony_ci#include <linux/ctype.h>
2262306a36Sopenharmony_ci#include <sound/core.h>
2362306a36Sopenharmony_ci#include <sound/jack.h>
2462306a36Sopenharmony_ci#include <sound/hda_codec.h>
2562306a36Sopenharmony_ci#include "hda_local.h"
2662306a36Sopenharmony_ci#include "hda_auto_parser.h"
2762306a36Sopenharmony_ci#include "hda_jack.h"
2862306a36Sopenharmony_ci#include "hda_generic.h"
2962306a36Sopenharmony_ci#include "hda_component.h"
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* keep halting ALC5505 DSP, for power saving */
3262306a36Sopenharmony_ci#define HALT_REALTEK_ALC5505
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* extra amp-initialization sequence types */
3562306a36Sopenharmony_cienum {
3662306a36Sopenharmony_ci	ALC_INIT_UNDEFINED,
3762306a36Sopenharmony_ci	ALC_INIT_NONE,
3862306a36Sopenharmony_ci	ALC_INIT_DEFAULT,
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cienum {
4262306a36Sopenharmony_ci	ALC_HEADSET_MODE_UNKNOWN,
4362306a36Sopenharmony_ci	ALC_HEADSET_MODE_UNPLUGGED,
4462306a36Sopenharmony_ci	ALC_HEADSET_MODE_HEADSET,
4562306a36Sopenharmony_ci	ALC_HEADSET_MODE_MIC,
4662306a36Sopenharmony_ci	ALC_HEADSET_MODE_HEADPHONE,
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cienum {
5062306a36Sopenharmony_ci	ALC_HEADSET_TYPE_UNKNOWN,
5162306a36Sopenharmony_ci	ALC_HEADSET_TYPE_CTIA,
5262306a36Sopenharmony_ci	ALC_HEADSET_TYPE_OMTP,
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cienum {
5662306a36Sopenharmony_ci	ALC_KEY_MICMUTE_INDEX,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct alc_customize_define {
6062306a36Sopenharmony_ci	unsigned int  sku_cfg;
6162306a36Sopenharmony_ci	unsigned char port_connectivity;
6262306a36Sopenharmony_ci	unsigned char check_sum;
6362306a36Sopenharmony_ci	unsigned char customization;
6462306a36Sopenharmony_ci	unsigned char external_amp;
6562306a36Sopenharmony_ci	unsigned int  enable_pcbeep:1;
6662306a36Sopenharmony_ci	unsigned int  platform_type:1;
6762306a36Sopenharmony_ci	unsigned int  swap:1;
6862306a36Sopenharmony_ci	unsigned int  override:1;
6962306a36Sopenharmony_ci	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct alc_coef_led {
7362306a36Sopenharmony_ci	unsigned int idx;
7462306a36Sopenharmony_ci	unsigned int mask;
7562306a36Sopenharmony_ci	unsigned int on;
7662306a36Sopenharmony_ci	unsigned int off;
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct alc_spec {
8062306a36Sopenharmony_ci	struct hda_gen_spec gen; /* must be at head */
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	/* codec parameterization */
8362306a36Sopenharmony_ci	struct alc_customize_define cdefine;
8462306a36Sopenharmony_ci	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	/* GPIO bits */
8762306a36Sopenharmony_ci	unsigned int gpio_mask;
8862306a36Sopenharmony_ci	unsigned int gpio_dir;
8962306a36Sopenharmony_ci	unsigned int gpio_data;
9062306a36Sopenharmony_ci	bool gpio_write_delay;	/* add a delay before writing gpio_data */
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	/* mute LED for HP laptops, see vref_mute_led_set() */
9362306a36Sopenharmony_ci	int mute_led_polarity;
9462306a36Sopenharmony_ci	int micmute_led_polarity;
9562306a36Sopenharmony_ci	hda_nid_t mute_led_nid;
9662306a36Sopenharmony_ci	hda_nid_t cap_mute_led_nid;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	unsigned int gpio_mute_led_mask;
9962306a36Sopenharmony_ci	unsigned int gpio_mic_led_mask;
10062306a36Sopenharmony_ci	struct alc_coef_led mute_led_coef;
10162306a36Sopenharmony_ci	struct alc_coef_led mic_led_coef;
10262306a36Sopenharmony_ci	struct mutex coef_mutex;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	hda_nid_t headset_mic_pin;
10562306a36Sopenharmony_ci	hda_nid_t headphone_mic_pin;
10662306a36Sopenharmony_ci	int current_headset_mode;
10762306a36Sopenharmony_ci	int current_headset_type;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	/* hooks */
11062306a36Sopenharmony_ci	void (*init_hook)(struct hda_codec *codec);
11162306a36Sopenharmony_ci#ifdef CONFIG_PM
11262306a36Sopenharmony_ci	void (*power_hook)(struct hda_codec *codec);
11362306a36Sopenharmony_ci#endif
11462306a36Sopenharmony_ci	void (*shutup)(struct hda_codec *codec);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	int init_amp;
11762306a36Sopenharmony_ci	int codec_variant;	/* flag for other variants */
11862306a36Sopenharmony_ci	unsigned int has_alc5505_dsp:1;
11962306a36Sopenharmony_ci	unsigned int no_depop_delay:1;
12062306a36Sopenharmony_ci	unsigned int done_hp_init:1;
12162306a36Sopenharmony_ci	unsigned int no_shutup_pins:1;
12262306a36Sopenharmony_ci	unsigned int ultra_low_power:1;
12362306a36Sopenharmony_ci	unsigned int has_hs_key:1;
12462306a36Sopenharmony_ci	unsigned int no_internal_mic_pin:1;
12562306a36Sopenharmony_ci	unsigned int en_3kpull_low:1;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* for PLL fix */
12862306a36Sopenharmony_ci	hda_nid_t pll_nid;
12962306a36Sopenharmony_ci	unsigned int pll_coef_idx, pll_coef_bit;
13062306a36Sopenharmony_ci	unsigned int coef0;
13162306a36Sopenharmony_ci	struct input_dev *kb_dev;
13262306a36Sopenharmony_ci	u8 alc_mute_keycode_map[1];
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	/* component binding */
13562306a36Sopenharmony_ci	struct component_match *match;
13662306a36Sopenharmony_ci	struct hda_component comps[HDA_MAX_COMPONENTS];
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/*
14062306a36Sopenharmony_ci * COEF access helper functions
14162306a36Sopenharmony_ci */
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistatic void coef_mutex_lock(struct hda_codec *codec)
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	snd_hda_power_up_pm(codec);
14862306a36Sopenharmony_ci	mutex_lock(&spec->coef_mutex);
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistatic void coef_mutex_unlock(struct hda_codec *codec)
15262306a36Sopenharmony_ci{
15362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	mutex_unlock(&spec->coef_mutex);
15662306a36Sopenharmony_ci	snd_hda_power_down_pm(codec);
15762306a36Sopenharmony_ci}
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistatic int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
16062306a36Sopenharmony_ci				 unsigned int coef_idx)
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	unsigned int val;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
16562306a36Sopenharmony_ci	val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
16662306a36Sopenharmony_ci	return val;
16762306a36Sopenharmony_ci}
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistatic int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
17062306a36Sopenharmony_ci			       unsigned int coef_idx)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	unsigned int val;
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	coef_mutex_lock(codec);
17562306a36Sopenharmony_ci	val = __alc_read_coefex_idx(codec, nid, coef_idx);
17662306a36Sopenharmony_ci	coef_mutex_unlock(codec);
17762306a36Sopenharmony_ci	return val;
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci#define alc_read_coef_idx(codec, coef_idx) \
18162306a36Sopenharmony_ci	alc_read_coefex_idx(codec, 0x20, coef_idx)
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
18462306a36Sopenharmony_ci				   unsigned int coef_idx, unsigned int coef_val)
18562306a36Sopenharmony_ci{
18662306a36Sopenharmony_ci	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
18762306a36Sopenharmony_ci	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
18862306a36Sopenharmony_ci}
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistatic void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
19162306a36Sopenharmony_ci				 unsigned int coef_idx, unsigned int coef_val)
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	coef_mutex_lock(codec);
19462306a36Sopenharmony_ci	__alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
19562306a36Sopenharmony_ci	coef_mutex_unlock(codec);
19662306a36Sopenharmony_ci}
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci#define alc_write_coef_idx(codec, coef_idx, coef_val) \
19962306a36Sopenharmony_ci	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
20262306a36Sopenharmony_ci				    unsigned int coef_idx, unsigned int mask,
20362306a36Sopenharmony_ci				    unsigned int bits_set)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	if (val != -1)
20862306a36Sopenharmony_ci		__alc_write_coefex_idx(codec, nid, coef_idx,
20962306a36Sopenharmony_ci				       (val & ~mask) | bits_set);
21062306a36Sopenharmony_ci}
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistatic void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
21362306a36Sopenharmony_ci				  unsigned int coef_idx, unsigned int mask,
21462306a36Sopenharmony_ci				  unsigned int bits_set)
21562306a36Sopenharmony_ci{
21662306a36Sopenharmony_ci	coef_mutex_lock(codec);
21762306a36Sopenharmony_ci	__alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
21862306a36Sopenharmony_ci	coef_mutex_unlock(codec);
21962306a36Sopenharmony_ci}
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\
22262306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci/* a special bypass for COEF 0; read the cached value at the second time */
22562306a36Sopenharmony_cistatic unsigned int alc_get_coef0(struct hda_codec *codec)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	if (!spec->coef0)
23062306a36Sopenharmony_ci		spec->coef0 = alc_read_coef_idx(codec, 0);
23162306a36Sopenharmony_ci	return spec->coef0;
23262306a36Sopenharmony_ci}
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci/* coef writes/updates batch */
23562306a36Sopenharmony_cistruct coef_fw {
23662306a36Sopenharmony_ci	unsigned char nid;
23762306a36Sopenharmony_ci	unsigned char idx;
23862306a36Sopenharmony_ci	unsigned short mask;
23962306a36Sopenharmony_ci	unsigned short val;
24062306a36Sopenharmony_ci};
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
24362306a36Sopenharmony_ci	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
24462306a36Sopenharmony_ci#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
24562306a36Sopenharmony_ci#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
24662306a36Sopenharmony_ci#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic void alc_process_coef_fw(struct hda_codec *codec,
24962306a36Sopenharmony_ci				const struct coef_fw *fw)
25062306a36Sopenharmony_ci{
25162306a36Sopenharmony_ci	coef_mutex_lock(codec);
25262306a36Sopenharmony_ci	for (; fw->nid; fw++) {
25362306a36Sopenharmony_ci		if (fw->mask == (unsigned short)-1)
25462306a36Sopenharmony_ci			__alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
25562306a36Sopenharmony_ci		else
25662306a36Sopenharmony_ci			__alc_update_coefex_idx(codec, fw->nid, fw->idx,
25762306a36Sopenharmony_ci						fw->mask, fw->val);
25862306a36Sopenharmony_ci	}
25962306a36Sopenharmony_ci	coef_mutex_unlock(codec);
26062306a36Sopenharmony_ci}
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci/*
26362306a36Sopenharmony_ci * GPIO setup tables, used in initialization
26462306a36Sopenharmony_ci */
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci/* Enable GPIO mask and set output */
26762306a36Sopenharmony_cistatic void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
26862306a36Sopenharmony_ci{
26962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	spec->gpio_mask |= mask;
27262306a36Sopenharmony_ci	spec->gpio_dir |= mask;
27362306a36Sopenharmony_ci	spec->gpio_data |= mask;
27462306a36Sopenharmony_ci}
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cistatic void alc_write_gpio_data(struct hda_codec *codec)
27762306a36Sopenharmony_ci{
27862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
28162306a36Sopenharmony_ci			    spec->gpio_data);
28262306a36Sopenharmony_ci}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cistatic void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
28562306a36Sopenharmony_ci				 bool on)
28662306a36Sopenharmony_ci{
28762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
28862306a36Sopenharmony_ci	unsigned int oldval = spec->gpio_data;
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci	if (on)
29162306a36Sopenharmony_ci		spec->gpio_data |= mask;
29262306a36Sopenharmony_ci	else
29362306a36Sopenharmony_ci		spec->gpio_data &= ~mask;
29462306a36Sopenharmony_ci	if (oldval != spec->gpio_data)
29562306a36Sopenharmony_ci		alc_write_gpio_data(codec);
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic void alc_write_gpio(struct hda_codec *codec)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	if (!spec->gpio_mask)
30362306a36Sopenharmony_ci		return;
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	snd_hda_codec_write(codec, codec->core.afg, 0,
30662306a36Sopenharmony_ci			    AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
30762306a36Sopenharmony_ci	snd_hda_codec_write(codec, codec->core.afg, 0,
30862306a36Sopenharmony_ci			    AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
30962306a36Sopenharmony_ci	if (spec->gpio_write_delay)
31062306a36Sopenharmony_ci		msleep(1);
31162306a36Sopenharmony_ci	alc_write_gpio_data(codec);
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic void alc_fixup_gpio(struct hda_codec *codec, int action,
31562306a36Sopenharmony_ci			   unsigned int mask)
31662306a36Sopenharmony_ci{
31762306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
31862306a36Sopenharmony_ci		alc_setup_gpio(codec, mask);
31962306a36Sopenharmony_ci}
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistatic void alc_fixup_gpio1(struct hda_codec *codec,
32262306a36Sopenharmony_ci			    const struct hda_fixup *fix, int action)
32362306a36Sopenharmony_ci{
32462306a36Sopenharmony_ci	alc_fixup_gpio(codec, action, 0x01);
32562306a36Sopenharmony_ci}
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_cistatic void alc_fixup_gpio2(struct hda_codec *codec,
32862306a36Sopenharmony_ci			    const struct hda_fixup *fix, int action)
32962306a36Sopenharmony_ci{
33062306a36Sopenharmony_ci	alc_fixup_gpio(codec, action, 0x02);
33162306a36Sopenharmony_ci}
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_cistatic void alc_fixup_gpio3(struct hda_codec *codec,
33462306a36Sopenharmony_ci			    const struct hda_fixup *fix, int action)
33562306a36Sopenharmony_ci{
33662306a36Sopenharmony_ci	alc_fixup_gpio(codec, action, 0x03);
33762306a36Sopenharmony_ci}
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cistatic void alc_fixup_gpio4(struct hda_codec *codec,
34062306a36Sopenharmony_ci			    const struct hda_fixup *fix, int action)
34162306a36Sopenharmony_ci{
34262306a36Sopenharmony_ci	alc_fixup_gpio(codec, action, 0x04);
34362306a36Sopenharmony_ci}
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_cistatic void alc_fixup_micmute_led(struct hda_codec *codec,
34662306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
34762306a36Sopenharmony_ci{
34862306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
34962306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, NULL);
35062306a36Sopenharmony_ci}
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci/*
35362306a36Sopenharmony_ci * Fix hardware PLL issue
35462306a36Sopenharmony_ci * On some codecs, the analog PLL gating control must be off while
35562306a36Sopenharmony_ci * the default value is 1.
35662306a36Sopenharmony_ci */
35762306a36Sopenharmony_cistatic void alc_fix_pll(struct hda_codec *codec)
35862306a36Sopenharmony_ci{
35962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	if (spec->pll_nid)
36262306a36Sopenharmony_ci		alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
36362306a36Sopenharmony_ci				      1 << spec->pll_coef_bit, 0);
36462306a36Sopenharmony_ci}
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_cistatic void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
36762306a36Sopenharmony_ci			     unsigned int coef_idx, unsigned int coef_bit)
36862306a36Sopenharmony_ci{
36962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
37062306a36Sopenharmony_ci	spec->pll_nid = nid;
37162306a36Sopenharmony_ci	spec->pll_coef_idx = coef_idx;
37262306a36Sopenharmony_ci	spec->pll_coef_bit = coef_bit;
37362306a36Sopenharmony_ci	alc_fix_pll(codec);
37462306a36Sopenharmony_ci}
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci/* update the master volume per volume-knob's unsol event */
37762306a36Sopenharmony_cistatic void alc_update_knob_master(struct hda_codec *codec,
37862306a36Sopenharmony_ci				   struct hda_jack_callback *jack)
37962306a36Sopenharmony_ci{
38062306a36Sopenharmony_ci	unsigned int val;
38162306a36Sopenharmony_ci	struct snd_kcontrol *kctl;
38262306a36Sopenharmony_ci	struct snd_ctl_elem_value *uctl;
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci	kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
38562306a36Sopenharmony_ci	if (!kctl)
38662306a36Sopenharmony_ci		return;
38762306a36Sopenharmony_ci	uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
38862306a36Sopenharmony_ci	if (!uctl)
38962306a36Sopenharmony_ci		return;
39062306a36Sopenharmony_ci	val = snd_hda_codec_read(codec, jack->nid, 0,
39162306a36Sopenharmony_ci				 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
39262306a36Sopenharmony_ci	val &= HDA_AMP_VOLMASK;
39362306a36Sopenharmony_ci	uctl->value.integer.value[0] = val;
39462306a36Sopenharmony_ci	uctl->value.integer.value[1] = val;
39562306a36Sopenharmony_ci	kctl->put(kctl, uctl);
39662306a36Sopenharmony_ci	kfree(uctl);
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistatic void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
40062306a36Sopenharmony_ci{
40162306a36Sopenharmony_ci	/* For some reason, the res given from ALC880 is broken.
40262306a36Sopenharmony_ci	   Here we adjust it properly. */
40362306a36Sopenharmony_ci	snd_hda_jack_unsol_event(codec, res >> 2);
40462306a36Sopenharmony_ci}
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci/* Change EAPD to verb control */
40762306a36Sopenharmony_cistatic void alc_fill_eapd_coef(struct hda_codec *codec)
40862306a36Sopenharmony_ci{
40962306a36Sopenharmony_ci	int coef;
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci	coef = alc_get_coef0(codec);
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
41462306a36Sopenharmony_ci	case 0x10ec0262:
41562306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x7, 0, 1<<5);
41662306a36Sopenharmony_ci		break;
41762306a36Sopenharmony_ci	case 0x10ec0267:
41862306a36Sopenharmony_ci	case 0x10ec0268:
41962306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x7, 0, 1<<13);
42062306a36Sopenharmony_ci		break;
42162306a36Sopenharmony_ci	case 0x10ec0269:
42262306a36Sopenharmony_ci		if ((coef & 0x00f0) == 0x0010)
42362306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0xd, 0, 1<<14);
42462306a36Sopenharmony_ci		if ((coef & 0x00f0) == 0x0020)
42562306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x4, 1<<15, 0);
42662306a36Sopenharmony_ci		if ((coef & 0x00f0) == 0x0030)
42762306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x10, 1<<9, 0);
42862306a36Sopenharmony_ci		break;
42962306a36Sopenharmony_ci	case 0x10ec0280:
43062306a36Sopenharmony_ci	case 0x10ec0284:
43162306a36Sopenharmony_ci	case 0x10ec0290:
43262306a36Sopenharmony_ci	case 0x10ec0292:
43362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4, 1<<15, 0);
43462306a36Sopenharmony_ci		break;
43562306a36Sopenharmony_ci	case 0x10ec0225:
43662306a36Sopenharmony_ci	case 0x10ec0295:
43762306a36Sopenharmony_ci	case 0x10ec0299:
43862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
43962306a36Sopenharmony_ci		fallthrough;
44062306a36Sopenharmony_ci	case 0x10ec0215:
44162306a36Sopenharmony_ci	case 0x10ec0285:
44262306a36Sopenharmony_ci	case 0x10ec0289:
44362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x36, 1<<13, 0);
44462306a36Sopenharmony_ci		fallthrough;
44562306a36Sopenharmony_ci	case 0x10ec0230:
44662306a36Sopenharmony_ci	case 0x10ec0233:
44762306a36Sopenharmony_ci	case 0x10ec0235:
44862306a36Sopenharmony_ci	case 0x10ec0236:
44962306a36Sopenharmony_ci	case 0x10ec0245:
45062306a36Sopenharmony_ci	case 0x10ec0255:
45162306a36Sopenharmony_ci	case 0x10ec0256:
45262306a36Sopenharmony_ci	case 0x19e58326:
45362306a36Sopenharmony_ci	case 0x10ec0257:
45462306a36Sopenharmony_ci	case 0x10ec0282:
45562306a36Sopenharmony_ci	case 0x10ec0283:
45662306a36Sopenharmony_ci	case 0x10ec0286:
45762306a36Sopenharmony_ci	case 0x10ec0288:
45862306a36Sopenharmony_ci	case 0x10ec0298:
45962306a36Sopenharmony_ci	case 0x10ec0300:
46062306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
46162306a36Sopenharmony_ci		break;
46262306a36Sopenharmony_ci	case 0x10ec0275:
46362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0xe, 0, 1<<0);
46462306a36Sopenharmony_ci		break;
46562306a36Sopenharmony_ci	case 0x10ec0287:
46662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
46762306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x8, 0x4ab7);
46862306a36Sopenharmony_ci		break;
46962306a36Sopenharmony_ci	case 0x10ec0293:
47062306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0xa, 1<<13, 0);
47162306a36Sopenharmony_ci		break;
47262306a36Sopenharmony_ci	case 0x10ec0234:
47362306a36Sopenharmony_ci	case 0x10ec0274:
47462306a36Sopenharmony_ci	case 0x10ec0294:
47562306a36Sopenharmony_ci	case 0x10ec0700:
47662306a36Sopenharmony_ci	case 0x10ec0701:
47762306a36Sopenharmony_ci	case 0x10ec0703:
47862306a36Sopenharmony_ci	case 0x10ec0711:
47962306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x10, 1<<15, 0);
48062306a36Sopenharmony_ci		break;
48162306a36Sopenharmony_ci	case 0x10ec0662:
48262306a36Sopenharmony_ci		if ((coef & 0x00f0) == 0x0030)
48362306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
48462306a36Sopenharmony_ci		break;
48562306a36Sopenharmony_ci	case 0x10ec0272:
48662306a36Sopenharmony_ci	case 0x10ec0273:
48762306a36Sopenharmony_ci	case 0x10ec0663:
48862306a36Sopenharmony_ci	case 0x10ec0665:
48962306a36Sopenharmony_ci	case 0x10ec0670:
49062306a36Sopenharmony_ci	case 0x10ec0671:
49162306a36Sopenharmony_ci	case 0x10ec0672:
49262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
49362306a36Sopenharmony_ci		break;
49462306a36Sopenharmony_ci	case 0x10ec0222:
49562306a36Sopenharmony_ci	case 0x10ec0623:
49662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x19, 1<<13, 0);
49762306a36Sopenharmony_ci		break;
49862306a36Sopenharmony_ci	case 0x10ec0668:
49962306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x7, 3<<13, 0);
50062306a36Sopenharmony_ci		break;
50162306a36Sopenharmony_ci	case 0x10ec0867:
50262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4, 1<<10, 0);
50362306a36Sopenharmony_ci		break;
50462306a36Sopenharmony_ci	case 0x10ec0888:
50562306a36Sopenharmony_ci		if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
50662306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x7, 1<<5, 0);
50762306a36Sopenharmony_ci		break;
50862306a36Sopenharmony_ci	case 0x10ec0892:
50962306a36Sopenharmony_ci	case 0x10ec0897:
51062306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x7, 1<<5, 0);
51162306a36Sopenharmony_ci		break;
51262306a36Sopenharmony_ci	case 0x10ec0899:
51362306a36Sopenharmony_ci	case 0x10ec0900:
51462306a36Sopenharmony_ci	case 0x10ec0b00:
51562306a36Sopenharmony_ci	case 0x10ec1168:
51662306a36Sopenharmony_ci	case 0x10ec1220:
51762306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x7, 1<<1, 0);
51862306a36Sopenharmony_ci		break;
51962306a36Sopenharmony_ci	}
52062306a36Sopenharmony_ci}
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci/* additional initialization for ALC888 variants */
52362306a36Sopenharmony_cistatic void alc888_coef_init(struct hda_codec *codec)
52462306a36Sopenharmony_ci{
52562306a36Sopenharmony_ci	switch (alc_get_coef0(codec) & 0x00f0) {
52662306a36Sopenharmony_ci	/* alc888-VA */
52762306a36Sopenharmony_ci	case 0x00:
52862306a36Sopenharmony_ci	/* alc888-VB */
52962306a36Sopenharmony_ci	case 0x10:
53062306a36Sopenharmony_ci		alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
53162306a36Sopenharmony_ci		break;
53262306a36Sopenharmony_ci	}
53362306a36Sopenharmony_ci}
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci/* turn on/off EAPD control (only if available) */
53662306a36Sopenharmony_cistatic void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
53762306a36Sopenharmony_ci{
53862306a36Sopenharmony_ci	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
53962306a36Sopenharmony_ci		return;
54062306a36Sopenharmony_ci	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
54162306a36Sopenharmony_ci		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
54262306a36Sopenharmony_ci				    on ? 2 : 0);
54362306a36Sopenharmony_ci}
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci/* turn on/off EAPD controls of the codec */
54662306a36Sopenharmony_cistatic void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
54762306a36Sopenharmony_ci{
54862306a36Sopenharmony_ci	/* We currently only handle front, HP */
54962306a36Sopenharmony_ci	static const hda_nid_t pins[] = {
55062306a36Sopenharmony_ci		0x0f, 0x10, 0x14, 0x15, 0x17, 0
55162306a36Sopenharmony_ci	};
55262306a36Sopenharmony_ci	const hda_nid_t *p;
55362306a36Sopenharmony_ci	for (p = pins; *p; p++)
55462306a36Sopenharmony_ci		set_eapd(codec, *p, on);
55562306a36Sopenharmony_ci}
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_cistatic int find_ext_mic_pin(struct hda_codec *codec);
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_cistatic void alc_headset_mic_no_shutup(struct hda_codec *codec)
56062306a36Sopenharmony_ci{
56162306a36Sopenharmony_ci	const struct hda_pincfg *pin;
56262306a36Sopenharmony_ci	int mic_pin = find_ext_mic_pin(codec);
56362306a36Sopenharmony_ci	int i;
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_ci	/* don't shut up pins when unloading the driver; otherwise it breaks
56662306a36Sopenharmony_ci	 * the default pin setup at the next load of the driver
56762306a36Sopenharmony_ci	 */
56862306a36Sopenharmony_ci	if (codec->bus->shutdown)
56962306a36Sopenharmony_ci		return;
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	snd_array_for_each(&codec->init_pins, i, pin) {
57262306a36Sopenharmony_ci		/* use read here for syncing after issuing each verb */
57362306a36Sopenharmony_ci		if (pin->nid != mic_pin)
57462306a36Sopenharmony_ci			snd_hda_codec_read(codec, pin->nid, 0,
57562306a36Sopenharmony_ci					AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
57662306a36Sopenharmony_ci	}
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_ci	codec->pins_shutup = 1;
57962306a36Sopenharmony_ci}
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_cistatic void alc_shutup_pins(struct hda_codec *codec)
58262306a36Sopenharmony_ci{
58362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
58662306a36Sopenharmony_ci	case 0x10ec0236:
58762306a36Sopenharmony_ci	case 0x10ec0256:
58862306a36Sopenharmony_ci	case 0x19e58326:
58962306a36Sopenharmony_ci	case 0x10ec0283:
59062306a36Sopenharmony_ci	case 0x10ec0286:
59162306a36Sopenharmony_ci	case 0x10ec0288:
59262306a36Sopenharmony_ci	case 0x10ec0298:
59362306a36Sopenharmony_ci		alc_headset_mic_no_shutup(codec);
59462306a36Sopenharmony_ci		break;
59562306a36Sopenharmony_ci	default:
59662306a36Sopenharmony_ci		if (!spec->no_shutup_pins)
59762306a36Sopenharmony_ci			snd_hda_shutup_pins(codec);
59862306a36Sopenharmony_ci		break;
59962306a36Sopenharmony_ci	}
60062306a36Sopenharmony_ci}
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci/* generic shutup callback;
60362306a36Sopenharmony_ci * just turning off EAPD and a little pause for avoiding pop-noise
60462306a36Sopenharmony_ci */
60562306a36Sopenharmony_cistatic void alc_eapd_shutup(struct hda_codec *codec)
60662306a36Sopenharmony_ci{
60762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
61062306a36Sopenharmony_ci	if (!spec->no_depop_delay)
61162306a36Sopenharmony_ci		msleep(200);
61262306a36Sopenharmony_ci	alc_shutup_pins(codec);
61362306a36Sopenharmony_ci}
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci/* generic EAPD initialization */
61662306a36Sopenharmony_cistatic void alc_auto_init_amp(struct hda_codec *codec, int type)
61762306a36Sopenharmony_ci{
61862306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, true);
61962306a36Sopenharmony_ci	alc_write_gpio(codec);
62062306a36Sopenharmony_ci	switch (type) {
62162306a36Sopenharmony_ci	case ALC_INIT_DEFAULT:
62262306a36Sopenharmony_ci		switch (codec->core.vendor_id) {
62362306a36Sopenharmony_ci		case 0x10ec0260:
62462306a36Sopenharmony_ci			alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
62562306a36Sopenharmony_ci			break;
62662306a36Sopenharmony_ci		case 0x10ec0880:
62762306a36Sopenharmony_ci		case 0x10ec0882:
62862306a36Sopenharmony_ci		case 0x10ec0883:
62962306a36Sopenharmony_ci		case 0x10ec0885:
63062306a36Sopenharmony_ci			alc_update_coef_idx(codec, 7, 0, 0x2030);
63162306a36Sopenharmony_ci			break;
63262306a36Sopenharmony_ci		case 0x10ec0888:
63362306a36Sopenharmony_ci			alc888_coef_init(codec);
63462306a36Sopenharmony_ci			break;
63562306a36Sopenharmony_ci		}
63662306a36Sopenharmony_ci		break;
63762306a36Sopenharmony_ci	}
63862306a36Sopenharmony_ci}
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci/* get a primary headphone pin if available */
64162306a36Sopenharmony_cistatic hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
64262306a36Sopenharmony_ci{
64362306a36Sopenharmony_ci	if (spec->gen.autocfg.hp_pins[0])
64462306a36Sopenharmony_ci		return spec->gen.autocfg.hp_pins[0];
64562306a36Sopenharmony_ci	if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
64662306a36Sopenharmony_ci		return spec->gen.autocfg.line_out_pins[0];
64762306a36Sopenharmony_ci	return 0;
64862306a36Sopenharmony_ci}
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci/*
65162306a36Sopenharmony_ci * Realtek SSID verification
65262306a36Sopenharmony_ci */
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci/* Could be any non-zero and even value. When used as fixup, tells
65562306a36Sopenharmony_ci * the driver to ignore any present sku defines.
65662306a36Sopenharmony_ci */
65762306a36Sopenharmony_ci#define ALC_FIXUP_SKU_IGNORE (2)
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_cistatic void alc_fixup_sku_ignore(struct hda_codec *codec,
66062306a36Sopenharmony_ci				 const struct hda_fixup *fix, int action)
66162306a36Sopenharmony_ci{
66262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
66362306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
66462306a36Sopenharmony_ci		spec->cdefine.fixup = 1;
66562306a36Sopenharmony_ci		spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
66662306a36Sopenharmony_ci	}
66762306a36Sopenharmony_ci}
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_cistatic void alc_fixup_no_depop_delay(struct hda_codec *codec,
67062306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
67162306a36Sopenharmony_ci{
67262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PROBE) {
67562306a36Sopenharmony_ci		spec->no_depop_delay = 1;
67662306a36Sopenharmony_ci		codec->depop_delay = 0;
67762306a36Sopenharmony_ci	}
67862306a36Sopenharmony_ci}
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_cistatic int alc_auto_parse_customize_define(struct hda_codec *codec)
68162306a36Sopenharmony_ci{
68262306a36Sopenharmony_ci	unsigned int ass, tmp, i;
68362306a36Sopenharmony_ci	unsigned nid = 0;
68462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_ci	if (spec->cdefine.fixup) {
68962306a36Sopenharmony_ci		ass = spec->cdefine.sku_cfg;
69062306a36Sopenharmony_ci		if (ass == ALC_FIXUP_SKU_IGNORE)
69162306a36Sopenharmony_ci			return -1;
69262306a36Sopenharmony_ci		goto do_sku;
69362306a36Sopenharmony_ci	}
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci	if (!codec->bus->pci)
69662306a36Sopenharmony_ci		return -1;
69762306a36Sopenharmony_ci	ass = codec->core.subsystem_id & 0xffff;
69862306a36Sopenharmony_ci	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
69962306a36Sopenharmony_ci		goto do_sku;
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_ci	nid = 0x1d;
70262306a36Sopenharmony_ci	if (codec->core.vendor_id == 0x10ec0260)
70362306a36Sopenharmony_ci		nid = 0x17;
70462306a36Sopenharmony_ci	ass = snd_hda_codec_get_pincfg(codec, nid);
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	if (!(ass & 1)) {
70762306a36Sopenharmony_ci		codec_info(codec, "%s: SKU not ready 0x%08x\n",
70862306a36Sopenharmony_ci			   codec->core.chip_name, ass);
70962306a36Sopenharmony_ci		return -1;
71062306a36Sopenharmony_ci	}
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci	/* check sum */
71362306a36Sopenharmony_ci	tmp = 0;
71462306a36Sopenharmony_ci	for (i = 1; i < 16; i++) {
71562306a36Sopenharmony_ci		if ((ass >> i) & 1)
71662306a36Sopenharmony_ci			tmp++;
71762306a36Sopenharmony_ci	}
71862306a36Sopenharmony_ci	if (((ass >> 16) & 0xf) != tmp)
71962306a36Sopenharmony_ci		return -1;
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci	spec->cdefine.port_connectivity = ass >> 30;
72262306a36Sopenharmony_ci	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
72362306a36Sopenharmony_ci	spec->cdefine.check_sum = (ass >> 16) & 0xf;
72462306a36Sopenharmony_ci	spec->cdefine.customization = ass >> 8;
72562306a36Sopenharmony_cido_sku:
72662306a36Sopenharmony_ci	spec->cdefine.sku_cfg = ass;
72762306a36Sopenharmony_ci	spec->cdefine.external_amp = (ass & 0x38) >> 3;
72862306a36Sopenharmony_ci	spec->cdefine.platform_type = (ass & 0x4) >> 2;
72962306a36Sopenharmony_ci	spec->cdefine.swap = (ass & 0x2) >> 1;
73062306a36Sopenharmony_ci	spec->cdefine.override = ass & 0x1;
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_ci	codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
73362306a36Sopenharmony_ci		   nid, spec->cdefine.sku_cfg);
73462306a36Sopenharmony_ci	codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
73562306a36Sopenharmony_ci		   spec->cdefine.port_connectivity);
73662306a36Sopenharmony_ci	codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
73762306a36Sopenharmony_ci	codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
73862306a36Sopenharmony_ci	codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
73962306a36Sopenharmony_ci	codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
74062306a36Sopenharmony_ci	codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
74162306a36Sopenharmony_ci	codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
74262306a36Sopenharmony_ci	codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci	return 0;
74562306a36Sopenharmony_ci}
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci/* return the position of NID in the list, or -1 if not found */
74862306a36Sopenharmony_cistatic int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
74962306a36Sopenharmony_ci{
75062306a36Sopenharmony_ci	int i;
75162306a36Sopenharmony_ci	for (i = 0; i < nums; i++)
75262306a36Sopenharmony_ci		if (list[i] == nid)
75362306a36Sopenharmony_ci			return i;
75462306a36Sopenharmony_ci	return -1;
75562306a36Sopenharmony_ci}
75662306a36Sopenharmony_ci/* return true if the given NID is found in the list */
75762306a36Sopenharmony_cistatic bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
75862306a36Sopenharmony_ci{
75962306a36Sopenharmony_ci	return find_idx_in_nid_list(nid, list, nums) >= 0;
76062306a36Sopenharmony_ci}
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_ci/* check subsystem ID and set up device-specific initialization;
76362306a36Sopenharmony_ci * return 1 if initialized, 0 if invalid SSID
76462306a36Sopenharmony_ci */
76562306a36Sopenharmony_ci/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
76662306a36Sopenharmony_ci *	31 ~ 16 :	Manufacture ID
76762306a36Sopenharmony_ci *	15 ~ 8	:	SKU ID
76862306a36Sopenharmony_ci *	7  ~ 0	:	Assembly ID
76962306a36Sopenharmony_ci *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
77062306a36Sopenharmony_ci */
77162306a36Sopenharmony_cistatic int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
77262306a36Sopenharmony_ci{
77362306a36Sopenharmony_ci	unsigned int ass, tmp, i;
77462306a36Sopenharmony_ci	unsigned nid;
77562306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci	if (spec->cdefine.fixup) {
77862306a36Sopenharmony_ci		ass = spec->cdefine.sku_cfg;
77962306a36Sopenharmony_ci		if (ass == ALC_FIXUP_SKU_IGNORE)
78062306a36Sopenharmony_ci			return 0;
78162306a36Sopenharmony_ci		goto do_sku;
78262306a36Sopenharmony_ci	}
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci	ass = codec->core.subsystem_id & 0xffff;
78562306a36Sopenharmony_ci	if (codec->bus->pci &&
78662306a36Sopenharmony_ci	    ass != codec->bus->pci->subsystem_device && (ass & 1))
78762306a36Sopenharmony_ci		goto do_sku;
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci	/* invalid SSID, check the special NID pin defcfg instead */
79062306a36Sopenharmony_ci	/*
79162306a36Sopenharmony_ci	 * 31~30	: port connectivity
79262306a36Sopenharmony_ci	 * 29~21	: reserve
79362306a36Sopenharmony_ci	 * 20		: PCBEEP input
79462306a36Sopenharmony_ci	 * 19~16	: Check sum (15:1)
79562306a36Sopenharmony_ci	 * 15~1		: Custom
79662306a36Sopenharmony_ci	 * 0		: override
79762306a36Sopenharmony_ci	*/
79862306a36Sopenharmony_ci	nid = 0x1d;
79962306a36Sopenharmony_ci	if (codec->core.vendor_id == 0x10ec0260)
80062306a36Sopenharmony_ci		nid = 0x17;
80162306a36Sopenharmony_ci	ass = snd_hda_codec_get_pincfg(codec, nid);
80262306a36Sopenharmony_ci	codec_dbg(codec,
80362306a36Sopenharmony_ci		  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
80462306a36Sopenharmony_ci		   ass, nid);
80562306a36Sopenharmony_ci	if (!(ass & 1))
80662306a36Sopenharmony_ci		return 0;
80762306a36Sopenharmony_ci	if ((ass >> 30) != 1)	/* no physical connection */
80862306a36Sopenharmony_ci		return 0;
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	/* check sum */
81162306a36Sopenharmony_ci	tmp = 0;
81262306a36Sopenharmony_ci	for (i = 1; i < 16; i++) {
81362306a36Sopenharmony_ci		if ((ass >> i) & 1)
81462306a36Sopenharmony_ci			tmp++;
81562306a36Sopenharmony_ci	}
81662306a36Sopenharmony_ci	if (((ass >> 16) & 0xf) != tmp)
81762306a36Sopenharmony_ci		return 0;
81862306a36Sopenharmony_cido_sku:
81962306a36Sopenharmony_ci	codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
82062306a36Sopenharmony_ci		   ass & 0xffff, codec->core.vendor_id);
82162306a36Sopenharmony_ci	/*
82262306a36Sopenharmony_ci	 * 0 : override
82362306a36Sopenharmony_ci	 * 1 :	Swap Jack
82462306a36Sopenharmony_ci	 * 2 : 0 --> Desktop, 1 --> Laptop
82562306a36Sopenharmony_ci	 * 3~5 : External Amplifier control
82662306a36Sopenharmony_ci	 * 7~6 : Reserved
82762306a36Sopenharmony_ci	*/
82862306a36Sopenharmony_ci	tmp = (ass & 0x38) >> 3;	/* external Amp control */
82962306a36Sopenharmony_ci	if (spec->init_amp == ALC_INIT_UNDEFINED) {
83062306a36Sopenharmony_ci		switch (tmp) {
83162306a36Sopenharmony_ci		case 1:
83262306a36Sopenharmony_ci			alc_setup_gpio(codec, 0x01);
83362306a36Sopenharmony_ci			break;
83462306a36Sopenharmony_ci		case 3:
83562306a36Sopenharmony_ci			alc_setup_gpio(codec, 0x02);
83662306a36Sopenharmony_ci			break;
83762306a36Sopenharmony_ci		case 7:
83862306a36Sopenharmony_ci			alc_setup_gpio(codec, 0x04);
83962306a36Sopenharmony_ci			break;
84062306a36Sopenharmony_ci		case 5:
84162306a36Sopenharmony_ci		default:
84262306a36Sopenharmony_ci			spec->init_amp = ALC_INIT_DEFAULT;
84362306a36Sopenharmony_ci			break;
84462306a36Sopenharmony_ci		}
84562306a36Sopenharmony_ci	}
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci	/* is laptop or Desktop and enable the function "Mute internal speaker
84862306a36Sopenharmony_ci	 * when the external headphone out jack is plugged"
84962306a36Sopenharmony_ci	 */
85062306a36Sopenharmony_ci	if (!(ass & 0x8000))
85162306a36Sopenharmony_ci		return 1;
85262306a36Sopenharmony_ci	/*
85362306a36Sopenharmony_ci	 * 10~8 : Jack location
85462306a36Sopenharmony_ci	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
85562306a36Sopenharmony_ci	 * 14~13: Resvered
85662306a36Sopenharmony_ci	 * 15   : 1 --> enable the function "Mute internal speaker
85762306a36Sopenharmony_ci	 *	        when the external headphone out jack is plugged"
85862306a36Sopenharmony_ci	 */
85962306a36Sopenharmony_ci	if (!alc_get_hp_pin(spec)) {
86062306a36Sopenharmony_ci		hda_nid_t nid;
86162306a36Sopenharmony_ci		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
86262306a36Sopenharmony_ci		nid = ports[tmp];
86362306a36Sopenharmony_ci		if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
86462306a36Sopenharmony_ci				      spec->gen.autocfg.line_outs))
86562306a36Sopenharmony_ci			return 1;
86662306a36Sopenharmony_ci		spec->gen.autocfg.hp_pins[0] = nid;
86762306a36Sopenharmony_ci	}
86862306a36Sopenharmony_ci	return 1;
86962306a36Sopenharmony_ci}
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci/* Check the validity of ALC subsystem-id
87262306a36Sopenharmony_ci * ports contains an array of 4 pin NIDs for port-A, E, D and I */
87362306a36Sopenharmony_cistatic void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
87462306a36Sopenharmony_ci{
87562306a36Sopenharmony_ci	if (!alc_subsystem_id(codec, ports)) {
87662306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
87762306a36Sopenharmony_ci		if (spec->init_amp == ALC_INIT_UNDEFINED) {
87862306a36Sopenharmony_ci			codec_dbg(codec,
87962306a36Sopenharmony_ci				  "realtek: Enable default setup for auto mode as fallback\n");
88062306a36Sopenharmony_ci			spec->init_amp = ALC_INIT_DEFAULT;
88162306a36Sopenharmony_ci		}
88262306a36Sopenharmony_ci	}
88362306a36Sopenharmony_ci}
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci/*
88662306a36Sopenharmony_ci */
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_cistatic void alc_fixup_inv_dmic(struct hda_codec *codec,
88962306a36Sopenharmony_ci			       const struct hda_fixup *fix, int action)
89062306a36Sopenharmony_ci{
89162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci	spec->gen.inv_dmic_split = 1;
89462306a36Sopenharmony_ci}
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_cistatic int alc_build_controls(struct hda_codec *codec)
89862306a36Sopenharmony_ci{
89962306a36Sopenharmony_ci	int err;
90062306a36Sopenharmony_ci
90162306a36Sopenharmony_ci	err = snd_hda_gen_build_controls(codec);
90262306a36Sopenharmony_ci	if (err < 0)
90362306a36Sopenharmony_ci		return err;
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
90662306a36Sopenharmony_ci	return 0;
90762306a36Sopenharmony_ci}
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci/*
91162306a36Sopenharmony_ci * Common callbacks
91262306a36Sopenharmony_ci */
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_cistatic void alc_pre_init(struct hda_codec *codec)
91562306a36Sopenharmony_ci{
91662306a36Sopenharmony_ci	alc_fill_eapd_coef(codec);
91762306a36Sopenharmony_ci}
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci#define is_s3_resume(codec) \
92062306a36Sopenharmony_ci	((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
92162306a36Sopenharmony_ci#define is_s4_resume(codec) \
92262306a36Sopenharmony_ci	((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_cistatic int alc_init(struct hda_codec *codec)
92562306a36Sopenharmony_ci{
92662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	/* hibernation resume needs the full chip initialization */
92962306a36Sopenharmony_ci	if (is_s4_resume(codec))
93062306a36Sopenharmony_ci		alc_pre_init(codec);
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	if (spec->init_hook)
93362306a36Sopenharmony_ci		spec->init_hook(codec);
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	spec->gen.skip_verbs = 1; /* applied in below */
93662306a36Sopenharmony_ci	snd_hda_gen_init(codec);
93762306a36Sopenharmony_ci	alc_fix_pll(codec);
93862306a36Sopenharmony_ci	alc_auto_init_amp(codec, spec->init_amp);
93962306a36Sopenharmony_ci	snd_hda_apply_verbs(codec); /* apply verbs here after own init */
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci	return 0;
94462306a36Sopenharmony_ci}
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_ci#define alc_free	snd_hda_gen_free
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_ci#ifdef CONFIG_PM
94962306a36Sopenharmony_cistatic inline void alc_shutup(struct hda_codec *codec)
95062306a36Sopenharmony_ci{
95162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci	if (!snd_hda_get_bool_hint(codec, "shutup"))
95462306a36Sopenharmony_ci		return; /* disabled explicitly by hints */
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci	if (spec && spec->shutup)
95762306a36Sopenharmony_ci		spec->shutup(codec);
95862306a36Sopenharmony_ci	else
95962306a36Sopenharmony_ci		alc_shutup_pins(codec);
96062306a36Sopenharmony_ci}
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_cistatic void alc_power_eapd(struct hda_codec *codec)
96362306a36Sopenharmony_ci{
96462306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
96562306a36Sopenharmony_ci}
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_cistatic int alc_suspend(struct hda_codec *codec)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
97062306a36Sopenharmony_ci	alc_shutup(codec);
97162306a36Sopenharmony_ci	if (spec && spec->power_hook)
97262306a36Sopenharmony_ci		spec->power_hook(codec);
97362306a36Sopenharmony_ci	return 0;
97462306a36Sopenharmony_ci}
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic int alc_resume(struct hda_codec *codec)
97762306a36Sopenharmony_ci{
97862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci	if (!spec->no_depop_delay)
98162306a36Sopenharmony_ci		msleep(150); /* to avoid pop noise */
98262306a36Sopenharmony_ci	codec->patch_ops.init(codec);
98362306a36Sopenharmony_ci	snd_hda_regmap_sync(codec);
98462306a36Sopenharmony_ci	hda_call_check_power_status(codec, 0x01);
98562306a36Sopenharmony_ci	return 0;
98662306a36Sopenharmony_ci}
98762306a36Sopenharmony_ci#endif
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_ci/*
99062306a36Sopenharmony_ci */
99162306a36Sopenharmony_cistatic const struct hda_codec_ops alc_patch_ops = {
99262306a36Sopenharmony_ci	.build_controls = alc_build_controls,
99362306a36Sopenharmony_ci	.build_pcms = snd_hda_gen_build_pcms,
99462306a36Sopenharmony_ci	.init = alc_init,
99562306a36Sopenharmony_ci	.free = alc_free,
99662306a36Sopenharmony_ci	.unsol_event = snd_hda_jack_unsol_event,
99762306a36Sopenharmony_ci#ifdef CONFIG_PM
99862306a36Sopenharmony_ci	.resume = alc_resume,
99962306a36Sopenharmony_ci	.suspend = alc_suspend,
100062306a36Sopenharmony_ci	.check_power_status = snd_hda_gen_check_power_status,
100162306a36Sopenharmony_ci#endif
100262306a36Sopenharmony_ci};
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci/*
100862306a36Sopenharmony_ci * Rename codecs appropriately from COEF value or subvendor id
100962306a36Sopenharmony_ci */
101062306a36Sopenharmony_cistruct alc_codec_rename_table {
101162306a36Sopenharmony_ci	unsigned int vendor_id;
101262306a36Sopenharmony_ci	unsigned short coef_mask;
101362306a36Sopenharmony_ci	unsigned short coef_bits;
101462306a36Sopenharmony_ci	const char *name;
101562306a36Sopenharmony_ci};
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_cistruct alc_codec_rename_pci_table {
101862306a36Sopenharmony_ci	unsigned int codec_vendor_id;
101962306a36Sopenharmony_ci	unsigned short pci_subvendor;
102062306a36Sopenharmony_ci	unsigned short pci_subdevice;
102162306a36Sopenharmony_ci	const char *name;
102262306a36Sopenharmony_ci};
102362306a36Sopenharmony_ci
102462306a36Sopenharmony_cistatic const struct alc_codec_rename_table rename_tbl[] = {
102562306a36Sopenharmony_ci	{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
102662306a36Sopenharmony_ci	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
102762306a36Sopenharmony_ci	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
102862306a36Sopenharmony_ci	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
102962306a36Sopenharmony_ci	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
103062306a36Sopenharmony_ci	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },
103162306a36Sopenharmony_ci	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
103262306a36Sopenharmony_ci	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
103362306a36Sopenharmony_ci	{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
103462306a36Sopenharmony_ci	{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },
103562306a36Sopenharmony_ci	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
103662306a36Sopenharmony_ci	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
103762306a36Sopenharmony_ci	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
103862306a36Sopenharmony_ci	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },
103962306a36Sopenharmony_ci	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },
104062306a36Sopenharmony_ci	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },
104162306a36Sopenharmony_ci	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },
104262306a36Sopenharmony_ci	{ } /* terminator */
104362306a36Sopenharmony_ci};
104462306a36Sopenharmony_ci
104562306a36Sopenharmony_cistatic const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
104662306a36Sopenharmony_ci	{ 0x10ec0280, 0x1028, 0, "ALC3220" },
104762306a36Sopenharmony_ci	{ 0x10ec0282, 0x1028, 0, "ALC3221" },
104862306a36Sopenharmony_ci	{ 0x10ec0283, 0x1028, 0, "ALC3223" },
104962306a36Sopenharmony_ci	{ 0x10ec0288, 0x1028, 0, "ALC3263" },
105062306a36Sopenharmony_ci	{ 0x10ec0292, 0x1028, 0, "ALC3226" },
105162306a36Sopenharmony_ci	{ 0x10ec0293, 0x1028, 0, "ALC3235" },
105262306a36Sopenharmony_ci	{ 0x10ec0255, 0x1028, 0, "ALC3234" },
105362306a36Sopenharmony_ci	{ 0x10ec0668, 0x1028, 0, "ALC3661" },
105462306a36Sopenharmony_ci	{ 0x10ec0275, 0x1028, 0, "ALC3260" },
105562306a36Sopenharmony_ci	{ 0x10ec0899, 0x1028, 0, "ALC3861" },
105662306a36Sopenharmony_ci	{ 0x10ec0298, 0x1028, 0, "ALC3266" },
105762306a36Sopenharmony_ci	{ 0x10ec0236, 0x1028, 0, "ALC3204" },
105862306a36Sopenharmony_ci	{ 0x10ec0256, 0x1028, 0, "ALC3246" },
105962306a36Sopenharmony_ci	{ 0x10ec0225, 0x1028, 0, "ALC3253" },
106062306a36Sopenharmony_ci	{ 0x10ec0295, 0x1028, 0, "ALC3254" },
106162306a36Sopenharmony_ci	{ 0x10ec0299, 0x1028, 0, "ALC3271" },
106262306a36Sopenharmony_ci	{ 0x10ec0670, 0x1025, 0, "ALC669X" },
106362306a36Sopenharmony_ci	{ 0x10ec0676, 0x1025, 0, "ALC679X" },
106462306a36Sopenharmony_ci	{ 0x10ec0282, 0x1043, 0, "ALC3229" },
106562306a36Sopenharmony_ci	{ 0x10ec0233, 0x1043, 0, "ALC3236" },
106662306a36Sopenharmony_ci	{ 0x10ec0280, 0x103c, 0, "ALC3228" },
106762306a36Sopenharmony_ci	{ 0x10ec0282, 0x103c, 0, "ALC3227" },
106862306a36Sopenharmony_ci	{ 0x10ec0286, 0x103c, 0, "ALC3242" },
106962306a36Sopenharmony_ci	{ 0x10ec0290, 0x103c, 0, "ALC3241" },
107062306a36Sopenharmony_ci	{ 0x10ec0668, 0x103c, 0, "ALC3662" },
107162306a36Sopenharmony_ci	{ 0x10ec0283, 0x17aa, 0, "ALC3239" },
107262306a36Sopenharmony_ci	{ 0x10ec0292, 0x17aa, 0, "ALC3232" },
107362306a36Sopenharmony_ci	{ } /* terminator */
107462306a36Sopenharmony_ci};
107562306a36Sopenharmony_ci
107662306a36Sopenharmony_cistatic int alc_codec_rename_from_preset(struct hda_codec *codec)
107762306a36Sopenharmony_ci{
107862306a36Sopenharmony_ci	const struct alc_codec_rename_table *p;
107962306a36Sopenharmony_ci	const struct alc_codec_rename_pci_table *q;
108062306a36Sopenharmony_ci
108162306a36Sopenharmony_ci	for (p = rename_tbl; p->vendor_id; p++) {
108262306a36Sopenharmony_ci		if (p->vendor_id != codec->core.vendor_id)
108362306a36Sopenharmony_ci			continue;
108462306a36Sopenharmony_ci		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
108562306a36Sopenharmony_ci			return alc_codec_rename(codec, p->name);
108662306a36Sopenharmony_ci	}
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_ci	if (!codec->bus->pci)
108962306a36Sopenharmony_ci		return 0;
109062306a36Sopenharmony_ci	for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
109162306a36Sopenharmony_ci		if (q->codec_vendor_id != codec->core.vendor_id)
109262306a36Sopenharmony_ci			continue;
109362306a36Sopenharmony_ci		if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
109462306a36Sopenharmony_ci			continue;
109562306a36Sopenharmony_ci		if (!q->pci_subdevice ||
109662306a36Sopenharmony_ci		    q->pci_subdevice == codec->bus->pci->subsystem_device)
109762306a36Sopenharmony_ci			return alc_codec_rename(codec, q->name);
109862306a36Sopenharmony_ci	}
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	return 0;
110162306a36Sopenharmony_ci}
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci
110462306a36Sopenharmony_ci/*
110562306a36Sopenharmony_ci * Digital-beep handlers
110662306a36Sopenharmony_ci */
110762306a36Sopenharmony_ci#ifdef CONFIG_SND_HDA_INPUT_BEEP
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci/* additional beep mixers; private_value will be overwritten */
111062306a36Sopenharmony_cistatic const struct snd_kcontrol_new alc_beep_mixer[] = {
111162306a36Sopenharmony_ci	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
111262306a36Sopenharmony_ci	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
111362306a36Sopenharmony_ci};
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci/* set up and create beep controls */
111662306a36Sopenharmony_cistatic int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
111762306a36Sopenharmony_ci			int idx, int dir)
111862306a36Sopenharmony_ci{
111962306a36Sopenharmony_ci	struct snd_kcontrol_new *knew;
112062306a36Sopenharmony_ci	unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
112162306a36Sopenharmony_ci	int i;
112262306a36Sopenharmony_ci
112362306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
112462306a36Sopenharmony_ci		knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
112562306a36Sopenharmony_ci					    &alc_beep_mixer[i]);
112662306a36Sopenharmony_ci		if (!knew)
112762306a36Sopenharmony_ci			return -ENOMEM;
112862306a36Sopenharmony_ci		knew->private_value = beep_amp;
112962306a36Sopenharmony_ci	}
113062306a36Sopenharmony_ci	return 0;
113162306a36Sopenharmony_ci}
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_cistatic const struct snd_pci_quirk beep_allow_list[] = {
113462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
113562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
113662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
113762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
113862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
113962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
114062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
114162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
114262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
114362306a36Sopenharmony_ci	/* denylist -- no beep available */
114462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
114562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
114662306a36Sopenharmony_ci	{}
114762306a36Sopenharmony_ci};
114862306a36Sopenharmony_ci
114962306a36Sopenharmony_cistatic inline int has_cdefine_beep(struct hda_codec *codec)
115062306a36Sopenharmony_ci{
115162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
115262306a36Sopenharmony_ci	const struct snd_pci_quirk *q;
115362306a36Sopenharmony_ci	q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
115462306a36Sopenharmony_ci	if (q)
115562306a36Sopenharmony_ci		return q->value;
115662306a36Sopenharmony_ci	return spec->cdefine.enable_pcbeep;
115762306a36Sopenharmony_ci}
115862306a36Sopenharmony_ci#else
115962306a36Sopenharmony_ci#define set_beep_amp(spec, nid, idx, dir)	0
116062306a36Sopenharmony_ci#define has_cdefine_beep(codec)		0
116162306a36Sopenharmony_ci#endif
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci/* parse the BIOS configuration and set up the alc_spec */
116462306a36Sopenharmony_ci/* return 1 if successful, 0 if the proper config is not found,
116562306a36Sopenharmony_ci * or a negative error code
116662306a36Sopenharmony_ci */
116762306a36Sopenharmony_cistatic int alc_parse_auto_config(struct hda_codec *codec,
116862306a36Sopenharmony_ci				 const hda_nid_t *ignore_nids,
116962306a36Sopenharmony_ci				 const hda_nid_t *ssid_nids)
117062306a36Sopenharmony_ci{
117162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
117262306a36Sopenharmony_ci	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
117362306a36Sopenharmony_ci	int err;
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_ci	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
117662306a36Sopenharmony_ci				       spec->parse_flags);
117762306a36Sopenharmony_ci	if (err < 0)
117862306a36Sopenharmony_ci		return err;
117962306a36Sopenharmony_ci
118062306a36Sopenharmony_ci	if (ssid_nids)
118162306a36Sopenharmony_ci		alc_ssid_check(codec, ssid_nids);
118262306a36Sopenharmony_ci
118362306a36Sopenharmony_ci	err = snd_hda_gen_parse_auto_config(codec, cfg);
118462306a36Sopenharmony_ci	if (err < 0)
118562306a36Sopenharmony_ci		return err;
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	return 1;
118862306a36Sopenharmony_ci}
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci/* common preparation job for alc_spec */
119162306a36Sopenharmony_cistatic int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
119262306a36Sopenharmony_ci{
119362306a36Sopenharmony_ci	struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
119462306a36Sopenharmony_ci	int err;
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci	if (!spec)
119762306a36Sopenharmony_ci		return -ENOMEM;
119862306a36Sopenharmony_ci	codec->spec = spec;
119962306a36Sopenharmony_ci	snd_hda_gen_spec_init(&spec->gen);
120062306a36Sopenharmony_ci	spec->gen.mixer_nid = mixer_nid;
120162306a36Sopenharmony_ci	spec->gen.own_eapd_ctl = 1;
120262306a36Sopenharmony_ci	codec->single_adc_amp = 1;
120362306a36Sopenharmony_ci	/* FIXME: do we need this for all Realtek codec models? */
120462306a36Sopenharmony_ci	codec->spdif_status_reset = 1;
120562306a36Sopenharmony_ci	codec->forced_resume = 1;
120662306a36Sopenharmony_ci	codec->patch_ops = alc_patch_ops;
120762306a36Sopenharmony_ci	mutex_init(&spec->coef_mutex);
120862306a36Sopenharmony_ci
120962306a36Sopenharmony_ci	err = alc_codec_rename_from_preset(codec);
121062306a36Sopenharmony_ci	if (err < 0) {
121162306a36Sopenharmony_ci		kfree(spec);
121262306a36Sopenharmony_ci		return err;
121362306a36Sopenharmony_ci	}
121462306a36Sopenharmony_ci	return 0;
121562306a36Sopenharmony_ci}
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_cistatic int alc880_parse_auto_config(struct hda_codec *codec)
121862306a36Sopenharmony_ci{
121962306a36Sopenharmony_ci	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
122062306a36Sopenharmony_ci	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
122162306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
122262306a36Sopenharmony_ci}
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci/*
122562306a36Sopenharmony_ci * ALC880 fix-ups
122662306a36Sopenharmony_ci */
122762306a36Sopenharmony_cienum {
122862306a36Sopenharmony_ci	ALC880_FIXUP_GPIO1,
122962306a36Sopenharmony_ci	ALC880_FIXUP_GPIO2,
123062306a36Sopenharmony_ci	ALC880_FIXUP_MEDION_RIM,
123162306a36Sopenharmony_ci	ALC880_FIXUP_LG,
123262306a36Sopenharmony_ci	ALC880_FIXUP_LG_LW25,
123362306a36Sopenharmony_ci	ALC880_FIXUP_W810,
123462306a36Sopenharmony_ci	ALC880_FIXUP_EAPD_COEF,
123562306a36Sopenharmony_ci	ALC880_FIXUP_TCL_S700,
123662306a36Sopenharmony_ci	ALC880_FIXUP_VOL_KNOB,
123762306a36Sopenharmony_ci	ALC880_FIXUP_FUJITSU,
123862306a36Sopenharmony_ci	ALC880_FIXUP_F1734,
123962306a36Sopenharmony_ci	ALC880_FIXUP_UNIWILL,
124062306a36Sopenharmony_ci	ALC880_FIXUP_UNIWILL_DIG,
124162306a36Sopenharmony_ci	ALC880_FIXUP_Z71V,
124262306a36Sopenharmony_ci	ALC880_FIXUP_ASUS_W5A,
124362306a36Sopenharmony_ci	ALC880_FIXUP_3ST_BASE,
124462306a36Sopenharmony_ci	ALC880_FIXUP_3ST,
124562306a36Sopenharmony_ci	ALC880_FIXUP_3ST_DIG,
124662306a36Sopenharmony_ci	ALC880_FIXUP_5ST_BASE,
124762306a36Sopenharmony_ci	ALC880_FIXUP_5ST,
124862306a36Sopenharmony_ci	ALC880_FIXUP_5ST_DIG,
124962306a36Sopenharmony_ci	ALC880_FIXUP_6ST_BASE,
125062306a36Sopenharmony_ci	ALC880_FIXUP_6ST,
125162306a36Sopenharmony_ci	ALC880_FIXUP_6ST_DIG,
125262306a36Sopenharmony_ci	ALC880_FIXUP_6ST_AUTOMUTE,
125362306a36Sopenharmony_ci};
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci/* enable the volume-knob widget support on NID 0x21 */
125662306a36Sopenharmony_cistatic void alc880_fixup_vol_knob(struct hda_codec *codec,
125762306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
125862306a36Sopenharmony_ci{
125962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PROBE)
126062306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x21,
126162306a36Sopenharmony_ci						    alc_update_knob_master);
126262306a36Sopenharmony_ci}
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_cistatic const struct hda_fixup alc880_fixups[] = {
126562306a36Sopenharmony_ci	[ALC880_FIXUP_GPIO1] = {
126662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
126762306a36Sopenharmony_ci		.v.func = alc_fixup_gpio1,
126862306a36Sopenharmony_ci	},
126962306a36Sopenharmony_ci	[ALC880_FIXUP_GPIO2] = {
127062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
127162306a36Sopenharmony_ci		.v.func = alc_fixup_gpio2,
127262306a36Sopenharmony_ci	},
127362306a36Sopenharmony_ci	[ALC880_FIXUP_MEDION_RIM] = {
127462306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
127562306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
127662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
127762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
127862306a36Sopenharmony_ci			{ }
127962306a36Sopenharmony_ci		},
128062306a36Sopenharmony_ci		.chained = true,
128162306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_GPIO2,
128262306a36Sopenharmony_ci	},
128362306a36Sopenharmony_ci	[ALC880_FIXUP_LG] = {
128462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
128562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
128662306a36Sopenharmony_ci			/* disable bogus unused pins */
128762306a36Sopenharmony_ci			{ 0x16, 0x411111f0 },
128862306a36Sopenharmony_ci			{ 0x18, 0x411111f0 },
128962306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 },
129062306a36Sopenharmony_ci			{ }
129162306a36Sopenharmony_ci		}
129262306a36Sopenharmony_ci	},
129362306a36Sopenharmony_ci	[ALC880_FIXUP_LG_LW25] = {
129462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
129562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
129662306a36Sopenharmony_ci			{ 0x1a, 0x0181344f }, /* line-in */
129762306a36Sopenharmony_ci			{ 0x1b, 0x0321403f }, /* headphone */
129862306a36Sopenharmony_ci			{ }
129962306a36Sopenharmony_ci		}
130062306a36Sopenharmony_ci	},
130162306a36Sopenharmony_ci	[ALC880_FIXUP_W810] = {
130262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
130362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
130462306a36Sopenharmony_ci			/* disable bogus unused pins */
130562306a36Sopenharmony_ci			{ 0x17, 0x411111f0 },
130662306a36Sopenharmony_ci			{ }
130762306a36Sopenharmony_ci		},
130862306a36Sopenharmony_ci		.chained = true,
130962306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_GPIO2,
131062306a36Sopenharmony_ci	},
131162306a36Sopenharmony_ci	[ALC880_FIXUP_EAPD_COEF] = {
131262306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
131362306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
131462306a36Sopenharmony_ci			/* change to EAPD mode */
131562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
131662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
131762306a36Sopenharmony_ci			{}
131862306a36Sopenharmony_ci		},
131962306a36Sopenharmony_ci	},
132062306a36Sopenharmony_ci	[ALC880_FIXUP_TCL_S700] = {
132162306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
132262306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
132362306a36Sopenharmony_ci			/* change to EAPD mode */
132462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
132562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
132662306a36Sopenharmony_ci			{}
132762306a36Sopenharmony_ci		},
132862306a36Sopenharmony_ci		.chained = true,
132962306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_GPIO2,
133062306a36Sopenharmony_ci	},
133162306a36Sopenharmony_ci	[ALC880_FIXUP_VOL_KNOB] = {
133262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
133362306a36Sopenharmony_ci		.v.func = alc880_fixup_vol_knob,
133462306a36Sopenharmony_ci	},
133562306a36Sopenharmony_ci	[ALC880_FIXUP_FUJITSU] = {
133662306a36Sopenharmony_ci		/* override all pins as BIOS on old Amilo is broken */
133762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
133862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
133962306a36Sopenharmony_ci			{ 0x14, 0x0121401f }, /* HP */
134062306a36Sopenharmony_ci			{ 0x15, 0x99030120 }, /* speaker */
134162306a36Sopenharmony_ci			{ 0x16, 0x99030130 }, /* bass speaker */
134262306a36Sopenharmony_ci			{ 0x17, 0x411111f0 }, /* N/A */
134362306a36Sopenharmony_ci			{ 0x18, 0x411111f0 }, /* N/A */
134462306a36Sopenharmony_ci			{ 0x19, 0x01a19950 }, /* mic-in */
134562306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 }, /* N/A */
134662306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 }, /* N/A */
134762306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
134862306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
134962306a36Sopenharmony_ci			{ 0x1e, 0x01454140 }, /* SPDIF out */
135062306a36Sopenharmony_ci			{ }
135162306a36Sopenharmony_ci		},
135262306a36Sopenharmony_ci		.chained = true,
135362306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_VOL_KNOB,
135462306a36Sopenharmony_ci	},
135562306a36Sopenharmony_ci	[ALC880_FIXUP_F1734] = {
135662306a36Sopenharmony_ci		/* almost compatible with FUJITSU, but no bass and SPDIF */
135762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
135862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
135962306a36Sopenharmony_ci			{ 0x14, 0x0121401f }, /* HP */
136062306a36Sopenharmony_ci			{ 0x15, 0x99030120 }, /* speaker */
136162306a36Sopenharmony_ci			{ 0x16, 0x411111f0 }, /* N/A */
136262306a36Sopenharmony_ci			{ 0x17, 0x411111f0 }, /* N/A */
136362306a36Sopenharmony_ci			{ 0x18, 0x411111f0 }, /* N/A */
136462306a36Sopenharmony_ci			{ 0x19, 0x01a19950 }, /* mic-in */
136562306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 }, /* N/A */
136662306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 }, /* N/A */
136762306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
136862306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
136962306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 }, /* N/A */
137062306a36Sopenharmony_ci			{ }
137162306a36Sopenharmony_ci		},
137262306a36Sopenharmony_ci		.chained = true,
137362306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_VOL_KNOB,
137462306a36Sopenharmony_ci	},
137562306a36Sopenharmony_ci	[ALC880_FIXUP_UNIWILL] = {
137662306a36Sopenharmony_ci		/* need to fix HP and speaker pins to be parsed correctly */
137762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
137862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
137962306a36Sopenharmony_ci			{ 0x14, 0x0121411f }, /* HP */
138062306a36Sopenharmony_ci			{ 0x15, 0x99030120 }, /* speaker */
138162306a36Sopenharmony_ci			{ 0x16, 0x99030130 }, /* bass speaker */
138262306a36Sopenharmony_ci			{ }
138362306a36Sopenharmony_ci		},
138462306a36Sopenharmony_ci	},
138562306a36Sopenharmony_ci	[ALC880_FIXUP_UNIWILL_DIG] = {
138662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
138762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
138862306a36Sopenharmony_ci			/* disable bogus unused pins */
138962306a36Sopenharmony_ci			{ 0x17, 0x411111f0 },
139062306a36Sopenharmony_ci			{ 0x19, 0x411111f0 },
139162306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 },
139262306a36Sopenharmony_ci			{ 0x1f, 0x411111f0 },
139362306a36Sopenharmony_ci			{ }
139462306a36Sopenharmony_ci		}
139562306a36Sopenharmony_ci	},
139662306a36Sopenharmony_ci	[ALC880_FIXUP_Z71V] = {
139762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
139862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
139962306a36Sopenharmony_ci			/* set up the whole pins as BIOS is utterly broken */
140062306a36Sopenharmony_ci			{ 0x14, 0x99030120 }, /* speaker */
140162306a36Sopenharmony_ci			{ 0x15, 0x0121411f }, /* HP */
140262306a36Sopenharmony_ci			{ 0x16, 0x411111f0 }, /* N/A */
140362306a36Sopenharmony_ci			{ 0x17, 0x411111f0 }, /* N/A */
140462306a36Sopenharmony_ci			{ 0x18, 0x01a19950 }, /* mic-in */
140562306a36Sopenharmony_ci			{ 0x19, 0x411111f0 }, /* N/A */
140662306a36Sopenharmony_ci			{ 0x1a, 0x01813031 }, /* line-in */
140762306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 }, /* N/A */
140862306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
140962306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
141062306a36Sopenharmony_ci			{ 0x1e, 0x0144111e }, /* SPDIF */
141162306a36Sopenharmony_ci			{ }
141262306a36Sopenharmony_ci		}
141362306a36Sopenharmony_ci	},
141462306a36Sopenharmony_ci	[ALC880_FIXUP_ASUS_W5A] = {
141562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
141662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
141762306a36Sopenharmony_ci			/* set up the whole pins as BIOS is utterly broken */
141862306a36Sopenharmony_ci			{ 0x14, 0x0121411f }, /* HP */
141962306a36Sopenharmony_ci			{ 0x15, 0x411111f0 }, /* N/A */
142062306a36Sopenharmony_ci			{ 0x16, 0x411111f0 }, /* N/A */
142162306a36Sopenharmony_ci			{ 0x17, 0x411111f0 }, /* N/A */
142262306a36Sopenharmony_ci			{ 0x18, 0x90a60160 }, /* mic */
142362306a36Sopenharmony_ci			{ 0x19, 0x411111f0 }, /* N/A */
142462306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 }, /* N/A */
142562306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 }, /* N/A */
142662306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
142762306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
142862306a36Sopenharmony_ci			{ 0x1e, 0xb743111e }, /* SPDIF out */
142962306a36Sopenharmony_ci			{ }
143062306a36Sopenharmony_ci		},
143162306a36Sopenharmony_ci		.chained = true,
143262306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_GPIO1,
143362306a36Sopenharmony_ci	},
143462306a36Sopenharmony_ci	[ALC880_FIXUP_3ST_BASE] = {
143562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
143662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
143762306a36Sopenharmony_ci			{ 0x14, 0x01014010 }, /* line-out */
143862306a36Sopenharmony_ci			{ 0x15, 0x411111f0 }, /* N/A */
143962306a36Sopenharmony_ci			{ 0x16, 0x411111f0 }, /* N/A */
144062306a36Sopenharmony_ci			{ 0x17, 0x411111f0 }, /* N/A */
144162306a36Sopenharmony_ci			{ 0x18, 0x01a19c30 }, /* mic-in */
144262306a36Sopenharmony_ci			{ 0x19, 0x0121411f }, /* HP */
144362306a36Sopenharmony_ci			{ 0x1a, 0x01813031 }, /* line-in */
144462306a36Sopenharmony_ci			{ 0x1b, 0x02a19c40 }, /* front-mic */
144562306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
144662306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
144762306a36Sopenharmony_ci			/* 0x1e is filled in below */
144862306a36Sopenharmony_ci			{ 0x1f, 0x411111f0 }, /* N/A */
144962306a36Sopenharmony_ci			{ }
145062306a36Sopenharmony_ci		}
145162306a36Sopenharmony_ci	},
145262306a36Sopenharmony_ci	[ALC880_FIXUP_3ST] = {
145362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
145462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
145562306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 }, /* N/A */
145662306a36Sopenharmony_ci			{ }
145762306a36Sopenharmony_ci		},
145862306a36Sopenharmony_ci		.chained = true,
145962306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_3ST_BASE,
146062306a36Sopenharmony_ci	},
146162306a36Sopenharmony_ci	[ALC880_FIXUP_3ST_DIG] = {
146262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
146362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
146462306a36Sopenharmony_ci			{ 0x1e, 0x0144111e }, /* SPDIF */
146562306a36Sopenharmony_ci			{ }
146662306a36Sopenharmony_ci		},
146762306a36Sopenharmony_ci		.chained = true,
146862306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_3ST_BASE,
146962306a36Sopenharmony_ci	},
147062306a36Sopenharmony_ci	[ALC880_FIXUP_5ST_BASE] = {
147162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
147262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
147362306a36Sopenharmony_ci			{ 0x14, 0x01014010 }, /* front */
147462306a36Sopenharmony_ci			{ 0x15, 0x411111f0 }, /* N/A */
147562306a36Sopenharmony_ci			{ 0x16, 0x01011411 }, /* CLFE */
147662306a36Sopenharmony_ci			{ 0x17, 0x01016412 }, /* surr */
147762306a36Sopenharmony_ci			{ 0x18, 0x01a19c30 }, /* mic-in */
147862306a36Sopenharmony_ci			{ 0x19, 0x0121411f }, /* HP */
147962306a36Sopenharmony_ci			{ 0x1a, 0x01813031 }, /* line-in */
148062306a36Sopenharmony_ci			{ 0x1b, 0x02a19c40 }, /* front-mic */
148162306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
148262306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
148362306a36Sopenharmony_ci			/* 0x1e is filled in below */
148462306a36Sopenharmony_ci			{ 0x1f, 0x411111f0 }, /* N/A */
148562306a36Sopenharmony_ci			{ }
148662306a36Sopenharmony_ci		}
148762306a36Sopenharmony_ci	},
148862306a36Sopenharmony_ci	[ALC880_FIXUP_5ST] = {
148962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
149062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
149162306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 }, /* N/A */
149262306a36Sopenharmony_ci			{ }
149362306a36Sopenharmony_ci		},
149462306a36Sopenharmony_ci		.chained = true,
149562306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_5ST_BASE,
149662306a36Sopenharmony_ci	},
149762306a36Sopenharmony_ci	[ALC880_FIXUP_5ST_DIG] = {
149862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
149962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
150062306a36Sopenharmony_ci			{ 0x1e, 0x0144111e }, /* SPDIF */
150162306a36Sopenharmony_ci			{ }
150262306a36Sopenharmony_ci		},
150362306a36Sopenharmony_ci		.chained = true,
150462306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_5ST_BASE,
150562306a36Sopenharmony_ci	},
150662306a36Sopenharmony_ci	[ALC880_FIXUP_6ST_BASE] = {
150762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
150862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
150962306a36Sopenharmony_ci			{ 0x14, 0x01014010 }, /* front */
151062306a36Sopenharmony_ci			{ 0x15, 0x01016412 }, /* surr */
151162306a36Sopenharmony_ci			{ 0x16, 0x01011411 }, /* CLFE */
151262306a36Sopenharmony_ci			{ 0x17, 0x01012414 }, /* side */
151362306a36Sopenharmony_ci			{ 0x18, 0x01a19c30 }, /* mic-in */
151462306a36Sopenharmony_ci			{ 0x19, 0x02a19c40 }, /* front-mic */
151562306a36Sopenharmony_ci			{ 0x1a, 0x01813031 }, /* line-in */
151662306a36Sopenharmony_ci			{ 0x1b, 0x0121411f }, /* HP */
151762306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 }, /* N/A */
151862306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 }, /* N/A */
151962306a36Sopenharmony_ci			/* 0x1e is filled in below */
152062306a36Sopenharmony_ci			{ 0x1f, 0x411111f0 }, /* N/A */
152162306a36Sopenharmony_ci			{ }
152262306a36Sopenharmony_ci		}
152362306a36Sopenharmony_ci	},
152462306a36Sopenharmony_ci	[ALC880_FIXUP_6ST] = {
152562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
152662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
152762306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 }, /* N/A */
152862306a36Sopenharmony_ci			{ }
152962306a36Sopenharmony_ci		},
153062306a36Sopenharmony_ci		.chained = true,
153162306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_6ST_BASE,
153262306a36Sopenharmony_ci	},
153362306a36Sopenharmony_ci	[ALC880_FIXUP_6ST_DIG] = {
153462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
153562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
153662306a36Sopenharmony_ci			{ 0x1e, 0x0144111e }, /* SPDIF */
153762306a36Sopenharmony_ci			{ }
153862306a36Sopenharmony_ci		},
153962306a36Sopenharmony_ci		.chained = true,
154062306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_6ST_BASE,
154162306a36Sopenharmony_ci	},
154262306a36Sopenharmony_ci	[ALC880_FIXUP_6ST_AUTOMUTE] = {
154362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
154462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
154562306a36Sopenharmony_ci			{ 0x1b, 0x0121401f }, /* HP with jack detect */
154662306a36Sopenharmony_ci			{ }
154762306a36Sopenharmony_ci		},
154862306a36Sopenharmony_ci		.chained_before = true,
154962306a36Sopenharmony_ci		.chain_id = ALC880_FIXUP_6ST_BASE,
155062306a36Sopenharmony_ci	},
155162306a36Sopenharmony_ci};
155262306a36Sopenharmony_ci
155362306a36Sopenharmony_cistatic const struct snd_pci_quirk alc880_fixup_tbl[] = {
155462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
155562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
155662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
155762306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
155862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
155962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
156062306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
156162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
156262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
156362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
156462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
156562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
156662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
156762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
156862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
156962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
157062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
157162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
157262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
157362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
157462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
157562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
157662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
157762306a36Sopenharmony_ci
157862306a36Sopenharmony_ci	/* Below is the copied entries from alc880_quirks.c.
157962306a36Sopenharmony_ci	 * It's not quite sure whether BIOS sets the correct pin-config table
158062306a36Sopenharmony_ci	 * on these machines, thus they are kept to be compatible with
158162306a36Sopenharmony_ci	 * the old static quirks.  Once when it's confirmed to work without
158262306a36Sopenharmony_ci	 * these overrides, it'd be better to remove.
158362306a36Sopenharmony_ci	 */
158462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
158562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
158662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
158762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
158862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
158962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
159062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
159162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
159262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
159362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
159462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
159562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
159662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
159762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
159862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
159962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
160062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
160162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
160262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
160362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
160462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
160562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
160662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
160762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
160862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
160962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
161062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
161162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
161262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
161362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
161462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
161562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
161662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
161762306a36Sopenharmony_ci	/* default Intel */
161862306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
161962306a36Sopenharmony_ci	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
162062306a36Sopenharmony_ci	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
162162306a36Sopenharmony_ci	{}
162262306a36Sopenharmony_ci};
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_cistatic const struct hda_model_fixup alc880_fixup_models[] = {
162562306a36Sopenharmony_ci	{.id = ALC880_FIXUP_3ST, .name = "3stack"},
162662306a36Sopenharmony_ci	{.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
162762306a36Sopenharmony_ci	{.id = ALC880_FIXUP_5ST, .name = "5stack"},
162862306a36Sopenharmony_ci	{.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
162962306a36Sopenharmony_ci	{.id = ALC880_FIXUP_6ST, .name = "6stack"},
163062306a36Sopenharmony_ci	{.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
163162306a36Sopenharmony_ci	{.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
163262306a36Sopenharmony_ci	{}
163362306a36Sopenharmony_ci};
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci
163662306a36Sopenharmony_ci/*
163762306a36Sopenharmony_ci * OK, here we have finally the patch for ALC880
163862306a36Sopenharmony_ci */
163962306a36Sopenharmony_cistatic int patch_alc880(struct hda_codec *codec)
164062306a36Sopenharmony_ci{
164162306a36Sopenharmony_ci	struct alc_spec *spec;
164262306a36Sopenharmony_ci	int err;
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x0b);
164562306a36Sopenharmony_ci	if (err < 0)
164662306a36Sopenharmony_ci		return err;
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci	spec = codec->spec;
164962306a36Sopenharmony_ci	spec->gen.need_dac_fix = 1;
165062306a36Sopenharmony_ci	spec->gen.beep_nid = 0x01;
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci	codec->patch_ops.unsol_event = alc880_unsol_event;
165362306a36Sopenharmony_ci
165462306a36Sopenharmony_ci	alc_pre_init(codec);
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
165762306a36Sopenharmony_ci		       alc880_fixups);
165862306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
166162306a36Sopenharmony_ci	err = alc880_parse_auto_config(codec);
166262306a36Sopenharmony_ci	if (err < 0)
166362306a36Sopenharmony_ci		goto error;
166462306a36Sopenharmony_ci
166562306a36Sopenharmony_ci	if (!spec->gen.no_analog) {
166662306a36Sopenharmony_ci		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
166762306a36Sopenharmony_ci		if (err < 0)
166862306a36Sopenharmony_ci			goto error;
166962306a36Sopenharmony_ci	}
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
167262306a36Sopenharmony_ci
167362306a36Sopenharmony_ci	return 0;
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_ci error:
167662306a36Sopenharmony_ci	alc_free(codec);
167762306a36Sopenharmony_ci	return err;
167862306a36Sopenharmony_ci}
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci
168162306a36Sopenharmony_ci/*
168262306a36Sopenharmony_ci * ALC260 support
168362306a36Sopenharmony_ci */
168462306a36Sopenharmony_cistatic int alc260_parse_auto_config(struct hda_codec *codec)
168562306a36Sopenharmony_ci{
168662306a36Sopenharmony_ci	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
168762306a36Sopenharmony_ci	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
168862306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
168962306a36Sopenharmony_ci}
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci/*
169262306a36Sopenharmony_ci * Pin config fixes
169362306a36Sopenharmony_ci */
169462306a36Sopenharmony_cienum {
169562306a36Sopenharmony_ci	ALC260_FIXUP_HP_DC5750,
169662306a36Sopenharmony_ci	ALC260_FIXUP_HP_PIN_0F,
169762306a36Sopenharmony_ci	ALC260_FIXUP_COEF,
169862306a36Sopenharmony_ci	ALC260_FIXUP_GPIO1,
169962306a36Sopenharmony_ci	ALC260_FIXUP_GPIO1_TOGGLE,
170062306a36Sopenharmony_ci	ALC260_FIXUP_REPLACER,
170162306a36Sopenharmony_ci	ALC260_FIXUP_HP_B1900,
170262306a36Sopenharmony_ci	ALC260_FIXUP_KN1,
170362306a36Sopenharmony_ci	ALC260_FIXUP_FSC_S7020,
170462306a36Sopenharmony_ci	ALC260_FIXUP_FSC_S7020_JWSE,
170562306a36Sopenharmony_ci	ALC260_FIXUP_VAIO_PINS,
170662306a36Sopenharmony_ci};
170762306a36Sopenharmony_ci
170862306a36Sopenharmony_cistatic void alc260_gpio1_automute(struct hda_codec *codec)
170962306a36Sopenharmony_ci{
171062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
171162306a36Sopenharmony_ci
171262306a36Sopenharmony_ci	alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
171362306a36Sopenharmony_ci}
171462306a36Sopenharmony_ci
171562306a36Sopenharmony_cistatic void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
171662306a36Sopenharmony_ci				      const struct hda_fixup *fix, int action)
171762306a36Sopenharmony_ci{
171862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
171962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PROBE) {
172062306a36Sopenharmony_ci		/* although the machine has only one output pin, we need to
172162306a36Sopenharmony_ci		 * toggle GPIO1 according to the jack state
172262306a36Sopenharmony_ci		 */
172362306a36Sopenharmony_ci		spec->gen.automute_hook = alc260_gpio1_automute;
172462306a36Sopenharmony_ci		spec->gen.detect_hp = 1;
172562306a36Sopenharmony_ci		spec->gen.automute_speaker = 1;
172662306a36Sopenharmony_ci		spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
172762306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x0f,
172862306a36Sopenharmony_ci						    snd_hda_gen_hp_automute);
172962306a36Sopenharmony_ci		alc_setup_gpio(codec, 0x01);
173062306a36Sopenharmony_ci	}
173162306a36Sopenharmony_ci}
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_cistatic void alc260_fixup_kn1(struct hda_codec *codec,
173462306a36Sopenharmony_ci			     const struct hda_fixup *fix, int action)
173562306a36Sopenharmony_ci{
173662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
173762306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
173862306a36Sopenharmony_ci		{ 0x0f, 0x02214000 }, /* HP/speaker */
173962306a36Sopenharmony_ci		{ 0x12, 0x90a60160 }, /* int mic */
174062306a36Sopenharmony_ci		{ 0x13, 0x02a19000 }, /* ext mic */
174162306a36Sopenharmony_ci		{ 0x18, 0x01446000 }, /* SPDIF out */
174262306a36Sopenharmony_ci		/* disable bogus I/O pins */
174362306a36Sopenharmony_ci		{ 0x10, 0x411111f0 },
174462306a36Sopenharmony_ci		{ 0x11, 0x411111f0 },
174562306a36Sopenharmony_ci		{ 0x14, 0x411111f0 },
174662306a36Sopenharmony_ci		{ 0x15, 0x411111f0 },
174762306a36Sopenharmony_ci		{ 0x16, 0x411111f0 },
174862306a36Sopenharmony_ci		{ 0x17, 0x411111f0 },
174962306a36Sopenharmony_ci		{ 0x19, 0x411111f0 },
175062306a36Sopenharmony_ci		{ }
175162306a36Sopenharmony_ci	};
175262306a36Sopenharmony_ci
175362306a36Sopenharmony_ci	switch (action) {
175462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
175562306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
175662306a36Sopenharmony_ci		spec->init_amp = ALC_INIT_NONE;
175762306a36Sopenharmony_ci		break;
175862306a36Sopenharmony_ci	}
175962306a36Sopenharmony_ci}
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_cistatic void alc260_fixup_fsc_s7020(struct hda_codec *codec,
176262306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
176362306a36Sopenharmony_ci{
176462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
176562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
176662306a36Sopenharmony_ci		spec->init_amp = ALC_INIT_NONE;
176762306a36Sopenharmony_ci}
176862306a36Sopenharmony_ci
176962306a36Sopenharmony_cistatic void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
177062306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
177162306a36Sopenharmony_ci{
177262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
177362306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
177462306a36Sopenharmony_ci		spec->gen.add_jack_modes = 1;
177562306a36Sopenharmony_ci		spec->gen.hp_mic = 1;
177662306a36Sopenharmony_ci	}
177762306a36Sopenharmony_ci}
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_cistatic const struct hda_fixup alc260_fixups[] = {
178062306a36Sopenharmony_ci	[ALC260_FIXUP_HP_DC5750] = {
178162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
178262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
178362306a36Sopenharmony_ci			{ 0x11, 0x90130110 }, /* speaker */
178462306a36Sopenharmony_ci			{ }
178562306a36Sopenharmony_ci		}
178662306a36Sopenharmony_ci	},
178762306a36Sopenharmony_ci	[ALC260_FIXUP_HP_PIN_0F] = {
178862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
178962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
179062306a36Sopenharmony_ci			{ 0x0f, 0x01214000 }, /* HP */
179162306a36Sopenharmony_ci			{ }
179262306a36Sopenharmony_ci		}
179362306a36Sopenharmony_ci	},
179462306a36Sopenharmony_ci	[ALC260_FIXUP_COEF] = {
179562306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
179662306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
179762306a36Sopenharmony_ci			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
179862306a36Sopenharmony_ci			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
179962306a36Sopenharmony_ci			{ }
180062306a36Sopenharmony_ci		},
180162306a36Sopenharmony_ci	},
180262306a36Sopenharmony_ci	[ALC260_FIXUP_GPIO1] = {
180362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
180462306a36Sopenharmony_ci		.v.func = alc_fixup_gpio1,
180562306a36Sopenharmony_ci	},
180662306a36Sopenharmony_ci	[ALC260_FIXUP_GPIO1_TOGGLE] = {
180762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
180862306a36Sopenharmony_ci		.v.func = alc260_fixup_gpio1_toggle,
180962306a36Sopenharmony_ci		.chained = true,
181062306a36Sopenharmony_ci		.chain_id = ALC260_FIXUP_HP_PIN_0F,
181162306a36Sopenharmony_ci	},
181262306a36Sopenharmony_ci	[ALC260_FIXUP_REPLACER] = {
181362306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
181462306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
181562306a36Sopenharmony_ci			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
181662306a36Sopenharmony_ci			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
181762306a36Sopenharmony_ci			{ }
181862306a36Sopenharmony_ci		},
181962306a36Sopenharmony_ci		.chained = true,
182062306a36Sopenharmony_ci		.chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
182162306a36Sopenharmony_ci	},
182262306a36Sopenharmony_ci	[ALC260_FIXUP_HP_B1900] = {
182362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
182462306a36Sopenharmony_ci		.v.func = alc260_fixup_gpio1_toggle,
182562306a36Sopenharmony_ci		.chained = true,
182662306a36Sopenharmony_ci		.chain_id = ALC260_FIXUP_COEF,
182762306a36Sopenharmony_ci	},
182862306a36Sopenharmony_ci	[ALC260_FIXUP_KN1] = {
182962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
183062306a36Sopenharmony_ci		.v.func = alc260_fixup_kn1,
183162306a36Sopenharmony_ci	},
183262306a36Sopenharmony_ci	[ALC260_FIXUP_FSC_S7020] = {
183362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
183462306a36Sopenharmony_ci		.v.func = alc260_fixup_fsc_s7020,
183562306a36Sopenharmony_ci	},
183662306a36Sopenharmony_ci	[ALC260_FIXUP_FSC_S7020_JWSE] = {
183762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
183862306a36Sopenharmony_ci		.v.func = alc260_fixup_fsc_s7020_jwse,
183962306a36Sopenharmony_ci		.chained = true,
184062306a36Sopenharmony_ci		.chain_id = ALC260_FIXUP_FSC_S7020,
184162306a36Sopenharmony_ci	},
184262306a36Sopenharmony_ci	[ALC260_FIXUP_VAIO_PINS] = {
184362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
184462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
184562306a36Sopenharmony_ci			/* Pin configs are missing completely on some VAIOs */
184662306a36Sopenharmony_ci			{ 0x0f, 0x01211020 },
184762306a36Sopenharmony_ci			{ 0x10, 0x0001003f },
184862306a36Sopenharmony_ci			{ 0x11, 0x411111f0 },
184962306a36Sopenharmony_ci			{ 0x12, 0x01a15930 },
185062306a36Sopenharmony_ci			{ 0x13, 0x411111f0 },
185162306a36Sopenharmony_ci			{ 0x14, 0x411111f0 },
185262306a36Sopenharmony_ci			{ 0x15, 0x411111f0 },
185362306a36Sopenharmony_ci			{ 0x16, 0x411111f0 },
185462306a36Sopenharmony_ci			{ 0x17, 0x411111f0 },
185562306a36Sopenharmony_ci			{ 0x18, 0x411111f0 },
185662306a36Sopenharmony_ci			{ 0x19, 0x411111f0 },
185762306a36Sopenharmony_ci			{ }
185862306a36Sopenharmony_ci		}
185962306a36Sopenharmony_ci	},
186062306a36Sopenharmony_ci};
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_cistatic const struct snd_pci_quirk alc260_fixup_tbl[] = {
186362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
186462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
186562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
186662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
186762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
186862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
186962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
187062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
187162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
187262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
187362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
187462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
187562306a36Sopenharmony_ci	{}
187662306a36Sopenharmony_ci};
187762306a36Sopenharmony_ci
187862306a36Sopenharmony_cistatic const struct hda_model_fixup alc260_fixup_models[] = {
187962306a36Sopenharmony_ci	{.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
188062306a36Sopenharmony_ci	{.id = ALC260_FIXUP_COEF, .name = "coef"},
188162306a36Sopenharmony_ci	{.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
188262306a36Sopenharmony_ci	{.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
188362306a36Sopenharmony_ci	{}
188462306a36Sopenharmony_ci};
188562306a36Sopenharmony_ci
188662306a36Sopenharmony_ci/*
188762306a36Sopenharmony_ci */
188862306a36Sopenharmony_cistatic int patch_alc260(struct hda_codec *codec)
188962306a36Sopenharmony_ci{
189062306a36Sopenharmony_ci	struct alc_spec *spec;
189162306a36Sopenharmony_ci	int err;
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x07);
189462306a36Sopenharmony_ci	if (err < 0)
189562306a36Sopenharmony_ci		return err;
189662306a36Sopenharmony_ci
189762306a36Sopenharmony_ci	spec = codec->spec;
189862306a36Sopenharmony_ci	/* as quite a few machines require HP amp for speaker outputs,
189962306a36Sopenharmony_ci	 * it's easier to enable it unconditionally; even if it's unneeded,
190062306a36Sopenharmony_ci	 * it's almost harmless.
190162306a36Sopenharmony_ci	 */
190262306a36Sopenharmony_ci	spec->gen.prefer_hp_amp = 1;
190362306a36Sopenharmony_ci	spec->gen.beep_nid = 0x01;
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_ci	spec->shutup = alc_eapd_shutup;
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci	alc_pre_init(codec);
190862306a36Sopenharmony_ci
190962306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
191062306a36Sopenharmony_ci			   alc260_fixups);
191162306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
191462306a36Sopenharmony_ci	err = alc260_parse_auto_config(codec);
191562306a36Sopenharmony_ci	if (err < 0)
191662306a36Sopenharmony_ci		goto error;
191762306a36Sopenharmony_ci
191862306a36Sopenharmony_ci	if (!spec->gen.no_analog) {
191962306a36Sopenharmony_ci		err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
192062306a36Sopenharmony_ci		if (err < 0)
192162306a36Sopenharmony_ci			goto error;
192262306a36Sopenharmony_ci	}
192362306a36Sopenharmony_ci
192462306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_ci	return 0;
192762306a36Sopenharmony_ci
192862306a36Sopenharmony_ci error:
192962306a36Sopenharmony_ci	alc_free(codec);
193062306a36Sopenharmony_ci	return err;
193162306a36Sopenharmony_ci}
193262306a36Sopenharmony_ci
193362306a36Sopenharmony_ci
193462306a36Sopenharmony_ci/*
193562306a36Sopenharmony_ci * ALC882/883/885/888/889 support
193662306a36Sopenharmony_ci *
193762306a36Sopenharmony_ci * ALC882 is almost identical with ALC880 but has cleaner and more flexible
193862306a36Sopenharmony_ci * configuration.  Each pin widget can choose any input DACs and a mixer.
193962306a36Sopenharmony_ci * Each ADC is connected from a mixer of all inputs.  This makes possible
194062306a36Sopenharmony_ci * 6-channel independent captures.
194162306a36Sopenharmony_ci *
194262306a36Sopenharmony_ci * In addition, an independent DAC for the multi-playback (not used in this
194362306a36Sopenharmony_ci * driver yet).
194462306a36Sopenharmony_ci */
194562306a36Sopenharmony_ci
194662306a36Sopenharmony_ci/*
194762306a36Sopenharmony_ci * Pin config fixes
194862306a36Sopenharmony_ci */
194962306a36Sopenharmony_cienum {
195062306a36Sopenharmony_ci	ALC882_FIXUP_ABIT_AW9D_MAX,
195162306a36Sopenharmony_ci	ALC882_FIXUP_LENOVO_Y530,
195262306a36Sopenharmony_ci	ALC882_FIXUP_PB_M5210,
195362306a36Sopenharmony_ci	ALC882_FIXUP_ACER_ASPIRE_7736,
195462306a36Sopenharmony_ci	ALC882_FIXUP_ASUS_W90V,
195562306a36Sopenharmony_ci	ALC889_FIXUP_CD,
195662306a36Sopenharmony_ci	ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
195762306a36Sopenharmony_ci	ALC889_FIXUP_VAIO_TT,
195862306a36Sopenharmony_ci	ALC888_FIXUP_EEE1601,
195962306a36Sopenharmony_ci	ALC886_FIXUP_EAPD,
196062306a36Sopenharmony_ci	ALC882_FIXUP_EAPD,
196162306a36Sopenharmony_ci	ALC883_FIXUP_EAPD,
196262306a36Sopenharmony_ci	ALC883_FIXUP_ACER_EAPD,
196362306a36Sopenharmony_ci	ALC882_FIXUP_GPIO1,
196462306a36Sopenharmony_ci	ALC882_FIXUP_GPIO2,
196562306a36Sopenharmony_ci	ALC882_FIXUP_GPIO3,
196662306a36Sopenharmony_ci	ALC889_FIXUP_COEF,
196762306a36Sopenharmony_ci	ALC882_FIXUP_ASUS_W2JC,
196862306a36Sopenharmony_ci	ALC882_FIXUP_ACER_ASPIRE_4930G,
196962306a36Sopenharmony_ci	ALC882_FIXUP_ACER_ASPIRE_8930G,
197062306a36Sopenharmony_ci	ALC882_FIXUP_ASPIRE_8930G_VERBS,
197162306a36Sopenharmony_ci	ALC885_FIXUP_MACPRO_GPIO,
197262306a36Sopenharmony_ci	ALC889_FIXUP_DAC_ROUTE,
197362306a36Sopenharmony_ci	ALC889_FIXUP_MBP_VREF,
197462306a36Sopenharmony_ci	ALC889_FIXUP_IMAC91_VREF,
197562306a36Sopenharmony_ci	ALC889_FIXUP_MBA11_VREF,
197662306a36Sopenharmony_ci	ALC889_FIXUP_MBA21_VREF,
197762306a36Sopenharmony_ci	ALC889_FIXUP_MP11_VREF,
197862306a36Sopenharmony_ci	ALC889_FIXUP_MP41_VREF,
197962306a36Sopenharmony_ci	ALC882_FIXUP_INV_DMIC,
198062306a36Sopenharmony_ci	ALC882_FIXUP_NO_PRIMARY_HP,
198162306a36Sopenharmony_ci	ALC887_FIXUP_ASUS_BASS,
198262306a36Sopenharmony_ci	ALC887_FIXUP_BASS_CHMAP,
198362306a36Sopenharmony_ci	ALC1220_FIXUP_GB_DUAL_CODECS,
198462306a36Sopenharmony_ci	ALC1220_FIXUP_GB_X570,
198562306a36Sopenharmony_ci	ALC1220_FIXUP_CLEVO_P950,
198662306a36Sopenharmony_ci	ALC1220_FIXUP_CLEVO_PB51ED,
198762306a36Sopenharmony_ci	ALC1220_FIXUP_CLEVO_PB51ED_PINS,
198862306a36Sopenharmony_ci	ALC887_FIXUP_ASUS_AUDIO,
198962306a36Sopenharmony_ci	ALC887_FIXUP_ASUS_HMIC,
199062306a36Sopenharmony_ci	ALCS1200A_FIXUP_MIC_VREF,
199162306a36Sopenharmony_ci	ALC888VD_FIXUP_MIC_100VREF,
199262306a36Sopenharmony_ci};
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_cistatic void alc889_fixup_coef(struct hda_codec *codec,
199562306a36Sopenharmony_ci			      const struct hda_fixup *fix, int action)
199662306a36Sopenharmony_ci{
199762306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_INIT)
199862306a36Sopenharmony_ci		return;
199962306a36Sopenharmony_ci	alc_update_coef_idx(codec, 7, 0, 0x2030);
200062306a36Sopenharmony_ci}
200162306a36Sopenharmony_ci
200262306a36Sopenharmony_ci/* set up GPIO at initialization */
200362306a36Sopenharmony_cistatic void alc885_fixup_macpro_gpio(struct hda_codec *codec,
200462306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
200562306a36Sopenharmony_ci{
200662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
200762306a36Sopenharmony_ci
200862306a36Sopenharmony_ci	spec->gpio_write_delay = true;
200962306a36Sopenharmony_ci	alc_fixup_gpio3(codec, fix, action);
201062306a36Sopenharmony_ci}
201162306a36Sopenharmony_ci
201262306a36Sopenharmony_ci/* Fix the connection of some pins for ALC889:
201362306a36Sopenharmony_ci * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
201462306a36Sopenharmony_ci * work correctly (bko#42740)
201562306a36Sopenharmony_ci */
201662306a36Sopenharmony_cistatic void alc889_fixup_dac_route(struct hda_codec *codec,
201762306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
201862306a36Sopenharmony_ci{
201962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
202062306a36Sopenharmony_ci		/* fake the connections during parsing the tree */
202162306a36Sopenharmony_ci		static const hda_nid_t conn1[] = { 0x0c, 0x0d };
202262306a36Sopenharmony_ci		static const hda_nid_t conn2[] = { 0x0e, 0x0f };
202362306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
202462306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
202562306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
202662306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
202762306a36Sopenharmony_ci	} else if (action == HDA_FIXUP_ACT_PROBE) {
202862306a36Sopenharmony_ci		/* restore the connections */
202962306a36Sopenharmony_ci		static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
203062306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
203162306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
203262306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
203362306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
203462306a36Sopenharmony_ci	}
203562306a36Sopenharmony_ci}
203662306a36Sopenharmony_ci
203762306a36Sopenharmony_ci/* Set VREF on HP pin */
203862306a36Sopenharmony_cistatic void alc889_fixup_mbp_vref(struct hda_codec *codec,
203962306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
204062306a36Sopenharmony_ci{
204162306a36Sopenharmony_ci	static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
204262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
204362306a36Sopenharmony_ci	int i;
204462306a36Sopenharmony_ci
204562306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_INIT)
204662306a36Sopenharmony_ci		return;
204762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(nids); i++) {
204862306a36Sopenharmony_ci		unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
204962306a36Sopenharmony_ci		if (get_defcfg_device(val) != AC_JACK_HP_OUT)
205062306a36Sopenharmony_ci			continue;
205162306a36Sopenharmony_ci		val = snd_hda_codec_get_pin_target(codec, nids[i]);
205262306a36Sopenharmony_ci		val |= AC_PINCTL_VREF_80;
205362306a36Sopenharmony_ci		snd_hda_set_pin_ctl(codec, nids[i], val);
205462306a36Sopenharmony_ci		spec->gen.keep_vref_in_automute = 1;
205562306a36Sopenharmony_ci		break;
205662306a36Sopenharmony_ci	}
205762306a36Sopenharmony_ci}
205862306a36Sopenharmony_ci
205962306a36Sopenharmony_cistatic void alc889_fixup_mac_pins(struct hda_codec *codec,
206062306a36Sopenharmony_ci				  const hda_nid_t *nids, int num_nids)
206162306a36Sopenharmony_ci{
206262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
206362306a36Sopenharmony_ci	int i;
206462306a36Sopenharmony_ci
206562306a36Sopenharmony_ci	for (i = 0; i < num_nids; i++) {
206662306a36Sopenharmony_ci		unsigned int val;
206762306a36Sopenharmony_ci		val = snd_hda_codec_get_pin_target(codec, nids[i]);
206862306a36Sopenharmony_ci		val |= AC_PINCTL_VREF_50;
206962306a36Sopenharmony_ci		snd_hda_set_pin_ctl(codec, nids[i], val);
207062306a36Sopenharmony_ci	}
207162306a36Sopenharmony_ci	spec->gen.keep_vref_in_automute = 1;
207262306a36Sopenharmony_ci}
207362306a36Sopenharmony_ci
207462306a36Sopenharmony_ci/* Set VREF on speaker pins on imac91 */
207562306a36Sopenharmony_cistatic void alc889_fixup_imac91_vref(struct hda_codec *codec,
207662306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
207762306a36Sopenharmony_ci{
207862306a36Sopenharmony_ci	static const hda_nid_t nids[] = { 0x18, 0x1a };
207962306a36Sopenharmony_ci
208062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_INIT)
208162306a36Sopenharmony_ci		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
208262306a36Sopenharmony_ci}
208362306a36Sopenharmony_ci
208462306a36Sopenharmony_ci/* Set VREF on speaker pins on mba11 */
208562306a36Sopenharmony_cistatic void alc889_fixup_mba11_vref(struct hda_codec *codec,
208662306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
208762306a36Sopenharmony_ci{
208862306a36Sopenharmony_ci	static const hda_nid_t nids[] = { 0x18 };
208962306a36Sopenharmony_ci
209062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_INIT)
209162306a36Sopenharmony_ci		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
209262306a36Sopenharmony_ci}
209362306a36Sopenharmony_ci
209462306a36Sopenharmony_ci/* Set VREF on speaker pins on mba21 */
209562306a36Sopenharmony_cistatic void alc889_fixup_mba21_vref(struct hda_codec *codec,
209662306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
209762306a36Sopenharmony_ci{
209862306a36Sopenharmony_ci	static const hda_nid_t nids[] = { 0x18, 0x19 };
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_INIT)
210162306a36Sopenharmony_ci		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
210262306a36Sopenharmony_ci}
210362306a36Sopenharmony_ci
210462306a36Sopenharmony_ci/* Don't take HP output as primary
210562306a36Sopenharmony_ci * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
210662306a36Sopenharmony_ci * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
210762306a36Sopenharmony_ci */
210862306a36Sopenharmony_cistatic void alc882_fixup_no_primary_hp(struct hda_codec *codec,
210962306a36Sopenharmony_ci				       const struct hda_fixup *fix, int action)
211062306a36Sopenharmony_ci{
211162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
211262306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
211362306a36Sopenharmony_ci		spec->gen.no_primary_hp = 1;
211462306a36Sopenharmony_ci		spec->gen.no_multi_io = 1;
211562306a36Sopenharmony_ci	}
211662306a36Sopenharmony_ci}
211762306a36Sopenharmony_ci
211862306a36Sopenharmony_cistatic void alc_fixup_bass_chmap(struct hda_codec *codec,
211962306a36Sopenharmony_ci				 const struct hda_fixup *fix, int action);
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci/* For dual-codec configuration, we need to disable some features to avoid
212262306a36Sopenharmony_ci * conflicts of kctls and PCM streams
212362306a36Sopenharmony_ci */
212462306a36Sopenharmony_cistatic void alc_fixup_dual_codecs(struct hda_codec *codec,
212562306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
212662306a36Sopenharmony_ci{
212762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
212862306a36Sopenharmony_ci
212962306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
213062306a36Sopenharmony_ci		return;
213162306a36Sopenharmony_ci	/* disable vmaster */
213262306a36Sopenharmony_ci	spec->gen.suppress_vmaster = 1;
213362306a36Sopenharmony_ci	/* auto-mute and auto-mic switch don't work with multiple codecs */
213462306a36Sopenharmony_ci	spec->gen.suppress_auto_mute = 1;
213562306a36Sopenharmony_ci	spec->gen.suppress_auto_mic = 1;
213662306a36Sopenharmony_ci	/* disable aamix as well */
213762306a36Sopenharmony_ci	spec->gen.mixer_nid = 0;
213862306a36Sopenharmony_ci	/* add location prefix to avoid conflicts */
213962306a36Sopenharmony_ci	codec->force_pin_prefix = 1;
214062306a36Sopenharmony_ci}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_cistatic void rename_ctl(struct hda_codec *codec, const char *oldname,
214362306a36Sopenharmony_ci		       const char *newname)
214462306a36Sopenharmony_ci{
214562306a36Sopenharmony_ci	struct snd_kcontrol *kctl;
214662306a36Sopenharmony_ci
214762306a36Sopenharmony_ci	kctl = snd_hda_find_mixer_ctl(codec, oldname);
214862306a36Sopenharmony_ci	if (kctl)
214962306a36Sopenharmony_ci		snd_ctl_rename(codec->card, kctl, newname);
215062306a36Sopenharmony_ci}
215162306a36Sopenharmony_ci
215262306a36Sopenharmony_cistatic void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
215362306a36Sopenharmony_ci					 const struct hda_fixup *fix,
215462306a36Sopenharmony_ci					 int action)
215562306a36Sopenharmony_ci{
215662306a36Sopenharmony_ci	alc_fixup_dual_codecs(codec, fix, action);
215762306a36Sopenharmony_ci	switch (action) {
215862306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
215962306a36Sopenharmony_ci		/* override card longname to provide a unique UCM profile */
216062306a36Sopenharmony_ci		strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
216162306a36Sopenharmony_ci		break;
216262306a36Sopenharmony_ci	case HDA_FIXUP_ACT_BUILD:
216362306a36Sopenharmony_ci		/* rename Capture controls depending on the codec */
216462306a36Sopenharmony_ci		rename_ctl(codec, "Capture Volume",
216562306a36Sopenharmony_ci			   codec->addr == 0 ?
216662306a36Sopenharmony_ci			   "Rear-Panel Capture Volume" :
216762306a36Sopenharmony_ci			   "Front-Panel Capture Volume");
216862306a36Sopenharmony_ci		rename_ctl(codec, "Capture Switch",
216962306a36Sopenharmony_ci			   codec->addr == 0 ?
217062306a36Sopenharmony_ci			   "Rear-Panel Capture Switch" :
217162306a36Sopenharmony_ci			   "Front-Panel Capture Switch");
217262306a36Sopenharmony_ci		break;
217362306a36Sopenharmony_ci	}
217462306a36Sopenharmony_ci}
217562306a36Sopenharmony_ci
217662306a36Sopenharmony_cistatic void alc1220_fixup_gb_x570(struct hda_codec *codec,
217762306a36Sopenharmony_ci				     const struct hda_fixup *fix,
217862306a36Sopenharmony_ci				     int action)
217962306a36Sopenharmony_ci{
218062306a36Sopenharmony_ci	static const hda_nid_t conn1[] = { 0x0c };
218162306a36Sopenharmony_ci	static const struct coef_fw gb_x570_coefs[] = {
218262306a36Sopenharmony_ci		WRITE_COEF(0x07, 0x03c0),
218362306a36Sopenharmony_ci		WRITE_COEF(0x1a, 0x01c1),
218462306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0202),
218562306a36Sopenharmony_ci		WRITE_COEF(0x43, 0x3005),
218662306a36Sopenharmony_ci		{}
218762306a36Sopenharmony_ci	};
218862306a36Sopenharmony_ci
218962306a36Sopenharmony_ci	switch (action) {
219062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
219162306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
219262306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
219362306a36Sopenharmony_ci		break;
219462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
219562306a36Sopenharmony_ci		alc_process_coef_fw(codec, gb_x570_coefs);
219662306a36Sopenharmony_ci		break;
219762306a36Sopenharmony_ci	}
219862306a36Sopenharmony_ci}
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_cistatic void alc1220_fixup_clevo_p950(struct hda_codec *codec,
220162306a36Sopenharmony_ci				     const struct hda_fixup *fix,
220262306a36Sopenharmony_ci				     int action)
220362306a36Sopenharmony_ci{
220462306a36Sopenharmony_ci	static const hda_nid_t conn1[] = { 0x0c };
220562306a36Sopenharmony_ci
220662306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
220762306a36Sopenharmony_ci		return;
220862306a36Sopenharmony_ci
220962306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
221062306a36Sopenharmony_ci	/* We therefore want to make sure 0x14 (front headphone) and
221162306a36Sopenharmony_ci	 * 0x1b (speakers) use the stereo DAC 0x02
221262306a36Sopenharmony_ci	 */
221362306a36Sopenharmony_ci	snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
221462306a36Sopenharmony_ci	snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
221562306a36Sopenharmony_ci}
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_cistatic void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
221862306a36Sopenharmony_ci				const struct hda_fixup *fix, int action);
221962306a36Sopenharmony_ci
222062306a36Sopenharmony_cistatic void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
222162306a36Sopenharmony_ci				     const struct hda_fixup *fix,
222262306a36Sopenharmony_ci				     int action)
222362306a36Sopenharmony_ci{
222462306a36Sopenharmony_ci	alc1220_fixup_clevo_p950(codec, fix, action);
222562306a36Sopenharmony_ci	alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
222662306a36Sopenharmony_ci}
222762306a36Sopenharmony_ci
222862306a36Sopenharmony_cistatic void alc887_asus_hp_automute_hook(struct hda_codec *codec,
222962306a36Sopenharmony_ci					 struct hda_jack_callback *jack)
223062306a36Sopenharmony_ci{
223162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
223262306a36Sopenharmony_ci	unsigned int vref;
223362306a36Sopenharmony_ci
223462306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_ci	if (spec->gen.hp_jack_present)
223762306a36Sopenharmony_ci		vref = AC_PINCTL_VREF_80;
223862306a36Sopenharmony_ci	else
223962306a36Sopenharmony_ci		vref = AC_PINCTL_VREF_HIZ;
224062306a36Sopenharmony_ci	snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
224162306a36Sopenharmony_ci}
224262306a36Sopenharmony_ci
224362306a36Sopenharmony_cistatic void alc887_fixup_asus_jack(struct hda_codec *codec,
224462306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
224562306a36Sopenharmony_ci{
224662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
224762306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PROBE)
224862306a36Sopenharmony_ci		return;
224962306a36Sopenharmony_ci	snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
225062306a36Sopenharmony_ci	spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
225162306a36Sopenharmony_ci}
225262306a36Sopenharmony_ci
225362306a36Sopenharmony_cistatic const struct hda_fixup alc882_fixups[] = {
225462306a36Sopenharmony_ci	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
225562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
225662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
225762306a36Sopenharmony_ci			{ 0x15, 0x01080104 }, /* side */
225862306a36Sopenharmony_ci			{ 0x16, 0x01011012 }, /* rear */
225962306a36Sopenharmony_ci			{ 0x17, 0x01016011 }, /* clfe */
226062306a36Sopenharmony_ci			{ }
226162306a36Sopenharmony_ci		}
226262306a36Sopenharmony_ci	},
226362306a36Sopenharmony_ci	[ALC882_FIXUP_LENOVO_Y530] = {
226462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
226562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
226662306a36Sopenharmony_ci			{ 0x15, 0x99130112 }, /* rear int speakers */
226762306a36Sopenharmony_ci			{ 0x16, 0x99130111 }, /* subwoofer */
226862306a36Sopenharmony_ci			{ }
226962306a36Sopenharmony_ci		}
227062306a36Sopenharmony_ci	},
227162306a36Sopenharmony_ci	[ALC882_FIXUP_PB_M5210] = {
227262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINCTLS,
227362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
227462306a36Sopenharmony_ci			{ 0x19, PIN_VREF50 },
227562306a36Sopenharmony_ci			{}
227662306a36Sopenharmony_ci		}
227762306a36Sopenharmony_ci	},
227862306a36Sopenharmony_ci	[ALC882_FIXUP_ACER_ASPIRE_7736] = {
227962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
228062306a36Sopenharmony_ci		.v.func = alc_fixup_sku_ignore,
228162306a36Sopenharmony_ci	},
228262306a36Sopenharmony_ci	[ALC882_FIXUP_ASUS_W90V] = {
228362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
228462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
228562306a36Sopenharmony_ci			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
228662306a36Sopenharmony_ci			{ }
228762306a36Sopenharmony_ci		}
228862306a36Sopenharmony_ci	},
228962306a36Sopenharmony_ci	[ALC889_FIXUP_CD] = {
229062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
229162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
229262306a36Sopenharmony_ci			{ 0x1c, 0x993301f0 }, /* CD */
229362306a36Sopenharmony_ci			{ }
229462306a36Sopenharmony_ci		}
229562306a36Sopenharmony_ci	},
229662306a36Sopenharmony_ci	[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
229762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
229862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
229962306a36Sopenharmony_ci			{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
230062306a36Sopenharmony_ci			{ }
230162306a36Sopenharmony_ci		},
230262306a36Sopenharmony_ci		.chained = true,
230362306a36Sopenharmony_ci		.chain_id = ALC889_FIXUP_CD,
230462306a36Sopenharmony_ci	},
230562306a36Sopenharmony_ci	[ALC889_FIXUP_VAIO_TT] = {
230662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
230762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
230862306a36Sopenharmony_ci			{ 0x17, 0x90170111 }, /* hidden surround speaker */
230962306a36Sopenharmony_ci			{ }
231062306a36Sopenharmony_ci		}
231162306a36Sopenharmony_ci	},
231262306a36Sopenharmony_ci	[ALC888_FIXUP_EEE1601] = {
231362306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
231462306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
231562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
231662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
231762306a36Sopenharmony_ci			{ }
231862306a36Sopenharmony_ci		}
231962306a36Sopenharmony_ci	},
232062306a36Sopenharmony_ci	[ALC886_FIXUP_EAPD] = {
232162306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
232262306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
232362306a36Sopenharmony_ci			/* change to EAPD mode */
232462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
232562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
232662306a36Sopenharmony_ci			{ }
232762306a36Sopenharmony_ci		}
232862306a36Sopenharmony_ci	},
232962306a36Sopenharmony_ci	[ALC882_FIXUP_EAPD] = {
233062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
233162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
233262306a36Sopenharmony_ci			/* change to EAPD mode */
233362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
233462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
233562306a36Sopenharmony_ci			{ }
233662306a36Sopenharmony_ci		}
233762306a36Sopenharmony_ci	},
233862306a36Sopenharmony_ci	[ALC883_FIXUP_EAPD] = {
233962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
234062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
234162306a36Sopenharmony_ci			/* change to EAPD mode */
234262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
234362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
234462306a36Sopenharmony_ci			{ }
234562306a36Sopenharmony_ci		}
234662306a36Sopenharmony_ci	},
234762306a36Sopenharmony_ci	[ALC883_FIXUP_ACER_EAPD] = {
234862306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
234962306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
235062306a36Sopenharmony_ci			/* eanable EAPD on Acer laptops */
235162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
235262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
235362306a36Sopenharmony_ci			{ }
235462306a36Sopenharmony_ci		}
235562306a36Sopenharmony_ci	},
235662306a36Sopenharmony_ci	[ALC882_FIXUP_GPIO1] = {
235762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
235862306a36Sopenharmony_ci		.v.func = alc_fixup_gpio1,
235962306a36Sopenharmony_ci	},
236062306a36Sopenharmony_ci	[ALC882_FIXUP_GPIO2] = {
236162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
236262306a36Sopenharmony_ci		.v.func = alc_fixup_gpio2,
236362306a36Sopenharmony_ci	},
236462306a36Sopenharmony_ci	[ALC882_FIXUP_GPIO3] = {
236562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
236662306a36Sopenharmony_ci		.v.func = alc_fixup_gpio3,
236762306a36Sopenharmony_ci	},
236862306a36Sopenharmony_ci	[ALC882_FIXUP_ASUS_W2JC] = {
236962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
237062306a36Sopenharmony_ci		.v.func = alc_fixup_gpio1,
237162306a36Sopenharmony_ci		.chained = true,
237262306a36Sopenharmony_ci		.chain_id = ALC882_FIXUP_EAPD,
237362306a36Sopenharmony_ci	},
237462306a36Sopenharmony_ci	[ALC889_FIXUP_COEF] = {
237562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
237662306a36Sopenharmony_ci		.v.func = alc889_fixup_coef,
237762306a36Sopenharmony_ci	},
237862306a36Sopenharmony_ci	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
237962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
238062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
238162306a36Sopenharmony_ci			{ 0x16, 0x99130111 }, /* CLFE speaker */
238262306a36Sopenharmony_ci			{ 0x17, 0x99130112 }, /* surround speaker */
238362306a36Sopenharmony_ci			{ }
238462306a36Sopenharmony_ci		},
238562306a36Sopenharmony_ci		.chained = true,
238662306a36Sopenharmony_ci		.chain_id = ALC882_FIXUP_GPIO1,
238762306a36Sopenharmony_ci	},
238862306a36Sopenharmony_ci	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
238962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
239062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
239162306a36Sopenharmony_ci			{ 0x16, 0x99130111 }, /* CLFE speaker */
239262306a36Sopenharmony_ci			{ 0x1b, 0x99130112 }, /* surround speaker */
239362306a36Sopenharmony_ci			{ }
239462306a36Sopenharmony_ci		},
239562306a36Sopenharmony_ci		.chained = true,
239662306a36Sopenharmony_ci		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
239762306a36Sopenharmony_ci	},
239862306a36Sopenharmony_ci	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
239962306a36Sopenharmony_ci		/* additional init verbs for Acer Aspire 8930G */
240062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
240162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
240262306a36Sopenharmony_ci			/* Enable all DACs */
240362306a36Sopenharmony_ci			/* DAC DISABLE/MUTE 1? */
240462306a36Sopenharmony_ci			/*  setting bits 1-5 disables DAC nids 0x02-0x06
240562306a36Sopenharmony_ci			 *  apparently. Init=0x38 */
240662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
240762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
240862306a36Sopenharmony_ci			/* DAC DISABLE/MUTE 2? */
240962306a36Sopenharmony_ci			/*  some bit here disables the other DACs.
241062306a36Sopenharmony_ci			 *  Init=0x4900 */
241162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
241262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
241362306a36Sopenharmony_ci			/* DMIC fix
241462306a36Sopenharmony_ci			 * This laptop has a stereo digital microphone.
241562306a36Sopenharmony_ci			 * The mics are only 1cm apart which makes the stereo
241662306a36Sopenharmony_ci			 * useless. However, either the mic or the ALC889
241762306a36Sopenharmony_ci			 * makes the signal become a difference/sum signal
241862306a36Sopenharmony_ci			 * instead of standard stereo, which is annoying.
241962306a36Sopenharmony_ci			 * So instead we flip this bit which makes the
242062306a36Sopenharmony_ci			 * codec replicate the sum signal to both channels,
242162306a36Sopenharmony_ci			 * turning it into a normal mono mic.
242262306a36Sopenharmony_ci			 */
242362306a36Sopenharmony_ci			/* DMIC_CONTROL? Init value = 0x0001 */
242462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
242562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
242662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
242762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
242862306a36Sopenharmony_ci			{ }
242962306a36Sopenharmony_ci		},
243062306a36Sopenharmony_ci		.chained = true,
243162306a36Sopenharmony_ci		.chain_id = ALC882_FIXUP_GPIO1,
243262306a36Sopenharmony_ci	},
243362306a36Sopenharmony_ci	[ALC885_FIXUP_MACPRO_GPIO] = {
243462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
243562306a36Sopenharmony_ci		.v.func = alc885_fixup_macpro_gpio,
243662306a36Sopenharmony_ci	},
243762306a36Sopenharmony_ci	[ALC889_FIXUP_DAC_ROUTE] = {
243862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
243962306a36Sopenharmony_ci		.v.func = alc889_fixup_dac_route,
244062306a36Sopenharmony_ci	},
244162306a36Sopenharmony_ci	[ALC889_FIXUP_MBP_VREF] = {
244262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
244362306a36Sopenharmony_ci		.v.func = alc889_fixup_mbp_vref,
244462306a36Sopenharmony_ci		.chained = true,
244562306a36Sopenharmony_ci		.chain_id = ALC882_FIXUP_GPIO1,
244662306a36Sopenharmony_ci	},
244762306a36Sopenharmony_ci	[ALC889_FIXUP_IMAC91_VREF] = {
244862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
244962306a36Sopenharmony_ci		.v.func = alc889_fixup_imac91_vref,
245062306a36Sopenharmony_ci		.chained = true,
245162306a36Sopenharmony_ci		.chain_id = ALC882_FIXUP_GPIO1,
245262306a36Sopenharmony_ci	},
245362306a36Sopenharmony_ci	[ALC889_FIXUP_MBA11_VREF] = {
245462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
245562306a36Sopenharmony_ci		.v.func = alc889_fixup_mba11_vref,
245662306a36Sopenharmony_ci		.chained = true,
245762306a36Sopenharmony_ci		.chain_id = ALC889_FIXUP_MBP_VREF,
245862306a36Sopenharmony_ci	},
245962306a36Sopenharmony_ci	[ALC889_FIXUP_MBA21_VREF] = {
246062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
246162306a36Sopenharmony_ci		.v.func = alc889_fixup_mba21_vref,
246262306a36Sopenharmony_ci		.chained = true,
246362306a36Sopenharmony_ci		.chain_id = ALC889_FIXUP_MBP_VREF,
246462306a36Sopenharmony_ci	},
246562306a36Sopenharmony_ci	[ALC889_FIXUP_MP11_VREF] = {
246662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
246762306a36Sopenharmony_ci		.v.func = alc889_fixup_mba11_vref,
246862306a36Sopenharmony_ci		.chained = true,
246962306a36Sopenharmony_ci		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
247062306a36Sopenharmony_ci	},
247162306a36Sopenharmony_ci	[ALC889_FIXUP_MP41_VREF] = {
247262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
247362306a36Sopenharmony_ci		.v.func = alc889_fixup_mbp_vref,
247462306a36Sopenharmony_ci		.chained = true,
247562306a36Sopenharmony_ci		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
247662306a36Sopenharmony_ci	},
247762306a36Sopenharmony_ci	[ALC882_FIXUP_INV_DMIC] = {
247862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
247962306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
248062306a36Sopenharmony_ci	},
248162306a36Sopenharmony_ci	[ALC882_FIXUP_NO_PRIMARY_HP] = {
248262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
248362306a36Sopenharmony_ci		.v.func = alc882_fixup_no_primary_hp,
248462306a36Sopenharmony_ci	},
248562306a36Sopenharmony_ci	[ALC887_FIXUP_ASUS_BASS] = {
248662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
248762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
248862306a36Sopenharmony_ci			{0x16, 0x99130130}, /* bass speaker */
248962306a36Sopenharmony_ci			{}
249062306a36Sopenharmony_ci		},
249162306a36Sopenharmony_ci		.chained = true,
249262306a36Sopenharmony_ci		.chain_id = ALC887_FIXUP_BASS_CHMAP,
249362306a36Sopenharmony_ci	},
249462306a36Sopenharmony_ci	[ALC887_FIXUP_BASS_CHMAP] = {
249562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
249662306a36Sopenharmony_ci		.v.func = alc_fixup_bass_chmap,
249762306a36Sopenharmony_ci	},
249862306a36Sopenharmony_ci	[ALC1220_FIXUP_GB_DUAL_CODECS] = {
249962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
250062306a36Sopenharmony_ci		.v.func = alc1220_fixup_gb_dual_codecs,
250162306a36Sopenharmony_ci	},
250262306a36Sopenharmony_ci	[ALC1220_FIXUP_GB_X570] = {
250362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
250462306a36Sopenharmony_ci		.v.func = alc1220_fixup_gb_x570,
250562306a36Sopenharmony_ci	},
250662306a36Sopenharmony_ci	[ALC1220_FIXUP_CLEVO_P950] = {
250762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
250862306a36Sopenharmony_ci		.v.func = alc1220_fixup_clevo_p950,
250962306a36Sopenharmony_ci	},
251062306a36Sopenharmony_ci	[ALC1220_FIXUP_CLEVO_PB51ED] = {
251162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
251262306a36Sopenharmony_ci		.v.func = alc1220_fixup_clevo_pb51ed,
251362306a36Sopenharmony_ci	},
251462306a36Sopenharmony_ci	[ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
251562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
251662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
251762306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
251862306a36Sopenharmony_ci			{}
251962306a36Sopenharmony_ci		},
252062306a36Sopenharmony_ci		.chained = true,
252162306a36Sopenharmony_ci		.chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
252262306a36Sopenharmony_ci	},
252362306a36Sopenharmony_ci	[ALC887_FIXUP_ASUS_AUDIO] = {
252462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
252562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
252662306a36Sopenharmony_ci			{ 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
252762306a36Sopenharmony_ci			{ 0x19, 0x22219420 },
252862306a36Sopenharmony_ci			{}
252962306a36Sopenharmony_ci		},
253062306a36Sopenharmony_ci	},
253162306a36Sopenharmony_ci	[ALC887_FIXUP_ASUS_HMIC] = {
253262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
253362306a36Sopenharmony_ci		.v.func = alc887_fixup_asus_jack,
253462306a36Sopenharmony_ci		.chained = true,
253562306a36Sopenharmony_ci		.chain_id = ALC887_FIXUP_ASUS_AUDIO,
253662306a36Sopenharmony_ci	},
253762306a36Sopenharmony_ci	[ALCS1200A_FIXUP_MIC_VREF] = {
253862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINCTLS,
253962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
254062306a36Sopenharmony_ci			{ 0x18, PIN_VREF50 }, /* rear mic */
254162306a36Sopenharmony_ci			{ 0x19, PIN_VREF50 }, /* front mic */
254262306a36Sopenharmony_ci			{}
254362306a36Sopenharmony_ci		}
254462306a36Sopenharmony_ci	},
254562306a36Sopenharmony_ci	[ALC888VD_FIXUP_MIC_100VREF] = {
254662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINCTLS,
254762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
254862306a36Sopenharmony_ci			{ 0x18, PIN_VREF100 }, /* headset mic */
254962306a36Sopenharmony_ci			{}
255062306a36Sopenharmony_ci		}
255162306a36Sopenharmony_ci	},
255262306a36Sopenharmony_ci};
255362306a36Sopenharmony_ci
255462306a36Sopenharmony_cistatic const struct snd_pci_quirk alc882_fixup_tbl[] = {
255562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
255662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
255762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
255862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
255962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
256062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
256162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
256262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
256362306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_4930G),
256462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
256562306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_4930G),
256662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
256762306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_8930G),
256862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
256962306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_8930G),
257062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
257162306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_4930G),
257262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
257362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
257462306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_4930G),
257562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
257662306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_4930G),
257762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
257862306a36Sopenharmony_ci		      ALC882_FIXUP_ACER_ASPIRE_4930G),
257962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
258062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
258162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
258262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
258362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
258462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
258562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
258662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
258762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
258862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
258962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
259062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
259162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
259262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
259362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
259462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
259562306a36Sopenharmony_ci
259662306a36Sopenharmony_ci	/* All Apple entries are in codec SSIDs */
259762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
259862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
259962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
260062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
260162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
260262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
260362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
260462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
260562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
260662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
260762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
260862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
260962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
261062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
261162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
261262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
261362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
261462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
261562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
261662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
261762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
261862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
261962306a36Sopenharmony_ci
262062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
262162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
262262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
262362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
262462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
262562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
262662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
262762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
262862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
262962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
263062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
263162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
263262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
263362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
263462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
263562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
263662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
263762306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
263862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
263962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
264962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
265062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
265162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
265262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
265362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
265462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
265562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
265662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
265762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
265862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
265962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
266062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
266162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
266262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
266362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
266462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
266562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
266662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
266762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
266862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
266962306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
267062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
267162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
267262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
267362306a36Sopenharmony_ci	{}
267462306a36Sopenharmony_ci};
267562306a36Sopenharmony_ci
267662306a36Sopenharmony_cistatic const struct hda_model_fixup alc882_fixup_models[] = {
267762306a36Sopenharmony_ci	{.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
267862306a36Sopenharmony_ci	{.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
267962306a36Sopenharmony_ci	{.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
268062306a36Sopenharmony_ci	{.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
268162306a36Sopenharmony_ci	{.id = ALC889_FIXUP_CD, .name = "cd"},
268262306a36Sopenharmony_ci	{.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
268362306a36Sopenharmony_ci	{.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
268462306a36Sopenharmony_ci	{.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
268562306a36Sopenharmony_ci	{.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
268662306a36Sopenharmony_ci	{.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
268762306a36Sopenharmony_ci	{.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
268862306a36Sopenharmony_ci	{.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
268962306a36Sopenharmony_ci	{.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
269062306a36Sopenharmony_ci	{.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
269162306a36Sopenharmony_ci	{.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
269262306a36Sopenharmony_ci	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
269362306a36Sopenharmony_ci	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
269462306a36Sopenharmony_ci	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
269562306a36Sopenharmony_ci	{.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
269662306a36Sopenharmony_ci	{.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
269762306a36Sopenharmony_ci	{.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
269862306a36Sopenharmony_ci	{.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
269962306a36Sopenharmony_ci	{.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
270062306a36Sopenharmony_ci	{.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
270162306a36Sopenharmony_ci	{.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
270262306a36Sopenharmony_ci	{.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
270362306a36Sopenharmony_ci	{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
270462306a36Sopenharmony_ci	{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
270562306a36Sopenharmony_ci	{.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
270662306a36Sopenharmony_ci	{.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
270762306a36Sopenharmony_ci	{.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
270862306a36Sopenharmony_ci	{.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
270962306a36Sopenharmony_ci	{}
271062306a36Sopenharmony_ci};
271162306a36Sopenharmony_ci
271262306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
271362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
271462306a36Sopenharmony_ci		{0x14, 0x01014010},
271562306a36Sopenharmony_ci		{0x15, 0x01011012},
271662306a36Sopenharmony_ci		{0x16, 0x01016011},
271762306a36Sopenharmony_ci		{0x18, 0x01a19040},
271862306a36Sopenharmony_ci		{0x19, 0x02a19050},
271962306a36Sopenharmony_ci		{0x1a, 0x0181304f},
272062306a36Sopenharmony_ci		{0x1b, 0x0221401f},
272162306a36Sopenharmony_ci		{0x1e, 0x01456130}),
272262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
272362306a36Sopenharmony_ci		{0x14, 0x01015010},
272462306a36Sopenharmony_ci		{0x15, 0x01011012},
272562306a36Sopenharmony_ci		{0x16, 0x01011011},
272662306a36Sopenharmony_ci		{0x18, 0x01a11040},
272762306a36Sopenharmony_ci		{0x19, 0x02a19050},
272862306a36Sopenharmony_ci		{0x1a, 0x0181104f},
272962306a36Sopenharmony_ci		{0x1b, 0x0221401f},
273062306a36Sopenharmony_ci		{0x1e, 0x01451130}),
273162306a36Sopenharmony_ci	{}
273262306a36Sopenharmony_ci};
273362306a36Sopenharmony_ci
273462306a36Sopenharmony_ci/*
273562306a36Sopenharmony_ci * BIOS auto configuration
273662306a36Sopenharmony_ci */
273762306a36Sopenharmony_ci/* almost identical with ALC880 parser... */
273862306a36Sopenharmony_cistatic int alc882_parse_auto_config(struct hda_codec *codec)
273962306a36Sopenharmony_ci{
274062306a36Sopenharmony_ci	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
274162306a36Sopenharmony_ci	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
274262306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
274362306a36Sopenharmony_ci}
274462306a36Sopenharmony_ci
274562306a36Sopenharmony_ci/*
274662306a36Sopenharmony_ci */
274762306a36Sopenharmony_cistatic int patch_alc882(struct hda_codec *codec)
274862306a36Sopenharmony_ci{
274962306a36Sopenharmony_ci	struct alc_spec *spec;
275062306a36Sopenharmony_ci	int err;
275162306a36Sopenharmony_ci
275262306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x0b);
275362306a36Sopenharmony_ci	if (err < 0)
275462306a36Sopenharmony_ci		return err;
275562306a36Sopenharmony_ci
275662306a36Sopenharmony_ci	spec = codec->spec;
275762306a36Sopenharmony_ci
275862306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
275962306a36Sopenharmony_ci	case 0x10ec0882:
276062306a36Sopenharmony_ci	case 0x10ec0885:
276162306a36Sopenharmony_ci	case 0x10ec0900:
276262306a36Sopenharmony_ci	case 0x10ec0b00:
276362306a36Sopenharmony_ci	case 0x10ec1220:
276462306a36Sopenharmony_ci		break;
276562306a36Sopenharmony_ci	default:
276662306a36Sopenharmony_ci		/* ALC883 and variants */
276762306a36Sopenharmony_ci		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
276862306a36Sopenharmony_ci		break;
276962306a36Sopenharmony_ci	}
277062306a36Sopenharmony_ci
277162306a36Sopenharmony_ci	alc_pre_init(codec);
277262306a36Sopenharmony_ci
277362306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
277462306a36Sopenharmony_ci		       alc882_fixups);
277562306a36Sopenharmony_ci	snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
277662306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
277762306a36Sopenharmony_ci
277862306a36Sopenharmony_ci	alc_auto_parse_customize_define(codec);
277962306a36Sopenharmony_ci
278062306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
278162306a36Sopenharmony_ci		spec->gen.beep_nid = 0x01;
278262306a36Sopenharmony_ci
278362306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
278462306a36Sopenharmony_ci	err = alc882_parse_auto_config(codec);
278562306a36Sopenharmony_ci	if (err < 0)
278662306a36Sopenharmony_ci		goto error;
278762306a36Sopenharmony_ci
278862306a36Sopenharmony_ci	if (!spec->gen.no_analog && spec->gen.beep_nid) {
278962306a36Sopenharmony_ci		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
279062306a36Sopenharmony_ci		if (err < 0)
279162306a36Sopenharmony_ci			goto error;
279262306a36Sopenharmony_ci	}
279362306a36Sopenharmony_ci
279462306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_ci	return 0;
279762306a36Sopenharmony_ci
279862306a36Sopenharmony_ci error:
279962306a36Sopenharmony_ci	alc_free(codec);
280062306a36Sopenharmony_ci	return err;
280162306a36Sopenharmony_ci}
280262306a36Sopenharmony_ci
280362306a36Sopenharmony_ci
280462306a36Sopenharmony_ci/*
280562306a36Sopenharmony_ci * ALC262 support
280662306a36Sopenharmony_ci */
280762306a36Sopenharmony_cistatic int alc262_parse_auto_config(struct hda_codec *codec)
280862306a36Sopenharmony_ci{
280962306a36Sopenharmony_ci	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
281062306a36Sopenharmony_ci	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
281162306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
281262306a36Sopenharmony_ci}
281362306a36Sopenharmony_ci
281462306a36Sopenharmony_ci/*
281562306a36Sopenharmony_ci * Pin config fixes
281662306a36Sopenharmony_ci */
281762306a36Sopenharmony_cienum {
281862306a36Sopenharmony_ci	ALC262_FIXUP_FSC_H270,
281962306a36Sopenharmony_ci	ALC262_FIXUP_FSC_S7110,
282062306a36Sopenharmony_ci	ALC262_FIXUP_HP_Z200,
282162306a36Sopenharmony_ci	ALC262_FIXUP_TYAN,
282262306a36Sopenharmony_ci	ALC262_FIXUP_LENOVO_3000,
282362306a36Sopenharmony_ci	ALC262_FIXUP_BENQ,
282462306a36Sopenharmony_ci	ALC262_FIXUP_BENQ_T31,
282562306a36Sopenharmony_ci	ALC262_FIXUP_INV_DMIC,
282662306a36Sopenharmony_ci	ALC262_FIXUP_INTEL_BAYLEYBAY,
282762306a36Sopenharmony_ci};
282862306a36Sopenharmony_ci
282962306a36Sopenharmony_cistatic const struct hda_fixup alc262_fixups[] = {
283062306a36Sopenharmony_ci	[ALC262_FIXUP_FSC_H270] = {
283162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
283262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
283362306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
283462306a36Sopenharmony_ci			{ 0x15, 0x0221142f }, /* front HP */
283562306a36Sopenharmony_ci			{ 0x1b, 0x0121141f }, /* rear HP */
283662306a36Sopenharmony_ci			{ }
283762306a36Sopenharmony_ci		}
283862306a36Sopenharmony_ci	},
283962306a36Sopenharmony_ci	[ALC262_FIXUP_FSC_S7110] = {
284062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
284162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
284262306a36Sopenharmony_ci			{ 0x15, 0x90170110 }, /* speaker */
284362306a36Sopenharmony_ci			{ }
284462306a36Sopenharmony_ci		},
284562306a36Sopenharmony_ci		.chained = true,
284662306a36Sopenharmony_ci		.chain_id = ALC262_FIXUP_BENQ,
284762306a36Sopenharmony_ci	},
284862306a36Sopenharmony_ci	[ALC262_FIXUP_HP_Z200] = {
284962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
285062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
285162306a36Sopenharmony_ci			{ 0x16, 0x99130120 }, /* internal speaker */
285262306a36Sopenharmony_ci			{ }
285362306a36Sopenharmony_ci		}
285462306a36Sopenharmony_ci	},
285562306a36Sopenharmony_ci	[ALC262_FIXUP_TYAN] = {
285662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
285762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
285862306a36Sopenharmony_ci			{ 0x14, 0x1993e1f0 }, /* int AUX */
285962306a36Sopenharmony_ci			{ }
286062306a36Sopenharmony_ci		}
286162306a36Sopenharmony_ci	},
286262306a36Sopenharmony_ci	[ALC262_FIXUP_LENOVO_3000] = {
286362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINCTLS,
286462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
286562306a36Sopenharmony_ci			{ 0x19, PIN_VREF50 },
286662306a36Sopenharmony_ci			{}
286762306a36Sopenharmony_ci		},
286862306a36Sopenharmony_ci		.chained = true,
286962306a36Sopenharmony_ci		.chain_id = ALC262_FIXUP_BENQ,
287062306a36Sopenharmony_ci	},
287162306a36Sopenharmony_ci	[ALC262_FIXUP_BENQ] = {
287262306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
287362306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
287462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
287562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
287662306a36Sopenharmony_ci			{}
287762306a36Sopenharmony_ci		}
287862306a36Sopenharmony_ci	},
287962306a36Sopenharmony_ci	[ALC262_FIXUP_BENQ_T31] = {
288062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
288162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
288262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
288362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
288462306a36Sopenharmony_ci			{}
288562306a36Sopenharmony_ci		}
288662306a36Sopenharmony_ci	},
288762306a36Sopenharmony_ci	[ALC262_FIXUP_INV_DMIC] = {
288862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
288962306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
289062306a36Sopenharmony_ci	},
289162306a36Sopenharmony_ci	[ALC262_FIXUP_INTEL_BAYLEYBAY] = {
289262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
289362306a36Sopenharmony_ci		.v.func = alc_fixup_no_depop_delay,
289462306a36Sopenharmony_ci	},
289562306a36Sopenharmony_ci};
289662306a36Sopenharmony_ci
289762306a36Sopenharmony_cistatic const struct snd_pci_quirk alc262_fixup_tbl[] = {
289862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
289962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
290062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
290162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
290262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
290362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
290462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
290562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
290662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
290762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
290862306a36Sopenharmony_ci	{}
290962306a36Sopenharmony_ci};
291062306a36Sopenharmony_ci
291162306a36Sopenharmony_cistatic const struct hda_model_fixup alc262_fixup_models[] = {
291262306a36Sopenharmony_ci	{.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
291362306a36Sopenharmony_ci	{.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
291462306a36Sopenharmony_ci	{.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
291562306a36Sopenharmony_ci	{.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
291662306a36Sopenharmony_ci	{.id = ALC262_FIXUP_TYAN, .name = "tyan"},
291762306a36Sopenharmony_ci	{.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
291862306a36Sopenharmony_ci	{.id = ALC262_FIXUP_BENQ, .name = "benq"},
291962306a36Sopenharmony_ci	{.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
292062306a36Sopenharmony_ci	{.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
292162306a36Sopenharmony_ci	{}
292262306a36Sopenharmony_ci};
292362306a36Sopenharmony_ci
292462306a36Sopenharmony_ci/*
292562306a36Sopenharmony_ci */
292662306a36Sopenharmony_cistatic int patch_alc262(struct hda_codec *codec)
292762306a36Sopenharmony_ci{
292862306a36Sopenharmony_ci	struct alc_spec *spec;
292962306a36Sopenharmony_ci	int err;
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x0b);
293262306a36Sopenharmony_ci	if (err < 0)
293362306a36Sopenharmony_ci		return err;
293462306a36Sopenharmony_ci
293562306a36Sopenharmony_ci	spec = codec->spec;
293662306a36Sopenharmony_ci	spec->gen.shared_mic_vref_pin = 0x18;
293762306a36Sopenharmony_ci
293862306a36Sopenharmony_ci	spec->shutup = alc_eapd_shutup;
293962306a36Sopenharmony_ci
294062306a36Sopenharmony_ci#if 0
294162306a36Sopenharmony_ci	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
294262306a36Sopenharmony_ci	 * under-run
294362306a36Sopenharmony_ci	 */
294462306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
294562306a36Sopenharmony_ci#endif
294662306a36Sopenharmony_ci	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
294762306a36Sopenharmony_ci
294862306a36Sopenharmony_ci	alc_pre_init(codec);
294962306a36Sopenharmony_ci
295062306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
295162306a36Sopenharmony_ci		       alc262_fixups);
295262306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
295362306a36Sopenharmony_ci
295462306a36Sopenharmony_ci	alc_auto_parse_customize_define(codec);
295562306a36Sopenharmony_ci
295662306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
295762306a36Sopenharmony_ci		spec->gen.beep_nid = 0x01;
295862306a36Sopenharmony_ci
295962306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
296062306a36Sopenharmony_ci	err = alc262_parse_auto_config(codec);
296162306a36Sopenharmony_ci	if (err < 0)
296262306a36Sopenharmony_ci		goto error;
296362306a36Sopenharmony_ci
296462306a36Sopenharmony_ci	if (!spec->gen.no_analog && spec->gen.beep_nid) {
296562306a36Sopenharmony_ci		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
296662306a36Sopenharmony_ci		if (err < 0)
296762306a36Sopenharmony_ci			goto error;
296862306a36Sopenharmony_ci	}
296962306a36Sopenharmony_ci
297062306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
297162306a36Sopenharmony_ci
297262306a36Sopenharmony_ci	return 0;
297362306a36Sopenharmony_ci
297462306a36Sopenharmony_ci error:
297562306a36Sopenharmony_ci	alc_free(codec);
297662306a36Sopenharmony_ci	return err;
297762306a36Sopenharmony_ci}
297862306a36Sopenharmony_ci
297962306a36Sopenharmony_ci/*
298062306a36Sopenharmony_ci *  ALC268
298162306a36Sopenharmony_ci */
298262306a36Sopenharmony_ci/* bind Beep switches of both NID 0x0f and 0x10 */
298362306a36Sopenharmony_cistatic int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
298462306a36Sopenharmony_ci				  struct snd_ctl_elem_value *ucontrol)
298562306a36Sopenharmony_ci{
298662306a36Sopenharmony_ci	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
298762306a36Sopenharmony_ci	unsigned long pval;
298862306a36Sopenharmony_ci	int err;
298962306a36Sopenharmony_ci
299062306a36Sopenharmony_ci	mutex_lock(&codec->control_mutex);
299162306a36Sopenharmony_ci	pval = kcontrol->private_value;
299262306a36Sopenharmony_ci	kcontrol->private_value = (pval & ~0xff) | 0x0f;
299362306a36Sopenharmony_ci	err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
299462306a36Sopenharmony_ci	if (err >= 0) {
299562306a36Sopenharmony_ci		kcontrol->private_value = (pval & ~0xff) | 0x10;
299662306a36Sopenharmony_ci		err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
299762306a36Sopenharmony_ci	}
299862306a36Sopenharmony_ci	kcontrol->private_value = pval;
299962306a36Sopenharmony_ci	mutex_unlock(&codec->control_mutex);
300062306a36Sopenharmony_ci	return err;
300162306a36Sopenharmony_ci}
300262306a36Sopenharmony_ci
300362306a36Sopenharmony_cistatic const struct snd_kcontrol_new alc268_beep_mixer[] = {
300462306a36Sopenharmony_ci	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
300562306a36Sopenharmony_ci	{
300662306a36Sopenharmony_ci		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
300762306a36Sopenharmony_ci		.name = "Beep Playback Switch",
300862306a36Sopenharmony_ci		.subdevice = HDA_SUBDEV_AMP_FLAG,
300962306a36Sopenharmony_ci		.info = snd_hda_mixer_amp_switch_info,
301062306a36Sopenharmony_ci		.get = snd_hda_mixer_amp_switch_get,
301162306a36Sopenharmony_ci		.put = alc268_beep_switch_put,
301262306a36Sopenharmony_ci		.private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
301362306a36Sopenharmony_ci	},
301462306a36Sopenharmony_ci};
301562306a36Sopenharmony_ci
301662306a36Sopenharmony_ci/* set PCBEEP vol = 0, mute connections */
301762306a36Sopenharmony_cistatic const struct hda_verb alc268_beep_init_verbs[] = {
301862306a36Sopenharmony_ci	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
301962306a36Sopenharmony_ci	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
302062306a36Sopenharmony_ci	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
302162306a36Sopenharmony_ci	{ }
302262306a36Sopenharmony_ci};
302362306a36Sopenharmony_ci
302462306a36Sopenharmony_cienum {
302562306a36Sopenharmony_ci	ALC268_FIXUP_INV_DMIC,
302662306a36Sopenharmony_ci	ALC268_FIXUP_HP_EAPD,
302762306a36Sopenharmony_ci	ALC268_FIXUP_SPDIF,
302862306a36Sopenharmony_ci};
302962306a36Sopenharmony_ci
303062306a36Sopenharmony_cistatic const struct hda_fixup alc268_fixups[] = {
303162306a36Sopenharmony_ci	[ALC268_FIXUP_INV_DMIC] = {
303262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
303362306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
303462306a36Sopenharmony_ci	},
303562306a36Sopenharmony_ci	[ALC268_FIXUP_HP_EAPD] = {
303662306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
303762306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
303862306a36Sopenharmony_ci			{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
303962306a36Sopenharmony_ci			{}
304062306a36Sopenharmony_ci		}
304162306a36Sopenharmony_ci	},
304262306a36Sopenharmony_ci	[ALC268_FIXUP_SPDIF] = {
304362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
304462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
304562306a36Sopenharmony_ci			{ 0x1e, 0x014b1180 }, /* enable SPDIF out */
304662306a36Sopenharmony_ci			{}
304762306a36Sopenharmony_ci		}
304862306a36Sopenharmony_ci	},
304962306a36Sopenharmony_ci};
305062306a36Sopenharmony_ci
305162306a36Sopenharmony_cistatic const struct hda_model_fixup alc268_fixup_models[] = {
305262306a36Sopenharmony_ci	{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
305362306a36Sopenharmony_ci	{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
305462306a36Sopenharmony_ci	{.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
305562306a36Sopenharmony_ci	{}
305662306a36Sopenharmony_ci};
305762306a36Sopenharmony_ci
305862306a36Sopenharmony_cistatic const struct snd_pci_quirk alc268_fixup_tbl[] = {
305962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
306062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
306162306a36Sopenharmony_ci	/* below is codec SSID since multiple Toshiba laptops have the
306262306a36Sopenharmony_ci	 * same PCI SSID 1179:ff00
306362306a36Sopenharmony_ci	 */
306462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
306562306a36Sopenharmony_ci	{}
306662306a36Sopenharmony_ci};
306762306a36Sopenharmony_ci
306862306a36Sopenharmony_ci/*
306962306a36Sopenharmony_ci * BIOS auto configuration
307062306a36Sopenharmony_ci */
307162306a36Sopenharmony_cistatic int alc268_parse_auto_config(struct hda_codec *codec)
307262306a36Sopenharmony_ci{
307362306a36Sopenharmony_ci	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
307462306a36Sopenharmony_ci	return alc_parse_auto_config(codec, NULL, alc268_ssids);
307562306a36Sopenharmony_ci}
307662306a36Sopenharmony_ci
307762306a36Sopenharmony_ci/*
307862306a36Sopenharmony_ci */
307962306a36Sopenharmony_cistatic int patch_alc268(struct hda_codec *codec)
308062306a36Sopenharmony_ci{
308162306a36Sopenharmony_ci	struct alc_spec *spec;
308262306a36Sopenharmony_ci	int i, err;
308362306a36Sopenharmony_ci
308462306a36Sopenharmony_ci	/* ALC268 has no aa-loopback mixer */
308562306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0);
308662306a36Sopenharmony_ci	if (err < 0)
308762306a36Sopenharmony_ci		return err;
308862306a36Sopenharmony_ci
308962306a36Sopenharmony_ci	spec = codec->spec;
309062306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
309162306a36Sopenharmony_ci		spec->gen.beep_nid = 0x01;
309262306a36Sopenharmony_ci
309362306a36Sopenharmony_ci	spec->shutup = alc_eapd_shutup;
309462306a36Sopenharmony_ci
309562306a36Sopenharmony_ci	alc_pre_init(codec);
309662306a36Sopenharmony_ci
309762306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
309862306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
309962306a36Sopenharmony_ci
310062306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
310162306a36Sopenharmony_ci	err = alc268_parse_auto_config(codec);
310262306a36Sopenharmony_ci	if (err < 0)
310362306a36Sopenharmony_ci		goto error;
310462306a36Sopenharmony_ci
310562306a36Sopenharmony_ci	if (err > 0 && !spec->gen.no_analog &&
310662306a36Sopenharmony_ci	    spec->gen.autocfg.speaker_pins[0] != 0x1d) {
310762306a36Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
310862306a36Sopenharmony_ci			if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
310962306a36Sopenharmony_ci						  &alc268_beep_mixer[i])) {
311062306a36Sopenharmony_ci				err = -ENOMEM;
311162306a36Sopenharmony_ci				goto error;
311262306a36Sopenharmony_ci			}
311362306a36Sopenharmony_ci		}
311462306a36Sopenharmony_ci		snd_hda_add_verbs(codec, alc268_beep_init_verbs);
311562306a36Sopenharmony_ci		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
311662306a36Sopenharmony_ci			/* override the amp caps for beep generator */
311762306a36Sopenharmony_ci			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
311862306a36Sopenharmony_ci					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
311962306a36Sopenharmony_ci					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
312062306a36Sopenharmony_ci					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
312162306a36Sopenharmony_ci					  (0 << AC_AMPCAP_MUTE_SHIFT));
312262306a36Sopenharmony_ci	}
312362306a36Sopenharmony_ci
312462306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
312562306a36Sopenharmony_ci
312662306a36Sopenharmony_ci	return 0;
312762306a36Sopenharmony_ci
312862306a36Sopenharmony_ci error:
312962306a36Sopenharmony_ci	alc_free(codec);
313062306a36Sopenharmony_ci	return err;
313162306a36Sopenharmony_ci}
313262306a36Sopenharmony_ci
313362306a36Sopenharmony_ci/*
313462306a36Sopenharmony_ci * ALC269
313562306a36Sopenharmony_ci */
313662306a36Sopenharmony_ci
313762306a36Sopenharmony_cistatic const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
313862306a36Sopenharmony_ci	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
313962306a36Sopenharmony_ci};
314062306a36Sopenharmony_ci
314162306a36Sopenharmony_cistatic const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
314262306a36Sopenharmony_ci	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
314362306a36Sopenharmony_ci};
314462306a36Sopenharmony_ci
314562306a36Sopenharmony_ci/* different alc269-variants */
314662306a36Sopenharmony_cienum {
314762306a36Sopenharmony_ci	ALC269_TYPE_ALC269VA,
314862306a36Sopenharmony_ci	ALC269_TYPE_ALC269VB,
314962306a36Sopenharmony_ci	ALC269_TYPE_ALC269VC,
315062306a36Sopenharmony_ci	ALC269_TYPE_ALC269VD,
315162306a36Sopenharmony_ci	ALC269_TYPE_ALC280,
315262306a36Sopenharmony_ci	ALC269_TYPE_ALC282,
315362306a36Sopenharmony_ci	ALC269_TYPE_ALC283,
315462306a36Sopenharmony_ci	ALC269_TYPE_ALC284,
315562306a36Sopenharmony_ci	ALC269_TYPE_ALC293,
315662306a36Sopenharmony_ci	ALC269_TYPE_ALC286,
315762306a36Sopenharmony_ci	ALC269_TYPE_ALC298,
315862306a36Sopenharmony_ci	ALC269_TYPE_ALC255,
315962306a36Sopenharmony_ci	ALC269_TYPE_ALC256,
316062306a36Sopenharmony_ci	ALC269_TYPE_ALC257,
316162306a36Sopenharmony_ci	ALC269_TYPE_ALC215,
316262306a36Sopenharmony_ci	ALC269_TYPE_ALC225,
316362306a36Sopenharmony_ci	ALC269_TYPE_ALC245,
316462306a36Sopenharmony_ci	ALC269_TYPE_ALC287,
316562306a36Sopenharmony_ci	ALC269_TYPE_ALC294,
316662306a36Sopenharmony_ci	ALC269_TYPE_ALC300,
316762306a36Sopenharmony_ci	ALC269_TYPE_ALC623,
316862306a36Sopenharmony_ci	ALC269_TYPE_ALC700,
316962306a36Sopenharmony_ci};
317062306a36Sopenharmony_ci
317162306a36Sopenharmony_ci/*
317262306a36Sopenharmony_ci * BIOS auto configuration
317362306a36Sopenharmony_ci */
317462306a36Sopenharmony_cistatic int alc269_parse_auto_config(struct hda_codec *codec)
317562306a36Sopenharmony_ci{
317662306a36Sopenharmony_ci	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
317762306a36Sopenharmony_ci	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
317862306a36Sopenharmony_ci	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
317962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
318062306a36Sopenharmony_ci	const hda_nid_t *ssids;
318162306a36Sopenharmony_ci
318262306a36Sopenharmony_ci	switch (spec->codec_variant) {
318362306a36Sopenharmony_ci	case ALC269_TYPE_ALC269VA:
318462306a36Sopenharmony_ci	case ALC269_TYPE_ALC269VC:
318562306a36Sopenharmony_ci	case ALC269_TYPE_ALC280:
318662306a36Sopenharmony_ci	case ALC269_TYPE_ALC284:
318762306a36Sopenharmony_ci	case ALC269_TYPE_ALC293:
318862306a36Sopenharmony_ci		ssids = alc269va_ssids;
318962306a36Sopenharmony_ci		break;
319062306a36Sopenharmony_ci	case ALC269_TYPE_ALC269VB:
319162306a36Sopenharmony_ci	case ALC269_TYPE_ALC269VD:
319262306a36Sopenharmony_ci	case ALC269_TYPE_ALC282:
319362306a36Sopenharmony_ci	case ALC269_TYPE_ALC283:
319462306a36Sopenharmony_ci	case ALC269_TYPE_ALC286:
319562306a36Sopenharmony_ci	case ALC269_TYPE_ALC298:
319662306a36Sopenharmony_ci	case ALC269_TYPE_ALC255:
319762306a36Sopenharmony_ci	case ALC269_TYPE_ALC256:
319862306a36Sopenharmony_ci	case ALC269_TYPE_ALC257:
319962306a36Sopenharmony_ci	case ALC269_TYPE_ALC215:
320062306a36Sopenharmony_ci	case ALC269_TYPE_ALC225:
320162306a36Sopenharmony_ci	case ALC269_TYPE_ALC245:
320262306a36Sopenharmony_ci	case ALC269_TYPE_ALC287:
320362306a36Sopenharmony_ci	case ALC269_TYPE_ALC294:
320462306a36Sopenharmony_ci	case ALC269_TYPE_ALC300:
320562306a36Sopenharmony_ci	case ALC269_TYPE_ALC623:
320662306a36Sopenharmony_ci	case ALC269_TYPE_ALC700:
320762306a36Sopenharmony_ci		ssids = alc269_ssids;
320862306a36Sopenharmony_ci		break;
320962306a36Sopenharmony_ci	default:
321062306a36Sopenharmony_ci		ssids = alc269_ssids;
321162306a36Sopenharmony_ci		break;
321262306a36Sopenharmony_ci	}
321362306a36Sopenharmony_ci
321462306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc269_ignore, ssids);
321562306a36Sopenharmony_ci}
321662306a36Sopenharmony_ci
321762306a36Sopenharmony_cistatic const struct hda_jack_keymap alc_headset_btn_keymap[] = {
321862306a36Sopenharmony_ci	{ SND_JACK_BTN_0, KEY_PLAYPAUSE },
321962306a36Sopenharmony_ci	{ SND_JACK_BTN_1, KEY_VOICECOMMAND },
322062306a36Sopenharmony_ci	{ SND_JACK_BTN_2, KEY_VOLUMEUP },
322162306a36Sopenharmony_ci	{ SND_JACK_BTN_3, KEY_VOLUMEDOWN },
322262306a36Sopenharmony_ci	{}
322362306a36Sopenharmony_ci};
322462306a36Sopenharmony_ci
322562306a36Sopenharmony_cistatic void alc_headset_btn_callback(struct hda_codec *codec,
322662306a36Sopenharmony_ci				     struct hda_jack_callback *jack)
322762306a36Sopenharmony_ci{
322862306a36Sopenharmony_ci	int report = 0;
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_ci	if (jack->unsol_res & (7 << 13))
323162306a36Sopenharmony_ci		report |= SND_JACK_BTN_0;
323262306a36Sopenharmony_ci
323362306a36Sopenharmony_ci	if (jack->unsol_res  & (1 << 16 | 3 << 8))
323462306a36Sopenharmony_ci		report |= SND_JACK_BTN_1;
323562306a36Sopenharmony_ci
323662306a36Sopenharmony_ci	/* Volume up key */
323762306a36Sopenharmony_ci	if (jack->unsol_res & (7 << 23))
323862306a36Sopenharmony_ci		report |= SND_JACK_BTN_2;
323962306a36Sopenharmony_ci
324062306a36Sopenharmony_ci	/* Volume down key */
324162306a36Sopenharmony_ci	if (jack->unsol_res & (7 << 10))
324262306a36Sopenharmony_ci		report |= SND_JACK_BTN_3;
324362306a36Sopenharmony_ci
324462306a36Sopenharmony_ci	snd_hda_jack_set_button_state(codec, jack->nid, report);
324562306a36Sopenharmony_ci}
324662306a36Sopenharmony_ci
324762306a36Sopenharmony_cistatic void alc_disable_headset_jack_key(struct hda_codec *codec)
324862306a36Sopenharmony_ci{
324962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
325062306a36Sopenharmony_ci
325162306a36Sopenharmony_ci	if (!spec->has_hs_key)
325262306a36Sopenharmony_ci		return;
325362306a36Sopenharmony_ci
325462306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
325562306a36Sopenharmony_ci	case 0x10ec0215:
325662306a36Sopenharmony_ci	case 0x10ec0225:
325762306a36Sopenharmony_ci	case 0x10ec0285:
325862306a36Sopenharmony_ci	case 0x10ec0287:
325962306a36Sopenharmony_ci	case 0x10ec0295:
326062306a36Sopenharmony_ci	case 0x10ec0289:
326162306a36Sopenharmony_ci	case 0x10ec0299:
326262306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x48, 0x0);
326362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
326462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
326562306a36Sopenharmony_ci		break;
326662306a36Sopenharmony_ci	case 0x10ec0230:
326762306a36Sopenharmony_ci	case 0x10ec0236:
326862306a36Sopenharmony_ci	case 0x10ec0256:
326962306a36Sopenharmony_ci	case 0x10ec0257:
327062306a36Sopenharmony_ci	case 0x19e58326:
327162306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x48, 0x0);
327262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
327362306a36Sopenharmony_ci		break;
327462306a36Sopenharmony_ci	}
327562306a36Sopenharmony_ci}
327662306a36Sopenharmony_ci
327762306a36Sopenharmony_cistatic void alc_enable_headset_jack_key(struct hda_codec *codec)
327862306a36Sopenharmony_ci{
327962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
328062306a36Sopenharmony_ci
328162306a36Sopenharmony_ci	if (!spec->has_hs_key)
328262306a36Sopenharmony_ci		return;
328362306a36Sopenharmony_ci
328462306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
328562306a36Sopenharmony_ci	case 0x10ec0215:
328662306a36Sopenharmony_ci	case 0x10ec0225:
328762306a36Sopenharmony_ci	case 0x10ec0285:
328862306a36Sopenharmony_ci	case 0x10ec0287:
328962306a36Sopenharmony_ci	case 0x10ec0295:
329062306a36Sopenharmony_ci	case 0x10ec0289:
329162306a36Sopenharmony_ci	case 0x10ec0299:
329262306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x48, 0xd011);
329362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
329462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
329562306a36Sopenharmony_ci		break;
329662306a36Sopenharmony_ci	case 0x10ec0230:
329762306a36Sopenharmony_ci	case 0x10ec0236:
329862306a36Sopenharmony_ci	case 0x10ec0256:
329962306a36Sopenharmony_ci	case 0x10ec0257:
330062306a36Sopenharmony_ci	case 0x19e58326:
330162306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x48, 0xd011);
330262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
330362306a36Sopenharmony_ci		break;
330462306a36Sopenharmony_ci	}
330562306a36Sopenharmony_ci}
330662306a36Sopenharmony_ci
330762306a36Sopenharmony_cistatic void alc_fixup_headset_jack(struct hda_codec *codec,
330862306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
330962306a36Sopenharmony_ci{
331062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
331162306a36Sopenharmony_ci	hda_nid_t hp_pin;
331262306a36Sopenharmony_ci
331362306a36Sopenharmony_ci	switch (action) {
331462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
331562306a36Sopenharmony_ci		spec->has_hs_key = 1;
331662306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x55,
331762306a36Sopenharmony_ci						    alc_headset_btn_callback);
331862306a36Sopenharmony_ci		break;
331962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_BUILD:
332062306a36Sopenharmony_ci		hp_pin = alc_get_hp_pin(spec);
332162306a36Sopenharmony_ci		if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
332262306a36Sopenharmony_ci							alc_headset_btn_keymap,
332362306a36Sopenharmony_ci							hp_pin))
332462306a36Sopenharmony_ci			snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
332562306a36Sopenharmony_ci					      false, SND_JACK_HEADSET,
332662306a36Sopenharmony_ci					      alc_headset_btn_keymap);
332762306a36Sopenharmony_ci
332862306a36Sopenharmony_ci		alc_enable_headset_jack_key(codec);
332962306a36Sopenharmony_ci		break;
333062306a36Sopenharmony_ci	}
333162306a36Sopenharmony_ci}
333262306a36Sopenharmony_ci
333362306a36Sopenharmony_cistatic void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
333462306a36Sopenharmony_ci{
333562306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
333662306a36Sopenharmony_ci}
333762306a36Sopenharmony_ci
333862306a36Sopenharmony_cistatic void alc269_shutup(struct hda_codec *codec)
333962306a36Sopenharmony_ci{
334062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
334162306a36Sopenharmony_ci
334262306a36Sopenharmony_ci	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
334362306a36Sopenharmony_ci		alc269vb_toggle_power_output(codec, 0);
334462306a36Sopenharmony_ci	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
334562306a36Sopenharmony_ci			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
334662306a36Sopenharmony_ci		msleep(150);
334762306a36Sopenharmony_ci	}
334862306a36Sopenharmony_ci	alc_shutup_pins(codec);
334962306a36Sopenharmony_ci}
335062306a36Sopenharmony_ci
335162306a36Sopenharmony_cistatic const struct coef_fw alc282_coefs[] = {
335262306a36Sopenharmony_ci	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
335362306a36Sopenharmony_ci	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
335462306a36Sopenharmony_ci	WRITE_COEF(0x07, 0x0200), /* DMIC control */
335562306a36Sopenharmony_ci	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
335662306a36Sopenharmony_ci	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
335762306a36Sopenharmony_ci	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
335862306a36Sopenharmony_ci	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
335962306a36Sopenharmony_ci	WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
336062306a36Sopenharmony_ci	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
336162306a36Sopenharmony_ci	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
336262306a36Sopenharmony_ci	WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
336362306a36Sopenharmony_ci	UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
336462306a36Sopenharmony_ci	WRITE_COEF(0x34, 0xa0c0), /* ANC */
336562306a36Sopenharmony_ci	UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
336662306a36Sopenharmony_ci	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
336762306a36Sopenharmony_ci	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
336862306a36Sopenharmony_ci	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
336962306a36Sopenharmony_ci	WRITE_COEF(0x63, 0x2902), /* PLL */
337062306a36Sopenharmony_ci	WRITE_COEF(0x68, 0xa080), /* capless control 2 */
337162306a36Sopenharmony_ci	WRITE_COEF(0x69, 0x3400), /* capless control 3 */
337262306a36Sopenharmony_ci	WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
337362306a36Sopenharmony_ci	WRITE_COEF(0x6b, 0x0), /* capless control 5 */
337462306a36Sopenharmony_ci	UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
337562306a36Sopenharmony_ci	WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
337662306a36Sopenharmony_ci	UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
337762306a36Sopenharmony_ci	WRITE_COEF(0x71, 0x0014), /* class D test 6 */
337862306a36Sopenharmony_ci	WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
337962306a36Sopenharmony_ci	UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
338062306a36Sopenharmony_ci	WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
338162306a36Sopenharmony_ci	{}
338262306a36Sopenharmony_ci};
338362306a36Sopenharmony_ci
338462306a36Sopenharmony_cistatic void alc282_restore_default_value(struct hda_codec *codec)
338562306a36Sopenharmony_ci{
338662306a36Sopenharmony_ci	alc_process_coef_fw(codec, alc282_coefs);
338762306a36Sopenharmony_ci}
338862306a36Sopenharmony_ci
338962306a36Sopenharmony_cistatic void alc282_init(struct hda_codec *codec)
339062306a36Sopenharmony_ci{
339162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
339262306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
339362306a36Sopenharmony_ci	bool hp_pin_sense;
339462306a36Sopenharmony_ci	int coef78;
339562306a36Sopenharmony_ci
339662306a36Sopenharmony_ci	alc282_restore_default_value(codec);
339762306a36Sopenharmony_ci
339862306a36Sopenharmony_ci	if (!hp_pin)
339962306a36Sopenharmony_ci		return;
340062306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
340162306a36Sopenharmony_ci	coef78 = alc_read_coef_idx(codec, 0x78);
340262306a36Sopenharmony_ci
340362306a36Sopenharmony_ci	/* Index 0x78 Direct Drive HP AMP LPM Control 1 */
340462306a36Sopenharmony_ci	/* Headphone capless set to high power mode */
340562306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x78, 0x9004);
340662306a36Sopenharmony_ci
340762306a36Sopenharmony_ci	if (hp_pin_sense)
340862306a36Sopenharmony_ci		msleep(2);
340962306a36Sopenharmony_ci
341062306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
341162306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
341262306a36Sopenharmony_ci
341362306a36Sopenharmony_ci	if (hp_pin_sense)
341462306a36Sopenharmony_ci		msleep(85);
341562306a36Sopenharmony_ci
341662306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
341762306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
341862306a36Sopenharmony_ci
341962306a36Sopenharmony_ci	if (hp_pin_sense)
342062306a36Sopenharmony_ci		msleep(100);
342162306a36Sopenharmony_ci
342262306a36Sopenharmony_ci	/* Headphone capless set to normal mode */
342362306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x78, coef78);
342462306a36Sopenharmony_ci}
342562306a36Sopenharmony_ci
342662306a36Sopenharmony_cistatic void alc282_shutup(struct hda_codec *codec)
342762306a36Sopenharmony_ci{
342862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
342962306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
343062306a36Sopenharmony_ci	bool hp_pin_sense;
343162306a36Sopenharmony_ci	int coef78;
343262306a36Sopenharmony_ci
343362306a36Sopenharmony_ci	if (!hp_pin) {
343462306a36Sopenharmony_ci		alc269_shutup(codec);
343562306a36Sopenharmony_ci		return;
343662306a36Sopenharmony_ci	}
343762306a36Sopenharmony_ci
343862306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
343962306a36Sopenharmony_ci	coef78 = alc_read_coef_idx(codec, 0x78);
344062306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x78, 0x9004);
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci	if (hp_pin_sense)
344362306a36Sopenharmony_ci		msleep(2);
344462306a36Sopenharmony_ci
344562306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
344662306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
344762306a36Sopenharmony_ci
344862306a36Sopenharmony_ci	if (hp_pin_sense)
344962306a36Sopenharmony_ci		msleep(85);
345062306a36Sopenharmony_ci
345162306a36Sopenharmony_ci	if (!spec->no_shutup_pins)
345262306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
345362306a36Sopenharmony_ci				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
345462306a36Sopenharmony_ci
345562306a36Sopenharmony_ci	if (hp_pin_sense)
345662306a36Sopenharmony_ci		msleep(100);
345762306a36Sopenharmony_ci
345862306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
345962306a36Sopenharmony_ci	alc_shutup_pins(codec);
346062306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x78, coef78);
346162306a36Sopenharmony_ci}
346262306a36Sopenharmony_ci
346362306a36Sopenharmony_cistatic const struct coef_fw alc283_coefs[] = {
346462306a36Sopenharmony_ci	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
346562306a36Sopenharmony_ci	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
346662306a36Sopenharmony_ci	WRITE_COEF(0x07, 0x0200), /* DMIC control */
346762306a36Sopenharmony_ci	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
346862306a36Sopenharmony_ci	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
346962306a36Sopenharmony_ci	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
347062306a36Sopenharmony_ci	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
347162306a36Sopenharmony_ci	WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
347262306a36Sopenharmony_ci	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
347362306a36Sopenharmony_ci	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
347462306a36Sopenharmony_ci	WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
347562306a36Sopenharmony_ci	UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
347662306a36Sopenharmony_ci	WRITE_COEF(0x22, 0xa0c0), /* ANC */
347762306a36Sopenharmony_ci	UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
347862306a36Sopenharmony_ci	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
347962306a36Sopenharmony_ci	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
348062306a36Sopenharmony_ci	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
348162306a36Sopenharmony_ci	WRITE_COEF(0x2e, 0x2902), /* PLL */
348262306a36Sopenharmony_ci	WRITE_COEF(0x33, 0xa080), /* capless control 2 */
348362306a36Sopenharmony_ci	WRITE_COEF(0x34, 0x3400), /* capless control 3 */
348462306a36Sopenharmony_ci	WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
348562306a36Sopenharmony_ci	WRITE_COEF(0x36, 0x0), /* capless control 5 */
348662306a36Sopenharmony_ci	UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
348762306a36Sopenharmony_ci	WRITE_COEF(0x39, 0x110a), /* class D test 3 */
348862306a36Sopenharmony_ci	UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
348962306a36Sopenharmony_ci	WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
349062306a36Sopenharmony_ci	WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
349162306a36Sopenharmony_ci	UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
349262306a36Sopenharmony_ci	WRITE_COEF(0x49, 0x0), /* test mode */
349362306a36Sopenharmony_ci	UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
349462306a36Sopenharmony_ci	UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
349562306a36Sopenharmony_ci	WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
349662306a36Sopenharmony_ci	UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
349762306a36Sopenharmony_ci	{}
349862306a36Sopenharmony_ci};
349962306a36Sopenharmony_ci
350062306a36Sopenharmony_cistatic void alc283_restore_default_value(struct hda_codec *codec)
350162306a36Sopenharmony_ci{
350262306a36Sopenharmony_ci	alc_process_coef_fw(codec, alc283_coefs);
350362306a36Sopenharmony_ci}
350462306a36Sopenharmony_ci
350562306a36Sopenharmony_cistatic void alc283_init(struct hda_codec *codec)
350662306a36Sopenharmony_ci{
350762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
350862306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
350962306a36Sopenharmony_ci	bool hp_pin_sense;
351062306a36Sopenharmony_ci
351162306a36Sopenharmony_ci	alc283_restore_default_value(codec);
351262306a36Sopenharmony_ci
351362306a36Sopenharmony_ci	if (!hp_pin)
351462306a36Sopenharmony_ci		return;
351562306a36Sopenharmony_ci
351662306a36Sopenharmony_ci	msleep(30);
351762306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
351862306a36Sopenharmony_ci
351962306a36Sopenharmony_ci	/* Index 0x43 Direct Drive HP AMP LPM Control 1 */
352062306a36Sopenharmony_ci	/* Headphone capless set to high power mode */
352162306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x43, 0x9004);
352262306a36Sopenharmony_ci
352362306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
352462306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
352562306a36Sopenharmony_ci
352662306a36Sopenharmony_ci	if (hp_pin_sense)
352762306a36Sopenharmony_ci		msleep(85);
352862306a36Sopenharmony_ci
352962306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
353062306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
353162306a36Sopenharmony_ci
353262306a36Sopenharmony_ci	if (hp_pin_sense)
353362306a36Sopenharmony_ci		msleep(85);
353462306a36Sopenharmony_ci	/* Index 0x46 Combo jack auto switch control 2 */
353562306a36Sopenharmony_ci	/* 3k pull low control for Headset jack. */
353662306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
353762306a36Sopenharmony_ci	/* Headphone capless set to normal mode */
353862306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x43, 0x9614);
353962306a36Sopenharmony_ci}
354062306a36Sopenharmony_ci
354162306a36Sopenharmony_cistatic void alc283_shutup(struct hda_codec *codec)
354262306a36Sopenharmony_ci{
354362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
354462306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
354562306a36Sopenharmony_ci	bool hp_pin_sense;
354662306a36Sopenharmony_ci
354762306a36Sopenharmony_ci	if (!hp_pin) {
354862306a36Sopenharmony_ci		alc269_shutup(codec);
354962306a36Sopenharmony_ci		return;
355062306a36Sopenharmony_ci	}
355162306a36Sopenharmony_ci
355262306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
355362306a36Sopenharmony_ci
355462306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x43, 0x9004);
355562306a36Sopenharmony_ci
355662306a36Sopenharmony_ci	/*depop hp during suspend*/
355762306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x06, 0x2100);
355862306a36Sopenharmony_ci
355962306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
356062306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
356162306a36Sopenharmony_ci
356262306a36Sopenharmony_ci	if (hp_pin_sense)
356362306a36Sopenharmony_ci		msleep(100);
356462306a36Sopenharmony_ci
356562306a36Sopenharmony_ci	if (!spec->no_shutup_pins)
356662306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
356762306a36Sopenharmony_ci				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
356862306a36Sopenharmony_ci
356962306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
357062306a36Sopenharmony_ci
357162306a36Sopenharmony_ci	if (hp_pin_sense)
357262306a36Sopenharmony_ci		msleep(100);
357362306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
357462306a36Sopenharmony_ci	alc_shutup_pins(codec);
357562306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x43, 0x9614);
357662306a36Sopenharmony_ci}
357762306a36Sopenharmony_ci
357862306a36Sopenharmony_cistatic void alc256_init(struct hda_codec *codec)
357962306a36Sopenharmony_ci{
358062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
358162306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
358262306a36Sopenharmony_ci	bool hp_pin_sense;
358362306a36Sopenharmony_ci
358462306a36Sopenharmony_ci	if (spec->ultra_low_power) {
358562306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
358662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
358762306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x08, 7<<4, 0);
358862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
358962306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
359062306a36Sopenharmony_ci		msleep(30);
359162306a36Sopenharmony_ci	}
359262306a36Sopenharmony_ci
359362306a36Sopenharmony_ci	if (!hp_pin)
359462306a36Sopenharmony_ci		hp_pin = 0x21;
359562306a36Sopenharmony_ci
359662306a36Sopenharmony_ci	msleep(30);
359762306a36Sopenharmony_ci
359862306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
359962306a36Sopenharmony_ci
360062306a36Sopenharmony_ci	if (hp_pin_sense)
360162306a36Sopenharmony_ci		msleep(2);
360262306a36Sopenharmony_ci
360362306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
360462306a36Sopenharmony_ci
360562306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
360662306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
360762306a36Sopenharmony_ci
360862306a36Sopenharmony_ci	if (hp_pin_sense || spec->ultra_low_power)
360962306a36Sopenharmony_ci		msleep(85);
361062306a36Sopenharmony_ci
361162306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
361262306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
361362306a36Sopenharmony_ci
361462306a36Sopenharmony_ci	if (hp_pin_sense || spec->ultra_low_power)
361562306a36Sopenharmony_ci		msleep(100);
361662306a36Sopenharmony_ci
361762306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
361862306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
361962306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
362062306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
362162306a36Sopenharmony_ci	/*
362262306a36Sopenharmony_ci	 * Expose headphone mic (or possibly Line In on some machines) instead
362362306a36Sopenharmony_ci	 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
362462306a36Sopenharmony_ci	 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
362562306a36Sopenharmony_ci	 * this register.
362662306a36Sopenharmony_ci	 */
362762306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x36, 0x5757);
362862306a36Sopenharmony_ci}
362962306a36Sopenharmony_ci
363062306a36Sopenharmony_cistatic void alc256_shutup(struct hda_codec *codec)
363162306a36Sopenharmony_ci{
363262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
363362306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
363462306a36Sopenharmony_ci	bool hp_pin_sense;
363562306a36Sopenharmony_ci
363662306a36Sopenharmony_ci	if (!hp_pin)
363762306a36Sopenharmony_ci		hp_pin = 0x21;
363862306a36Sopenharmony_ci
363962306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
364062306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
364162306a36Sopenharmony_ci
364262306a36Sopenharmony_ci	if (hp_pin_sense)
364362306a36Sopenharmony_ci		msleep(2);
364462306a36Sopenharmony_ci
364562306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
364662306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
364762306a36Sopenharmony_ci
364862306a36Sopenharmony_ci	if (hp_pin_sense || spec->ultra_low_power)
364962306a36Sopenharmony_ci		msleep(85);
365062306a36Sopenharmony_ci
365162306a36Sopenharmony_ci	/* 3k pull low control for Headset jack. */
365262306a36Sopenharmony_ci	/* NOTE: call this before clearing the pin, otherwise codec stalls */
365362306a36Sopenharmony_ci	/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
365462306a36Sopenharmony_ci	 * when booting with headset plugged. So skip setting it for the codec alc257
365562306a36Sopenharmony_ci	 */
365662306a36Sopenharmony_ci	if (spec->en_3kpull_low)
365762306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
365862306a36Sopenharmony_ci
365962306a36Sopenharmony_ci	if (!spec->no_shutup_pins)
366062306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
366162306a36Sopenharmony_ci				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
366262306a36Sopenharmony_ci
366362306a36Sopenharmony_ci	if (hp_pin_sense || spec->ultra_low_power)
366462306a36Sopenharmony_ci		msleep(100);
366562306a36Sopenharmony_ci
366662306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
366762306a36Sopenharmony_ci	alc_shutup_pins(codec);
366862306a36Sopenharmony_ci	if (spec->ultra_low_power) {
366962306a36Sopenharmony_ci		msleep(50);
367062306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x03, 1<<1, 0);
367162306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
367262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x08, 3<<2, 0);
367362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
367462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
367562306a36Sopenharmony_ci		msleep(30);
367662306a36Sopenharmony_ci	}
367762306a36Sopenharmony_ci}
367862306a36Sopenharmony_ci
367962306a36Sopenharmony_cistatic void alc285_hp_init(struct hda_codec *codec)
368062306a36Sopenharmony_ci{
368162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
368262306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
368362306a36Sopenharmony_ci	int i, val;
368462306a36Sopenharmony_ci	int coef38, coef0d, coef36;
368562306a36Sopenharmony_ci
368662306a36Sopenharmony_ci	alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */
368762306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
368862306a36Sopenharmony_ci	coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
368962306a36Sopenharmony_ci	coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
369062306a36Sopenharmony_ci	coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
369162306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
369262306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
369362306a36Sopenharmony_ci
369462306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
369562306a36Sopenharmony_ci
369662306a36Sopenharmony_ci	if (hp_pin)
369762306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
369862306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
369962306a36Sopenharmony_ci
370062306a36Sopenharmony_ci	msleep(130);
370162306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
370262306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
370362306a36Sopenharmony_ci
370462306a36Sopenharmony_ci	if (hp_pin)
370562306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
370662306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
370762306a36Sopenharmony_ci	msleep(10);
370862306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
370962306a36Sopenharmony_ci	alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
371062306a36Sopenharmony_ci	alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
371162306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
371262306a36Sopenharmony_ci
371362306a36Sopenharmony_ci	alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
371462306a36Sopenharmony_ci	val = alc_read_coefex_idx(codec, 0x58, 0x00);
371562306a36Sopenharmony_ci	for (i = 0; i < 20 && val & 0x8000; i++) {
371662306a36Sopenharmony_ci		msleep(50);
371762306a36Sopenharmony_ci		val = alc_read_coefex_idx(codec, 0x58, 0x00);
371862306a36Sopenharmony_ci	} /* Wait for depop procedure finish  */
371962306a36Sopenharmony_ci
372062306a36Sopenharmony_ci	alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
372162306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
372262306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
372362306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
372462306a36Sopenharmony_ci
372562306a36Sopenharmony_ci	msleep(50);
372662306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
372762306a36Sopenharmony_ci}
372862306a36Sopenharmony_ci
372962306a36Sopenharmony_cistatic void alc225_init(struct hda_codec *codec)
373062306a36Sopenharmony_ci{
373162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
373262306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
373362306a36Sopenharmony_ci	bool hp1_pin_sense, hp2_pin_sense;
373462306a36Sopenharmony_ci
373562306a36Sopenharmony_ci	if (spec->ultra_low_power) {
373662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
373762306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
373862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x33, 1<<11, 0);
373962306a36Sopenharmony_ci		msleep(30);
374062306a36Sopenharmony_ci	}
374162306a36Sopenharmony_ci
374262306a36Sopenharmony_ci	if (spec->codec_variant != ALC269_TYPE_ALC287 &&
374362306a36Sopenharmony_ci		spec->codec_variant != ALC269_TYPE_ALC245)
374462306a36Sopenharmony_ci		/* required only at boot or S3 and S4 resume time */
374562306a36Sopenharmony_ci		if (!spec->done_hp_init ||
374662306a36Sopenharmony_ci			is_s3_resume(codec) ||
374762306a36Sopenharmony_ci			is_s4_resume(codec)) {
374862306a36Sopenharmony_ci			alc285_hp_init(codec);
374962306a36Sopenharmony_ci			spec->done_hp_init = true;
375062306a36Sopenharmony_ci		}
375162306a36Sopenharmony_ci
375262306a36Sopenharmony_ci	if (!hp_pin)
375362306a36Sopenharmony_ci		hp_pin = 0x21;
375462306a36Sopenharmony_ci	msleep(30);
375562306a36Sopenharmony_ci
375662306a36Sopenharmony_ci	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
375762306a36Sopenharmony_ci	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
375862306a36Sopenharmony_ci
375962306a36Sopenharmony_ci	if (hp1_pin_sense || hp2_pin_sense)
376062306a36Sopenharmony_ci		msleep(2);
376162306a36Sopenharmony_ci
376262306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
376362306a36Sopenharmony_ci
376462306a36Sopenharmony_ci	if (hp1_pin_sense || spec->ultra_low_power)
376562306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
376662306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
376762306a36Sopenharmony_ci	if (hp2_pin_sense)
376862306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x16, 0,
376962306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
377062306a36Sopenharmony_ci
377162306a36Sopenharmony_ci	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
377262306a36Sopenharmony_ci		msleep(85);
377362306a36Sopenharmony_ci
377462306a36Sopenharmony_ci	if (hp1_pin_sense || spec->ultra_low_power)
377562306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
377662306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
377762306a36Sopenharmony_ci	if (hp2_pin_sense)
377862306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x16, 0,
377962306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
378062306a36Sopenharmony_ci
378162306a36Sopenharmony_ci	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
378262306a36Sopenharmony_ci		msleep(100);
378362306a36Sopenharmony_ci
378462306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
378562306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
378662306a36Sopenharmony_ci}
378762306a36Sopenharmony_ci
378862306a36Sopenharmony_cistatic void alc225_shutup(struct hda_codec *codec)
378962306a36Sopenharmony_ci{
379062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
379162306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
379262306a36Sopenharmony_ci	bool hp1_pin_sense, hp2_pin_sense;
379362306a36Sopenharmony_ci
379462306a36Sopenharmony_ci	if (!hp_pin)
379562306a36Sopenharmony_ci		hp_pin = 0x21;
379662306a36Sopenharmony_ci
379762306a36Sopenharmony_ci	alc_disable_headset_jack_key(codec);
379862306a36Sopenharmony_ci	/* 3k pull low control for Headset jack. */
379962306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
380062306a36Sopenharmony_ci
380162306a36Sopenharmony_ci	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
380262306a36Sopenharmony_ci	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
380362306a36Sopenharmony_ci
380462306a36Sopenharmony_ci	if (hp1_pin_sense || hp2_pin_sense)
380562306a36Sopenharmony_ci		msleep(2);
380662306a36Sopenharmony_ci
380762306a36Sopenharmony_ci	if (hp1_pin_sense || spec->ultra_low_power)
380862306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
380962306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
381062306a36Sopenharmony_ci	if (hp2_pin_sense)
381162306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x16, 0,
381262306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
381362306a36Sopenharmony_ci
381462306a36Sopenharmony_ci	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
381562306a36Sopenharmony_ci		msleep(85);
381662306a36Sopenharmony_ci
381762306a36Sopenharmony_ci	if (hp1_pin_sense || spec->ultra_low_power)
381862306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
381962306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
382062306a36Sopenharmony_ci	if (hp2_pin_sense)
382162306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x16, 0,
382262306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
382362306a36Sopenharmony_ci
382462306a36Sopenharmony_ci	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
382562306a36Sopenharmony_ci		msleep(100);
382662306a36Sopenharmony_ci
382762306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
382862306a36Sopenharmony_ci	alc_shutup_pins(codec);
382962306a36Sopenharmony_ci	if (spec->ultra_low_power) {
383062306a36Sopenharmony_ci		msleep(50);
383162306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
383262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
383362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
383462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
383562306a36Sopenharmony_ci		msleep(30);
383662306a36Sopenharmony_ci	}
383762306a36Sopenharmony_ci
383862306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
383962306a36Sopenharmony_ci	alc_enable_headset_jack_key(codec);
384062306a36Sopenharmony_ci}
384162306a36Sopenharmony_ci
384262306a36Sopenharmony_cistatic void alc_default_init(struct hda_codec *codec)
384362306a36Sopenharmony_ci{
384462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
384562306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
384662306a36Sopenharmony_ci	bool hp_pin_sense;
384762306a36Sopenharmony_ci
384862306a36Sopenharmony_ci	if (!hp_pin)
384962306a36Sopenharmony_ci		return;
385062306a36Sopenharmony_ci
385162306a36Sopenharmony_ci	msleep(30);
385262306a36Sopenharmony_ci
385362306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
385462306a36Sopenharmony_ci
385562306a36Sopenharmony_ci	if (hp_pin_sense)
385662306a36Sopenharmony_ci		msleep(2);
385762306a36Sopenharmony_ci
385862306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
385962306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
386062306a36Sopenharmony_ci
386162306a36Sopenharmony_ci	if (hp_pin_sense)
386262306a36Sopenharmony_ci		msleep(85);
386362306a36Sopenharmony_ci
386462306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
386562306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
386662306a36Sopenharmony_ci
386762306a36Sopenharmony_ci	if (hp_pin_sense)
386862306a36Sopenharmony_ci		msleep(100);
386962306a36Sopenharmony_ci}
387062306a36Sopenharmony_ci
387162306a36Sopenharmony_cistatic void alc_default_shutup(struct hda_codec *codec)
387262306a36Sopenharmony_ci{
387362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
387462306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
387562306a36Sopenharmony_ci	bool hp_pin_sense;
387662306a36Sopenharmony_ci
387762306a36Sopenharmony_ci	if (!hp_pin) {
387862306a36Sopenharmony_ci		alc269_shutup(codec);
387962306a36Sopenharmony_ci		return;
388062306a36Sopenharmony_ci	}
388162306a36Sopenharmony_ci
388262306a36Sopenharmony_ci	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
388362306a36Sopenharmony_ci
388462306a36Sopenharmony_ci	if (hp_pin_sense)
388562306a36Sopenharmony_ci		msleep(2);
388662306a36Sopenharmony_ci
388762306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
388862306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
388962306a36Sopenharmony_ci
389062306a36Sopenharmony_ci	if (hp_pin_sense)
389162306a36Sopenharmony_ci		msleep(85);
389262306a36Sopenharmony_ci
389362306a36Sopenharmony_ci	if (!spec->no_shutup_pins)
389462306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
389562306a36Sopenharmony_ci				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
389662306a36Sopenharmony_ci
389762306a36Sopenharmony_ci	if (hp_pin_sense)
389862306a36Sopenharmony_ci		msleep(100);
389962306a36Sopenharmony_ci
390062306a36Sopenharmony_ci	alc_auto_setup_eapd(codec, false);
390162306a36Sopenharmony_ci	alc_shutup_pins(codec);
390262306a36Sopenharmony_ci}
390362306a36Sopenharmony_ci
390462306a36Sopenharmony_cistatic void alc294_hp_init(struct hda_codec *codec)
390562306a36Sopenharmony_ci{
390662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
390762306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
390862306a36Sopenharmony_ci	int i, val;
390962306a36Sopenharmony_ci
391062306a36Sopenharmony_ci	if (!hp_pin)
391162306a36Sopenharmony_ci		return;
391262306a36Sopenharmony_ci
391362306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
391462306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
391562306a36Sopenharmony_ci
391662306a36Sopenharmony_ci	msleep(100);
391762306a36Sopenharmony_ci
391862306a36Sopenharmony_ci	if (!spec->no_shutup_pins)
391962306a36Sopenharmony_ci		snd_hda_codec_write(codec, hp_pin, 0,
392062306a36Sopenharmony_ci				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
392162306a36Sopenharmony_ci
392262306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
392362306a36Sopenharmony_ci	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
392462306a36Sopenharmony_ci
392562306a36Sopenharmony_ci	/* Wait for depop procedure finish  */
392662306a36Sopenharmony_ci	val = alc_read_coefex_idx(codec, 0x58, 0x01);
392762306a36Sopenharmony_ci	for (i = 0; i < 20 && val & 0x0080; i++) {
392862306a36Sopenharmony_ci		msleep(50);
392962306a36Sopenharmony_ci		val = alc_read_coefex_idx(codec, 0x58, 0x01);
393062306a36Sopenharmony_ci	}
393162306a36Sopenharmony_ci	/* Set HP depop to auto mode */
393262306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
393362306a36Sopenharmony_ci	msleep(50);
393462306a36Sopenharmony_ci}
393562306a36Sopenharmony_ci
393662306a36Sopenharmony_cistatic void alc294_init(struct hda_codec *codec)
393762306a36Sopenharmony_ci{
393862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
393962306a36Sopenharmony_ci
394062306a36Sopenharmony_ci	/* required only at boot or S4 resume time */
394162306a36Sopenharmony_ci	if (!spec->done_hp_init ||
394262306a36Sopenharmony_ci	    codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
394362306a36Sopenharmony_ci		alc294_hp_init(codec);
394462306a36Sopenharmony_ci		spec->done_hp_init = true;
394562306a36Sopenharmony_ci	}
394662306a36Sopenharmony_ci	alc_default_init(codec);
394762306a36Sopenharmony_ci}
394862306a36Sopenharmony_ci
394962306a36Sopenharmony_cistatic void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
395062306a36Sopenharmony_ci			     unsigned int val)
395162306a36Sopenharmony_ci{
395262306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
395362306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
395462306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
395562306a36Sopenharmony_ci}
395662306a36Sopenharmony_ci
395762306a36Sopenharmony_cistatic int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
395862306a36Sopenharmony_ci{
395962306a36Sopenharmony_ci	unsigned int val;
396062306a36Sopenharmony_ci
396162306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
396262306a36Sopenharmony_ci	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
396362306a36Sopenharmony_ci		& 0xffff;
396462306a36Sopenharmony_ci	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
396562306a36Sopenharmony_ci		<< 16;
396662306a36Sopenharmony_ci	return val;
396762306a36Sopenharmony_ci}
396862306a36Sopenharmony_ci
396962306a36Sopenharmony_cistatic void alc5505_dsp_halt(struct hda_codec *codec)
397062306a36Sopenharmony_ci{
397162306a36Sopenharmony_ci	unsigned int val;
397262306a36Sopenharmony_ci
397362306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
397462306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
397562306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
397662306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
397762306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
397862306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
397962306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
398062306a36Sopenharmony_ci	val = alc5505_coef_get(codec, 0x6220);
398162306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
398262306a36Sopenharmony_ci}
398362306a36Sopenharmony_ci
398462306a36Sopenharmony_cistatic void alc5505_dsp_back_from_halt(struct hda_codec *codec)
398562306a36Sopenharmony_ci{
398662306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x04133302);
398762306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b0, 0x00005b16);
398862306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
398962306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x6230, 0xf80d4011);
399062306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x6220, 0x2002010f);
399162306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x880c, 0x00000004);
399262306a36Sopenharmony_ci}
399362306a36Sopenharmony_ci
399462306a36Sopenharmony_cistatic void alc5505_dsp_init(struct hda_codec *codec)
399562306a36Sopenharmony_ci{
399662306a36Sopenharmony_ci	unsigned int val;
399762306a36Sopenharmony_ci
399862306a36Sopenharmony_ci	alc5505_dsp_halt(codec);
399962306a36Sopenharmony_ci	alc5505_dsp_back_from_halt(codec);
400062306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
400162306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b0, 0x5b16);
400262306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
400362306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b4, 0x04132b02);
400462306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
400562306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x041f3302);
400662306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
400762306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x041b3302);
400862306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x04173302);
400962306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b8, 0x04163302);
401062306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
401162306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
401262306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
401362306a36Sopenharmony_ci
401462306a36Sopenharmony_ci	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
401562306a36Sopenharmony_ci	if (val <= 3)
401662306a36Sopenharmony_ci		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
401762306a36Sopenharmony_ci	else
401862306a36Sopenharmony_ci		alc5505_coef_set(codec, 0x6220, 0x6002018f);
401962306a36Sopenharmony_ci
402062306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
402162306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
402262306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
402362306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
402462306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
402562306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x880c, 0x00000003);
402662306a36Sopenharmony_ci	alc5505_coef_set(codec, 0x880c, 0x00000010);
402762306a36Sopenharmony_ci
402862306a36Sopenharmony_ci#ifdef HALT_REALTEK_ALC5505
402962306a36Sopenharmony_ci	alc5505_dsp_halt(codec);
403062306a36Sopenharmony_ci#endif
403162306a36Sopenharmony_ci}
403262306a36Sopenharmony_ci
403362306a36Sopenharmony_ci#ifdef HALT_REALTEK_ALC5505
403462306a36Sopenharmony_ci#define alc5505_dsp_suspend(codec)	do { } while (0) /* NOP */
403562306a36Sopenharmony_ci#define alc5505_dsp_resume(codec)	do { } while (0) /* NOP */
403662306a36Sopenharmony_ci#else
403762306a36Sopenharmony_ci#define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)
403862306a36Sopenharmony_ci#define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)
403962306a36Sopenharmony_ci#endif
404062306a36Sopenharmony_ci
404162306a36Sopenharmony_ci#ifdef CONFIG_PM
404262306a36Sopenharmony_cistatic int alc269_suspend(struct hda_codec *codec)
404362306a36Sopenharmony_ci{
404462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
404562306a36Sopenharmony_ci
404662306a36Sopenharmony_ci	if (spec->has_alc5505_dsp)
404762306a36Sopenharmony_ci		alc5505_dsp_suspend(codec);
404862306a36Sopenharmony_ci
404962306a36Sopenharmony_ci	return alc_suspend(codec);
405062306a36Sopenharmony_ci}
405162306a36Sopenharmony_ci
405262306a36Sopenharmony_cistatic int alc269_resume(struct hda_codec *codec)
405362306a36Sopenharmony_ci{
405462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
405562306a36Sopenharmony_ci
405662306a36Sopenharmony_ci	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
405762306a36Sopenharmony_ci		alc269vb_toggle_power_output(codec, 0);
405862306a36Sopenharmony_ci	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
405962306a36Sopenharmony_ci			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
406062306a36Sopenharmony_ci		msleep(150);
406162306a36Sopenharmony_ci	}
406262306a36Sopenharmony_ci
406362306a36Sopenharmony_ci	codec->patch_ops.init(codec);
406462306a36Sopenharmony_ci
406562306a36Sopenharmony_ci	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
406662306a36Sopenharmony_ci		alc269vb_toggle_power_output(codec, 1);
406762306a36Sopenharmony_ci	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
406862306a36Sopenharmony_ci			(alc_get_coef0(codec) & 0x00ff) == 0x017) {
406962306a36Sopenharmony_ci		msleep(200);
407062306a36Sopenharmony_ci	}
407162306a36Sopenharmony_ci
407262306a36Sopenharmony_ci	snd_hda_regmap_sync(codec);
407362306a36Sopenharmony_ci	hda_call_check_power_status(codec, 0x01);
407462306a36Sopenharmony_ci
407562306a36Sopenharmony_ci	/* on some machine, the BIOS will clear the codec gpio data when enter
407662306a36Sopenharmony_ci	 * suspend, and won't restore the data after resume, so we restore it
407762306a36Sopenharmony_ci	 * in the driver.
407862306a36Sopenharmony_ci	 */
407962306a36Sopenharmony_ci	if (spec->gpio_data)
408062306a36Sopenharmony_ci		alc_write_gpio_data(codec);
408162306a36Sopenharmony_ci
408262306a36Sopenharmony_ci	if (spec->has_alc5505_dsp)
408362306a36Sopenharmony_ci		alc5505_dsp_resume(codec);
408462306a36Sopenharmony_ci
408562306a36Sopenharmony_ci	return 0;
408662306a36Sopenharmony_ci}
408762306a36Sopenharmony_ci#endif /* CONFIG_PM */
408862306a36Sopenharmony_ci
408962306a36Sopenharmony_cistatic void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
409062306a36Sopenharmony_ci						 const struct hda_fixup *fix, int action)
409162306a36Sopenharmony_ci{
409262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
409362306a36Sopenharmony_ci
409462306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
409562306a36Sopenharmony_ci		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
409662306a36Sopenharmony_ci}
409762306a36Sopenharmony_ci
409862306a36Sopenharmony_cistatic void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
409962306a36Sopenharmony_ci						 const struct hda_fixup *fix,
410062306a36Sopenharmony_ci						 int action)
410162306a36Sopenharmony_ci{
410262306a36Sopenharmony_ci	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
410362306a36Sopenharmony_ci	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
410462306a36Sopenharmony_ci
410562306a36Sopenharmony_ci	if (cfg_headphone && cfg_headset_mic == 0x411111f0)
410662306a36Sopenharmony_ci		snd_hda_codec_set_pincfg(codec, 0x19,
410762306a36Sopenharmony_ci			(cfg_headphone & ~AC_DEFCFG_DEVICE) |
410862306a36Sopenharmony_ci			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
410962306a36Sopenharmony_ci}
411062306a36Sopenharmony_ci
411162306a36Sopenharmony_cistatic void alc269_fixup_hweq(struct hda_codec *codec,
411262306a36Sopenharmony_ci			       const struct hda_fixup *fix, int action)
411362306a36Sopenharmony_ci{
411462306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_INIT)
411562306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x1e, 0, 0x80);
411662306a36Sopenharmony_ci}
411762306a36Sopenharmony_ci
411862306a36Sopenharmony_cistatic void alc269_fixup_headset_mic(struct hda_codec *codec,
411962306a36Sopenharmony_ci				       const struct hda_fixup *fix, int action)
412062306a36Sopenharmony_ci{
412162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
412262306a36Sopenharmony_ci
412362306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
412462306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
412562306a36Sopenharmony_ci}
412662306a36Sopenharmony_ci
412762306a36Sopenharmony_cistatic void alc271_fixup_dmic(struct hda_codec *codec,
412862306a36Sopenharmony_ci			      const struct hda_fixup *fix, int action)
412962306a36Sopenharmony_ci{
413062306a36Sopenharmony_ci	static const struct hda_verb verbs[] = {
413162306a36Sopenharmony_ci		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
413262306a36Sopenharmony_ci		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
413362306a36Sopenharmony_ci		{}
413462306a36Sopenharmony_ci	};
413562306a36Sopenharmony_ci	unsigned int cfg;
413662306a36Sopenharmony_ci
413762306a36Sopenharmony_ci	if (strcmp(codec->core.chip_name, "ALC271X") &&
413862306a36Sopenharmony_ci	    strcmp(codec->core.chip_name, "ALC269VB"))
413962306a36Sopenharmony_ci		return;
414062306a36Sopenharmony_ci	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
414162306a36Sopenharmony_ci	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
414262306a36Sopenharmony_ci		snd_hda_sequence_write(codec, verbs);
414362306a36Sopenharmony_ci}
414462306a36Sopenharmony_ci
414562306a36Sopenharmony_ci/* Fix the speaker amp after resume, etc */
414662306a36Sopenharmony_cistatic void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
414762306a36Sopenharmony_ci					  const struct hda_fixup *fix,
414862306a36Sopenharmony_ci					  int action)
414962306a36Sopenharmony_ci{
415062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_INIT)
415162306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
415262306a36Sopenharmony_ci}
415362306a36Sopenharmony_ci
415462306a36Sopenharmony_cistatic void alc269_fixup_pcm_44k(struct hda_codec *codec,
415562306a36Sopenharmony_ci				 const struct hda_fixup *fix, int action)
415662306a36Sopenharmony_ci{
415762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
415862306a36Sopenharmony_ci
415962306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PROBE)
416062306a36Sopenharmony_ci		return;
416162306a36Sopenharmony_ci
416262306a36Sopenharmony_ci	/* Due to a hardware problem on Lenovo Ideadpad, we need to
416362306a36Sopenharmony_ci	 * fix the sample rate of analog I/O to 44.1kHz
416462306a36Sopenharmony_ci	 */
416562306a36Sopenharmony_ci	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
416662306a36Sopenharmony_ci	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
416762306a36Sopenharmony_ci}
416862306a36Sopenharmony_ci
416962306a36Sopenharmony_cistatic void alc269_fixup_stereo_dmic(struct hda_codec *codec,
417062306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
417162306a36Sopenharmony_ci{
417262306a36Sopenharmony_ci	/* The digital-mic unit sends PDM (differential signal) instead of
417362306a36Sopenharmony_ci	 * the standard PCM, thus you can't record a valid mono stream as is.
417462306a36Sopenharmony_ci	 * Below is a workaround specific to ALC269 to control the dmic
417562306a36Sopenharmony_ci	 * signal source as mono.
417662306a36Sopenharmony_ci	 */
417762306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_INIT)
417862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x07, 0, 0x80);
417962306a36Sopenharmony_ci}
418062306a36Sopenharmony_ci
418162306a36Sopenharmony_cistatic void alc269_quanta_automute(struct hda_codec *codec)
418262306a36Sopenharmony_ci{
418362306a36Sopenharmony_ci	snd_hda_gen_update_outputs(codec);
418462306a36Sopenharmony_ci
418562306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x0c, 0x680);
418662306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x0c, 0x480);
418762306a36Sopenharmony_ci}
418862306a36Sopenharmony_ci
418962306a36Sopenharmony_cistatic void alc269_fixup_quanta_mute(struct hda_codec *codec,
419062306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
419162306a36Sopenharmony_ci{
419262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
419362306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PROBE)
419462306a36Sopenharmony_ci		return;
419562306a36Sopenharmony_ci	spec->gen.automute_hook = alc269_quanta_automute;
419662306a36Sopenharmony_ci}
419762306a36Sopenharmony_ci
419862306a36Sopenharmony_cistatic void alc269_x101_hp_automute_hook(struct hda_codec *codec,
419962306a36Sopenharmony_ci					 struct hda_jack_callback *jack)
420062306a36Sopenharmony_ci{
420162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
420262306a36Sopenharmony_ci	int vref;
420362306a36Sopenharmony_ci	msleep(200);
420462306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
420562306a36Sopenharmony_ci
420662306a36Sopenharmony_ci	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
420762306a36Sopenharmony_ci	msleep(100);
420862306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
420962306a36Sopenharmony_ci			    vref);
421062306a36Sopenharmony_ci	msleep(500);
421162306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
421262306a36Sopenharmony_ci			    vref);
421362306a36Sopenharmony_ci}
421462306a36Sopenharmony_ci
421562306a36Sopenharmony_ci/*
421662306a36Sopenharmony_ci * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
421762306a36Sopenharmony_ci */
421862306a36Sopenharmony_cistruct hda_alc298_mbxinit {
421962306a36Sopenharmony_ci	unsigned char value_0x23;
422062306a36Sopenharmony_ci	unsigned char value_0x25;
422162306a36Sopenharmony_ci};
422262306a36Sopenharmony_ci
422362306a36Sopenharmony_cistatic void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
422462306a36Sopenharmony_ci					 const struct hda_alc298_mbxinit *initval,
422562306a36Sopenharmony_ci					 bool first)
422662306a36Sopenharmony_ci{
422762306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
422862306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x26, 0xb000);
422962306a36Sopenharmony_ci
423062306a36Sopenharmony_ci	if (first)
423162306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
423262306a36Sopenharmony_ci
423362306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
423462306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x26, 0xf000);
423562306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x23, initval->value_0x23);
423662306a36Sopenharmony_ci
423762306a36Sopenharmony_ci	if (initval->value_0x23 != 0x1e)
423862306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x25, initval->value_0x25);
423962306a36Sopenharmony_ci
424062306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
424162306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
424262306a36Sopenharmony_ci}
424362306a36Sopenharmony_ci
424462306a36Sopenharmony_cistatic void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
424562306a36Sopenharmony_ci					   const struct hda_fixup *fix,
424662306a36Sopenharmony_ci					   int action)
424762306a36Sopenharmony_ci{
424862306a36Sopenharmony_ci	/* Initialization magic */
424962306a36Sopenharmony_ci	static const struct hda_alc298_mbxinit dac_init[] = {
425062306a36Sopenharmony_ci		{0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
425162306a36Sopenharmony_ci		{0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
425262306a36Sopenharmony_ci		{0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
425362306a36Sopenharmony_ci		{0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
425462306a36Sopenharmony_ci		{0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
425562306a36Sopenharmony_ci		{0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
425662306a36Sopenharmony_ci		{0x2f, 0x00},
425762306a36Sopenharmony_ci		{0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
425862306a36Sopenharmony_ci		{0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
425962306a36Sopenharmony_ci		{0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
426062306a36Sopenharmony_ci		{}
426162306a36Sopenharmony_ci	};
426262306a36Sopenharmony_ci	const struct hda_alc298_mbxinit *seq;
426362306a36Sopenharmony_ci
426462306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_INIT)
426562306a36Sopenharmony_ci		return;
426662306a36Sopenharmony_ci
426762306a36Sopenharmony_ci	/* Start */
426862306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
426962306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
427062306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x26, 0xf000);
427162306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x22, 0x31);
427262306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x23, 0x0b);
427362306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x25, 0x00);
427462306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
427562306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
427662306a36Sopenharmony_ci
427762306a36Sopenharmony_ci	for (seq = dac_init; seq->value_0x23; seq++)
427862306a36Sopenharmony_ci		alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
427962306a36Sopenharmony_ci}
428062306a36Sopenharmony_ci
428162306a36Sopenharmony_cistatic void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
428262306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
428362306a36Sopenharmony_ci{
428462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
428562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
428662306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
428762306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
428862306a36Sopenharmony_ci	}
428962306a36Sopenharmony_ci}
429062306a36Sopenharmony_ci
429162306a36Sopenharmony_cistatic void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
429262306a36Sopenharmony_ci				bool polarity, bool on)
429362306a36Sopenharmony_ci{
429462306a36Sopenharmony_ci	unsigned int pinval;
429562306a36Sopenharmony_ci
429662306a36Sopenharmony_ci	if (!pin)
429762306a36Sopenharmony_ci		return;
429862306a36Sopenharmony_ci	if (polarity)
429962306a36Sopenharmony_ci		on = !on;
430062306a36Sopenharmony_ci	pinval = snd_hda_codec_get_pin_target(codec, pin);
430162306a36Sopenharmony_ci	pinval &= ~AC_PINCTL_VREFEN;
430262306a36Sopenharmony_ci	pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
430362306a36Sopenharmony_ci	/* temporarily power up/down for setting VREF */
430462306a36Sopenharmony_ci	snd_hda_power_up_pm(codec);
430562306a36Sopenharmony_ci	snd_hda_set_pin_ctl_cache(codec, pin, pinval);
430662306a36Sopenharmony_ci	snd_hda_power_down_pm(codec);
430762306a36Sopenharmony_ci}
430862306a36Sopenharmony_ci
430962306a36Sopenharmony_ci/* update mute-LED according to the speaker mute state via mic VREF pin */
431062306a36Sopenharmony_cistatic int vref_mute_led_set(struct led_classdev *led_cdev,
431162306a36Sopenharmony_ci			     enum led_brightness brightness)
431262306a36Sopenharmony_ci{
431362306a36Sopenharmony_ci	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
431462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
431562306a36Sopenharmony_ci
431662306a36Sopenharmony_ci	alc_update_vref_led(codec, spec->mute_led_nid,
431762306a36Sopenharmony_ci			    spec->mute_led_polarity, brightness);
431862306a36Sopenharmony_ci	return 0;
431962306a36Sopenharmony_ci}
432062306a36Sopenharmony_ci
432162306a36Sopenharmony_ci/* Make sure the led works even in runtime suspend */
432262306a36Sopenharmony_cistatic unsigned int led_power_filter(struct hda_codec *codec,
432362306a36Sopenharmony_ci						  hda_nid_t nid,
432462306a36Sopenharmony_ci						  unsigned int power_state)
432562306a36Sopenharmony_ci{
432662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
432762306a36Sopenharmony_ci
432862306a36Sopenharmony_ci	if (power_state != AC_PWRST_D3 || nid == 0 ||
432962306a36Sopenharmony_ci	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
433062306a36Sopenharmony_ci		return power_state;
433162306a36Sopenharmony_ci
433262306a36Sopenharmony_ci	/* Set pin ctl again, it might have just been set to 0 */
433362306a36Sopenharmony_ci	snd_hda_set_pin_ctl(codec, nid,
433462306a36Sopenharmony_ci			    snd_hda_codec_get_pin_target(codec, nid));
433562306a36Sopenharmony_ci
433662306a36Sopenharmony_ci	return snd_hda_gen_path_power_filter(codec, nid, power_state);
433762306a36Sopenharmony_ci}
433862306a36Sopenharmony_ci
433962306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led(struct hda_codec *codec,
434062306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
434162306a36Sopenharmony_ci{
434262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
434362306a36Sopenharmony_ci	const struct dmi_device *dev = NULL;
434462306a36Sopenharmony_ci
434562306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
434662306a36Sopenharmony_ci		return;
434762306a36Sopenharmony_ci
434862306a36Sopenharmony_ci	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
434962306a36Sopenharmony_ci		int pol, pin;
435062306a36Sopenharmony_ci		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
435162306a36Sopenharmony_ci			continue;
435262306a36Sopenharmony_ci		if (pin < 0x0a || pin >= 0x10)
435362306a36Sopenharmony_ci			break;
435462306a36Sopenharmony_ci		spec->mute_led_polarity = pol;
435562306a36Sopenharmony_ci		spec->mute_led_nid = pin - 0x0a + 0x18;
435662306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
435762306a36Sopenharmony_ci		codec->power_filter = led_power_filter;
435862306a36Sopenharmony_ci		codec_dbg(codec,
435962306a36Sopenharmony_ci			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,
436062306a36Sopenharmony_ci			   spec->mute_led_polarity);
436162306a36Sopenharmony_ci		break;
436262306a36Sopenharmony_ci	}
436362306a36Sopenharmony_ci}
436462306a36Sopenharmony_ci
436562306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
436662306a36Sopenharmony_ci					  const struct hda_fixup *fix,
436762306a36Sopenharmony_ci					  int action, hda_nid_t pin)
436862306a36Sopenharmony_ci{
436962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
437062306a36Sopenharmony_ci
437162306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
437262306a36Sopenharmony_ci		spec->mute_led_polarity = 0;
437362306a36Sopenharmony_ci		spec->mute_led_nid = pin;
437462306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
437562306a36Sopenharmony_ci		codec->power_filter = led_power_filter;
437662306a36Sopenharmony_ci	}
437762306a36Sopenharmony_ci}
437862306a36Sopenharmony_ci
437962306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
438062306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
438162306a36Sopenharmony_ci{
438262306a36Sopenharmony_ci	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
438362306a36Sopenharmony_ci}
438462306a36Sopenharmony_ci
438562306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
438662306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
438762306a36Sopenharmony_ci{
438862306a36Sopenharmony_ci	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
438962306a36Sopenharmony_ci}
439062306a36Sopenharmony_ci
439162306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
439262306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
439362306a36Sopenharmony_ci{
439462306a36Sopenharmony_ci	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
439562306a36Sopenharmony_ci}
439662306a36Sopenharmony_ci
439762306a36Sopenharmony_ci/* update LED status via GPIO */
439862306a36Sopenharmony_cistatic void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
439962306a36Sopenharmony_ci				int polarity, bool enabled)
440062306a36Sopenharmony_ci{
440162306a36Sopenharmony_ci	if (polarity)
440262306a36Sopenharmony_ci		enabled = !enabled;
440362306a36Sopenharmony_ci	alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
440462306a36Sopenharmony_ci}
440562306a36Sopenharmony_ci
440662306a36Sopenharmony_ci/* turn on/off mute LED via GPIO per vmaster hook */
440762306a36Sopenharmony_cistatic int gpio_mute_led_set(struct led_classdev *led_cdev,
440862306a36Sopenharmony_ci			     enum led_brightness brightness)
440962306a36Sopenharmony_ci{
441062306a36Sopenharmony_ci	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
441162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
441262306a36Sopenharmony_ci
441362306a36Sopenharmony_ci	alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
441462306a36Sopenharmony_ci			    spec->mute_led_polarity, !brightness);
441562306a36Sopenharmony_ci	return 0;
441662306a36Sopenharmony_ci}
441762306a36Sopenharmony_ci
441862306a36Sopenharmony_ci/* turn on/off mic-mute LED via GPIO per capture hook */
441962306a36Sopenharmony_cistatic int micmute_led_set(struct led_classdev *led_cdev,
442062306a36Sopenharmony_ci			   enum led_brightness brightness)
442162306a36Sopenharmony_ci{
442262306a36Sopenharmony_ci	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
442362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
442462306a36Sopenharmony_ci
442562306a36Sopenharmony_ci	alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
442662306a36Sopenharmony_ci			    spec->micmute_led_polarity, !brightness);
442762306a36Sopenharmony_ci	return 0;
442862306a36Sopenharmony_ci}
442962306a36Sopenharmony_ci
443062306a36Sopenharmony_ci/* setup mute and mic-mute GPIO bits, add hooks appropriately */
443162306a36Sopenharmony_cistatic void alc_fixup_hp_gpio_led(struct hda_codec *codec,
443262306a36Sopenharmony_ci				  int action,
443362306a36Sopenharmony_ci				  unsigned int mute_mask,
443462306a36Sopenharmony_ci				  unsigned int micmute_mask)
443562306a36Sopenharmony_ci{
443662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
443762306a36Sopenharmony_ci
443862306a36Sopenharmony_ci	alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
443962306a36Sopenharmony_ci
444062306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
444162306a36Sopenharmony_ci		return;
444262306a36Sopenharmony_ci	if (mute_mask) {
444362306a36Sopenharmony_ci		spec->gpio_mute_led_mask = mute_mask;
444462306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
444562306a36Sopenharmony_ci	}
444662306a36Sopenharmony_ci	if (micmute_mask) {
444762306a36Sopenharmony_ci		spec->gpio_mic_led_mask = micmute_mask;
444862306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
444962306a36Sopenharmony_ci	}
445062306a36Sopenharmony_ci}
445162306a36Sopenharmony_ci
445262306a36Sopenharmony_cistatic void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
445362306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
445462306a36Sopenharmony_ci{
445562306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
445662306a36Sopenharmony_ci}
445762306a36Sopenharmony_ci
445862306a36Sopenharmony_cistatic void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
445962306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
446062306a36Sopenharmony_ci{
446162306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
446262306a36Sopenharmony_ci}
446362306a36Sopenharmony_ci
446462306a36Sopenharmony_cistatic void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
446562306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
446662306a36Sopenharmony_ci{
446762306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
446862306a36Sopenharmony_ci}
446962306a36Sopenharmony_ci
447062306a36Sopenharmony_cistatic void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
447162306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
447262306a36Sopenharmony_ci{
447362306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
447462306a36Sopenharmony_ci}
447562306a36Sopenharmony_ci
447662306a36Sopenharmony_cistatic void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
447762306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
447862306a36Sopenharmony_ci{
447962306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
448062306a36Sopenharmony_ci}
448162306a36Sopenharmony_ci
448262306a36Sopenharmony_cistatic void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
448362306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
448462306a36Sopenharmony_ci{
448562306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
448662306a36Sopenharmony_ci
448762306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
448862306a36Sopenharmony_ci		spec->micmute_led_polarity = 1;
448962306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
449062306a36Sopenharmony_ci}
449162306a36Sopenharmony_ci
449262306a36Sopenharmony_ci/* turn on/off mic-mute LED per capture hook via VREF change */
449362306a36Sopenharmony_cistatic int vref_micmute_led_set(struct led_classdev *led_cdev,
449462306a36Sopenharmony_ci				enum led_brightness brightness)
449562306a36Sopenharmony_ci{
449662306a36Sopenharmony_ci	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
449762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
449862306a36Sopenharmony_ci
449962306a36Sopenharmony_ci	alc_update_vref_led(codec, spec->cap_mute_led_nid,
450062306a36Sopenharmony_ci			    spec->micmute_led_polarity, brightness);
450162306a36Sopenharmony_ci	return 0;
450262306a36Sopenharmony_ci}
450362306a36Sopenharmony_ci
450462306a36Sopenharmony_cistatic void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
450562306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
450662306a36Sopenharmony_ci{
450762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
450862306a36Sopenharmony_ci
450962306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
451062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
451162306a36Sopenharmony_ci		/* Like hp_gpio_mic1_led, but also needs GPIO4 low to
451262306a36Sopenharmony_ci		 * enable headphone amp
451362306a36Sopenharmony_ci		 */
451462306a36Sopenharmony_ci		spec->gpio_mask |= 0x10;
451562306a36Sopenharmony_ci		spec->gpio_dir |= 0x10;
451662306a36Sopenharmony_ci		spec->cap_mute_led_nid = 0x18;
451762306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
451862306a36Sopenharmony_ci		codec->power_filter = led_power_filter;
451962306a36Sopenharmony_ci	}
452062306a36Sopenharmony_ci}
452162306a36Sopenharmony_ci
452262306a36Sopenharmony_cistatic void alc280_fixup_hp_gpio4(struct hda_codec *codec,
452362306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
452462306a36Sopenharmony_ci{
452562306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
452662306a36Sopenharmony_ci
452762306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
452862306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
452962306a36Sopenharmony_ci		spec->cap_mute_led_nid = 0x18;
453062306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
453162306a36Sopenharmony_ci		codec->power_filter = led_power_filter;
453262306a36Sopenharmony_ci	}
453362306a36Sopenharmony_ci}
453462306a36Sopenharmony_ci
453562306a36Sopenharmony_ci/* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
453662306a36Sopenharmony_ci * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
453762306a36Sopenharmony_ci */
453862306a36Sopenharmony_cistatic void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
453962306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
454062306a36Sopenharmony_ci{
454162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
454262306a36Sopenharmony_ci
454362306a36Sopenharmony_ci	switch (action) {
454462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
454562306a36Sopenharmony_ci		spec->gpio_mask |= 0x01;
454662306a36Sopenharmony_ci		spec->gpio_dir |= 0x01;
454762306a36Sopenharmony_ci		break;
454862306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
454962306a36Sopenharmony_ci		/* need to toggle GPIO to enable the amp */
455062306a36Sopenharmony_ci		alc_update_gpio_data(codec, 0x01, true);
455162306a36Sopenharmony_ci		msleep(100);
455262306a36Sopenharmony_ci		alc_update_gpio_data(codec, 0x01, false);
455362306a36Sopenharmony_ci		break;
455462306a36Sopenharmony_ci	}
455562306a36Sopenharmony_ci}
455662306a36Sopenharmony_ci
455762306a36Sopenharmony_ci/* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
455862306a36Sopenharmony_cistatic void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
455962306a36Sopenharmony_ci				    struct hda_codec *codec,
456062306a36Sopenharmony_ci				    struct snd_pcm_substream *substream,
456162306a36Sopenharmony_ci				    int action)
456262306a36Sopenharmony_ci{
456362306a36Sopenharmony_ci	switch (action) {
456462306a36Sopenharmony_ci	case HDA_GEN_PCM_ACT_PREPARE:
456562306a36Sopenharmony_ci		alc_update_gpio_data(codec, 0x04, true);
456662306a36Sopenharmony_ci		break;
456762306a36Sopenharmony_ci	case HDA_GEN_PCM_ACT_CLEANUP:
456862306a36Sopenharmony_ci		alc_update_gpio_data(codec, 0x04, false);
456962306a36Sopenharmony_ci		break;
457062306a36Sopenharmony_ci	}
457162306a36Sopenharmony_ci}
457262306a36Sopenharmony_ci
457362306a36Sopenharmony_cistatic void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
457462306a36Sopenharmony_ci				      const struct hda_fixup *fix,
457562306a36Sopenharmony_ci				      int action)
457662306a36Sopenharmony_ci{
457762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
457862306a36Sopenharmony_ci
457962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PROBE) {
458062306a36Sopenharmony_ci		spec->gpio_mask |= 0x04;
458162306a36Sopenharmony_ci		spec->gpio_dir |= 0x04;
458262306a36Sopenharmony_ci		spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
458362306a36Sopenharmony_ci	}
458462306a36Sopenharmony_ci}
458562306a36Sopenharmony_ci
458662306a36Sopenharmony_cistatic void alc_update_coef_led(struct hda_codec *codec,
458762306a36Sopenharmony_ci				struct alc_coef_led *led,
458862306a36Sopenharmony_ci				bool polarity, bool on)
458962306a36Sopenharmony_ci{
459062306a36Sopenharmony_ci	if (polarity)
459162306a36Sopenharmony_ci		on = !on;
459262306a36Sopenharmony_ci	/* temporarily power up/down for setting COEF bit */
459362306a36Sopenharmony_ci	alc_update_coef_idx(codec, led->idx, led->mask,
459462306a36Sopenharmony_ci			    on ? led->on : led->off);
459562306a36Sopenharmony_ci}
459662306a36Sopenharmony_ci
459762306a36Sopenharmony_ci/* update mute-LED according to the speaker mute state via COEF bit */
459862306a36Sopenharmony_cistatic int coef_mute_led_set(struct led_classdev *led_cdev,
459962306a36Sopenharmony_ci			     enum led_brightness brightness)
460062306a36Sopenharmony_ci{
460162306a36Sopenharmony_ci	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
460262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
460362306a36Sopenharmony_ci
460462306a36Sopenharmony_ci	alc_update_coef_led(codec, &spec->mute_led_coef,
460562306a36Sopenharmony_ci			    spec->mute_led_polarity, brightness);
460662306a36Sopenharmony_ci	return 0;
460762306a36Sopenharmony_ci}
460862306a36Sopenharmony_ci
460962306a36Sopenharmony_cistatic void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
461062306a36Sopenharmony_ci					  const struct hda_fixup *fix,
461162306a36Sopenharmony_ci					  int action)
461262306a36Sopenharmony_ci{
461362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
461462306a36Sopenharmony_ci
461562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
461662306a36Sopenharmony_ci		spec->mute_led_polarity = 0;
461762306a36Sopenharmony_ci		spec->mute_led_coef.idx = 0x0b;
461862306a36Sopenharmony_ci		spec->mute_led_coef.mask = 1 << 3;
461962306a36Sopenharmony_ci		spec->mute_led_coef.on = 1 << 3;
462062306a36Sopenharmony_ci		spec->mute_led_coef.off = 0;
462162306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
462262306a36Sopenharmony_ci	}
462362306a36Sopenharmony_ci}
462462306a36Sopenharmony_ci
462562306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
462662306a36Sopenharmony_ci					  const struct hda_fixup *fix,
462762306a36Sopenharmony_ci					  int action)
462862306a36Sopenharmony_ci{
462962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
463062306a36Sopenharmony_ci
463162306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
463262306a36Sopenharmony_ci		spec->mute_led_polarity = 0;
463362306a36Sopenharmony_ci		spec->mute_led_coef.idx = 0x34;
463462306a36Sopenharmony_ci		spec->mute_led_coef.mask = 1 << 5;
463562306a36Sopenharmony_ci		spec->mute_led_coef.on = 0;
463662306a36Sopenharmony_ci		spec->mute_led_coef.off = 1 << 5;
463762306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
463862306a36Sopenharmony_ci	}
463962306a36Sopenharmony_ci}
464062306a36Sopenharmony_ci
464162306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
464262306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
464362306a36Sopenharmony_ci{
464462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
464562306a36Sopenharmony_ci
464662306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
464762306a36Sopenharmony_ci		spec->mute_led_polarity = 0;
464862306a36Sopenharmony_ci		spec->mute_led_coef.idx = 0x07;
464962306a36Sopenharmony_ci		spec->mute_led_coef.mask = 1;
465062306a36Sopenharmony_ci		spec->mute_led_coef.on = 1;
465162306a36Sopenharmony_ci		spec->mute_led_coef.off = 0;
465262306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
465362306a36Sopenharmony_ci	}
465462306a36Sopenharmony_ci}
465562306a36Sopenharmony_ci
465662306a36Sopenharmony_cistatic void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
465762306a36Sopenharmony_ci					  const struct hda_fixup *fix,
465862306a36Sopenharmony_ci					  int action)
465962306a36Sopenharmony_ci{
466062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
466162306a36Sopenharmony_ci
466262306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
466362306a36Sopenharmony_ci		spec->mute_led_polarity = 0;
466462306a36Sopenharmony_ci		spec->mute_led_coef.idx = 0x0b;
466562306a36Sopenharmony_ci		spec->mute_led_coef.mask = 3 << 2;
466662306a36Sopenharmony_ci		spec->mute_led_coef.on = 2 << 2;
466762306a36Sopenharmony_ci		spec->mute_led_coef.off = 1 << 2;
466862306a36Sopenharmony_ci		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
466962306a36Sopenharmony_ci	}
467062306a36Sopenharmony_ci}
467162306a36Sopenharmony_ci
467262306a36Sopenharmony_ci/* turn on/off mic-mute LED per capture hook by coef bit */
467362306a36Sopenharmony_cistatic int coef_micmute_led_set(struct led_classdev *led_cdev,
467462306a36Sopenharmony_ci				enum led_brightness brightness)
467562306a36Sopenharmony_ci{
467662306a36Sopenharmony_ci	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
467762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
467862306a36Sopenharmony_ci
467962306a36Sopenharmony_ci	alc_update_coef_led(codec, &spec->mic_led_coef,
468062306a36Sopenharmony_ci			    spec->micmute_led_polarity, brightness);
468162306a36Sopenharmony_ci	return 0;
468262306a36Sopenharmony_ci}
468362306a36Sopenharmony_ci
468462306a36Sopenharmony_cistatic void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
468562306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
468662306a36Sopenharmony_ci{
468762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
468862306a36Sopenharmony_ci
468962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
469062306a36Sopenharmony_ci		spec->mic_led_coef.idx = 0x19;
469162306a36Sopenharmony_ci		spec->mic_led_coef.mask = 1 << 13;
469262306a36Sopenharmony_ci		spec->mic_led_coef.on = 1 << 13;
469362306a36Sopenharmony_ci		spec->mic_led_coef.off = 0;
469462306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
469562306a36Sopenharmony_ci	}
469662306a36Sopenharmony_ci}
469762306a36Sopenharmony_ci
469862306a36Sopenharmony_cistatic void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
469962306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
470062306a36Sopenharmony_ci{
470162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
470262306a36Sopenharmony_ci
470362306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
470462306a36Sopenharmony_ci		spec->micmute_led_polarity = 1;
470562306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
470662306a36Sopenharmony_ci}
470762306a36Sopenharmony_ci
470862306a36Sopenharmony_cistatic void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
470962306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
471062306a36Sopenharmony_ci{
471162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
471262306a36Sopenharmony_ci
471362306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
471462306a36Sopenharmony_ci		spec->mic_led_coef.idx = 0x35;
471562306a36Sopenharmony_ci		spec->mic_led_coef.mask = 3 << 2;
471662306a36Sopenharmony_ci		spec->mic_led_coef.on = 2 << 2;
471762306a36Sopenharmony_ci		spec->mic_led_coef.off = 1 << 2;
471862306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
471962306a36Sopenharmony_ci	}
472062306a36Sopenharmony_ci}
472162306a36Sopenharmony_ci
472262306a36Sopenharmony_cistatic void alc285_fixup_hp_mute_led(struct hda_codec *codec,
472362306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
472462306a36Sopenharmony_ci{
472562306a36Sopenharmony_ci	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
472662306a36Sopenharmony_ci	alc285_fixup_hp_coef_micmute_led(codec, fix, action);
472762306a36Sopenharmony_ci}
472862306a36Sopenharmony_ci
472962306a36Sopenharmony_cistatic void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
473062306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
473162306a36Sopenharmony_ci{
473262306a36Sopenharmony_ci	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
473362306a36Sopenharmony_ci	alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
473462306a36Sopenharmony_ci}
473562306a36Sopenharmony_ci
473662306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led(struct hda_codec *codec,
473762306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
473862306a36Sopenharmony_ci{
473962306a36Sopenharmony_ci	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
474062306a36Sopenharmony_ci	alc236_fixup_hp_coef_micmute_led(codec, fix, action);
474162306a36Sopenharmony_ci}
474262306a36Sopenharmony_ci
474362306a36Sopenharmony_cistatic void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
474462306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
474562306a36Sopenharmony_ci{
474662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
474762306a36Sopenharmony_ci
474862306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
474962306a36Sopenharmony_ci		spec->cap_mute_led_nid = 0x1a;
475062306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
475162306a36Sopenharmony_ci		codec->power_filter = led_power_filter;
475262306a36Sopenharmony_ci	}
475362306a36Sopenharmony_ci}
475462306a36Sopenharmony_ci
475562306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
475662306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
475762306a36Sopenharmony_ci{
475862306a36Sopenharmony_ci	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
475962306a36Sopenharmony_ci	alc236_fixup_hp_micmute_led_vref(codec, fix, action);
476062306a36Sopenharmony_ci}
476162306a36Sopenharmony_ci
476262306a36Sopenharmony_cistatic inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
476362306a36Sopenharmony_ci						  const unsigned short coefs[2])
476462306a36Sopenharmony_ci{
476562306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x23, coefs[0]);
476662306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x25, coefs[1]);
476762306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x26, 0xb011);
476862306a36Sopenharmony_ci}
476962306a36Sopenharmony_ci
477062306a36Sopenharmony_cistruct alc298_samsung_amp_desc {
477162306a36Sopenharmony_ci	unsigned char nid;
477262306a36Sopenharmony_ci	unsigned short init_seq[2][2];
477362306a36Sopenharmony_ci};
477462306a36Sopenharmony_ci
477562306a36Sopenharmony_cistatic void alc298_fixup_samsung_amp(struct hda_codec *codec,
477662306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
477762306a36Sopenharmony_ci{
477862306a36Sopenharmony_ci	int i, j;
477962306a36Sopenharmony_ci	static const unsigned short init_seq[][2] = {
478062306a36Sopenharmony_ci		{ 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
478162306a36Sopenharmony_ci		{ 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
478262306a36Sopenharmony_ci		{ 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
478362306a36Sopenharmony_ci		{ 0x41, 0x07 }, { 0x400, 0x1 }
478462306a36Sopenharmony_ci	};
478562306a36Sopenharmony_ci	static const struct alc298_samsung_amp_desc amps[] = {
478662306a36Sopenharmony_ci		{ 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
478762306a36Sopenharmony_ci		{ 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
478862306a36Sopenharmony_ci	};
478962306a36Sopenharmony_ci
479062306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_INIT)
479162306a36Sopenharmony_ci		return;
479262306a36Sopenharmony_ci
479362306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(amps); i++) {
479462306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x22, amps[i].nid);
479562306a36Sopenharmony_ci
479662306a36Sopenharmony_ci		for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
479762306a36Sopenharmony_ci			alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
479862306a36Sopenharmony_ci
479962306a36Sopenharmony_ci		for (j = 0; j < ARRAY_SIZE(init_seq); j++)
480062306a36Sopenharmony_ci			alc298_samsung_write_coef_pack(codec, init_seq[j]);
480162306a36Sopenharmony_ci	}
480262306a36Sopenharmony_ci}
480362306a36Sopenharmony_ci
480462306a36Sopenharmony_ci#if IS_REACHABLE(CONFIG_INPUT)
480562306a36Sopenharmony_cistatic void gpio2_mic_hotkey_event(struct hda_codec *codec,
480662306a36Sopenharmony_ci				   struct hda_jack_callback *event)
480762306a36Sopenharmony_ci{
480862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
480962306a36Sopenharmony_ci
481062306a36Sopenharmony_ci	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
481162306a36Sopenharmony_ci	   send both key on and key off event for every interrupt. */
481262306a36Sopenharmony_ci	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
481362306a36Sopenharmony_ci	input_sync(spec->kb_dev);
481462306a36Sopenharmony_ci	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
481562306a36Sopenharmony_ci	input_sync(spec->kb_dev);
481662306a36Sopenharmony_ci}
481762306a36Sopenharmony_ci
481862306a36Sopenharmony_cistatic int alc_register_micmute_input_device(struct hda_codec *codec)
481962306a36Sopenharmony_ci{
482062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
482162306a36Sopenharmony_ci	int i;
482262306a36Sopenharmony_ci
482362306a36Sopenharmony_ci	spec->kb_dev = input_allocate_device();
482462306a36Sopenharmony_ci	if (!spec->kb_dev) {
482562306a36Sopenharmony_ci		codec_err(codec, "Out of memory (input_allocate_device)\n");
482662306a36Sopenharmony_ci		return -ENOMEM;
482762306a36Sopenharmony_ci	}
482862306a36Sopenharmony_ci
482962306a36Sopenharmony_ci	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
483062306a36Sopenharmony_ci
483162306a36Sopenharmony_ci	spec->kb_dev->name = "Microphone Mute Button";
483262306a36Sopenharmony_ci	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
483362306a36Sopenharmony_ci	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
483462306a36Sopenharmony_ci	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
483562306a36Sopenharmony_ci	spec->kb_dev->keycode = spec->alc_mute_keycode_map;
483662306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
483762306a36Sopenharmony_ci		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
483862306a36Sopenharmony_ci
483962306a36Sopenharmony_ci	if (input_register_device(spec->kb_dev)) {
484062306a36Sopenharmony_ci		codec_err(codec, "input_register_device failed\n");
484162306a36Sopenharmony_ci		input_free_device(spec->kb_dev);
484262306a36Sopenharmony_ci		spec->kb_dev = NULL;
484362306a36Sopenharmony_ci		return -ENOMEM;
484462306a36Sopenharmony_ci	}
484562306a36Sopenharmony_ci
484662306a36Sopenharmony_ci	return 0;
484762306a36Sopenharmony_ci}
484862306a36Sopenharmony_ci
484962306a36Sopenharmony_ci/* GPIO1 = set according to SKU external amp
485062306a36Sopenharmony_ci * GPIO2 = mic mute hotkey
485162306a36Sopenharmony_ci * GPIO3 = mute LED
485262306a36Sopenharmony_ci * GPIO4 = mic mute LED
485362306a36Sopenharmony_ci */
485462306a36Sopenharmony_cistatic void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
485562306a36Sopenharmony_ci					     const struct hda_fixup *fix, int action)
485662306a36Sopenharmony_ci{
485762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
485862306a36Sopenharmony_ci
485962306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
486062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
486162306a36Sopenharmony_ci		spec->init_amp = ALC_INIT_DEFAULT;
486262306a36Sopenharmony_ci		if (alc_register_micmute_input_device(codec) != 0)
486362306a36Sopenharmony_ci			return;
486462306a36Sopenharmony_ci
486562306a36Sopenharmony_ci		spec->gpio_mask |= 0x06;
486662306a36Sopenharmony_ci		spec->gpio_dir |= 0x02;
486762306a36Sopenharmony_ci		spec->gpio_data |= 0x02;
486862306a36Sopenharmony_ci		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
486962306a36Sopenharmony_ci					  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
487062306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
487162306a36Sopenharmony_ci						    gpio2_mic_hotkey_event);
487262306a36Sopenharmony_ci		return;
487362306a36Sopenharmony_ci	}
487462306a36Sopenharmony_ci
487562306a36Sopenharmony_ci	if (!spec->kb_dev)
487662306a36Sopenharmony_ci		return;
487762306a36Sopenharmony_ci
487862306a36Sopenharmony_ci	switch (action) {
487962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_FREE:
488062306a36Sopenharmony_ci		input_unregister_device(spec->kb_dev);
488162306a36Sopenharmony_ci		spec->kb_dev = NULL;
488262306a36Sopenharmony_ci	}
488362306a36Sopenharmony_ci}
488462306a36Sopenharmony_ci
488562306a36Sopenharmony_ci/* Line2 = mic mute hotkey
488662306a36Sopenharmony_ci * GPIO2 = mic mute LED
488762306a36Sopenharmony_ci */
488862306a36Sopenharmony_cistatic void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
488962306a36Sopenharmony_ci					     const struct hda_fixup *fix, int action)
489062306a36Sopenharmony_ci{
489162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
489262306a36Sopenharmony_ci
489362306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
489462306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
489562306a36Sopenharmony_ci		spec->init_amp = ALC_INIT_DEFAULT;
489662306a36Sopenharmony_ci		if (alc_register_micmute_input_device(codec) != 0)
489762306a36Sopenharmony_ci			return;
489862306a36Sopenharmony_ci
489962306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x1b,
490062306a36Sopenharmony_ci						    gpio2_mic_hotkey_event);
490162306a36Sopenharmony_ci		return;
490262306a36Sopenharmony_ci	}
490362306a36Sopenharmony_ci
490462306a36Sopenharmony_ci	if (!spec->kb_dev)
490562306a36Sopenharmony_ci		return;
490662306a36Sopenharmony_ci
490762306a36Sopenharmony_ci	switch (action) {
490862306a36Sopenharmony_ci	case HDA_FIXUP_ACT_FREE:
490962306a36Sopenharmony_ci		input_unregister_device(spec->kb_dev);
491062306a36Sopenharmony_ci		spec->kb_dev = NULL;
491162306a36Sopenharmony_ci	}
491262306a36Sopenharmony_ci}
491362306a36Sopenharmony_ci#else /* INPUT */
491462306a36Sopenharmony_ci#define alc280_fixup_hp_gpio2_mic_hotkey	NULL
491562306a36Sopenharmony_ci#define alc233_fixup_lenovo_line2_mic_hotkey	NULL
491662306a36Sopenharmony_ci#endif /* INPUT */
491762306a36Sopenharmony_ci
491862306a36Sopenharmony_cistatic void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
491962306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
492062306a36Sopenharmony_ci{
492162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
492262306a36Sopenharmony_ci
492362306a36Sopenharmony_ci	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
492462306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
492562306a36Sopenharmony_ci		spec->cap_mute_led_nid = 0x18;
492662306a36Sopenharmony_ci		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
492762306a36Sopenharmony_ci	}
492862306a36Sopenharmony_ci}
492962306a36Sopenharmony_ci
493062306a36Sopenharmony_cistatic const struct coef_fw alc225_pre_hsmode[] = {
493162306a36Sopenharmony_ci	UPDATE_COEF(0x4a, 1<<8, 0),
493262306a36Sopenharmony_ci	UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
493362306a36Sopenharmony_ci	UPDATE_COEF(0x63, 3<<14, 3<<14),
493462306a36Sopenharmony_ci	UPDATE_COEF(0x4a, 3<<4, 2<<4),
493562306a36Sopenharmony_ci	UPDATE_COEF(0x4a, 3<<10, 3<<10),
493662306a36Sopenharmony_ci	UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
493762306a36Sopenharmony_ci	UPDATE_COEF(0x4a, 3<<10, 0),
493862306a36Sopenharmony_ci	{}
493962306a36Sopenharmony_ci};
494062306a36Sopenharmony_ci
494162306a36Sopenharmony_cistatic void alc_headset_mode_unplugged(struct hda_codec *codec)
494262306a36Sopenharmony_ci{
494362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
494462306a36Sopenharmony_ci	static const struct coef_fw coef0255[] = {
494562306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
494662306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
494762306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
494862306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
494962306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
495062306a36Sopenharmony_ci		{}
495162306a36Sopenharmony_ci	};
495262306a36Sopenharmony_ci	static const struct coef_fw coef0256[] = {
495362306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
495462306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
495562306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
495662306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
495762306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
495862306a36Sopenharmony_ci		{}
495962306a36Sopenharmony_ci	};
496062306a36Sopenharmony_ci	static const struct coef_fw coef0233[] = {
496162306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c0b),
496262306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xc429),
496362306a36Sopenharmony_ci		UPDATE_COEF(0x35, 0x4000, 0),
496462306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x2104),
496562306a36Sopenharmony_ci		WRITE_COEF(0x1a, 0x0001),
496662306a36Sopenharmony_ci		WRITE_COEF(0x26, 0x0004),
496762306a36Sopenharmony_ci		WRITE_COEF(0x32, 0x42a3),
496862306a36Sopenharmony_ci		{}
496962306a36Sopenharmony_ci	};
497062306a36Sopenharmony_ci	static const struct coef_fw coef0288[] = {
497162306a36Sopenharmony_ci		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
497262306a36Sopenharmony_ci		UPDATE_COEF(0x50, 0x2000, 0x2000),
497362306a36Sopenharmony_ci		UPDATE_COEF(0x56, 0x0006, 0x0006),
497462306a36Sopenharmony_ci		UPDATE_COEF(0x66, 0x0008, 0),
497562306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0x2000, 0),
497662306a36Sopenharmony_ci		{}
497762306a36Sopenharmony_ci	};
497862306a36Sopenharmony_ci	static const struct coef_fw coef0298[] = {
497962306a36Sopenharmony_ci		UPDATE_COEF(0x19, 0x1300, 0x0300),
498062306a36Sopenharmony_ci		{}
498162306a36Sopenharmony_ci	};
498262306a36Sopenharmony_ci	static const struct coef_fw coef0292[] = {
498362306a36Sopenharmony_ci		WRITE_COEF(0x76, 0x000e),
498462306a36Sopenharmony_ci		WRITE_COEF(0x6c, 0x2400),
498562306a36Sopenharmony_ci		WRITE_COEF(0x18, 0x7308),
498662306a36Sopenharmony_ci		WRITE_COEF(0x6b, 0xc429),
498762306a36Sopenharmony_ci		{}
498862306a36Sopenharmony_ci	};
498962306a36Sopenharmony_ci	static const struct coef_fw coef0293[] = {
499062306a36Sopenharmony_ci		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
499162306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
499262306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
499362306a36Sopenharmony_ci		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
499462306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
499562306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
499662306a36Sopenharmony_ci		{}
499762306a36Sopenharmony_ci	};
499862306a36Sopenharmony_ci	static const struct coef_fw coef0668[] = {
499962306a36Sopenharmony_ci		WRITE_COEF(0x15, 0x0d40),
500062306a36Sopenharmony_ci		WRITE_COEF(0xb7, 0x802b),
500162306a36Sopenharmony_ci		{}
500262306a36Sopenharmony_ci	};
500362306a36Sopenharmony_ci	static const struct coef_fw coef0225[] = {
500462306a36Sopenharmony_ci		UPDATE_COEF(0x63, 3<<14, 0),
500562306a36Sopenharmony_ci		{}
500662306a36Sopenharmony_ci	};
500762306a36Sopenharmony_ci	static const struct coef_fw coef0274[] = {
500862306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0100, 0),
500962306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
501062306a36Sopenharmony_ci		UPDATE_COEF(0x6b, 0xf000, 0x5000),
501162306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0010, 0),
501262306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
501362306a36Sopenharmony_ci		WRITE_COEF(0x45, 0x5289),
501462306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0c00, 0),
501562306a36Sopenharmony_ci		{}
501662306a36Sopenharmony_ci	};
501762306a36Sopenharmony_ci
501862306a36Sopenharmony_ci	if (spec->no_internal_mic_pin) {
501962306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
502062306a36Sopenharmony_ci		return;
502162306a36Sopenharmony_ci	}
502262306a36Sopenharmony_ci
502362306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
502462306a36Sopenharmony_ci	case 0x10ec0255:
502562306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
502662306a36Sopenharmony_ci		break;
502762306a36Sopenharmony_ci	case 0x10ec0230:
502862306a36Sopenharmony_ci	case 0x10ec0236:
502962306a36Sopenharmony_ci	case 0x10ec0256:
503062306a36Sopenharmony_ci	case 0x19e58326:
503162306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0256);
503262306a36Sopenharmony_ci		break;
503362306a36Sopenharmony_ci	case 0x10ec0234:
503462306a36Sopenharmony_ci	case 0x10ec0274:
503562306a36Sopenharmony_ci	case 0x10ec0294:
503662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0274);
503762306a36Sopenharmony_ci		break;
503862306a36Sopenharmony_ci	case 0x10ec0233:
503962306a36Sopenharmony_ci	case 0x10ec0283:
504062306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0233);
504162306a36Sopenharmony_ci		break;
504262306a36Sopenharmony_ci	case 0x10ec0286:
504362306a36Sopenharmony_ci	case 0x10ec0288:
504462306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
504562306a36Sopenharmony_ci		break;
504662306a36Sopenharmony_ci	case 0x10ec0298:
504762306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0298);
504862306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
504962306a36Sopenharmony_ci		break;
505062306a36Sopenharmony_ci	case 0x10ec0292:
505162306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0292);
505262306a36Sopenharmony_ci		break;
505362306a36Sopenharmony_ci	case 0x10ec0293:
505462306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0293);
505562306a36Sopenharmony_ci		break;
505662306a36Sopenharmony_ci	case 0x10ec0668:
505762306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0668);
505862306a36Sopenharmony_ci		break;
505962306a36Sopenharmony_ci	case 0x10ec0215:
506062306a36Sopenharmony_ci	case 0x10ec0225:
506162306a36Sopenharmony_ci	case 0x10ec0285:
506262306a36Sopenharmony_ci	case 0x10ec0295:
506362306a36Sopenharmony_ci	case 0x10ec0289:
506462306a36Sopenharmony_ci	case 0x10ec0299:
506562306a36Sopenharmony_ci		alc_process_coef_fw(codec, alc225_pre_hsmode);
506662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0225);
506762306a36Sopenharmony_ci		break;
506862306a36Sopenharmony_ci	case 0x10ec0867:
506962306a36Sopenharmony_ci		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
507062306a36Sopenharmony_ci		break;
507162306a36Sopenharmony_ci	}
507262306a36Sopenharmony_ci	codec_dbg(codec, "Headset jack set to unplugged mode.\n");
507362306a36Sopenharmony_ci}
507462306a36Sopenharmony_ci
507562306a36Sopenharmony_ci
507662306a36Sopenharmony_cistatic void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
507762306a36Sopenharmony_ci				    hda_nid_t mic_pin)
507862306a36Sopenharmony_ci{
507962306a36Sopenharmony_ci	static const struct coef_fw coef0255[] = {
508062306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x8aa6),
508162306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
508262306a36Sopenharmony_ci		{}
508362306a36Sopenharmony_ci	};
508462306a36Sopenharmony_ci	static const struct coef_fw coef0256[] = {
508562306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
508662306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x09a3),
508762306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
508862306a36Sopenharmony_ci		{}
508962306a36Sopenharmony_ci	};
509062306a36Sopenharmony_ci	static const struct coef_fw coef0233[] = {
509162306a36Sopenharmony_ci		UPDATE_COEF(0x35, 0, 1<<14),
509262306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x2100),
509362306a36Sopenharmony_ci		WRITE_COEF(0x1a, 0x0021),
509462306a36Sopenharmony_ci		WRITE_COEF(0x26, 0x008c),
509562306a36Sopenharmony_ci		{}
509662306a36Sopenharmony_ci	};
509762306a36Sopenharmony_ci	static const struct coef_fw coef0288[] = {
509862306a36Sopenharmony_ci		UPDATE_COEF(0x4f, 0x00c0, 0),
509962306a36Sopenharmony_ci		UPDATE_COEF(0x50, 0x2000, 0),
510062306a36Sopenharmony_ci		UPDATE_COEF(0x56, 0x0006, 0),
510162306a36Sopenharmony_ci		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
510262306a36Sopenharmony_ci		UPDATE_COEF(0x66, 0x0008, 0x0008),
510362306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0x2000, 0x2000),
510462306a36Sopenharmony_ci		{}
510562306a36Sopenharmony_ci	};
510662306a36Sopenharmony_ci	static const struct coef_fw coef0292[] = {
510762306a36Sopenharmony_ci		WRITE_COEF(0x19, 0xa208),
510862306a36Sopenharmony_ci		WRITE_COEF(0x2e, 0xacf0),
510962306a36Sopenharmony_ci		{}
511062306a36Sopenharmony_ci	};
511162306a36Sopenharmony_ci	static const struct coef_fw coef0293[] = {
511262306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
511362306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
511462306a36Sopenharmony_ci		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
511562306a36Sopenharmony_ci		{}
511662306a36Sopenharmony_ci	};
511762306a36Sopenharmony_ci	static const struct coef_fw coef0688[] = {
511862306a36Sopenharmony_ci		WRITE_COEF(0xb7, 0x802b),
511962306a36Sopenharmony_ci		WRITE_COEF(0xb5, 0x1040),
512062306a36Sopenharmony_ci		UPDATE_COEF(0xc3, 0, 1<<12),
512162306a36Sopenharmony_ci		{}
512262306a36Sopenharmony_ci	};
512362306a36Sopenharmony_ci	static const struct coef_fw coef0225[] = {
512462306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
512562306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 3<<4, 2<<4),
512662306a36Sopenharmony_ci		UPDATE_COEF(0x63, 3<<14, 0),
512762306a36Sopenharmony_ci		{}
512862306a36Sopenharmony_ci	};
512962306a36Sopenharmony_ci	static const struct coef_fw coef0274[] = {
513062306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
513162306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0010, 0),
513262306a36Sopenharmony_ci		UPDATE_COEF(0x6b, 0xf000, 0),
513362306a36Sopenharmony_ci		{}
513462306a36Sopenharmony_ci	};
513562306a36Sopenharmony_ci
513662306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
513762306a36Sopenharmony_ci	case 0x10ec0255:
513862306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xc489);
513962306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
514062306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
514162306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
514262306a36Sopenharmony_ci		break;
514362306a36Sopenharmony_ci	case 0x10ec0230:
514462306a36Sopenharmony_ci	case 0x10ec0236:
514562306a36Sopenharmony_ci	case 0x10ec0256:
514662306a36Sopenharmony_ci	case 0x19e58326:
514762306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xc489);
514862306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
514962306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0256);
515062306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
515162306a36Sopenharmony_ci		break;
515262306a36Sopenharmony_ci	case 0x10ec0234:
515362306a36Sopenharmony_ci	case 0x10ec0274:
515462306a36Sopenharmony_ci	case 0x10ec0294:
515562306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0x4689);
515662306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
515762306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0274);
515862306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
515962306a36Sopenharmony_ci		break;
516062306a36Sopenharmony_ci	case 0x10ec0233:
516162306a36Sopenharmony_ci	case 0x10ec0283:
516262306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xc429);
516362306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
516462306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0233);
516562306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
516662306a36Sopenharmony_ci		break;
516762306a36Sopenharmony_ci	case 0x10ec0286:
516862306a36Sopenharmony_ci	case 0x10ec0288:
516962306a36Sopenharmony_ci	case 0x10ec0298:
517062306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
517162306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
517262306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
517362306a36Sopenharmony_ci		break;
517462306a36Sopenharmony_ci	case 0x10ec0292:
517562306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
517662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0292);
517762306a36Sopenharmony_ci		break;
517862306a36Sopenharmony_ci	case 0x10ec0293:
517962306a36Sopenharmony_ci		/* Set to TRS mode */
518062306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xc429);
518162306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
518262306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0293);
518362306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
518462306a36Sopenharmony_ci		break;
518562306a36Sopenharmony_ci	case 0x10ec0867:
518662306a36Sopenharmony_ci		alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
518762306a36Sopenharmony_ci		fallthrough;
518862306a36Sopenharmony_ci	case 0x10ec0221:
518962306a36Sopenharmony_ci	case 0x10ec0662:
519062306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
519162306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
519262306a36Sopenharmony_ci		break;
519362306a36Sopenharmony_ci	case 0x10ec0668:
519462306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x11, 0x0001);
519562306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
519662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0688);
519762306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
519862306a36Sopenharmony_ci		break;
519962306a36Sopenharmony_ci	case 0x10ec0215:
520062306a36Sopenharmony_ci	case 0x10ec0225:
520162306a36Sopenharmony_ci	case 0x10ec0285:
520262306a36Sopenharmony_ci	case 0x10ec0295:
520362306a36Sopenharmony_ci	case 0x10ec0289:
520462306a36Sopenharmony_ci	case 0x10ec0299:
520562306a36Sopenharmony_ci		alc_process_coef_fw(codec, alc225_pre_hsmode);
520662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
520762306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
520862306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0225);
520962306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
521062306a36Sopenharmony_ci		break;
521162306a36Sopenharmony_ci	}
521262306a36Sopenharmony_ci	codec_dbg(codec, "Headset jack set to mic-in mode.\n");
521362306a36Sopenharmony_ci}
521462306a36Sopenharmony_ci
521562306a36Sopenharmony_cistatic void alc_headset_mode_default(struct hda_codec *codec)
521662306a36Sopenharmony_ci{
521762306a36Sopenharmony_ci	static const struct coef_fw coef0225[] = {
521862306a36Sopenharmony_ci		UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
521962306a36Sopenharmony_ci		UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
522062306a36Sopenharmony_ci		UPDATE_COEF(0x49, 3<<8, 0<<8),
522162306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 3<<4, 3<<4),
522262306a36Sopenharmony_ci		UPDATE_COEF(0x63, 3<<14, 0),
522362306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0xf000, 0x3000),
522462306a36Sopenharmony_ci		{}
522562306a36Sopenharmony_ci	};
522662306a36Sopenharmony_ci	static const struct coef_fw coef0255[] = {
522762306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xc089),
522862306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xc489),
522962306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
523062306a36Sopenharmony_ci		WRITE_COEF(0x49, 0x0049),
523162306a36Sopenharmony_ci		{}
523262306a36Sopenharmony_ci	};
523362306a36Sopenharmony_ci	static const struct coef_fw coef0256[] = {
523462306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xc489),
523562306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x0da3),
523662306a36Sopenharmony_ci		WRITE_COEF(0x49, 0x0049),
523762306a36Sopenharmony_ci		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
523862306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x6100),
523962306a36Sopenharmony_ci		{}
524062306a36Sopenharmony_ci	};
524162306a36Sopenharmony_ci	static const struct coef_fw coef0233[] = {
524262306a36Sopenharmony_ci		WRITE_COEF(0x06, 0x2100),
524362306a36Sopenharmony_ci		WRITE_COEF(0x32, 0x4ea3),
524462306a36Sopenharmony_ci		{}
524562306a36Sopenharmony_ci	};
524662306a36Sopenharmony_ci	static const struct coef_fw coef0288[] = {
524762306a36Sopenharmony_ci		UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
524862306a36Sopenharmony_ci		UPDATE_COEF(0x50, 0x2000, 0x2000),
524962306a36Sopenharmony_ci		UPDATE_COEF(0x56, 0x0006, 0x0006),
525062306a36Sopenharmony_ci		UPDATE_COEF(0x66, 0x0008, 0),
525162306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0x2000, 0),
525262306a36Sopenharmony_ci		{}
525362306a36Sopenharmony_ci	};
525462306a36Sopenharmony_ci	static const struct coef_fw coef0292[] = {
525562306a36Sopenharmony_ci		WRITE_COEF(0x76, 0x000e),
525662306a36Sopenharmony_ci		WRITE_COEF(0x6c, 0x2400),
525762306a36Sopenharmony_ci		WRITE_COEF(0x6b, 0xc429),
525862306a36Sopenharmony_ci		WRITE_COEF(0x18, 0x7308),
525962306a36Sopenharmony_ci		{}
526062306a36Sopenharmony_ci	};
526162306a36Sopenharmony_ci	static const struct coef_fw coef0293[] = {
526262306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
526362306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
526462306a36Sopenharmony_ci		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
526562306a36Sopenharmony_ci		{}
526662306a36Sopenharmony_ci	};
526762306a36Sopenharmony_ci	static const struct coef_fw coef0688[] = {
526862306a36Sopenharmony_ci		WRITE_COEF(0x11, 0x0041),
526962306a36Sopenharmony_ci		WRITE_COEF(0x15, 0x0d40),
527062306a36Sopenharmony_ci		WRITE_COEF(0xb7, 0x802b),
527162306a36Sopenharmony_ci		{}
527262306a36Sopenharmony_ci	};
527362306a36Sopenharmony_ci	static const struct coef_fw coef0274[] = {
527462306a36Sopenharmony_ci		WRITE_COEF(0x45, 0x4289),
527562306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0010, 0x0010),
527662306a36Sopenharmony_ci		UPDATE_COEF(0x6b, 0x0f00, 0),
527762306a36Sopenharmony_ci		UPDATE_COEF(0x49, 0x0300, 0x0300),
527862306a36Sopenharmony_ci		{}
527962306a36Sopenharmony_ci	};
528062306a36Sopenharmony_ci
528162306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
528262306a36Sopenharmony_ci	case 0x10ec0215:
528362306a36Sopenharmony_ci	case 0x10ec0225:
528462306a36Sopenharmony_ci	case 0x10ec0285:
528562306a36Sopenharmony_ci	case 0x10ec0295:
528662306a36Sopenharmony_ci	case 0x10ec0289:
528762306a36Sopenharmony_ci	case 0x10ec0299:
528862306a36Sopenharmony_ci		alc_process_coef_fw(codec, alc225_pre_hsmode);
528962306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0225);
529062306a36Sopenharmony_ci		break;
529162306a36Sopenharmony_ci	case 0x10ec0255:
529262306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
529362306a36Sopenharmony_ci		break;
529462306a36Sopenharmony_ci	case 0x10ec0230:
529562306a36Sopenharmony_ci	case 0x10ec0236:
529662306a36Sopenharmony_ci	case 0x10ec0256:
529762306a36Sopenharmony_ci	case 0x19e58326:
529862306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
529962306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xc089);
530062306a36Sopenharmony_ci		msleep(50);
530162306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0256);
530262306a36Sopenharmony_ci		break;
530362306a36Sopenharmony_ci	case 0x10ec0234:
530462306a36Sopenharmony_ci	case 0x10ec0274:
530562306a36Sopenharmony_ci	case 0x10ec0294:
530662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0274);
530762306a36Sopenharmony_ci		break;
530862306a36Sopenharmony_ci	case 0x10ec0233:
530962306a36Sopenharmony_ci	case 0x10ec0283:
531062306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0233);
531162306a36Sopenharmony_ci		break;
531262306a36Sopenharmony_ci	case 0x10ec0286:
531362306a36Sopenharmony_ci	case 0x10ec0288:
531462306a36Sopenharmony_ci	case 0x10ec0298:
531562306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
531662306a36Sopenharmony_ci		break;
531762306a36Sopenharmony_ci	case 0x10ec0292:
531862306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0292);
531962306a36Sopenharmony_ci		break;
532062306a36Sopenharmony_ci	case 0x10ec0293:
532162306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0293);
532262306a36Sopenharmony_ci		break;
532362306a36Sopenharmony_ci	case 0x10ec0668:
532462306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0688);
532562306a36Sopenharmony_ci		break;
532662306a36Sopenharmony_ci	case 0x10ec0867:
532762306a36Sopenharmony_ci		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
532862306a36Sopenharmony_ci		break;
532962306a36Sopenharmony_ci	}
533062306a36Sopenharmony_ci	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
533162306a36Sopenharmony_ci}
533262306a36Sopenharmony_ci
533362306a36Sopenharmony_ci/* Iphone type */
533462306a36Sopenharmony_cistatic void alc_headset_mode_ctia(struct hda_codec *codec)
533562306a36Sopenharmony_ci{
533662306a36Sopenharmony_ci	int val;
533762306a36Sopenharmony_ci
533862306a36Sopenharmony_ci	static const struct coef_fw coef0255[] = {
533962306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
534062306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c2b),
534162306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
534262306a36Sopenharmony_ci		{}
534362306a36Sopenharmony_ci	};
534462306a36Sopenharmony_ci	static const struct coef_fw coef0256[] = {
534562306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
534662306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0e6b),
534762306a36Sopenharmony_ci		{}
534862306a36Sopenharmony_ci	};
534962306a36Sopenharmony_ci	static const struct coef_fw coef0233[] = {
535062306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd429),
535162306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c2b),
535262306a36Sopenharmony_ci		WRITE_COEF(0x32, 0x4ea3),
535362306a36Sopenharmony_ci		{}
535462306a36Sopenharmony_ci	};
535562306a36Sopenharmony_ci	static const struct coef_fw coef0288[] = {
535662306a36Sopenharmony_ci		UPDATE_COEF(0x50, 0x2000, 0x2000),
535762306a36Sopenharmony_ci		UPDATE_COEF(0x56, 0x0006, 0x0006),
535862306a36Sopenharmony_ci		UPDATE_COEF(0x66, 0x0008, 0),
535962306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0x2000, 0),
536062306a36Sopenharmony_ci		{}
536162306a36Sopenharmony_ci	};
536262306a36Sopenharmony_ci	static const struct coef_fw coef0292[] = {
536362306a36Sopenharmony_ci		WRITE_COEF(0x6b, 0xd429),
536462306a36Sopenharmony_ci		WRITE_COEF(0x76, 0x0008),
536562306a36Sopenharmony_ci		WRITE_COEF(0x18, 0x7388),
536662306a36Sopenharmony_ci		{}
536762306a36Sopenharmony_ci	};
536862306a36Sopenharmony_ci	static const struct coef_fw coef0293[] = {
536962306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
537062306a36Sopenharmony_ci		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
537162306a36Sopenharmony_ci		{}
537262306a36Sopenharmony_ci	};
537362306a36Sopenharmony_ci	static const struct coef_fw coef0688[] = {
537462306a36Sopenharmony_ci		WRITE_COEF(0x11, 0x0001),
537562306a36Sopenharmony_ci		WRITE_COEF(0x15, 0x0d60),
537662306a36Sopenharmony_ci		WRITE_COEF(0xc3, 0x0000),
537762306a36Sopenharmony_ci		{}
537862306a36Sopenharmony_ci	};
537962306a36Sopenharmony_ci	static const struct coef_fw coef0225_1[] = {
538062306a36Sopenharmony_ci		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
538162306a36Sopenharmony_ci		UPDATE_COEF(0x63, 3<<14, 2<<14),
538262306a36Sopenharmony_ci		{}
538362306a36Sopenharmony_ci	};
538462306a36Sopenharmony_ci	static const struct coef_fw coef0225_2[] = {
538562306a36Sopenharmony_ci		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
538662306a36Sopenharmony_ci		UPDATE_COEF(0x63, 3<<14, 1<<14),
538762306a36Sopenharmony_ci		{}
538862306a36Sopenharmony_ci	};
538962306a36Sopenharmony_ci
539062306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
539162306a36Sopenharmony_ci	case 0x10ec0255:
539262306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
539362306a36Sopenharmony_ci		break;
539462306a36Sopenharmony_ci	case 0x10ec0230:
539562306a36Sopenharmony_ci	case 0x10ec0236:
539662306a36Sopenharmony_ci	case 0x10ec0256:
539762306a36Sopenharmony_ci	case 0x19e58326:
539862306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0256);
539962306a36Sopenharmony_ci		break;
540062306a36Sopenharmony_ci	case 0x10ec0234:
540162306a36Sopenharmony_ci	case 0x10ec0274:
540262306a36Sopenharmony_ci	case 0x10ec0294:
540362306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xd689);
540462306a36Sopenharmony_ci		break;
540562306a36Sopenharmony_ci	case 0x10ec0233:
540662306a36Sopenharmony_ci	case 0x10ec0283:
540762306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0233);
540862306a36Sopenharmony_ci		break;
540962306a36Sopenharmony_ci	case 0x10ec0298:
541062306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x50);
541162306a36Sopenharmony_ci		if (val & (1 << 12)) {
541262306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
541362306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
541462306a36Sopenharmony_ci			msleep(300);
541562306a36Sopenharmony_ci		} else {
541662306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
541762306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
541862306a36Sopenharmony_ci			msleep(300);
541962306a36Sopenharmony_ci		}
542062306a36Sopenharmony_ci		break;
542162306a36Sopenharmony_ci	case 0x10ec0286:
542262306a36Sopenharmony_ci	case 0x10ec0288:
542362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
542462306a36Sopenharmony_ci		msleep(300);
542562306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
542662306a36Sopenharmony_ci		break;
542762306a36Sopenharmony_ci	case 0x10ec0292:
542862306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0292);
542962306a36Sopenharmony_ci		break;
543062306a36Sopenharmony_ci	case 0x10ec0293:
543162306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0293);
543262306a36Sopenharmony_ci		break;
543362306a36Sopenharmony_ci	case 0x10ec0668:
543462306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0688);
543562306a36Sopenharmony_ci		break;
543662306a36Sopenharmony_ci	case 0x10ec0215:
543762306a36Sopenharmony_ci	case 0x10ec0225:
543862306a36Sopenharmony_ci	case 0x10ec0285:
543962306a36Sopenharmony_ci	case 0x10ec0295:
544062306a36Sopenharmony_ci	case 0x10ec0289:
544162306a36Sopenharmony_ci	case 0x10ec0299:
544262306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x45);
544362306a36Sopenharmony_ci		if (val & (1 << 9))
544462306a36Sopenharmony_ci			alc_process_coef_fw(codec, coef0225_2);
544562306a36Sopenharmony_ci		else
544662306a36Sopenharmony_ci			alc_process_coef_fw(codec, coef0225_1);
544762306a36Sopenharmony_ci		break;
544862306a36Sopenharmony_ci	case 0x10ec0867:
544962306a36Sopenharmony_ci		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
545062306a36Sopenharmony_ci		break;
545162306a36Sopenharmony_ci	}
545262306a36Sopenharmony_ci	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
545362306a36Sopenharmony_ci}
545462306a36Sopenharmony_ci
545562306a36Sopenharmony_ci/* Nokia type */
545662306a36Sopenharmony_cistatic void alc_headset_mode_omtp(struct hda_codec *codec)
545762306a36Sopenharmony_ci{
545862306a36Sopenharmony_ci	static const struct coef_fw coef0255[] = {
545962306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
546062306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c2b),
546162306a36Sopenharmony_ci		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
546262306a36Sopenharmony_ci		{}
546362306a36Sopenharmony_ci	};
546462306a36Sopenharmony_ci	static const struct coef_fw coef0256[] = {
546562306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
546662306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0e6b),
546762306a36Sopenharmony_ci		{}
546862306a36Sopenharmony_ci	};
546962306a36Sopenharmony_ci	static const struct coef_fw coef0233[] = {
547062306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xe429),
547162306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c2b),
547262306a36Sopenharmony_ci		WRITE_COEF(0x32, 0x4ea3),
547362306a36Sopenharmony_ci		{}
547462306a36Sopenharmony_ci	};
547562306a36Sopenharmony_ci	static const struct coef_fw coef0288[] = {
547662306a36Sopenharmony_ci		UPDATE_COEF(0x50, 0x2000, 0x2000),
547762306a36Sopenharmony_ci		UPDATE_COEF(0x56, 0x0006, 0x0006),
547862306a36Sopenharmony_ci		UPDATE_COEF(0x66, 0x0008, 0),
547962306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0x2000, 0),
548062306a36Sopenharmony_ci		{}
548162306a36Sopenharmony_ci	};
548262306a36Sopenharmony_ci	static const struct coef_fw coef0292[] = {
548362306a36Sopenharmony_ci		WRITE_COEF(0x6b, 0xe429),
548462306a36Sopenharmony_ci		WRITE_COEF(0x76, 0x0008),
548562306a36Sopenharmony_ci		WRITE_COEF(0x18, 0x7388),
548662306a36Sopenharmony_ci		{}
548762306a36Sopenharmony_ci	};
548862306a36Sopenharmony_ci	static const struct coef_fw coef0293[] = {
548962306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
549062306a36Sopenharmony_ci		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
549162306a36Sopenharmony_ci		{}
549262306a36Sopenharmony_ci	};
549362306a36Sopenharmony_ci	static const struct coef_fw coef0688[] = {
549462306a36Sopenharmony_ci		WRITE_COEF(0x11, 0x0001),
549562306a36Sopenharmony_ci		WRITE_COEF(0x15, 0x0d50),
549662306a36Sopenharmony_ci		WRITE_COEF(0xc3, 0x0000),
549762306a36Sopenharmony_ci		{}
549862306a36Sopenharmony_ci	};
549962306a36Sopenharmony_ci	static const struct coef_fw coef0225[] = {
550062306a36Sopenharmony_ci		UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
550162306a36Sopenharmony_ci		UPDATE_COEF(0x63, 3<<14, 2<<14),
550262306a36Sopenharmony_ci		{}
550362306a36Sopenharmony_ci	};
550462306a36Sopenharmony_ci
550562306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
550662306a36Sopenharmony_ci	case 0x10ec0255:
550762306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
550862306a36Sopenharmony_ci		break;
550962306a36Sopenharmony_ci	case 0x10ec0230:
551062306a36Sopenharmony_ci	case 0x10ec0236:
551162306a36Sopenharmony_ci	case 0x10ec0256:
551262306a36Sopenharmony_ci	case 0x19e58326:
551362306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0256);
551462306a36Sopenharmony_ci		break;
551562306a36Sopenharmony_ci	case 0x10ec0234:
551662306a36Sopenharmony_ci	case 0x10ec0274:
551762306a36Sopenharmony_ci	case 0x10ec0294:
551862306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xe689);
551962306a36Sopenharmony_ci		break;
552062306a36Sopenharmony_ci	case 0x10ec0233:
552162306a36Sopenharmony_ci	case 0x10ec0283:
552262306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0233);
552362306a36Sopenharmony_ci		break;
552462306a36Sopenharmony_ci	case 0x10ec0298:
552562306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
552662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
552762306a36Sopenharmony_ci		msleep(300);
552862306a36Sopenharmony_ci		break;
552962306a36Sopenharmony_ci	case 0x10ec0286:
553062306a36Sopenharmony_ci	case 0x10ec0288:
553162306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
553262306a36Sopenharmony_ci		msleep(300);
553362306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
553462306a36Sopenharmony_ci		break;
553562306a36Sopenharmony_ci	case 0x10ec0292:
553662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0292);
553762306a36Sopenharmony_ci		break;
553862306a36Sopenharmony_ci	case 0x10ec0293:
553962306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0293);
554062306a36Sopenharmony_ci		break;
554162306a36Sopenharmony_ci	case 0x10ec0668:
554262306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0688);
554362306a36Sopenharmony_ci		break;
554462306a36Sopenharmony_ci	case 0x10ec0215:
554562306a36Sopenharmony_ci	case 0x10ec0225:
554662306a36Sopenharmony_ci	case 0x10ec0285:
554762306a36Sopenharmony_ci	case 0x10ec0295:
554862306a36Sopenharmony_ci	case 0x10ec0289:
554962306a36Sopenharmony_ci	case 0x10ec0299:
555062306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0225);
555162306a36Sopenharmony_ci		break;
555262306a36Sopenharmony_ci	}
555362306a36Sopenharmony_ci	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
555462306a36Sopenharmony_ci}
555562306a36Sopenharmony_ci
555662306a36Sopenharmony_cistatic void alc_determine_headset_type(struct hda_codec *codec)
555762306a36Sopenharmony_ci{
555862306a36Sopenharmony_ci	int val;
555962306a36Sopenharmony_ci	bool is_ctia = false;
556062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
556162306a36Sopenharmony_ci	static const struct coef_fw coef0255[] = {
556262306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
556362306a36Sopenharmony_ci		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
556462306a36Sopenharmony_ci conteol) */
556562306a36Sopenharmony_ci		{}
556662306a36Sopenharmony_ci	};
556762306a36Sopenharmony_ci	static const struct coef_fw coef0288[] = {
556862306a36Sopenharmony_ci		UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
556962306a36Sopenharmony_ci		{}
557062306a36Sopenharmony_ci	};
557162306a36Sopenharmony_ci	static const struct coef_fw coef0298[] = {
557262306a36Sopenharmony_ci		UPDATE_COEF(0x50, 0x2000, 0x2000),
557362306a36Sopenharmony_ci		UPDATE_COEF(0x56, 0x0006, 0x0006),
557462306a36Sopenharmony_ci		UPDATE_COEF(0x66, 0x0008, 0),
557562306a36Sopenharmony_ci		UPDATE_COEF(0x67, 0x2000, 0),
557662306a36Sopenharmony_ci		UPDATE_COEF(0x19, 0x1300, 0x1300),
557762306a36Sopenharmony_ci		{}
557862306a36Sopenharmony_ci	};
557962306a36Sopenharmony_ci	static const struct coef_fw coef0293[] = {
558062306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
558162306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
558262306a36Sopenharmony_ci		{}
558362306a36Sopenharmony_ci	};
558462306a36Sopenharmony_ci	static const struct coef_fw coef0688[] = {
558562306a36Sopenharmony_ci		WRITE_COEF(0x11, 0x0001),
558662306a36Sopenharmony_ci		WRITE_COEF(0xb7, 0x802b),
558762306a36Sopenharmony_ci		WRITE_COEF(0x15, 0x0d60),
558862306a36Sopenharmony_ci		WRITE_COEF(0xc3, 0x0c00),
558962306a36Sopenharmony_ci		{}
559062306a36Sopenharmony_ci	};
559162306a36Sopenharmony_ci	static const struct coef_fw coef0274[] = {
559262306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x0010, 0),
559362306a36Sopenharmony_ci		UPDATE_COEF(0x4a, 0x8000, 0),
559462306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd289),
559562306a36Sopenharmony_ci		UPDATE_COEF(0x49, 0x0300, 0x0300),
559662306a36Sopenharmony_ci		{}
559762306a36Sopenharmony_ci	};
559862306a36Sopenharmony_ci
559962306a36Sopenharmony_ci	if (spec->no_internal_mic_pin) {
560062306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
560162306a36Sopenharmony_ci		return;
560262306a36Sopenharmony_ci	}
560362306a36Sopenharmony_ci
560462306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
560562306a36Sopenharmony_ci	case 0x10ec0255:
560662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
560762306a36Sopenharmony_ci		msleep(300);
560862306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x46);
560962306a36Sopenharmony_ci		is_ctia = (val & 0x0070) == 0x0070;
561062306a36Sopenharmony_ci		break;
561162306a36Sopenharmony_ci	case 0x10ec0230:
561262306a36Sopenharmony_ci	case 0x10ec0236:
561362306a36Sopenharmony_ci	case 0x10ec0256:
561462306a36Sopenharmony_ci	case 0x19e58326:
561562306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
561662306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x06, 0x6104);
561762306a36Sopenharmony_ci		alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
561862306a36Sopenharmony_ci
561962306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
562062306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
562162306a36Sopenharmony_ci		msleep(80);
562262306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
562362306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
562462306a36Sopenharmony_ci
562562306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0255);
562662306a36Sopenharmony_ci		msleep(300);
562762306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x46);
562862306a36Sopenharmony_ci		is_ctia = (val & 0x0070) == 0x0070;
562962306a36Sopenharmony_ci
563062306a36Sopenharmony_ci		alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
563162306a36Sopenharmony_ci		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
563262306a36Sopenharmony_ci
563362306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
563462306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
563562306a36Sopenharmony_ci		msleep(80);
563662306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
563762306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
563862306a36Sopenharmony_ci		break;
563962306a36Sopenharmony_ci	case 0x10ec0234:
564062306a36Sopenharmony_ci	case 0x10ec0274:
564162306a36Sopenharmony_ci	case 0x10ec0294:
564262306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0274);
564362306a36Sopenharmony_ci		msleep(850);
564462306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x46);
564562306a36Sopenharmony_ci		is_ctia = (val & 0x00f0) == 0x00f0;
564662306a36Sopenharmony_ci		break;
564762306a36Sopenharmony_ci	case 0x10ec0233:
564862306a36Sopenharmony_ci	case 0x10ec0283:
564962306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x45, 0xd029);
565062306a36Sopenharmony_ci		msleep(300);
565162306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x46);
565262306a36Sopenharmony_ci		is_ctia = (val & 0x0070) == 0x0070;
565362306a36Sopenharmony_ci		break;
565462306a36Sopenharmony_ci	case 0x10ec0298:
565562306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
565662306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
565762306a36Sopenharmony_ci		msleep(100);
565862306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
565962306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
566062306a36Sopenharmony_ci		msleep(200);
566162306a36Sopenharmony_ci
566262306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x50);
566362306a36Sopenharmony_ci		if (val & (1 << 12)) {
566462306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
566562306a36Sopenharmony_ci			alc_process_coef_fw(codec, coef0288);
566662306a36Sopenharmony_ci			msleep(350);
566762306a36Sopenharmony_ci			val = alc_read_coef_idx(codec, 0x50);
566862306a36Sopenharmony_ci			is_ctia = (val & 0x0070) == 0x0070;
566962306a36Sopenharmony_ci		} else {
567062306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
567162306a36Sopenharmony_ci			alc_process_coef_fw(codec, coef0288);
567262306a36Sopenharmony_ci			msleep(350);
567362306a36Sopenharmony_ci			val = alc_read_coef_idx(codec, 0x50);
567462306a36Sopenharmony_ci			is_ctia = (val & 0x0070) == 0x0070;
567562306a36Sopenharmony_ci		}
567662306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0298);
567762306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
567862306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
567962306a36Sopenharmony_ci		msleep(75);
568062306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
568162306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
568262306a36Sopenharmony_ci		break;
568362306a36Sopenharmony_ci	case 0x10ec0286:
568462306a36Sopenharmony_ci	case 0x10ec0288:
568562306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0288);
568662306a36Sopenharmony_ci		msleep(350);
568762306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x50);
568862306a36Sopenharmony_ci		is_ctia = (val & 0x0070) == 0x0070;
568962306a36Sopenharmony_ci		break;
569062306a36Sopenharmony_ci	case 0x10ec0292:
569162306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x6b, 0xd429);
569262306a36Sopenharmony_ci		msleep(300);
569362306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x6c);
569462306a36Sopenharmony_ci		is_ctia = (val & 0x001c) == 0x001c;
569562306a36Sopenharmony_ci		break;
569662306a36Sopenharmony_ci	case 0x10ec0293:
569762306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0293);
569862306a36Sopenharmony_ci		msleep(300);
569962306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x46);
570062306a36Sopenharmony_ci		is_ctia = (val & 0x0070) == 0x0070;
570162306a36Sopenharmony_ci		break;
570262306a36Sopenharmony_ci	case 0x10ec0668:
570362306a36Sopenharmony_ci		alc_process_coef_fw(codec, coef0688);
570462306a36Sopenharmony_ci		msleep(300);
570562306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0xbe);
570662306a36Sopenharmony_ci		is_ctia = (val & 0x1c02) == 0x1c02;
570762306a36Sopenharmony_ci		break;
570862306a36Sopenharmony_ci	case 0x10ec0215:
570962306a36Sopenharmony_ci	case 0x10ec0225:
571062306a36Sopenharmony_ci	case 0x10ec0285:
571162306a36Sopenharmony_ci	case 0x10ec0295:
571262306a36Sopenharmony_ci	case 0x10ec0289:
571362306a36Sopenharmony_ci	case 0x10ec0299:
571462306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
571562306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
571662306a36Sopenharmony_ci		msleep(80);
571762306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
571862306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
571962306a36Sopenharmony_ci
572062306a36Sopenharmony_ci		alc_process_coef_fw(codec, alc225_pre_hsmode);
572162306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
572262306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x45);
572362306a36Sopenharmony_ci		if (val & (1 << 9)) {
572462306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
572562306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
572662306a36Sopenharmony_ci			msleep(800);
572762306a36Sopenharmony_ci			val = alc_read_coef_idx(codec, 0x46);
572862306a36Sopenharmony_ci			is_ctia = (val & 0x00f0) == 0x00f0;
572962306a36Sopenharmony_ci		} else {
573062306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
573162306a36Sopenharmony_ci			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
573262306a36Sopenharmony_ci			msleep(800);
573362306a36Sopenharmony_ci			val = alc_read_coef_idx(codec, 0x46);
573462306a36Sopenharmony_ci			is_ctia = (val & 0x00f0) == 0x00f0;
573562306a36Sopenharmony_ci		}
573662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
573762306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
573862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
573962306a36Sopenharmony_ci
574062306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
574162306a36Sopenharmony_ci			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
574262306a36Sopenharmony_ci		msleep(80);
574362306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x21, 0,
574462306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
574562306a36Sopenharmony_ci		break;
574662306a36Sopenharmony_ci	case 0x10ec0867:
574762306a36Sopenharmony_ci		is_ctia = true;
574862306a36Sopenharmony_ci		break;
574962306a36Sopenharmony_ci	}
575062306a36Sopenharmony_ci
575162306a36Sopenharmony_ci	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
575262306a36Sopenharmony_ci		    is_ctia ? "yes" : "no");
575362306a36Sopenharmony_ci	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
575462306a36Sopenharmony_ci}
575562306a36Sopenharmony_ci
575662306a36Sopenharmony_cistatic void alc_update_headset_mode(struct hda_codec *codec)
575762306a36Sopenharmony_ci{
575862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
575962306a36Sopenharmony_ci
576062306a36Sopenharmony_ci	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
576162306a36Sopenharmony_ci	hda_nid_t hp_pin = alc_get_hp_pin(spec);
576262306a36Sopenharmony_ci
576362306a36Sopenharmony_ci	int new_headset_mode;
576462306a36Sopenharmony_ci
576562306a36Sopenharmony_ci	if (!snd_hda_jack_detect(codec, hp_pin))
576662306a36Sopenharmony_ci		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
576762306a36Sopenharmony_ci	else if (mux_pin == spec->headset_mic_pin)
576862306a36Sopenharmony_ci		new_headset_mode = ALC_HEADSET_MODE_HEADSET;
576962306a36Sopenharmony_ci	else if (mux_pin == spec->headphone_mic_pin)
577062306a36Sopenharmony_ci		new_headset_mode = ALC_HEADSET_MODE_MIC;
577162306a36Sopenharmony_ci	else
577262306a36Sopenharmony_ci		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
577362306a36Sopenharmony_ci
577462306a36Sopenharmony_ci	if (new_headset_mode == spec->current_headset_mode) {
577562306a36Sopenharmony_ci		snd_hda_gen_update_outputs(codec);
577662306a36Sopenharmony_ci		return;
577762306a36Sopenharmony_ci	}
577862306a36Sopenharmony_ci
577962306a36Sopenharmony_ci	switch (new_headset_mode) {
578062306a36Sopenharmony_ci	case ALC_HEADSET_MODE_UNPLUGGED:
578162306a36Sopenharmony_ci		alc_headset_mode_unplugged(codec);
578262306a36Sopenharmony_ci		spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
578362306a36Sopenharmony_ci		spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
578462306a36Sopenharmony_ci		spec->gen.hp_jack_present = false;
578562306a36Sopenharmony_ci		break;
578662306a36Sopenharmony_ci	case ALC_HEADSET_MODE_HEADSET:
578762306a36Sopenharmony_ci		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
578862306a36Sopenharmony_ci			alc_determine_headset_type(codec);
578962306a36Sopenharmony_ci		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
579062306a36Sopenharmony_ci			alc_headset_mode_ctia(codec);
579162306a36Sopenharmony_ci		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
579262306a36Sopenharmony_ci			alc_headset_mode_omtp(codec);
579362306a36Sopenharmony_ci		spec->gen.hp_jack_present = true;
579462306a36Sopenharmony_ci		break;
579562306a36Sopenharmony_ci	case ALC_HEADSET_MODE_MIC:
579662306a36Sopenharmony_ci		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
579762306a36Sopenharmony_ci		spec->gen.hp_jack_present = false;
579862306a36Sopenharmony_ci		break;
579962306a36Sopenharmony_ci	case ALC_HEADSET_MODE_HEADPHONE:
580062306a36Sopenharmony_ci		alc_headset_mode_default(codec);
580162306a36Sopenharmony_ci		spec->gen.hp_jack_present = true;
580262306a36Sopenharmony_ci		break;
580362306a36Sopenharmony_ci	}
580462306a36Sopenharmony_ci	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
580562306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, hp_pin,
580662306a36Sopenharmony_ci					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
580762306a36Sopenharmony_ci		if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
580862306a36Sopenharmony_ci			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
580962306a36Sopenharmony_ci						  PIN_VREFHIZ);
581062306a36Sopenharmony_ci	}
581162306a36Sopenharmony_ci	spec->current_headset_mode = new_headset_mode;
581262306a36Sopenharmony_ci
581362306a36Sopenharmony_ci	snd_hda_gen_update_outputs(codec);
581462306a36Sopenharmony_ci}
581562306a36Sopenharmony_ci
581662306a36Sopenharmony_cistatic void alc_update_headset_mode_hook(struct hda_codec *codec,
581762306a36Sopenharmony_ci					 struct snd_kcontrol *kcontrol,
581862306a36Sopenharmony_ci					 struct snd_ctl_elem_value *ucontrol)
581962306a36Sopenharmony_ci{
582062306a36Sopenharmony_ci	alc_update_headset_mode(codec);
582162306a36Sopenharmony_ci}
582262306a36Sopenharmony_ci
582362306a36Sopenharmony_cistatic void alc_update_headset_jack_cb(struct hda_codec *codec,
582462306a36Sopenharmony_ci				       struct hda_jack_callback *jack)
582562306a36Sopenharmony_ci{
582662306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
582762306a36Sopenharmony_ci	alc_update_headset_mode(codec);
582862306a36Sopenharmony_ci}
582962306a36Sopenharmony_ci
583062306a36Sopenharmony_cistatic void alc_probe_headset_mode(struct hda_codec *codec)
583162306a36Sopenharmony_ci{
583262306a36Sopenharmony_ci	int i;
583362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
583462306a36Sopenharmony_ci	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
583562306a36Sopenharmony_ci
583662306a36Sopenharmony_ci	/* Find mic pins */
583762306a36Sopenharmony_ci	for (i = 0; i < cfg->num_inputs; i++) {
583862306a36Sopenharmony_ci		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
583962306a36Sopenharmony_ci			spec->headset_mic_pin = cfg->inputs[i].pin;
584062306a36Sopenharmony_ci		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
584162306a36Sopenharmony_ci			spec->headphone_mic_pin = cfg->inputs[i].pin;
584262306a36Sopenharmony_ci	}
584362306a36Sopenharmony_ci
584462306a36Sopenharmony_ci	WARN_ON(spec->gen.cap_sync_hook);
584562306a36Sopenharmony_ci	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
584662306a36Sopenharmony_ci	spec->gen.automute_hook = alc_update_headset_mode;
584762306a36Sopenharmony_ci	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
584862306a36Sopenharmony_ci}
584962306a36Sopenharmony_ci
585062306a36Sopenharmony_cistatic void alc_fixup_headset_mode(struct hda_codec *codec,
585162306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
585262306a36Sopenharmony_ci{
585362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
585462306a36Sopenharmony_ci
585562306a36Sopenharmony_ci	switch (action) {
585662306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
585762306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
585862306a36Sopenharmony_ci		break;
585962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PROBE:
586062306a36Sopenharmony_ci		alc_probe_headset_mode(codec);
586162306a36Sopenharmony_ci		break;
586262306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
586362306a36Sopenharmony_ci		if (is_s3_resume(codec) || is_s4_resume(codec)) {
586462306a36Sopenharmony_ci			spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
586562306a36Sopenharmony_ci			spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
586662306a36Sopenharmony_ci		}
586762306a36Sopenharmony_ci		alc_update_headset_mode(codec);
586862306a36Sopenharmony_ci		break;
586962306a36Sopenharmony_ci	}
587062306a36Sopenharmony_ci}
587162306a36Sopenharmony_ci
587262306a36Sopenharmony_cistatic void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
587362306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
587462306a36Sopenharmony_ci{
587562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
587662306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
587762306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
587862306a36Sopenharmony_ci	}
587962306a36Sopenharmony_ci	else
588062306a36Sopenharmony_ci		alc_fixup_headset_mode(codec, fix, action);
588162306a36Sopenharmony_ci}
588262306a36Sopenharmony_ci
588362306a36Sopenharmony_cistatic void alc255_set_default_jack_type(struct hda_codec *codec)
588462306a36Sopenharmony_ci{
588562306a36Sopenharmony_ci	/* Set to iphone type */
588662306a36Sopenharmony_ci	static const struct coef_fw alc255fw[] = {
588762306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x880b),
588862306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd089),
588962306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x080b),
589062306a36Sopenharmony_ci		WRITE_COEF(0x46, 0x0004),
589162306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c0b),
589262306a36Sopenharmony_ci		{}
589362306a36Sopenharmony_ci	};
589462306a36Sopenharmony_ci	static const struct coef_fw alc256fw[] = {
589562306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x884b),
589662306a36Sopenharmony_ci		WRITE_COEF(0x45, 0xd089),
589762306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x084b),
589862306a36Sopenharmony_ci		WRITE_COEF(0x46, 0x0004),
589962306a36Sopenharmony_ci		WRITE_COEF(0x1b, 0x0c4b),
590062306a36Sopenharmony_ci		{}
590162306a36Sopenharmony_ci	};
590262306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
590362306a36Sopenharmony_ci	case 0x10ec0255:
590462306a36Sopenharmony_ci		alc_process_coef_fw(codec, alc255fw);
590562306a36Sopenharmony_ci		break;
590662306a36Sopenharmony_ci	case 0x10ec0230:
590762306a36Sopenharmony_ci	case 0x10ec0236:
590862306a36Sopenharmony_ci	case 0x10ec0256:
590962306a36Sopenharmony_ci	case 0x19e58326:
591062306a36Sopenharmony_ci		alc_process_coef_fw(codec, alc256fw);
591162306a36Sopenharmony_ci		break;
591262306a36Sopenharmony_ci	}
591362306a36Sopenharmony_ci	msleep(30);
591462306a36Sopenharmony_ci}
591562306a36Sopenharmony_ci
591662306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
591762306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
591862306a36Sopenharmony_ci{
591962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
592062306a36Sopenharmony_ci		alc255_set_default_jack_type(codec);
592162306a36Sopenharmony_ci	}
592262306a36Sopenharmony_ci	alc_fixup_headset_mode(codec, fix, action);
592362306a36Sopenharmony_ci}
592462306a36Sopenharmony_ci
592562306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
592662306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
592762306a36Sopenharmony_ci{
592862306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
592962306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
593062306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
593162306a36Sopenharmony_ci		alc255_set_default_jack_type(codec);
593262306a36Sopenharmony_ci	}
593362306a36Sopenharmony_ci	else
593462306a36Sopenharmony_ci		alc_fixup_headset_mode(codec, fix, action);
593562306a36Sopenharmony_ci}
593662306a36Sopenharmony_ci
593762306a36Sopenharmony_cistatic void alc288_update_headset_jack_cb(struct hda_codec *codec,
593862306a36Sopenharmony_ci				       struct hda_jack_callback *jack)
593962306a36Sopenharmony_ci{
594062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
594162306a36Sopenharmony_ci
594262306a36Sopenharmony_ci	alc_update_headset_jack_cb(codec, jack);
594362306a36Sopenharmony_ci	/* Headset Mic enable or disable, only for Dell Dino */
594462306a36Sopenharmony_ci	alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
594562306a36Sopenharmony_ci}
594662306a36Sopenharmony_ci
594762306a36Sopenharmony_cistatic void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
594862306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
594962306a36Sopenharmony_ci{
595062306a36Sopenharmony_ci	alc_fixup_headset_mode(codec, fix, action);
595162306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PROBE) {
595262306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
595362306a36Sopenharmony_ci		/* toggled via hp_automute_hook */
595462306a36Sopenharmony_ci		spec->gpio_mask |= 0x40;
595562306a36Sopenharmony_ci		spec->gpio_dir |= 0x40;
595662306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
595762306a36Sopenharmony_ci	}
595862306a36Sopenharmony_ci}
595962306a36Sopenharmony_ci
596062306a36Sopenharmony_cistatic void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
596162306a36Sopenharmony_ci					const struct hda_fixup *fix, int action)
596262306a36Sopenharmony_ci{
596362306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
596462306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
596562306a36Sopenharmony_ci		spec->gen.auto_mute_via_amp = 1;
596662306a36Sopenharmony_ci	}
596762306a36Sopenharmony_ci}
596862306a36Sopenharmony_ci
596962306a36Sopenharmony_cistatic void alc_fixup_no_shutup(struct hda_codec *codec,
597062306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
597162306a36Sopenharmony_ci{
597262306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
597362306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
597462306a36Sopenharmony_ci		spec->no_shutup_pins = 1;
597562306a36Sopenharmony_ci	}
597662306a36Sopenharmony_ci}
597762306a36Sopenharmony_ci
597862306a36Sopenharmony_cistatic void alc_fixup_disable_aamix(struct hda_codec *codec,
597962306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
598062306a36Sopenharmony_ci{
598162306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
598262306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
598362306a36Sopenharmony_ci		/* Disable AA-loopback as it causes white noise */
598462306a36Sopenharmony_ci		spec->gen.mixer_nid = 0;
598562306a36Sopenharmony_ci	}
598662306a36Sopenharmony_ci}
598762306a36Sopenharmony_ci
598862306a36Sopenharmony_ci/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
598962306a36Sopenharmony_cistatic void alc_fixup_tpt440_dock(struct hda_codec *codec,
599062306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
599162306a36Sopenharmony_ci{
599262306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
599362306a36Sopenharmony_ci		{ 0x16, 0x21211010 }, /* dock headphone */
599462306a36Sopenharmony_ci		{ 0x19, 0x21a11010 }, /* dock mic */
599562306a36Sopenharmony_ci		{ }
599662306a36Sopenharmony_ci	};
599762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
599862306a36Sopenharmony_ci
599962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
600062306a36Sopenharmony_ci		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
600162306a36Sopenharmony_ci		codec->power_save_node = 0; /* avoid click noises */
600262306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
600362306a36Sopenharmony_ci	}
600462306a36Sopenharmony_ci}
600562306a36Sopenharmony_ci
600662306a36Sopenharmony_cistatic void alc_fixup_tpt470_dock(struct hda_codec *codec,
600762306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
600862306a36Sopenharmony_ci{
600962306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
601062306a36Sopenharmony_ci		{ 0x17, 0x21211010 }, /* dock headphone */
601162306a36Sopenharmony_ci		{ 0x19, 0x21a11010 }, /* dock mic */
601262306a36Sopenharmony_ci		{ }
601362306a36Sopenharmony_ci	};
601462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
601562306a36Sopenharmony_ci
601662306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
601762306a36Sopenharmony_ci		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
601862306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
601962306a36Sopenharmony_ci	} else if (action == HDA_FIXUP_ACT_INIT) {
602062306a36Sopenharmony_ci		/* Enable DOCK device */
602162306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x17, 0,
602262306a36Sopenharmony_ci			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
602362306a36Sopenharmony_ci		/* Enable DOCK device */
602462306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x19, 0,
602562306a36Sopenharmony_ci			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
602662306a36Sopenharmony_ci	}
602762306a36Sopenharmony_ci}
602862306a36Sopenharmony_ci
602962306a36Sopenharmony_cistatic void alc_fixup_tpt470_dacs(struct hda_codec *codec,
603062306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
603162306a36Sopenharmony_ci{
603262306a36Sopenharmony_ci	/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
603362306a36Sopenharmony_ci	 * the speaker output becomes too low by some reason on Thinkpads with
603462306a36Sopenharmony_ci	 * ALC298 codec
603562306a36Sopenharmony_ci	 */
603662306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
603762306a36Sopenharmony_ci		0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
603862306a36Sopenharmony_ci		0
603962306a36Sopenharmony_ci	};
604062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
604162306a36Sopenharmony_ci
604262306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
604362306a36Sopenharmony_ci		spec->gen.preferred_dacs = preferred_pairs;
604462306a36Sopenharmony_ci}
604562306a36Sopenharmony_ci
604662306a36Sopenharmony_cistatic void alc295_fixup_asus_dacs(struct hda_codec *codec,
604762306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
604862306a36Sopenharmony_ci{
604962306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
605062306a36Sopenharmony_ci		0x17, 0x02, 0x21, 0x03, 0
605162306a36Sopenharmony_ci	};
605262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
605362306a36Sopenharmony_ci
605462306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
605562306a36Sopenharmony_ci		spec->gen.preferred_dacs = preferred_pairs;
605662306a36Sopenharmony_ci}
605762306a36Sopenharmony_ci
605862306a36Sopenharmony_cistatic void alc_shutup_dell_xps13(struct hda_codec *codec)
605962306a36Sopenharmony_ci{
606062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
606162306a36Sopenharmony_ci	int hp_pin = alc_get_hp_pin(spec);
606262306a36Sopenharmony_ci
606362306a36Sopenharmony_ci	/* Prevent pop noises when headphones are plugged in */
606462306a36Sopenharmony_ci	snd_hda_codec_write(codec, hp_pin, 0,
606562306a36Sopenharmony_ci			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
606662306a36Sopenharmony_ci	msleep(20);
606762306a36Sopenharmony_ci}
606862306a36Sopenharmony_ci
606962306a36Sopenharmony_cistatic void alc_fixup_dell_xps13(struct hda_codec *codec,
607062306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
607162306a36Sopenharmony_ci{
607262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
607362306a36Sopenharmony_ci	struct hda_input_mux *imux = &spec->gen.input_mux;
607462306a36Sopenharmony_ci	int i;
607562306a36Sopenharmony_ci
607662306a36Sopenharmony_ci	switch (action) {
607762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
607862306a36Sopenharmony_ci		/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
607962306a36Sopenharmony_ci		 * it causes a click noise at start up
608062306a36Sopenharmony_ci		 */
608162306a36Sopenharmony_ci		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
608262306a36Sopenharmony_ci		spec->shutup = alc_shutup_dell_xps13;
608362306a36Sopenharmony_ci		break;
608462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PROBE:
608562306a36Sopenharmony_ci		/* Make the internal mic the default input source. */
608662306a36Sopenharmony_ci		for (i = 0; i < imux->num_items; i++) {
608762306a36Sopenharmony_ci			if (spec->gen.imux_pins[i] == 0x12) {
608862306a36Sopenharmony_ci				spec->gen.cur_mux[0] = i;
608962306a36Sopenharmony_ci				break;
609062306a36Sopenharmony_ci			}
609162306a36Sopenharmony_ci		}
609262306a36Sopenharmony_ci		break;
609362306a36Sopenharmony_ci	}
609462306a36Sopenharmony_ci}
609562306a36Sopenharmony_ci
609662306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
609762306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
609862306a36Sopenharmony_ci{
609962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
610062306a36Sopenharmony_ci
610162306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
610262306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
610362306a36Sopenharmony_ci		spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
610462306a36Sopenharmony_ci
610562306a36Sopenharmony_ci		/* Disable boost for mic-in permanently. (This code is only called
610662306a36Sopenharmony_ci		   from quirks that guarantee that the headphone is at NID 0x1b.) */
610762306a36Sopenharmony_ci		snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
610862306a36Sopenharmony_ci		snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
610962306a36Sopenharmony_ci	} else
611062306a36Sopenharmony_ci		alc_fixup_headset_mode(codec, fix, action);
611162306a36Sopenharmony_ci}
611262306a36Sopenharmony_ci
611362306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
611462306a36Sopenharmony_ci				const struct hda_fixup *fix, int action)
611562306a36Sopenharmony_ci{
611662306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
611762306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0xc4, 0x8000);
611862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
611962306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
612062306a36Sopenharmony_ci	}
612162306a36Sopenharmony_ci	alc_fixup_headset_mode(codec, fix, action);
612262306a36Sopenharmony_ci}
612362306a36Sopenharmony_ci
612462306a36Sopenharmony_ci/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
612562306a36Sopenharmony_cistatic int find_ext_mic_pin(struct hda_codec *codec)
612662306a36Sopenharmony_ci{
612762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
612862306a36Sopenharmony_ci	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
612962306a36Sopenharmony_ci	hda_nid_t nid;
613062306a36Sopenharmony_ci	unsigned int defcfg;
613162306a36Sopenharmony_ci	int i;
613262306a36Sopenharmony_ci
613362306a36Sopenharmony_ci	for (i = 0; i < cfg->num_inputs; i++) {
613462306a36Sopenharmony_ci		if (cfg->inputs[i].type != AUTO_PIN_MIC)
613562306a36Sopenharmony_ci			continue;
613662306a36Sopenharmony_ci		nid = cfg->inputs[i].pin;
613762306a36Sopenharmony_ci		defcfg = snd_hda_codec_get_pincfg(codec, nid);
613862306a36Sopenharmony_ci		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
613962306a36Sopenharmony_ci			continue;
614062306a36Sopenharmony_ci		return nid;
614162306a36Sopenharmony_ci	}
614262306a36Sopenharmony_ci
614362306a36Sopenharmony_ci	return 0;
614462306a36Sopenharmony_ci}
614562306a36Sopenharmony_ci
614662306a36Sopenharmony_cistatic void alc271_hp_gate_mic_jack(struct hda_codec *codec,
614762306a36Sopenharmony_ci				    const struct hda_fixup *fix,
614862306a36Sopenharmony_ci				    int action)
614962306a36Sopenharmony_ci{
615062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
615162306a36Sopenharmony_ci
615262306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PROBE) {
615362306a36Sopenharmony_ci		int mic_pin = find_ext_mic_pin(codec);
615462306a36Sopenharmony_ci		int hp_pin = alc_get_hp_pin(spec);
615562306a36Sopenharmony_ci
615662306a36Sopenharmony_ci		if (snd_BUG_ON(!mic_pin || !hp_pin))
615762306a36Sopenharmony_ci			return;
615862306a36Sopenharmony_ci		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
615962306a36Sopenharmony_ci	}
616062306a36Sopenharmony_ci}
616162306a36Sopenharmony_ci
616262306a36Sopenharmony_cistatic void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
616362306a36Sopenharmony_ci					     const struct hda_fixup *fix,
616462306a36Sopenharmony_ci					     int action)
616562306a36Sopenharmony_ci{
616662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
616762306a36Sopenharmony_ci	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
616862306a36Sopenharmony_ci	int i;
616962306a36Sopenharmony_ci
617062306a36Sopenharmony_ci	/* The mic boosts on level 2 and 3 are too noisy
617162306a36Sopenharmony_ci	   on the internal mic input.
617262306a36Sopenharmony_ci	   Therefore limit the boost to 0 or 1. */
617362306a36Sopenharmony_ci
617462306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PROBE)
617562306a36Sopenharmony_ci		return;
617662306a36Sopenharmony_ci
617762306a36Sopenharmony_ci	for (i = 0; i < cfg->num_inputs; i++) {
617862306a36Sopenharmony_ci		hda_nid_t nid = cfg->inputs[i].pin;
617962306a36Sopenharmony_ci		unsigned int defcfg;
618062306a36Sopenharmony_ci		if (cfg->inputs[i].type != AUTO_PIN_MIC)
618162306a36Sopenharmony_ci			continue;
618262306a36Sopenharmony_ci		defcfg = snd_hda_codec_get_pincfg(codec, nid);
618362306a36Sopenharmony_ci		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
618462306a36Sopenharmony_ci			continue;
618562306a36Sopenharmony_ci
618662306a36Sopenharmony_ci		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
618762306a36Sopenharmony_ci					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
618862306a36Sopenharmony_ci					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
618962306a36Sopenharmony_ci					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
619062306a36Sopenharmony_ci					  (0 << AC_AMPCAP_MUTE_SHIFT));
619162306a36Sopenharmony_ci	}
619262306a36Sopenharmony_ci}
619362306a36Sopenharmony_ci
619462306a36Sopenharmony_cistatic void alc283_hp_automute_hook(struct hda_codec *codec,
619562306a36Sopenharmony_ci				    struct hda_jack_callback *jack)
619662306a36Sopenharmony_ci{
619762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
619862306a36Sopenharmony_ci	int vref;
619962306a36Sopenharmony_ci
620062306a36Sopenharmony_ci	msleep(200);
620162306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
620262306a36Sopenharmony_ci
620362306a36Sopenharmony_ci	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
620462306a36Sopenharmony_ci
620562306a36Sopenharmony_ci	msleep(600);
620662306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
620762306a36Sopenharmony_ci			    vref);
620862306a36Sopenharmony_ci}
620962306a36Sopenharmony_ci
621062306a36Sopenharmony_cistatic void alc283_fixup_chromebook(struct hda_codec *codec,
621162306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
621262306a36Sopenharmony_ci{
621362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
621462306a36Sopenharmony_ci
621562306a36Sopenharmony_ci	switch (action) {
621662306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
621762306a36Sopenharmony_ci		snd_hda_override_wcaps(codec, 0x03, 0);
621862306a36Sopenharmony_ci		/* Disable AA-loopback as it causes white noise */
621962306a36Sopenharmony_ci		spec->gen.mixer_nid = 0;
622062306a36Sopenharmony_ci		break;
622162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
622262306a36Sopenharmony_ci		/* MIC2-VREF control */
622362306a36Sopenharmony_ci		/* Set to manual mode */
622462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
622562306a36Sopenharmony_ci		/* Enable Line1 input control by verb */
622662306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
622762306a36Sopenharmony_ci		break;
622862306a36Sopenharmony_ci	}
622962306a36Sopenharmony_ci}
623062306a36Sopenharmony_ci
623162306a36Sopenharmony_cistatic void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
623262306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
623362306a36Sopenharmony_ci{
623462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
623562306a36Sopenharmony_ci
623662306a36Sopenharmony_ci	switch (action) {
623762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
623862306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc283_hp_automute_hook;
623962306a36Sopenharmony_ci		break;
624062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
624162306a36Sopenharmony_ci		/* MIC2-VREF control */
624262306a36Sopenharmony_ci		/* Set to manual mode */
624362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
624462306a36Sopenharmony_ci		break;
624562306a36Sopenharmony_ci	}
624662306a36Sopenharmony_ci}
624762306a36Sopenharmony_ci
624862306a36Sopenharmony_ci/* mute tablet speaker pin (0x14) via dock plugging in addition */
624962306a36Sopenharmony_cistatic void asus_tx300_automute(struct hda_codec *codec)
625062306a36Sopenharmony_ci{
625162306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
625262306a36Sopenharmony_ci	snd_hda_gen_update_outputs(codec);
625362306a36Sopenharmony_ci	if (snd_hda_jack_detect(codec, 0x1b))
625462306a36Sopenharmony_ci		spec->gen.mute_bits |= (1ULL << 0x14);
625562306a36Sopenharmony_ci}
625662306a36Sopenharmony_ci
625762306a36Sopenharmony_cistatic void alc282_fixup_asus_tx300(struct hda_codec *codec,
625862306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
625962306a36Sopenharmony_ci{
626062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
626162306a36Sopenharmony_ci	static const struct hda_pintbl dock_pins[] = {
626262306a36Sopenharmony_ci		{ 0x1b, 0x21114000 }, /* dock speaker pin */
626362306a36Sopenharmony_ci		{}
626462306a36Sopenharmony_ci	};
626562306a36Sopenharmony_ci
626662306a36Sopenharmony_ci	switch (action) {
626762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
626862306a36Sopenharmony_ci		spec->init_amp = ALC_INIT_DEFAULT;
626962306a36Sopenharmony_ci		/* TX300 needs to set up GPIO2 for the speaker amp */
627062306a36Sopenharmony_ci		alc_setup_gpio(codec, 0x04);
627162306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, dock_pins);
627262306a36Sopenharmony_ci		spec->gen.auto_mute_via_amp = 1;
627362306a36Sopenharmony_ci		spec->gen.automute_hook = asus_tx300_automute;
627462306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x1b,
627562306a36Sopenharmony_ci						    snd_hda_gen_hp_automute);
627662306a36Sopenharmony_ci		break;
627762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PROBE:
627862306a36Sopenharmony_ci		spec->init_amp = ALC_INIT_DEFAULT;
627962306a36Sopenharmony_ci		break;
628062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_BUILD:
628162306a36Sopenharmony_ci		/* this is a bit tricky; give more sane names for the main
628262306a36Sopenharmony_ci		 * (tablet) speaker and the dock speaker, respectively
628362306a36Sopenharmony_ci		 */
628462306a36Sopenharmony_ci		rename_ctl(codec, "Speaker Playback Switch",
628562306a36Sopenharmony_ci			   "Dock Speaker Playback Switch");
628662306a36Sopenharmony_ci		rename_ctl(codec, "Bass Speaker Playback Switch",
628762306a36Sopenharmony_ci			   "Speaker Playback Switch");
628862306a36Sopenharmony_ci		break;
628962306a36Sopenharmony_ci	}
629062306a36Sopenharmony_ci}
629162306a36Sopenharmony_ci
629262306a36Sopenharmony_cistatic void alc290_fixup_mono_speakers(struct hda_codec *codec,
629362306a36Sopenharmony_ci				       const struct hda_fixup *fix, int action)
629462306a36Sopenharmony_ci{
629562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
629662306a36Sopenharmony_ci		/* DAC node 0x03 is giving mono output. We therefore want to
629762306a36Sopenharmony_ci		   make sure 0x14 (front speaker) and 0x15 (headphones) use the
629862306a36Sopenharmony_ci		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
629962306a36Sopenharmony_ci		static const hda_nid_t conn1[] = { 0x0c };
630062306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
630162306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
630262306a36Sopenharmony_ci	}
630362306a36Sopenharmony_ci}
630462306a36Sopenharmony_ci
630562306a36Sopenharmony_cistatic void alc298_fixup_speaker_volume(struct hda_codec *codec,
630662306a36Sopenharmony_ci					const struct hda_fixup *fix, int action)
630762306a36Sopenharmony_ci{
630862306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
630962306a36Sopenharmony_ci		/* The speaker is routed to the Node 0x06 by a mistake, as a result
631062306a36Sopenharmony_ci		   we can't adjust the speaker's volume since this node does not has
631162306a36Sopenharmony_ci		   Amp-out capability. we change the speaker's route to:
631262306a36Sopenharmony_ci		   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
631362306a36Sopenharmony_ci		   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
631462306a36Sopenharmony_ci		   speaker's volume now. */
631562306a36Sopenharmony_ci
631662306a36Sopenharmony_ci		static const hda_nid_t conn1[] = { 0x0c };
631762306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
631862306a36Sopenharmony_ci	}
631962306a36Sopenharmony_ci}
632062306a36Sopenharmony_ci
632162306a36Sopenharmony_ci/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
632262306a36Sopenharmony_cistatic void alc295_fixup_disable_dac3(struct hda_codec *codec,
632362306a36Sopenharmony_ci				      const struct hda_fixup *fix, int action)
632462306a36Sopenharmony_ci{
632562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
632662306a36Sopenharmony_ci		static const hda_nid_t conn[] = { 0x02, 0x03 };
632762306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
632862306a36Sopenharmony_ci	}
632962306a36Sopenharmony_ci}
633062306a36Sopenharmony_ci
633162306a36Sopenharmony_ci/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
633262306a36Sopenharmony_cistatic void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
633362306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
633462306a36Sopenharmony_ci{
633562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
633662306a36Sopenharmony_ci		static const hda_nid_t conn[] = { 0x02 };
633762306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
633862306a36Sopenharmony_ci	}
633962306a36Sopenharmony_ci}
634062306a36Sopenharmony_ci
634162306a36Sopenharmony_ci/* Hook to update amp GPIO4 for automute */
634262306a36Sopenharmony_cistatic void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
634362306a36Sopenharmony_ci					  struct hda_jack_callback *jack)
634462306a36Sopenharmony_ci{
634562306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
634662306a36Sopenharmony_ci
634762306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
634862306a36Sopenharmony_ci	/* mute_led_polarity is set to 0, so we pass inverted value here */
634962306a36Sopenharmony_ci	alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
635062306a36Sopenharmony_ci			    !spec->gen.hp_jack_present);
635162306a36Sopenharmony_ci}
635262306a36Sopenharmony_ci
635362306a36Sopenharmony_ci/* Manage GPIOs for HP EliteBook Folio 9480m.
635462306a36Sopenharmony_ci *
635562306a36Sopenharmony_ci * GPIO4 is the headphone amplifier power control
635662306a36Sopenharmony_ci * GPIO3 is the audio output mute indicator LED
635762306a36Sopenharmony_ci */
635862306a36Sopenharmony_ci
635962306a36Sopenharmony_cistatic void alc280_fixup_hp_9480m(struct hda_codec *codec,
636062306a36Sopenharmony_ci				  const struct hda_fixup *fix,
636162306a36Sopenharmony_ci				  int action)
636262306a36Sopenharmony_ci{
636362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
636462306a36Sopenharmony_ci
636562306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
636662306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
636762306a36Sopenharmony_ci		/* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
636862306a36Sopenharmony_ci		spec->gpio_mask |= 0x10;
636962306a36Sopenharmony_ci		spec->gpio_dir |= 0x10;
637062306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
637162306a36Sopenharmony_ci	}
637262306a36Sopenharmony_ci}
637362306a36Sopenharmony_ci
637462306a36Sopenharmony_cistatic void alc275_fixup_gpio4_off(struct hda_codec *codec,
637562306a36Sopenharmony_ci				   const struct hda_fixup *fix,
637662306a36Sopenharmony_ci				   int action)
637762306a36Sopenharmony_ci{
637862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
637962306a36Sopenharmony_ci
638062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
638162306a36Sopenharmony_ci		spec->gpio_mask |= 0x04;
638262306a36Sopenharmony_ci		spec->gpio_dir |= 0x04;
638362306a36Sopenharmony_ci		/* set data bit low */
638462306a36Sopenharmony_ci	}
638562306a36Sopenharmony_ci}
638662306a36Sopenharmony_ci
638762306a36Sopenharmony_ci/* Quirk for Thinkpad X1 7th and 8th Gen
638862306a36Sopenharmony_ci * The following fixed routing needed
638962306a36Sopenharmony_ci * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
639062306a36Sopenharmony_ci * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
639162306a36Sopenharmony_ci * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
639262306a36Sopenharmony_ci */
639362306a36Sopenharmony_cistatic void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
639462306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
639562306a36Sopenharmony_ci{
639662306a36Sopenharmony_ci	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
639762306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
639862306a36Sopenharmony_ci		0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
639962306a36Sopenharmony_ci	};
640062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
640162306a36Sopenharmony_ci
640262306a36Sopenharmony_ci	switch (action) {
640362306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
640462306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
640562306a36Sopenharmony_ci		spec->gen.preferred_dacs = preferred_pairs;
640662306a36Sopenharmony_ci		break;
640762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_BUILD:
640862306a36Sopenharmony_ci		/* The generic parser creates somewhat unintuitive volume ctls
640962306a36Sopenharmony_ci		 * with the fixed routing above, and the shared DAC2 may be
641062306a36Sopenharmony_ci		 * confusing for PA.
641162306a36Sopenharmony_ci		 * Rename those to unique names so that PA doesn't touch them
641262306a36Sopenharmony_ci		 * and use only Master volume.
641362306a36Sopenharmony_ci		 */
641462306a36Sopenharmony_ci		rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
641562306a36Sopenharmony_ci		rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
641662306a36Sopenharmony_ci		break;
641762306a36Sopenharmony_ci	}
641862306a36Sopenharmony_ci}
641962306a36Sopenharmony_ci
642062306a36Sopenharmony_cistatic void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
642162306a36Sopenharmony_ci					 const struct hda_fixup *fix,
642262306a36Sopenharmony_ci					 int action)
642362306a36Sopenharmony_ci{
642462306a36Sopenharmony_ci	alc_fixup_dual_codecs(codec, fix, action);
642562306a36Sopenharmony_ci	switch (action) {
642662306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
642762306a36Sopenharmony_ci		/* override card longname to provide a unique UCM profile */
642862306a36Sopenharmony_ci		strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
642962306a36Sopenharmony_ci		break;
643062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_BUILD:
643162306a36Sopenharmony_ci		/* rename Capture controls depending on the codec */
643262306a36Sopenharmony_ci		rename_ctl(codec, "Capture Volume",
643362306a36Sopenharmony_ci			   codec->addr == 0 ?
643462306a36Sopenharmony_ci			   "Rear-Panel Capture Volume" :
643562306a36Sopenharmony_ci			   "Front-Panel Capture Volume");
643662306a36Sopenharmony_ci		rename_ctl(codec, "Capture Switch",
643762306a36Sopenharmony_ci			   codec->addr == 0 ?
643862306a36Sopenharmony_ci			   "Rear-Panel Capture Switch" :
643962306a36Sopenharmony_ci			   "Front-Panel Capture Switch");
644062306a36Sopenharmony_ci		break;
644162306a36Sopenharmony_ci	}
644262306a36Sopenharmony_ci}
644362306a36Sopenharmony_ci
644462306a36Sopenharmony_cistatic void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
644562306a36Sopenharmony_ci				      const struct hda_fixup *fix, int action)
644662306a36Sopenharmony_ci{
644762306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
644862306a36Sopenharmony_ci		return;
644962306a36Sopenharmony_ci
645062306a36Sopenharmony_ci	codec->power_save_node = 1;
645162306a36Sopenharmony_ci}
645262306a36Sopenharmony_ci
645362306a36Sopenharmony_ci/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
645462306a36Sopenharmony_cistatic void alc274_fixup_bind_dacs(struct hda_codec *codec,
645562306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
645662306a36Sopenharmony_ci{
645762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
645862306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
645962306a36Sopenharmony_ci		0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
646062306a36Sopenharmony_ci		0
646162306a36Sopenharmony_ci	};
646262306a36Sopenharmony_ci
646362306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
646462306a36Sopenharmony_ci		return;
646562306a36Sopenharmony_ci
646662306a36Sopenharmony_ci	spec->gen.preferred_dacs = preferred_pairs;
646762306a36Sopenharmony_ci	spec->gen.auto_mute_via_amp = 1;
646862306a36Sopenharmony_ci	codec->power_save_node = 0;
646962306a36Sopenharmony_ci}
647062306a36Sopenharmony_ci
647162306a36Sopenharmony_ci/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
647262306a36Sopenharmony_cistatic void alc289_fixup_asus_ga401(struct hda_codec *codec,
647362306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
647462306a36Sopenharmony_ci{
647562306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
647662306a36Sopenharmony_ci		0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
647762306a36Sopenharmony_ci	};
647862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
647962306a36Sopenharmony_ci
648062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
648162306a36Sopenharmony_ci		spec->gen.preferred_dacs = preferred_pairs;
648262306a36Sopenharmony_ci		spec->gen.obey_preferred_dacs = 1;
648362306a36Sopenharmony_ci	}
648462306a36Sopenharmony_ci}
648562306a36Sopenharmony_ci
648662306a36Sopenharmony_ci/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
648762306a36Sopenharmony_cistatic void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
648862306a36Sopenharmony_ci			      const struct hda_fixup *fix, int action)
648962306a36Sopenharmony_ci{
649062306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
649162306a36Sopenharmony_ci		return;
649262306a36Sopenharmony_ci
649362306a36Sopenharmony_ci	snd_hda_override_wcaps(codec, 0x03, 0);
649462306a36Sopenharmony_ci}
649562306a36Sopenharmony_ci
649662306a36Sopenharmony_cistatic void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
649762306a36Sopenharmony_ci{
649862306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
649962306a36Sopenharmony_ci	case 0x10ec0274:
650062306a36Sopenharmony_ci	case 0x10ec0294:
650162306a36Sopenharmony_ci	case 0x10ec0225:
650262306a36Sopenharmony_ci	case 0x10ec0295:
650362306a36Sopenharmony_ci	case 0x10ec0299:
650462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
650562306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
650662306a36Sopenharmony_ci		break;
650762306a36Sopenharmony_ci	case 0x10ec0230:
650862306a36Sopenharmony_ci	case 0x10ec0235:
650962306a36Sopenharmony_ci	case 0x10ec0236:
651062306a36Sopenharmony_ci	case 0x10ec0255:
651162306a36Sopenharmony_ci	case 0x10ec0256:
651262306a36Sopenharmony_ci	case 0x10ec0257:
651362306a36Sopenharmony_ci	case 0x19e58326:
651462306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
651562306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
651662306a36Sopenharmony_ci		break;
651762306a36Sopenharmony_ci	}
651862306a36Sopenharmony_ci}
651962306a36Sopenharmony_ci
652062306a36Sopenharmony_cistatic void alc295_fixup_chromebook(struct hda_codec *codec,
652162306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
652262306a36Sopenharmony_ci{
652362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
652462306a36Sopenharmony_ci
652562306a36Sopenharmony_ci	switch (action) {
652662306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
652762306a36Sopenharmony_ci		spec->ultra_low_power = true;
652862306a36Sopenharmony_ci		break;
652962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
653062306a36Sopenharmony_ci		alc_combo_jack_hp_jd_restart(codec);
653162306a36Sopenharmony_ci		break;
653262306a36Sopenharmony_ci	}
653362306a36Sopenharmony_ci}
653462306a36Sopenharmony_ci
653562306a36Sopenharmony_cistatic void alc_fixup_disable_mic_vref(struct hda_codec *codec,
653662306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
653762306a36Sopenharmony_ci{
653862306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
653962306a36Sopenharmony_ci		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
654062306a36Sopenharmony_ci}
654162306a36Sopenharmony_ci
654262306a36Sopenharmony_ci
654362306a36Sopenharmony_cistatic void alc294_gx502_toggle_output(struct hda_codec *codec,
654462306a36Sopenharmony_ci					struct hda_jack_callback *cb)
654562306a36Sopenharmony_ci{
654662306a36Sopenharmony_ci	/* The Windows driver sets the codec up in a very different way where
654762306a36Sopenharmony_ci	 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
654862306a36Sopenharmony_ci	 */
654962306a36Sopenharmony_ci	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
655062306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x10, 0x8a20);
655162306a36Sopenharmony_ci	else
655262306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x10, 0x0a20);
655362306a36Sopenharmony_ci}
655462306a36Sopenharmony_ci
655562306a36Sopenharmony_cistatic void alc294_fixup_gx502_hp(struct hda_codec *codec,
655662306a36Sopenharmony_ci					const struct hda_fixup *fix, int action)
655762306a36Sopenharmony_ci{
655862306a36Sopenharmony_ci	/* Pin 0x21: headphones/headset mic */
655962306a36Sopenharmony_ci	if (!is_jack_detectable(codec, 0x21))
656062306a36Sopenharmony_ci		return;
656162306a36Sopenharmony_ci
656262306a36Sopenharmony_ci	switch (action) {
656362306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
656462306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x21,
656562306a36Sopenharmony_ci				alc294_gx502_toggle_output);
656662306a36Sopenharmony_ci		break;
656762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
656862306a36Sopenharmony_ci		/* Make sure to start in a correct state, i.e. if
656962306a36Sopenharmony_ci		 * headphones have been plugged in before powering up the system
657062306a36Sopenharmony_ci		 */
657162306a36Sopenharmony_ci		alc294_gx502_toggle_output(codec, NULL);
657262306a36Sopenharmony_ci		break;
657362306a36Sopenharmony_ci	}
657462306a36Sopenharmony_ci}
657562306a36Sopenharmony_ci
657662306a36Sopenharmony_cistatic void alc294_gu502_toggle_output(struct hda_codec *codec,
657762306a36Sopenharmony_ci				       struct hda_jack_callback *cb)
657862306a36Sopenharmony_ci{
657962306a36Sopenharmony_ci	/* Windows sets 0x10 to 0x8420 for Node 0x20 which is
658062306a36Sopenharmony_ci	 * responsible from changes between speakers and headphones
658162306a36Sopenharmony_ci	 */
658262306a36Sopenharmony_ci	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
658362306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x10, 0x8420);
658462306a36Sopenharmony_ci	else
658562306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x10, 0x0a20);
658662306a36Sopenharmony_ci}
658762306a36Sopenharmony_ci
658862306a36Sopenharmony_cistatic void alc294_fixup_gu502_hp(struct hda_codec *codec,
658962306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
659062306a36Sopenharmony_ci{
659162306a36Sopenharmony_ci	if (!is_jack_detectable(codec, 0x21))
659262306a36Sopenharmony_ci		return;
659362306a36Sopenharmony_ci
659462306a36Sopenharmony_ci	switch (action) {
659562306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
659662306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x21,
659762306a36Sopenharmony_ci				alc294_gu502_toggle_output);
659862306a36Sopenharmony_ci		break;
659962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
660062306a36Sopenharmony_ci		alc294_gu502_toggle_output(codec, NULL);
660162306a36Sopenharmony_ci		break;
660262306a36Sopenharmony_ci	}
660362306a36Sopenharmony_ci}
660462306a36Sopenharmony_ci
660562306a36Sopenharmony_cistatic void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
660662306a36Sopenharmony_ci			      const struct hda_fixup *fix, int action)
660762306a36Sopenharmony_ci{
660862306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_INIT)
660962306a36Sopenharmony_ci		return;
661062306a36Sopenharmony_ci
661162306a36Sopenharmony_ci	msleep(100);
661262306a36Sopenharmony_ci	alc_write_coef_idx(codec, 0x65, 0x0);
661362306a36Sopenharmony_ci}
661462306a36Sopenharmony_ci
661562306a36Sopenharmony_cistatic void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
661662306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
661762306a36Sopenharmony_ci{
661862306a36Sopenharmony_ci	switch (action) {
661962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
662062306a36Sopenharmony_ci		alc_combo_jack_hp_jd_restart(codec);
662162306a36Sopenharmony_ci		break;
662262306a36Sopenharmony_ci	}
662362306a36Sopenharmony_ci}
662462306a36Sopenharmony_ci
662562306a36Sopenharmony_cistatic void alc_fixup_no_int_mic(struct hda_codec *codec,
662662306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
662762306a36Sopenharmony_ci{
662862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
662962306a36Sopenharmony_ci
663062306a36Sopenharmony_ci	switch (action) {
663162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
663262306a36Sopenharmony_ci		/* Mic RING SLEEVE swap for combo jack */
663362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
663462306a36Sopenharmony_ci		spec->no_internal_mic_pin = true;
663562306a36Sopenharmony_ci		break;
663662306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
663762306a36Sopenharmony_ci		alc_combo_jack_hp_jd_restart(codec);
663862306a36Sopenharmony_ci		break;
663962306a36Sopenharmony_ci	}
664062306a36Sopenharmony_ci}
664162306a36Sopenharmony_ci
664262306a36Sopenharmony_ci/* GPIO1 = amplifier on/off
664362306a36Sopenharmony_ci * GPIO3 = mic mute LED
664462306a36Sopenharmony_ci */
664562306a36Sopenharmony_cistatic void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
664662306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
664762306a36Sopenharmony_ci{
664862306a36Sopenharmony_ci	static const hda_nid_t conn[] = { 0x02 };
664962306a36Sopenharmony_ci
665062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
665162306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
665262306a36Sopenharmony_ci		{ 0x14, 0x90170110 },  /* front/high speakers */
665362306a36Sopenharmony_ci		{ 0x17, 0x90170130 },  /* back/bass speakers */
665462306a36Sopenharmony_ci		{ }
665562306a36Sopenharmony_ci	};
665662306a36Sopenharmony_ci
665762306a36Sopenharmony_ci	//enable micmute led
665862306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
665962306a36Sopenharmony_ci
666062306a36Sopenharmony_ci	switch (action) {
666162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
666262306a36Sopenharmony_ci		spec->micmute_led_polarity = 1;
666362306a36Sopenharmony_ci		/* needed for amp of back speakers */
666462306a36Sopenharmony_ci		spec->gpio_mask |= 0x01;
666562306a36Sopenharmony_ci		spec->gpio_dir |= 0x01;
666662306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
666762306a36Sopenharmony_ci		/* share DAC to have unified volume control */
666862306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
666962306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
667062306a36Sopenharmony_ci		break;
667162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
667262306a36Sopenharmony_ci		/* need to toggle GPIO to enable the amp of back speakers */
667362306a36Sopenharmony_ci		alc_update_gpio_data(codec, 0x01, true);
667462306a36Sopenharmony_ci		msleep(100);
667562306a36Sopenharmony_ci		alc_update_gpio_data(codec, 0x01, false);
667662306a36Sopenharmony_ci		break;
667762306a36Sopenharmony_ci	}
667862306a36Sopenharmony_ci}
667962306a36Sopenharmony_ci
668062306a36Sopenharmony_cistatic void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
668162306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
668262306a36Sopenharmony_ci{
668362306a36Sopenharmony_ci	static const hda_nid_t conn[] = { 0x02 };
668462306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
668562306a36Sopenharmony_ci		{ 0x14, 0x90170110 },  /* rear speaker */
668662306a36Sopenharmony_ci		{ }
668762306a36Sopenharmony_ci	};
668862306a36Sopenharmony_ci
668962306a36Sopenharmony_ci	switch (action) {
669062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
669162306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
669262306a36Sopenharmony_ci		/* force front speaker to DAC1 */
669362306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
669462306a36Sopenharmony_ci		break;
669562306a36Sopenharmony_ci	}
669662306a36Sopenharmony_ci}
669762306a36Sopenharmony_ci
669862306a36Sopenharmony_cistatic void alc285_fixup_hp_envy_x360(struct hda_codec *codec,
669962306a36Sopenharmony_ci				      const struct hda_fixup *fix,
670062306a36Sopenharmony_ci				      int action)
670162306a36Sopenharmony_ci{
670262306a36Sopenharmony_ci	static const struct coef_fw coefs[] = {
670362306a36Sopenharmony_ci		WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),
670462306a36Sopenharmony_ci		WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),
670562306a36Sopenharmony_ci		WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),
670662306a36Sopenharmony_ci		WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),
670762306a36Sopenharmony_ci		WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),
670862306a36Sopenharmony_ci		WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),
670962306a36Sopenharmony_ci		WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),
671062306a36Sopenharmony_ci		WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),
671162306a36Sopenharmony_ci		WRITE_COEF(0x6e, 0x1005), { }
671262306a36Sopenharmony_ci	};
671362306a36Sopenharmony_ci
671462306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
671562306a36Sopenharmony_ci		{ 0x12, 0xb7a60130 },  /* Internal microphone*/
671662306a36Sopenharmony_ci		{ 0x14, 0x90170150 },  /* B&O soundbar speakers */
671762306a36Sopenharmony_ci		{ 0x17, 0x90170153 },  /* Side speakers */
671862306a36Sopenharmony_ci		{ 0x19, 0x03a11040 },  /* Headset microphone */
671962306a36Sopenharmony_ci		{ }
672062306a36Sopenharmony_ci	};
672162306a36Sopenharmony_ci
672262306a36Sopenharmony_ci	switch (action) {
672362306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
672462306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
672562306a36Sopenharmony_ci
672662306a36Sopenharmony_ci		/* Fixes volume control problem for side speakers */
672762306a36Sopenharmony_ci		alc295_fixup_disable_dac3(codec, fix, action);
672862306a36Sopenharmony_ci
672962306a36Sopenharmony_ci		/* Fixes no sound from headset speaker */
673062306a36Sopenharmony_ci		snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);
673162306a36Sopenharmony_ci
673262306a36Sopenharmony_ci		/* Auto-enable headset mic when plugged */
673362306a36Sopenharmony_ci		snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);
673462306a36Sopenharmony_ci
673562306a36Sopenharmony_ci		/* Headset mic volume enhancement */
673662306a36Sopenharmony_ci		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);
673762306a36Sopenharmony_ci		break;
673862306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
673962306a36Sopenharmony_ci		alc_process_coef_fw(codec, coefs);
674062306a36Sopenharmony_ci		break;
674162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_BUILD:
674262306a36Sopenharmony_ci		rename_ctl(codec, "Bass Speaker Playback Volume",
674362306a36Sopenharmony_ci			   "B&O-Tuned Playback Volume");
674462306a36Sopenharmony_ci		rename_ctl(codec, "Front Playback Switch",
674562306a36Sopenharmony_ci			   "B&O Soundbar Playback Switch");
674662306a36Sopenharmony_ci		rename_ctl(codec, "Bass Speaker Playback Switch",
674762306a36Sopenharmony_ci			   "Side Speaker Playback Switch");
674862306a36Sopenharmony_ci		break;
674962306a36Sopenharmony_ci	}
675062306a36Sopenharmony_ci}
675162306a36Sopenharmony_ci
675262306a36Sopenharmony_ci/* for hda_fixup_thinkpad_acpi() */
675362306a36Sopenharmony_ci#include "thinkpad_helper.c"
675462306a36Sopenharmony_ci
675562306a36Sopenharmony_cistatic void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
675662306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
675762306a36Sopenharmony_ci{
675862306a36Sopenharmony_ci	alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
675962306a36Sopenharmony_ci	hda_fixup_thinkpad_acpi(codec, fix, action);
676062306a36Sopenharmony_ci}
676162306a36Sopenharmony_ci
676262306a36Sopenharmony_ci/* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
676362306a36Sopenharmony_cistatic void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
676462306a36Sopenharmony_ci						  const struct hda_fixup *fix,
676562306a36Sopenharmony_ci						  int action)
676662306a36Sopenharmony_ci{
676762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
676862306a36Sopenharmony_ci
676962306a36Sopenharmony_ci	switch (action) {
677062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
677162306a36Sopenharmony_ci		spec->gen.suppress_auto_mute = 1;
677262306a36Sopenharmony_ci		break;
677362306a36Sopenharmony_ci	}
677462306a36Sopenharmony_ci}
677562306a36Sopenharmony_ci
677662306a36Sopenharmony_cistatic int comp_bind(struct device *dev)
677762306a36Sopenharmony_ci{
677862306a36Sopenharmony_ci	struct hda_codec *cdc = dev_to_hda_codec(dev);
677962306a36Sopenharmony_ci	struct alc_spec *spec = cdc->spec;
678062306a36Sopenharmony_ci
678162306a36Sopenharmony_ci	return component_bind_all(dev, spec->comps);
678262306a36Sopenharmony_ci}
678362306a36Sopenharmony_ci
678462306a36Sopenharmony_cistatic void comp_unbind(struct device *dev)
678562306a36Sopenharmony_ci{
678662306a36Sopenharmony_ci	struct hda_codec *cdc = dev_to_hda_codec(dev);
678762306a36Sopenharmony_ci	struct alc_spec *spec = cdc->spec;
678862306a36Sopenharmony_ci
678962306a36Sopenharmony_ci	component_unbind_all(dev, spec->comps);
679062306a36Sopenharmony_ci}
679162306a36Sopenharmony_ci
679262306a36Sopenharmony_cistatic const struct component_master_ops comp_master_ops = {
679362306a36Sopenharmony_ci	.bind = comp_bind,
679462306a36Sopenharmony_ci	.unbind = comp_unbind,
679562306a36Sopenharmony_ci};
679662306a36Sopenharmony_ci
679762306a36Sopenharmony_cistatic void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
679862306a36Sopenharmony_ci				       struct snd_pcm_substream *sub, int action)
679962306a36Sopenharmony_ci{
680062306a36Sopenharmony_ci	struct alc_spec *spec = cdc->spec;
680162306a36Sopenharmony_ci	int i;
680262306a36Sopenharmony_ci
680362306a36Sopenharmony_ci	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
680462306a36Sopenharmony_ci		if (spec->comps[i].dev && spec->comps[i].pre_playback_hook)
680562306a36Sopenharmony_ci			spec->comps[i].pre_playback_hook(spec->comps[i].dev, action);
680662306a36Sopenharmony_ci	}
680762306a36Sopenharmony_ci	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
680862306a36Sopenharmony_ci		if (spec->comps[i].dev && spec->comps[i].playback_hook)
680962306a36Sopenharmony_ci			spec->comps[i].playback_hook(spec->comps[i].dev, action);
681062306a36Sopenharmony_ci	}
681162306a36Sopenharmony_ci	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
681262306a36Sopenharmony_ci		if (spec->comps[i].dev && spec->comps[i].post_playback_hook)
681362306a36Sopenharmony_ci			spec->comps[i].post_playback_hook(spec->comps[i].dev, action);
681462306a36Sopenharmony_ci	}
681562306a36Sopenharmony_ci}
681662306a36Sopenharmony_ci
681762306a36Sopenharmony_cistruct scodec_dev_name {
681862306a36Sopenharmony_ci	const char *bus;
681962306a36Sopenharmony_ci	const char *hid;
682062306a36Sopenharmony_ci	int index;
682162306a36Sopenharmony_ci};
682262306a36Sopenharmony_ci
682362306a36Sopenharmony_ci/* match the device name in a slightly relaxed manner */
682462306a36Sopenharmony_cistatic int comp_match_cs35l41_dev_name(struct device *dev, void *data)
682562306a36Sopenharmony_ci{
682662306a36Sopenharmony_ci	struct scodec_dev_name *p = data;
682762306a36Sopenharmony_ci	const char *d = dev_name(dev);
682862306a36Sopenharmony_ci	int n = strlen(p->bus);
682962306a36Sopenharmony_ci	char tmp[32];
683062306a36Sopenharmony_ci
683162306a36Sopenharmony_ci	/* check the bus name */
683262306a36Sopenharmony_ci	if (strncmp(d, p->bus, n))
683362306a36Sopenharmony_ci		return 0;
683462306a36Sopenharmony_ci	/* skip the bus number */
683562306a36Sopenharmony_ci	if (isdigit(d[n]))
683662306a36Sopenharmony_ci		n++;
683762306a36Sopenharmony_ci	/* the rest must be exact matching */
683862306a36Sopenharmony_ci	snprintf(tmp, sizeof(tmp), "-%s:00-cs35l41-hda.%d", p->hid, p->index);
683962306a36Sopenharmony_ci	return !strcmp(d + n, tmp);
684062306a36Sopenharmony_ci}
684162306a36Sopenharmony_ci
684262306a36Sopenharmony_cistatic int comp_match_tas2781_dev_name(struct device *dev,
684362306a36Sopenharmony_ci	void *data)
684462306a36Sopenharmony_ci{
684562306a36Sopenharmony_ci	struct scodec_dev_name *p = data;
684662306a36Sopenharmony_ci	const char *d = dev_name(dev);
684762306a36Sopenharmony_ci	int n = strlen(p->bus);
684862306a36Sopenharmony_ci	char tmp[32];
684962306a36Sopenharmony_ci
685062306a36Sopenharmony_ci	/* check the bus name */
685162306a36Sopenharmony_ci	if (strncmp(d, p->bus, n))
685262306a36Sopenharmony_ci		return 0;
685362306a36Sopenharmony_ci	/* skip the bus number */
685462306a36Sopenharmony_ci	if (isdigit(d[n]))
685562306a36Sopenharmony_ci		n++;
685662306a36Sopenharmony_ci	/* the rest must be exact matching */
685762306a36Sopenharmony_ci	snprintf(tmp, sizeof(tmp), "-%s:00", p->hid);
685862306a36Sopenharmony_ci
685962306a36Sopenharmony_ci	return !strcmp(d + n, tmp);
686062306a36Sopenharmony_ci}
686162306a36Sopenharmony_ci
686262306a36Sopenharmony_cistatic void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
686362306a36Sopenharmony_ci				  const char *hid, int count)
686462306a36Sopenharmony_ci{
686562306a36Sopenharmony_ci	struct device *dev = hda_codec_dev(cdc);
686662306a36Sopenharmony_ci	struct alc_spec *spec = cdc->spec;
686762306a36Sopenharmony_ci	struct scodec_dev_name *rec;
686862306a36Sopenharmony_ci	int ret, i;
686962306a36Sopenharmony_ci
687062306a36Sopenharmony_ci	switch (action) {
687162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
687262306a36Sopenharmony_ci		for (i = 0; i < count; i++) {
687362306a36Sopenharmony_ci			rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
687462306a36Sopenharmony_ci			if (!rec)
687562306a36Sopenharmony_ci				return;
687662306a36Sopenharmony_ci			rec->bus = bus;
687762306a36Sopenharmony_ci			rec->hid = hid;
687862306a36Sopenharmony_ci			rec->index = i;
687962306a36Sopenharmony_ci			spec->comps[i].codec = cdc;
688062306a36Sopenharmony_ci			component_match_add(dev, &spec->match,
688162306a36Sopenharmony_ci					    comp_match_cs35l41_dev_name, rec);
688262306a36Sopenharmony_ci		}
688362306a36Sopenharmony_ci		ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
688462306a36Sopenharmony_ci		if (ret)
688562306a36Sopenharmony_ci			codec_err(cdc, "Fail to register component aggregator %d\n", ret);
688662306a36Sopenharmony_ci		else
688762306a36Sopenharmony_ci			spec->gen.pcm_playback_hook = comp_generic_playback_hook;
688862306a36Sopenharmony_ci		break;
688962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_FREE:
689062306a36Sopenharmony_ci		component_master_del(dev, &comp_master_ops);
689162306a36Sopenharmony_ci		break;
689262306a36Sopenharmony_ci	}
689362306a36Sopenharmony_ci}
689462306a36Sopenharmony_ci
689562306a36Sopenharmony_cistatic void tas2781_generic_fixup(struct hda_codec *cdc, int action,
689662306a36Sopenharmony_ci	const char *bus, const char *hid)
689762306a36Sopenharmony_ci{
689862306a36Sopenharmony_ci	struct device *dev = hda_codec_dev(cdc);
689962306a36Sopenharmony_ci	struct alc_spec *spec = cdc->spec;
690062306a36Sopenharmony_ci	struct scodec_dev_name *rec;
690162306a36Sopenharmony_ci	int ret;
690262306a36Sopenharmony_ci
690362306a36Sopenharmony_ci	switch (action) {
690462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
690562306a36Sopenharmony_ci		rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
690662306a36Sopenharmony_ci		if (!rec)
690762306a36Sopenharmony_ci			return;
690862306a36Sopenharmony_ci		rec->bus = bus;
690962306a36Sopenharmony_ci		rec->hid = hid;
691062306a36Sopenharmony_ci		rec->index = 0;
691162306a36Sopenharmony_ci		spec->comps[0].codec = cdc;
691262306a36Sopenharmony_ci		component_match_add(dev, &spec->match,
691362306a36Sopenharmony_ci			comp_match_tas2781_dev_name, rec);
691462306a36Sopenharmony_ci		ret = component_master_add_with_match(dev, &comp_master_ops,
691562306a36Sopenharmony_ci			spec->match);
691662306a36Sopenharmony_ci		if (ret)
691762306a36Sopenharmony_ci			codec_err(cdc,
691862306a36Sopenharmony_ci				"Fail to register component aggregator %d\n",
691962306a36Sopenharmony_ci				ret);
692062306a36Sopenharmony_ci		else
692162306a36Sopenharmony_ci			spec->gen.pcm_playback_hook =
692262306a36Sopenharmony_ci				comp_generic_playback_hook;
692362306a36Sopenharmony_ci		break;
692462306a36Sopenharmony_ci	case HDA_FIXUP_ACT_FREE:
692562306a36Sopenharmony_ci		component_master_del(dev, &comp_master_ops);
692662306a36Sopenharmony_ci		break;
692762306a36Sopenharmony_ci	}
692862306a36Sopenharmony_ci}
692962306a36Sopenharmony_ci
693062306a36Sopenharmony_cistatic void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
693162306a36Sopenharmony_ci{
693262306a36Sopenharmony_ci	cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
693362306a36Sopenharmony_ci}
693462306a36Sopenharmony_ci
693562306a36Sopenharmony_cistatic void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
693662306a36Sopenharmony_ci{
693762306a36Sopenharmony_ci	cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 2);
693862306a36Sopenharmony_ci}
693962306a36Sopenharmony_ci
694062306a36Sopenharmony_cistatic void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
694162306a36Sopenharmony_ci{
694262306a36Sopenharmony_ci	cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 4);
694362306a36Sopenharmony_ci}
694462306a36Sopenharmony_ci
694562306a36Sopenharmony_cistatic void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
694662306a36Sopenharmony_ci						 int action)
694762306a36Sopenharmony_ci{
694862306a36Sopenharmony_ci	cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2);
694962306a36Sopenharmony_ci}
695062306a36Sopenharmony_ci
695162306a36Sopenharmony_cistatic void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
695262306a36Sopenharmony_ci						 int action)
695362306a36Sopenharmony_ci{
695462306a36Sopenharmony_ci	cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2);
695562306a36Sopenharmony_ci}
695662306a36Sopenharmony_ci
695762306a36Sopenharmony_cistatic void tas2781_fixup_i2c(struct hda_codec *cdc,
695862306a36Sopenharmony_ci	const struct hda_fixup *fix, int action)
695962306a36Sopenharmony_ci{
696062306a36Sopenharmony_ci	 tas2781_generic_fixup(cdc, action, "i2c", "TIAS2781");
696162306a36Sopenharmony_ci}
696262306a36Sopenharmony_ci
696362306a36Sopenharmony_ci/* for alc295_fixup_hp_top_speakers */
696462306a36Sopenharmony_ci#include "hp_x360_helper.c"
696562306a36Sopenharmony_ci
696662306a36Sopenharmony_ci/* for alc285_fixup_ideapad_s740_coef() */
696762306a36Sopenharmony_ci#include "ideapad_s740_helper.c"
696862306a36Sopenharmony_ci
696962306a36Sopenharmony_cistatic const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
697062306a36Sopenharmony_ci	WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
697162306a36Sopenharmony_ci	WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
697262306a36Sopenharmony_ci	WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
697362306a36Sopenharmony_ci	{}
697462306a36Sopenharmony_ci};
697562306a36Sopenharmony_ci
697662306a36Sopenharmony_cistatic void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
697762306a36Sopenharmony_ci					   const struct hda_fixup *fix,
697862306a36Sopenharmony_ci					   int action)
697962306a36Sopenharmony_ci{
698062306a36Sopenharmony_ci	/*
698162306a36Sopenharmony_ci	 * A certain other OS sets these coeffs to different values. On at least
698262306a36Sopenharmony_ci	 * one TongFang barebone these settings might survive even a cold
698362306a36Sopenharmony_ci	 * reboot. So to restore a clean slate the values are explicitly reset
698462306a36Sopenharmony_ci	 * to default here. Without this, the external microphone is always in a
698562306a36Sopenharmony_ci	 * plugged-in state, while the internal microphone is always in an
698662306a36Sopenharmony_ci	 * unplugged state, breaking the ability to use the internal microphone.
698762306a36Sopenharmony_ci	 */
698862306a36Sopenharmony_ci	alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
698962306a36Sopenharmony_ci}
699062306a36Sopenharmony_ci
699162306a36Sopenharmony_cistatic const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
699262306a36Sopenharmony_ci	WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
699362306a36Sopenharmony_ci	WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
699462306a36Sopenharmony_ci	WRITE_COEF(0x49, 0x0149),
699562306a36Sopenharmony_ci	{}
699662306a36Sopenharmony_ci};
699762306a36Sopenharmony_ci
699862306a36Sopenharmony_cistatic void alc233_fixup_no_audio_jack(struct hda_codec *codec,
699962306a36Sopenharmony_ci				       const struct hda_fixup *fix,
700062306a36Sopenharmony_ci				       int action)
700162306a36Sopenharmony_ci{
700262306a36Sopenharmony_ci	/*
700362306a36Sopenharmony_ci	 * The audio jack input and output is not detected on the ASRock NUC Box
700462306a36Sopenharmony_ci	 * 1100 series when cold booting without this fix. Warm rebooting from a
700562306a36Sopenharmony_ci	 * certain other OS makes the audio functional, as COEF settings are
700662306a36Sopenharmony_ci	 * preserved in this case. This fix sets these altered COEF values as
700762306a36Sopenharmony_ci	 * the default.
700862306a36Sopenharmony_ci	 */
700962306a36Sopenharmony_ci	alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
701062306a36Sopenharmony_ci}
701162306a36Sopenharmony_ci
701262306a36Sopenharmony_cistatic void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
701362306a36Sopenharmony_ci						    const struct hda_fixup *fix,
701462306a36Sopenharmony_ci						    int action)
701562306a36Sopenharmony_ci{
701662306a36Sopenharmony_ci	/*
701762306a36Sopenharmony_ci	 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
701862306a36Sopenharmony_ci	 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
701962306a36Sopenharmony_ci	 * needs an additional quirk for sound working after suspend and resume.
702062306a36Sopenharmony_ci	 */
702162306a36Sopenharmony_ci	if (codec->core.vendor_id == 0x10ec0256) {
702262306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
702362306a36Sopenharmony_ci		snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
702462306a36Sopenharmony_ci	} else {
702562306a36Sopenharmony_ci		snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
702662306a36Sopenharmony_ci	}
702762306a36Sopenharmony_ci}
702862306a36Sopenharmony_ci
702962306a36Sopenharmony_cistatic void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
703062306a36Sopenharmony_ci						  const struct hda_fixup *fix,
703162306a36Sopenharmony_ci						  int action)
703262306a36Sopenharmony_ci{
703362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
703462306a36Sopenharmony_ci	struct hda_input_mux *imux = &spec->gen.input_mux;
703562306a36Sopenharmony_ci	int i;
703662306a36Sopenharmony_ci
703762306a36Sopenharmony_ci	alc269_fixup_limit_int_mic_boost(codec, fix, action);
703862306a36Sopenharmony_ci
703962306a36Sopenharmony_ci	switch (action) {
704062306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
704162306a36Sopenharmony_ci		/**
704262306a36Sopenharmony_ci		 * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
704362306a36Sopenharmony_ci		 * to Hi-Z to avoid pop noises at startup and when plugging and
704462306a36Sopenharmony_ci		 * unplugging headphones.
704562306a36Sopenharmony_ci		 */
704662306a36Sopenharmony_ci		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
704762306a36Sopenharmony_ci		snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
704862306a36Sopenharmony_ci		break;
704962306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PROBE:
705062306a36Sopenharmony_ci		/**
705162306a36Sopenharmony_ci		 * Make the internal mic (0x12) the default input source to
705262306a36Sopenharmony_ci		 * prevent pop noises on cold boot.
705362306a36Sopenharmony_ci		 */
705462306a36Sopenharmony_ci		for (i = 0; i < imux->num_items; i++) {
705562306a36Sopenharmony_ci			if (spec->gen.imux_pins[i] == 0x12) {
705662306a36Sopenharmony_ci				spec->gen.cur_mux[0] = i;
705762306a36Sopenharmony_ci				break;
705862306a36Sopenharmony_ci			}
705962306a36Sopenharmony_ci		}
706062306a36Sopenharmony_ci		break;
706162306a36Sopenharmony_ci	}
706262306a36Sopenharmony_ci}
706362306a36Sopenharmony_ci
706462306a36Sopenharmony_cistatic void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
706562306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
706662306a36Sopenharmony_ci{
706762306a36Sopenharmony_ci	/*
706862306a36Sopenharmony_ci	 * The Pin Complex 0x17 for the bass speakers is wrongly reported as
706962306a36Sopenharmony_ci	 * unconnected.
707062306a36Sopenharmony_ci	 */
707162306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
707262306a36Sopenharmony_ci		{ 0x17, 0x90170121 },
707362306a36Sopenharmony_ci		{ }
707462306a36Sopenharmony_ci	};
707562306a36Sopenharmony_ci	/*
707662306a36Sopenharmony_ci	 * Avoid DAC 0x06 and 0x08, as they have no volume controls.
707762306a36Sopenharmony_ci	 * DAC 0x02 and 0x03 would be fine.
707862306a36Sopenharmony_ci	 */
707962306a36Sopenharmony_ci	static const hda_nid_t conn[] = { 0x02, 0x03 };
708062306a36Sopenharmony_ci	/*
708162306a36Sopenharmony_ci	 * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
708262306a36Sopenharmony_ci	 * Headphones (0x21) are connected to DAC 0x03.
708362306a36Sopenharmony_ci	 */
708462306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
708562306a36Sopenharmony_ci		0x14, 0x02,
708662306a36Sopenharmony_ci		0x17, 0x02,
708762306a36Sopenharmony_ci		0x21, 0x03,
708862306a36Sopenharmony_ci		0
708962306a36Sopenharmony_ci	};
709062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
709162306a36Sopenharmony_ci
709262306a36Sopenharmony_ci	switch (action) {
709362306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
709462306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
709562306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
709662306a36Sopenharmony_ci		spec->gen.preferred_dacs = preferred_pairs;
709762306a36Sopenharmony_ci		break;
709862306a36Sopenharmony_ci	}
709962306a36Sopenharmony_ci}
710062306a36Sopenharmony_ci
710162306a36Sopenharmony_cistatic void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
710262306a36Sopenharmony_ci					  const struct hda_fixup *fix, int action)
710362306a36Sopenharmony_ci{
710462306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
710562306a36Sopenharmony_ci		{ 0x14, 0x90170151 },
710662306a36Sopenharmony_ci		{ 0x17, 0x90170150 },
710762306a36Sopenharmony_ci		{ }
710862306a36Sopenharmony_ci	};
710962306a36Sopenharmony_ci	static const hda_nid_t conn[] = { 0x02, 0x03 };
711062306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
711162306a36Sopenharmony_ci		0x14, 0x02,
711262306a36Sopenharmony_ci		0x17, 0x03,
711362306a36Sopenharmony_ci		0x21, 0x02,
711462306a36Sopenharmony_ci		0
711562306a36Sopenharmony_ci	};
711662306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
711762306a36Sopenharmony_ci
711862306a36Sopenharmony_ci	alc_fixup_no_shutup(codec, fix, action);
711962306a36Sopenharmony_ci
712062306a36Sopenharmony_ci	switch (action) {
712162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
712262306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
712362306a36Sopenharmony_ci		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
712462306a36Sopenharmony_ci		spec->gen.preferred_dacs = preferred_pairs;
712562306a36Sopenharmony_ci		break;
712662306a36Sopenharmony_ci	}
712762306a36Sopenharmony_ci}
712862306a36Sopenharmony_ci
712962306a36Sopenharmony_ci/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
713062306a36Sopenharmony_cistatic void alc287_fixup_bind_dacs(struct hda_codec *codec,
713162306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
713262306a36Sopenharmony_ci{
713362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
713462306a36Sopenharmony_ci	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
713562306a36Sopenharmony_ci	static const hda_nid_t preferred_pairs[] = {
713662306a36Sopenharmony_ci		0x17, 0x02, 0x21, 0x03, 0
713762306a36Sopenharmony_ci	};
713862306a36Sopenharmony_ci
713962306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
714062306a36Sopenharmony_ci		return;
714162306a36Sopenharmony_ci
714262306a36Sopenharmony_ci	snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
714362306a36Sopenharmony_ci	spec->gen.preferred_dacs = preferred_pairs;
714462306a36Sopenharmony_ci	spec->gen.auto_mute_via_amp = 1;
714562306a36Sopenharmony_ci	if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
714662306a36Sopenharmony_ci		snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
714762306a36Sopenharmony_ci					0x0); /* Make sure 0x14 was disable */
714862306a36Sopenharmony_ci	}
714962306a36Sopenharmony_ci}
715062306a36Sopenharmony_ci/* Fix none verb table of Headset Mic pin */
715162306a36Sopenharmony_cistatic void alc_fixup_headset_mic(struct hda_codec *codec,
715262306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
715362306a36Sopenharmony_ci{
715462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
715562306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
715662306a36Sopenharmony_ci		{ 0x19, 0x03a1103c },
715762306a36Sopenharmony_ci		{ }
715862306a36Sopenharmony_ci	};
715962306a36Sopenharmony_ci
716062306a36Sopenharmony_ci	switch (action) {
716162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
716262306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
716362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
716462306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
716562306a36Sopenharmony_ci		break;
716662306a36Sopenharmony_ci	}
716762306a36Sopenharmony_ci}
716862306a36Sopenharmony_ci
716962306a36Sopenharmony_ci
717062306a36Sopenharmony_cienum {
717162306a36Sopenharmony_ci	ALC269_FIXUP_GPIO2,
717262306a36Sopenharmony_ci	ALC269_FIXUP_SONY_VAIO,
717362306a36Sopenharmony_ci	ALC275_FIXUP_SONY_VAIO_GPIO2,
717462306a36Sopenharmony_ci	ALC269_FIXUP_DELL_M101Z,
717562306a36Sopenharmony_ci	ALC269_FIXUP_SKU_IGNORE,
717662306a36Sopenharmony_ci	ALC269_FIXUP_ASUS_G73JW,
717762306a36Sopenharmony_ci	ALC269_FIXUP_ASUS_N7601ZM_PINS,
717862306a36Sopenharmony_ci	ALC269_FIXUP_ASUS_N7601ZM,
717962306a36Sopenharmony_ci	ALC269_FIXUP_LENOVO_EAPD,
718062306a36Sopenharmony_ci	ALC275_FIXUP_SONY_HWEQ,
718162306a36Sopenharmony_ci	ALC275_FIXUP_SONY_DISABLE_AAMIX,
718262306a36Sopenharmony_ci	ALC271_FIXUP_DMIC,
718362306a36Sopenharmony_ci	ALC269_FIXUP_PCM_44K,
718462306a36Sopenharmony_ci	ALC269_FIXUP_STEREO_DMIC,
718562306a36Sopenharmony_ci	ALC269_FIXUP_HEADSET_MIC,
718662306a36Sopenharmony_ci	ALC269_FIXUP_QUANTA_MUTE,
718762306a36Sopenharmony_ci	ALC269_FIXUP_LIFEBOOK,
718862306a36Sopenharmony_ci	ALC269_FIXUP_LIFEBOOK_EXTMIC,
718962306a36Sopenharmony_ci	ALC269_FIXUP_LIFEBOOK_HP_PIN,
719062306a36Sopenharmony_ci	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
719162306a36Sopenharmony_ci	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
719262306a36Sopenharmony_ci	ALC269_FIXUP_AMIC,
719362306a36Sopenharmony_ci	ALC269_FIXUP_DMIC,
719462306a36Sopenharmony_ci	ALC269VB_FIXUP_AMIC,
719562306a36Sopenharmony_ci	ALC269VB_FIXUP_DMIC,
719662306a36Sopenharmony_ci	ALC269_FIXUP_HP_MUTE_LED,
719762306a36Sopenharmony_ci	ALC269_FIXUP_HP_MUTE_LED_MIC1,
719862306a36Sopenharmony_ci	ALC269_FIXUP_HP_MUTE_LED_MIC2,
719962306a36Sopenharmony_ci	ALC269_FIXUP_HP_MUTE_LED_MIC3,
720062306a36Sopenharmony_ci	ALC269_FIXUP_HP_GPIO_LED,
720162306a36Sopenharmony_ci	ALC269_FIXUP_HP_GPIO_MIC1_LED,
720262306a36Sopenharmony_ci	ALC269_FIXUP_HP_LINE1_MIC1_LED,
720362306a36Sopenharmony_ci	ALC269_FIXUP_INV_DMIC,
720462306a36Sopenharmony_ci	ALC269_FIXUP_LENOVO_DOCK,
720562306a36Sopenharmony_ci	ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
720662306a36Sopenharmony_ci	ALC269_FIXUP_NO_SHUTUP,
720762306a36Sopenharmony_ci	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
720862306a36Sopenharmony_ci	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
720962306a36Sopenharmony_ci	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
721062306a36Sopenharmony_ci	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
721162306a36Sopenharmony_ci	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
721262306a36Sopenharmony_ci	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
721362306a36Sopenharmony_ci	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
721462306a36Sopenharmony_ci	ALC269_FIXUP_HEADSET_MODE,
721562306a36Sopenharmony_ci	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
721662306a36Sopenharmony_ci	ALC269_FIXUP_ASPIRE_HEADSET_MIC,
721762306a36Sopenharmony_ci	ALC269_FIXUP_ASUS_X101_FUNC,
721862306a36Sopenharmony_ci	ALC269_FIXUP_ASUS_X101_VERB,
721962306a36Sopenharmony_ci	ALC269_FIXUP_ASUS_X101,
722062306a36Sopenharmony_ci	ALC271_FIXUP_AMIC_MIC2,
722162306a36Sopenharmony_ci	ALC271_FIXUP_HP_GATE_MIC_JACK,
722262306a36Sopenharmony_ci	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
722362306a36Sopenharmony_ci	ALC269_FIXUP_ACER_AC700,
722462306a36Sopenharmony_ci	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
722562306a36Sopenharmony_ci	ALC269VB_FIXUP_ASUS_ZENBOOK,
722662306a36Sopenharmony_ci	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
722762306a36Sopenharmony_ci	ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
722862306a36Sopenharmony_ci	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
722962306a36Sopenharmony_ci	ALC269VB_FIXUP_ORDISSIMO_EVE2,
723062306a36Sopenharmony_ci	ALC283_FIXUP_CHROME_BOOK,
723162306a36Sopenharmony_ci	ALC283_FIXUP_SENSE_COMBO_JACK,
723262306a36Sopenharmony_ci	ALC282_FIXUP_ASUS_TX300,
723362306a36Sopenharmony_ci	ALC283_FIXUP_INT_MIC,
723462306a36Sopenharmony_ci	ALC290_FIXUP_MONO_SPEAKERS,
723562306a36Sopenharmony_ci	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
723662306a36Sopenharmony_ci	ALC290_FIXUP_SUBWOOFER,
723762306a36Sopenharmony_ci	ALC290_FIXUP_SUBWOOFER_HSJACK,
723862306a36Sopenharmony_ci	ALC269_FIXUP_THINKPAD_ACPI,
723962306a36Sopenharmony_ci	ALC269_FIXUP_DMIC_THINKPAD_ACPI,
724062306a36Sopenharmony_ci	ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
724162306a36Sopenharmony_ci	ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
724262306a36Sopenharmony_ci	ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
724362306a36Sopenharmony_ci	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
724462306a36Sopenharmony_ci	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
724562306a36Sopenharmony_ci	ALC255_FIXUP_HEADSET_MODE,
724662306a36Sopenharmony_ci	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
724762306a36Sopenharmony_ci	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
724862306a36Sopenharmony_ci	ALC292_FIXUP_TPT440_DOCK,
724962306a36Sopenharmony_ci	ALC292_FIXUP_TPT440,
725062306a36Sopenharmony_ci	ALC283_FIXUP_HEADSET_MIC,
725162306a36Sopenharmony_ci	ALC255_FIXUP_MIC_MUTE_LED,
725262306a36Sopenharmony_ci	ALC282_FIXUP_ASPIRE_V5_PINS,
725362306a36Sopenharmony_ci	ALC269VB_FIXUP_ASPIRE_E1_COEF,
725462306a36Sopenharmony_ci	ALC280_FIXUP_HP_GPIO4,
725562306a36Sopenharmony_ci	ALC286_FIXUP_HP_GPIO_LED,
725662306a36Sopenharmony_ci	ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
725762306a36Sopenharmony_ci	ALC280_FIXUP_HP_DOCK_PINS,
725862306a36Sopenharmony_ci	ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
725962306a36Sopenharmony_ci	ALC280_FIXUP_HP_9480M,
726062306a36Sopenharmony_ci	ALC245_FIXUP_HP_X360_AMP,
726162306a36Sopenharmony_ci	ALC285_FIXUP_HP_SPECTRE_X360_EB1,
726262306a36Sopenharmony_ci	ALC285_FIXUP_HP_ENVY_X360,
726362306a36Sopenharmony_ci	ALC288_FIXUP_DELL_HEADSET_MODE,
726462306a36Sopenharmony_ci	ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
726562306a36Sopenharmony_ci	ALC288_FIXUP_DELL_XPS_13,
726662306a36Sopenharmony_ci	ALC288_FIXUP_DISABLE_AAMIX,
726762306a36Sopenharmony_ci	ALC292_FIXUP_DELL_E7X_AAMIX,
726862306a36Sopenharmony_ci	ALC292_FIXUP_DELL_E7X,
726962306a36Sopenharmony_ci	ALC292_FIXUP_DISABLE_AAMIX,
727062306a36Sopenharmony_ci	ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
727162306a36Sopenharmony_ci	ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
727262306a36Sopenharmony_ci	ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
727362306a36Sopenharmony_ci	ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
727462306a36Sopenharmony_ci	ALC275_FIXUP_DELL_XPS,
727562306a36Sopenharmony_ci	ALC293_FIXUP_LENOVO_SPK_NOISE,
727662306a36Sopenharmony_ci	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
727762306a36Sopenharmony_ci	ALC255_FIXUP_DELL_SPK_NOISE,
727862306a36Sopenharmony_ci	ALC225_FIXUP_DISABLE_MIC_VREF,
727962306a36Sopenharmony_ci	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
728062306a36Sopenharmony_ci	ALC295_FIXUP_DISABLE_DAC3,
728162306a36Sopenharmony_ci	ALC285_FIXUP_SPEAKER2_TO_DAC1,
728262306a36Sopenharmony_ci	ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
728362306a36Sopenharmony_ci	ALC285_FIXUP_ASUS_HEADSET_MIC,
728462306a36Sopenharmony_ci	ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
728562306a36Sopenharmony_ci	ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
728662306a36Sopenharmony_ci	ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
728762306a36Sopenharmony_ci	ALC280_FIXUP_HP_HEADSET_MIC,
728862306a36Sopenharmony_ci	ALC221_FIXUP_HP_FRONT_MIC,
728962306a36Sopenharmony_ci	ALC292_FIXUP_TPT460,
729062306a36Sopenharmony_ci	ALC298_FIXUP_SPK_VOLUME,
729162306a36Sopenharmony_ci	ALC298_FIXUP_LENOVO_SPK_VOLUME,
729262306a36Sopenharmony_ci	ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
729362306a36Sopenharmony_ci	ALC269_FIXUP_ATIV_BOOK_8,
729462306a36Sopenharmony_ci	ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
729562306a36Sopenharmony_ci	ALC221_FIXUP_HP_MIC_NO_PRESENCE,
729662306a36Sopenharmony_ci	ALC256_FIXUP_ASUS_HEADSET_MODE,
729762306a36Sopenharmony_ci	ALC256_FIXUP_ASUS_MIC,
729862306a36Sopenharmony_ci	ALC256_FIXUP_ASUS_AIO_GPIO2,
729962306a36Sopenharmony_ci	ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
730062306a36Sopenharmony_ci	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
730162306a36Sopenharmony_ci	ALC233_FIXUP_LENOVO_MULTI_CODECS,
730262306a36Sopenharmony_ci	ALC233_FIXUP_ACER_HEADSET_MIC,
730362306a36Sopenharmony_ci	ALC294_FIXUP_LENOVO_MIC_LOCATION,
730462306a36Sopenharmony_ci	ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
730562306a36Sopenharmony_ci	ALC225_FIXUP_S3_POP_NOISE,
730662306a36Sopenharmony_ci	ALC700_FIXUP_INTEL_REFERENCE,
730762306a36Sopenharmony_ci	ALC274_FIXUP_DELL_BIND_DACS,
730862306a36Sopenharmony_ci	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
730962306a36Sopenharmony_ci	ALC298_FIXUP_TPT470_DOCK_FIX,
731062306a36Sopenharmony_ci	ALC298_FIXUP_TPT470_DOCK,
731162306a36Sopenharmony_ci	ALC255_FIXUP_DUMMY_LINEOUT_VERB,
731262306a36Sopenharmony_ci	ALC255_FIXUP_DELL_HEADSET_MIC,
731362306a36Sopenharmony_ci	ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
731462306a36Sopenharmony_ci	ALC298_FIXUP_HUAWEI_MBX_STEREO,
731562306a36Sopenharmony_ci	ALC295_FIXUP_HP_X360,
731662306a36Sopenharmony_ci	ALC221_FIXUP_HP_HEADSET_MIC,
731762306a36Sopenharmony_ci	ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
731862306a36Sopenharmony_ci	ALC295_FIXUP_HP_AUTO_MUTE,
731962306a36Sopenharmony_ci	ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
732062306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_MIC,
732162306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_HEADSET_MIC,
732262306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_SPK,
732362306a36Sopenharmony_ci	ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
732462306a36Sopenharmony_ci	ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
732562306a36Sopenharmony_ci	ALC255_FIXUP_ACER_HEADSET_MIC,
732662306a36Sopenharmony_ci	ALC295_FIXUP_CHROME_BOOK,
732762306a36Sopenharmony_ci	ALC225_FIXUP_HEADSET_JACK,
732862306a36Sopenharmony_ci	ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
732962306a36Sopenharmony_ci	ALC225_FIXUP_WYSE_AUTO_MUTE,
733062306a36Sopenharmony_ci	ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
733162306a36Sopenharmony_ci	ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
733262306a36Sopenharmony_ci	ALC256_FIXUP_ASUS_HEADSET_MIC,
733362306a36Sopenharmony_ci	ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
733462306a36Sopenharmony_ci	ALC299_FIXUP_PREDATOR_SPK,
733562306a36Sopenharmony_ci	ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
733662306a36Sopenharmony_ci	ALC289_FIXUP_DELL_SPK1,
733762306a36Sopenharmony_ci	ALC289_FIXUP_DELL_SPK2,
733862306a36Sopenharmony_ci	ALC289_FIXUP_DUAL_SPK,
733962306a36Sopenharmony_ci	ALC289_FIXUP_RTK_AMP_DUAL_SPK,
734062306a36Sopenharmony_ci	ALC294_FIXUP_SPK2_TO_DAC1,
734162306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_DUAL_SPK,
734262306a36Sopenharmony_ci	ALC285_FIXUP_THINKPAD_X1_GEN7,
734362306a36Sopenharmony_ci	ALC285_FIXUP_THINKPAD_HEADSET_JACK,
734462306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_ALLY,
734562306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_ALLY_PINS,
734662306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_ALLY_VERBS,
734762306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_ALLY_SPEAKER,
734862306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_HPE,
734962306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_COEF_1B,
735062306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_GX502_HP,
735162306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_GX502_PINS,
735262306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_GX502_VERBS,
735362306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_GU502_HP,
735462306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_GU502_PINS,
735562306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_GU502_VERBS,
735662306a36Sopenharmony_ci	ALC294_FIXUP_ASUS_G513_PINS,
735762306a36Sopenharmony_ci	ALC285_FIXUP_ASUS_G533Z_PINS,
735862306a36Sopenharmony_ci	ALC285_FIXUP_HP_GPIO_LED,
735962306a36Sopenharmony_ci	ALC285_FIXUP_HP_MUTE_LED,
736062306a36Sopenharmony_ci	ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
736162306a36Sopenharmony_ci	ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
736262306a36Sopenharmony_ci	ALC236_FIXUP_HP_GPIO_LED,
736362306a36Sopenharmony_ci	ALC236_FIXUP_HP_MUTE_LED,
736462306a36Sopenharmony_ci	ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
736562306a36Sopenharmony_ci	ALC298_FIXUP_SAMSUNG_AMP,
736662306a36Sopenharmony_ci	ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
736762306a36Sopenharmony_ci	ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
736862306a36Sopenharmony_ci	ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
736962306a36Sopenharmony_ci	ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
737062306a36Sopenharmony_ci	ALC269VC_FIXUP_ACER_HEADSET_MIC,
737162306a36Sopenharmony_ci	ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
737262306a36Sopenharmony_ci	ALC289_FIXUP_ASUS_GA401,
737362306a36Sopenharmony_ci	ALC289_FIXUP_ASUS_GA502,
737462306a36Sopenharmony_ci	ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
737562306a36Sopenharmony_ci	ALC285_FIXUP_HP_GPIO_AMP_INIT,
737662306a36Sopenharmony_ci	ALC269_FIXUP_CZC_B20,
737762306a36Sopenharmony_ci	ALC269_FIXUP_CZC_TMI,
737862306a36Sopenharmony_ci	ALC269_FIXUP_CZC_L101,
737962306a36Sopenharmony_ci	ALC269_FIXUP_LEMOTE_A1802,
738062306a36Sopenharmony_ci	ALC269_FIXUP_LEMOTE_A190X,
738162306a36Sopenharmony_ci	ALC256_FIXUP_INTEL_NUC8_RUGGED,
738262306a36Sopenharmony_ci	ALC233_FIXUP_INTEL_NUC8_DMIC,
738362306a36Sopenharmony_ci	ALC233_FIXUP_INTEL_NUC8_BOOST,
738462306a36Sopenharmony_ci	ALC256_FIXUP_INTEL_NUC10,
738562306a36Sopenharmony_ci	ALC255_FIXUP_XIAOMI_HEADSET_MIC,
738662306a36Sopenharmony_ci	ALC274_FIXUP_HP_MIC,
738762306a36Sopenharmony_ci	ALC274_FIXUP_HP_HEADSET_MIC,
738862306a36Sopenharmony_ci	ALC274_FIXUP_HP_ENVY_GPIO,
738962306a36Sopenharmony_ci	ALC256_FIXUP_ASUS_HPE,
739062306a36Sopenharmony_ci	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
739162306a36Sopenharmony_ci	ALC287_FIXUP_HP_GPIO_LED,
739262306a36Sopenharmony_ci	ALC256_FIXUP_HP_HEADSET_MIC,
739362306a36Sopenharmony_ci	ALC245_FIXUP_HP_GPIO_LED,
739462306a36Sopenharmony_ci	ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
739562306a36Sopenharmony_ci	ALC282_FIXUP_ACER_DISABLE_LINEOUT,
739662306a36Sopenharmony_ci	ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
739762306a36Sopenharmony_ci	ALC256_FIXUP_ACER_HEADSET_MIC,
739862306a36Sopenharmony_ci	ALC285_FIXUP_IDEAPAD_S740_COEF,
739962306a36Sopenharmony_ci	ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
740062306a36Sopenharmony_ci	ALC295_FIXUP_ASUS_DACS,
740162306a36Sopenharmony_ci	ALC295_FIXUP_HP_OMEN,
740262306a36Sopenharmony_ci	ALC285_FIXUP_HP_SPECTRE_X360,
740362306a36Sopenharmony_ci	ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
740462306a36Sopenharmony_ci	ALC623_FIXUP_LENOVO_THINKSTATION_P340,
740562306a36Sopenharmony_ci	ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
740662306a36Sopenharmony_ci	ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
740762306a36Sopenharmony_ci	ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
740862306a36Sopenharmony_ci	ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
740962306a36Sopenharmony_ci	ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
741062306a36Sopenharmony_ci	ALC298_FIXUP_LENOVO_C940_DUET7,
741162306a36Sopenharmony_ci	ALC287_FIXUP_LENOVO_14IRP8_DUETITL,
741262306a36Sopenharmony_ci	ALC287_FIXUP_13S_GEN2_SPEAKERS,
741362306a36Sopenharmony_ci	ALC256_FIXUP_SET_COEF_DEFAULTS,
741462306a36Sopenharmony_ci	ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
741562306a36Sopenharmony_ci	ALC233_FIXUP_NO_AUDIO_JACK,
741662306a36Sopenharmony_ci	ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
741762306a36Sopenharmony_ci	ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
741862306a36Sopenharmony_ci	ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
741962306a36Sopenharmony_ci	ALC287_FIXUP_LEGION_16ACHG6,
742062306a36Sopenharmony_ci	ALC287_FIXUP_CS35L41_I2C_2,
742162306a36Sopenharmony_ci	ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
742262306a36Sopenharmony_ci	ALC245_FIXUP_CS35L41_SPI_2,
742362306a36Sopenharmony_ci	ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
742462306a36Sopenharmony_ci	ALC245_FIXUP_CS35L41_SPI_4,
742562306a36Sopenharmony_ci	ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
742662306a36Sopenharmony_ci	ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
742762306a36Sopenharmony_ci	ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
742862306a36Sopenharmony_ci	ALC287_FIXUP_LEGION_16ITHG6,
742962306a36Sopenharmony_ci	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
743062306a36Sopenharmony_ci	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
743162306a36Sopenharmony_ci	ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
743262306a36Sopenharmony_ci	ALC236_FIXUP_DELL_DUAL_CODECS,
743362306a36Sopenharmony_ci	ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
743462306a36Sopenharmony_ci	ALC287_FIXUP_TAS2781_I2C,
743562306a36Sopenharmony_ci	ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
743662306a36Sopenharmony_ci	ALC245_FIXUP_HP_X360_MUTE_LEDS,
743762306a36Sopenharmony_ci	ALC287_FIXUP_THINKPAD_I2S_SPK,
743862306a36Sopenharmony_ci	ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
743962306a36Sopenharmony_ci	ALC2XX_FIXUP_HEADSET_MIC,
744062306a36Sopenharmony_ci	ALC289_FIXUP_DELL_CS35L41_SPI_2,
744162306a36Sopenharmony_ci	ALC294_FIXUP_CS35L41_I2C_2,
744262306a36Sopenharmony_ci};
744362306a36Sopenharmony_ci
744462306a36Sopenharmony_ci/* A special fixup for Lenovo C940 and Yoga Duet 7;
744562306a36Sopenharmony_ci * both have the very same PCI SSID, and we need to apply different fixups
744662306a36Sopenharmony_ci * depending on the codec ID
744762306a36Sopenharmony_ci */
744862306a36Sopenharmony_cistatic void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
744962306a36Sopenharmony_ci					   const struct hda_fixup *fix,
745062306a36Sopenharmony_ci					   int action)
745162306a36Sopenharmony_ci{
745262306a36Sopenharmony_ci	int id;
745362306a36Sopenharmony_ci
745462306a36Sopenharmony_ci	if (codec->core.vendor_id == 0x10ec0298)
745562306a36Sopenharmony_ci		id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
745662306a36Sopenharmony_ci	else
745762306a36Sopenharmony_ci		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
745862306a36Sopenharmony_ci	__snd_hda_apply_fixup(codec, id, action, 0);
745962306a36Sopenharmony_ci}
746062306a36Sopenharmony_ci
746162306a36Sopenharmony_ci/* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021;
746262306a36Sopenharmony_ci * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID,
746362306a36Sopenharmony_ci * so we need to apply a different fixup in this case. The only DuetITL codec
746462306a36Sopenharmony_ci * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be
746562306a36Sopenharmony_ci * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would
746662306a36Sopenharmony_ci * have matched correctly by their codecs.
746762306a36Sopenharmony_ci */
746862306a36Sopenharmony_cistatic void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec,
746962306a36Sopenharmony_ci					      const struct hda_fixup *fix,
747062306a36Sopenharmony_ci					      int action)
747162306a36Sopenharmony_ci{
747262306a36Sopenharmony_ci	int id;
747362306a36Sopenharmony_ci
747462306a36Sopenharmony_ci	if (codec->core.subsystem_id == 0x17aa3802)
747562306a36Sopenharmony_ci		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */
747662306a36Sopenharmony_ci	else
747762306a36Sopenharmony_ci		id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */
747862306a36Sopenharmony_ci	__snd_hda_apply_fixup(codec, id, action, 0);
747962306a36Sopenharmony_ci}
748062306a36Sopenharmony_ci
748162306a36Sopenharmony_cistatic const struct hda_fixup alc269_fixups[] = {
748262306a36Sopenharmony_ci	[ALC269_FIXUP_GPIO2] = {
748362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
748462306a36Sopenharmony_ci		.v.func = alc_fixup_gpio2,
748562306a36Sopenharmony_ci	},
748662306a36Sopenharmony_ci	[ALC269_FIXUP_SONY_VAIO] = {
748762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINCTLS,
748862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
748962306a36Sopenharmony_ci			{0x19, PIN_VREFGRD},
749062306a36Sopenharmony_ci			{}
749162306a36Sopenharmony_ci		}
749262306a36Sopenharmony_ci	},
749362306a36Sopenharmony_ci	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
749462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
749562306a36Sopenharmony_ci		.v.func = alc275_fixup_gpio4_off,
749662306a36Sopenharmony_ci		.chained = true,
749762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_SONY_VAIO
749862306a36Sopenharmony_ci	},
749962306a36Sopenharmony_ci	[ALC269_FIXUP_DELL_M101Z] = {
750062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
750162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
750262306a36Sopenharmony_ci			/* Enables internal speaker */
750362306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 13},
750462306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
750562306a36Sopenharmony_ci			{}
750662306a36Sopenharmony_ci		}
750762306a36Sopenharmony_ci	},
750862306a36Sopenharmony_ci	[ALC269_FIXUP_SKU_IGNORE] = {
750962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
751062306a36Sopenharmony_ci		.v.func = alc_fixup_sku_ignore,
751162306a36Sopenharmony_ci	},
751262306a36Sopenharmony_ci	[ALC269_FIXUP_ASUS_G73JW] = {
751362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
751462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
751562306a36Sopenharmony_ci			{ 0x17, 0x99130111 }, /* subwoofer */
751662306a36Sopenharmony_ci			{ }
751762306a36Sopenharmony_ci		}
751862306a36Sopenharmony_ci	},
751962306a36Sopenharmony_ci	[ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
752062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
752162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
752262306a36Sopenharmony_ci			{ 0x19, 0x03A11050 },
752362306a36Sopenharmony_ci			{ 0x1a, 0x03A11C30 },
752462306a36Sopenharmony_ci			{ 0x21, 0x03211420 },
752562306a36Sopenharmony_ci			{ }
752662306a36Sopenharmony_ci		}
752762306a36Sopenharmony_ci	},
752862306a36Sopenharmony_ci	[ALC269_FIXUP_ASUS_N7601ZM] = {
752962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
753062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
753162306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x62},
753262306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0xa007},
753362306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x10},
753462306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x8420},
753562306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
753662306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x7774},
753762306a36Sopenharmony_ci			{ }
753862306a36Sopenharmony_ci		},
753962306a36Sopenharmony_ci		.chained = true,
754062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
754162306a36Sopenharmony_ci	},
754262306a36Sopenharmony_ci	[ALC269_FIXUP_LENOVO_EAPD] = {
754362306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
754462306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
754562306a36Sopenharmony_ci			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
754662306a36Sopenharmony_ci			{}
754762306a36Sopenharmony_ci		}
754862306a36Sopenharmony_ci	},
754962306a36Sopenharmony_ci	[ALC275_FIXUP_SONY_HWEQ] = {
755062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
755162306a36Sopenharmony_ci		.v.func = alc269_fixup_hweq,
755262306a36Sopenharmony_ci		.chained = true,
755362306a36Sopenharmony_ci		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
755462306a36Sopenharmony_ci	},
755562306a36Sopenharmony_ci	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
755662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
755762306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
755862306a36Sopenharmony_ci		.chained = true,
755962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_SONY_VAIO
756062306a36Sopenharmony_ci	},
756162306a36Sopenharmony_ci	[ALC271_FIXUP_DMIC] = {
756262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
756362306a36Sopenharmony_ci		.v.func = alc271_fixup_dmic,
756462306a36Sopenharmony_ci	},
756562306a36Sopenharmony_ci	[ALC269_FIXUP_PCM_44K] = {
756662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
756762306a36Sopenharmony_ci		.v.func = alc269_fixup_pcm_44k,
756862306a36Sopenharmony_ci		.chained = true,
756962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_QUANTA_MUTE
757062306a36Sopenharmony_ci	},
757162306a36Sopenharmony_ci	[ALC269_FIXUP_STEREO_DMIC] = {
757262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
757362306a36Sopenharmony_ci		.v.func = alc269_fixup_stereo_dmic,
757462306a36Sopenharmony_ci	},
757562306a36Sopenharmony_ci	[ALC269_FIXUP_HEADSET_MIC] = {
757662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
757762306a36Sopenharmony_ci		.v.func = alc269_fixup_headset_mic,
757862306a36Sopenharmony_ci	},
757962306a36Sopenharmony_ci	[ALC269_FIXUP_QUANTA_MUTE] = {
758062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
758162306a36Sopenharmony_ci		.v.func = alc269_fixup_quanta_mute,
758262306a36Sopenharmony_ci	},
758362306a36Sopenharmony_ci	[ALC269_FIXUP_LIFEBOOK] = {
758462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
758562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
758662306a36Sopenharmony_ci			{ 0x1a, 0x2101103f }, /* dock line-out */
758762306a36Sopenharmony_ci			{ 0x1b, 0x23a11040 }, /* dock mic-in */
758862306a36Sopenharmony_ci			{ }
758962306a36Sopenharmony_ci		},
759062306a36Sopenharmony_ci		.chained = true,
759162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_QUANTA_MUTE
759262306a36Sopenharmony_ci	},
759362306a36Sopenharmony_ci	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
759462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
759562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
759662306a36Sopenharmony_ci			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
759762306a36Sopenharmony_ci			{ }
759862306a36Sopenharmony_ci		},
759962306a36Sopenharmony_ci	},
760062306a36Sopenharmony_ci	[ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
760162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
760262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
760362306a36Sopenharmony_ci			{ 0x21, 0x0221102f }, /* HP out */
760462306a36Sopenharmony_ci			{ }
760562306a36Sopenharmony_ci		},
760662306a36Sopenharmony_ci	},
760762306a36Sopenharmony_ci	[ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
760862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
760962306a36Sopenharmony_ci		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
761062306a36Sopenharmony_ci	},
761162306a36Sopenharmony_ci	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
761262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
761362306a36Sopenharmony_ci		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
761462306a36Sopenharmony_ci	},
761562306a36Sopenharmony_ci	[ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
761662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
761762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
761862306a36Sopenharmony_ci			{ 0x18, 0x03a19020 }, /* headset mic */
761962306a36Sopenharmony_ci			{ 0x1b, 0x90170150 }, /* speaker */
762062306a36Sopenharmony_ci			{ }
762162306a36Sopenharmony_ci		},
762262306a36Sopenharmony_ci	},
762362306a36Sopenharmony_ci	[ALC269_FIXUP_AMIC] = {
762462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
762562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
762662306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
762762306a36Sopenharmony_ci			{ 0x15, 0x0121401f }, /* HP out */
762862306a36Sopenharmony_ci			{ 0x18, 0x01a19c20 }, /* mic */
762962306a36Sopenharmony_ci			{ 0x19, 0x99a3092f }, /* int-mic */
763062306a36Sopenharmony_ci			{ }
763162306a36Sopenharmony_ci		},
763262306a36Sopenharmony_ci	},
763362306a36Sopenharmony_ci	[ALC269_FIXUP_DMIC] = {
763462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
763562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
763662306a36Sopenharmony_ci			{ 0x12, 0x99a3092f }, /* int-mic */
763762306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
763862306a36Sopenharmony_ci			{ 0x15, 0x0121401f }, /* HP out */
763962306a36Sopenharmony_ci			{ 0x18, 0x01a19c20 }, /* mic */
764062306a36Sopenharmony_ci			{ }
764162306a36Sopenharmony_ci		},
764262306a36Sopenharmony_ci	},
764362306a36Sopenharmony_ci	[ALC269VB_FIXUP_AMIC] = {
764462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
764562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
764662306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
764762306a36Sopenharmony_ci			{ 0x18, 0x01a19c20 }, /* mic */
764862306a36Sopenharmony_ci			{ 0x19, 0x99a3092f }, /* int-mic */
764962306a36Sopenharmony_ci			{ 0x21, 0x0121401f }, /* HP out */
765062306a36Sopenharmony_ci			{ }
765162306a36Sopenharmony_ci		},
765262306a36Sopenharmony_ci	},
765362306a36Sopenharmony_ci	[ALC269VB_FIXUP_DMIC] = {
765462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
765562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
765662306a36Sopenharmony_ci			{ 0x12, 0x99a3092f }, /* int-mic */
765762306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
765862306a36Sopenharmony_ci			{ 0x18, 0x01a19c20 }, /* mic */
765962306a36Sopenharmony_ci			{ 0x21, 0x0121401f }, /* HP out */
766062306a36Sopenharmony_ci			{ }
766162306a36Sopenharmony_ci		},
766262306a36Sopenharmony_ci	},
766362306a36Sopenharmony_ci	[ALC269_FIXUP_HP_MUTE_LED] = {
766462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
766562306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_mute_led,
766662306a36Sopenharmony_ci	},
766762306a36Sopenharmony_ci	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
766862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
766962306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_mute_led_mic1,
767062306a36Sopenharmony_ci	},
767162306a36Sopenharmony_ci	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
767262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
767362306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_mute_led_mic2,
767462306a36Sopenharmony_ci	},
767562306a36Sopenharmony_ci	[ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
767662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
767762306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_mute_led_mic3,
767862306a36Sopenharmony_ci		.chained = true,
767962306a36Sopenharmony_ci		.chain_id = ALC295_FIXUP_HP_AUTO_MUTE
768062306a36Sopenharmony_ci	},
768162306a36Sopenharmony_ci	[ALC269_FIXUP_HP_GPIO_LED] = {
768262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
768362306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_gpio_led,
768462306a36Sopenharmony_ci	},
768562306a36Sopenharmony_ci	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
768662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
768762306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_gpio_mic1_led,
768862306a36Sopenharmony_ci	},
768962306a36Sopenharmony_ci	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
769062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
769162306a36Sopenharmony_ci		.v.func = alc269_fixup_hp_line1_mic1_led,
769262306a36Sopenharmony_ci	},
769362306a36Sopenharmony_ci	[ALC269_FIXUP_INV_DMIC] = {
769462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
769562306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
769662306a36Sopenharmony_ci	},
769762306a36Sopenharmony_ci	[ALC269_FIXUP_NO_SHUTUP] = {
769862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
769962306a36Sopenharmony_ci		.v.func = alc_fixup_no_shutup,
770062306a36Sopenharmony_ci	},
770162306a36Sopenharmony_ci	[ALC269_FIXUP_LENOVO_DOCK] = {
770262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
770362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
770462306a36Sopenharmony_ci			{ 0x19, 0x23a11040 }, /* dock mic */
770562306a36Sopenharmony_ci			{ 0x1b, 0x2121103f }, /* dock headphone */
770662306a36Sopenharmony_ci			{ }
770762306a36Sopenharmony_ci		},
770862306a36Sopenharmony_ci		.chained = true,
770962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
771062306a36Sopenharmony_ci	},
771162306a36Sopenharmony_ci	[ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
771262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
771362306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
771462306a36Sopenharmony_ci		.chained = true,
771562306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_LENOVO_DOCK,
771662306a36Sopenharmony_ci	},
771762306a36Sopenharmony_ci	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
771862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
771962306a36Sopenharmony_ci		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
772062306a36Sopenharmony_ci		.chained = true,
772162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
772262306a36Sopenharmony_ci	},
772362306a36Sopenharmony_ci	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
772462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
772562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
772662306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
772762306a36Sopenharmony_ci			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
772862306a36Sopenharmony_ci			{ }
772962306a36Sopenharmony_ci		},
773062306a36Sopenharmony_ci		.chained = true,
773162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
773262306a36Sopenharmony_ci	},
773362306a36Sopenharmony_ci	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
773462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
773562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
773662306a36Sopenharmony_ci			{ 0x16, 0x21014020 }, /* dock line out */
773762306a36Sopenharmony_ci			{ 0x19, 0x21a19030 }, /* dock mic */
773862306a36Sopenharmony_ci			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
773962306a36Sopenharmony_ci			{ }
774062306a36Sopenharmony_ci		},
774162306a36Sopenharmony_ci		.chained = true,
774262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
774362306a36Sopenharmony_ci	},
774462306a36Sopenharmony_ci	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
774562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
774662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
774762306a36Sopenharmony_ci			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
774862306a36Sopenharmony_ci			{ }
774962306a36Sopenharmony_ci		},
775062306a36Sopenharmony_ci		.chained = true,
775162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
775262306a36Sopenharmony_ci	},
775362306a36Sopenharmony_ci	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
775462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
775562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
775662306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
775762306a36Sopenharmony_ci			{ 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
775862306a36Sopenharmony_ci			{ }
775962306a36Sopenharmony_ci		},
776062306a36Sopenharmony_ci		.chained = true,
776162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
776262306a36Sopenharmony_ci	},
776362306a36Sopenharmony_ci	[ALC269_FIXUP_HEADSET_MODE] = {
776462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
776562306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode,
776662306a36Sopenharmony_ci		.chained = true,
776762306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
776862306a36Sopenharmony_ci	},
776962306a36Sopenharmony_ci	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
777062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
777162306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_no_hp_mic,
777262306a36Sopenharmony_ci	},
777362306a36Sopenharmony_ci	[ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
777462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
777562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
777662306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
777762306a36Sopenharmony_ci			{ }
777862306a36Sopenharmony_ci		},
777962306a36Sopenharmony_ci		.chained = true,
778062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE,
778162306a36Sopenharmony_ci	},
778262306a36Sopenharmony_ci	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
778362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
778462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
778562306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
778662306a36Sopenharmony_ci			{ }
778762306a36Sopenharmony_ci		},
778862306a36Sopenharmony_ci		.chained = true,
778962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
779062306a36Sopenharmony_ci	},
779162306a36Sopenharmony_ci	[ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
779262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
779362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
779462306a36Sopenharmony_ci			{0x12, 0x90a60130},
779562306a36Sopenharmony_ci			{0x13, 0x40000000},
779662306a36Sopenharmony_ci			{0x14, 0x90170110},
779762306a36Sopenharmony_ci			{0x18, 0x411111f0},
779862306a36Sopenharmony_ci			{0x19, 0x04a11040},
779962306a36Sopenharmony_ci			{0x1a, 0x411111f0},
780062306a36Sopenharmony_ci			{0x1b, 0x90170112},
780162306a36Sopenharmony_ci			{0x1d, 0x40759a05},
780262306a36Sopenharmony_ci			{0x1e, 0x411111f0},
780362306a36Sopenharmony_ci			{0x21, 0x04211020},
780462306a36Sopenharmony_ci			{ }
780562306a36Sopenharmony_ci		},
780662306a36Sopenharmony_ci		.chained = true,
780762306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
780862306a36Sopenharmony_ci	},
780962306a36Sopenharmony_ci	[ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
781062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
781162306a36Sopenharmony_ci		.v.func = alc298_fixup_huawei_mbx_stereo,
781262306a36Sopenharmony_ci		.chained = true,
781362306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
781462306a36Sopenharmony_ci	},
781562306a36Sopenharmony_ci	[ALC269_FIXUP_ASUS_X101_FUNC] = {
781662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
781762306a36Sopenharmony_ci		.v.func = alc269_fixup_x101_headset_mic,
781862306a36Sopenharmony_ci	},
781962306a36Sopenharmony_ci	[ALC269_FIXUP_ASUS_X101_VERB] = {
782062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
782162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
782262306a36Sopenharmony_ci			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
782362306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
782462306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},
782562306a36Sopenharmony_ci			{ }
782662306a36Sopenharmony_ci		},
782762306a36Sopenharmony_ci		.chained = true,
782862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC
782962306a36Sopenharmony_ci	},
783062306a36Sopenharmony_ci	[ALC269_FIXUP_ASUS_X101] = {
783162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
783262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
783362306a36Sopenharmony_ci			{ 0x18, 0x04a1182c }, /* Headset mic */
783462306a36Sopenharmony_ci			{ }
783562306a36Sopenharmony_ci		},
783662306a36Sopenharmony_ci		.chained = true,
783762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_ASUS_X101_VERB
783862306a36Sopenharmony_ci	},
783962306a36Sopenharmony_ci	[ALC271_FIXUP_AMIC_MIC2] = {
784062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
784162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
784262306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
784362306a36Sopenharmony_ci			{ 0x19, 0x01a19c20 }, /* mic */
784462306a36Sopenharmony_ci			{ 0x1b, 0x99a7012f }, /* int-mic */
784562306a36Sopenharmony_ci			{ 0x21, 0x0121401f }, /* HP out */
784662306a36Sopenharmony_ci			{ }
784762306a36Sopenharmony_ci		},
784862306a36Sopenharmony_ci	},
784962306a36Sopenharmony_ci	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {
785062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
785162306a36Sopenharmony_ci		.v.func = alc271_hp_gate_mic_jack,
785262306a36Sopenharmony_ci		.chained = true,
785362306a36Sopenharmony_ci		.chain_id = ALC271_FIXUP_AMIC_MIC2,
785462306a36Sopenharmony_ci	},
785562306a36Sopenharmony_ci	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
785662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
785762306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
785862306a36Sopenharmony_ci		.chained = true,
785962306a36Sopenharmony_ci		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
786062306a36Sopenharmony_ci	},
786162306a36Sopenharmony_ci	[ALC269_FIXUP_ACER_AC700] = {
786262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
786362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
786462306a36Sopenharmony_ci			{ 0x12, 0x99a3092f }, /* int-mic */
786562306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
786662306a36Sopenharmony_ci			{ 0x18, 0x03a11c20 }, /* mic */
786762306a36Sopenharmony_ci			{ 0x1e, 0x0346101e }, /* SPDIF1 */
786862306a36Sopenharmony_ci			{ 0x21, 0x0321101f }, /* HP out */
786962306a36Sopenharmony_ci			{ }
787062306a36Sopenharmony_ci		},
787162306a36Sopenharmony_ci		.chained = true,
787262306a36Sopenharmony_ci		.chain_id = ALC271_FIXUP_DMIC,
787362306a36Sopenharmony_ci	},
787462306a36Sopenharmony_ci	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
787562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
787662306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
787762306a36Sopenharmony_ci		.chained = true,
787862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
787962306a36Sopenharmony_ci	},
788062306a36Sopenharmony_ci	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {
788162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
788262306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
788362306a36Sopenharmony_ci		.chained = true,
788462306a36Sopenharmony_ci		.chain_id = ALC269VB_FIXUP_DMIC,
788562306a36Sopenharmony_ci	},
788662306a36Sopenharmony_ci	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
788762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
788862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
788962306a36Sopenharmony_ci			/* class-D output amp +5dB */
789062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
789162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
789262306a36Sopenharmony_ci			{}
789362306a36Sopenharmony_ci		},
789462306a36Sopenharmony_ci		.chained = true,
789562306a36Sopenharmony_ci		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
789662306a36Sopenharmony_ci	},
789762306a36Sopenharmony_ci	[ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
789862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
789962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
790062306a36Sopenharmony_ci			{ 0x18, 0x01a110f0 },  /* use as headset mic */
790162306a36Sopenharmony_ci			{ }
790262306a36Sopenharmony_ci		},
790362306a36Sopenharmony_ci		.chained = true,
790462306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
790562306a36Sopenharmony_ci	},
790662306a36Sopenharmony_ci	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
790762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
790862306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
790962306a36Sopenharmony_ci		.chained = true,
791062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
791162306a36Sopenharmony_ci	},
791262306a36Sopenharmony_ci	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
791362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
791462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
791562306a36Sopenharmony_ci			{ 0x12, 0x99a3092f }, /* int-mic */
791662306a36Sopenharmony_ci			{ 0x18, 0x03a11d20 }, /* mic */
791762306a36Sopenharmony_ci			{ 0x19, 0x411111f0 }, /* Unused bogus pin */
791862306a36Sopenharmony_ci			{ }
791962306a36Sopenharmony_ci		},
792062306a36Sopenharmony_ci	},
792162306a36Sopenharmony_ci	[ALC283_FIXUP_CHROME_BOOK] = {
792262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
792362306a36Sopenharmony_ci		.v.func = alc283_fixup_chromebook,
792462306a36Sopenharmony_ci	},
792562306a36Sopenharmony_ci	[ALC283_FIXUP_SENSE_COMBO_JACK] = {
792662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
792762306a36Sopenharmony_ci		.v.func = alc283_fixup_sense_combo_jack,
792862306a36Sopenharmony_ci		.chained = true,
792962306a36Sopenharmony_ci		.chain_id = ALC283_FIXUP_CHROME_BOOK,
793062306a36Sopenharmony_ci	},
793162306a36Sopenharmony_ci	[ALC282_FIXUP_ASUS_TX300] = {
793262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
793362306a36Sopenharmony_ci		.v.func = alc282_fixup_asus_tx300,
793462306a36Sopenharmony_ci	},
793562306a36Sopenharmony_ci	[ALC283_FIXUP_INT_MIC] = {
793662306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
793762306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
793862306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
793962306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},
794062306a36Sopenharmony_ci			{ }
794162306a36Sopenharmony_ci		},
794262306a36Sopenharmony_ci		.chained = true,
794362306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
794462306a36Sopenharmony_ci	},
794562306a36Sopenharmony_ci	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {
794662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
794762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
794862306a36Sopenharmony_ci			{ 0x17, 0x90170112 }, /* subwoofer */
794962306a36Sopenharmony_ci			{ }
795062306a36Sopenharmony_ci		},
795162306a36Sopenharmony_ci		.chained = true,
795262306a36Sopenharmony_ci		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
795362306a36Sopenharmony_ci	},
795462306a36Sopenharmony_ci	[ALC290_FIXUP_SUBWOOFER] = {
795562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
795662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
795762306a36Sopenharmony_ci			{ 0x17, 0x90170112 }, /* subwoofer */
795862306a36Sopenharmony_ci			{ }
795962306a36Sopenharmony_ci		},
796062306a36Sopenharmony_ci		.chained = true,
796162306a36Sopenharmony_ci		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,
796262306a36Sopenharmony_ci	},
796362306a36Sopenharmony_ci	[ALC290_FIXUP_MONO_SPEAKERS] = {
796462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
796562306a36Sopenharmony_ci		.v.func = alc290_fixup_mono_speakers,
796662306a36Sopenharmony_ci	},
796762306a36Sopenharmony_ci	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
796862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
796962306a36Sopenharmony_ci		.v.func = alc290_fixup_mono_speakers,
797062306a36Sopenharmony_ci		.chained = true,
797162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
797262306a36Sopenharmony_ci	},
797362306a36Sopenharmony_ci	[ALC269_FIXUP_THINKPAD_ACPI] = {
797462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
797562306a36Sopenharmony_ci		.v.func = alc_fixup_thinkpad_acpi,
797662306a36Sopenharmony_ci		.chained = true,
797762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_SKU_IGNORE,
797862306a36Sopenharmony_ci	},
797962306a36Sopenharmony_ci	[ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
798062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
798162306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
798262306a36Sopenharmony_ci		.chained = true,
798362306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
798462306a36Sopenharmony_ci	},
798562306a36Sopenharmony_ci	[ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
798662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
798762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
798862306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
798962306a36Sopenharmony_ci			{ }
799062306a36Sopenharmony_ci		},
799162306a36Sopenharmony_ci		.chained = true,
799262306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_HEADSET_MODE
799362306a36Sopenharmony_ci	},
799462306a36Sopenharmony_ci	[ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
799562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
799662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
799762306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
799862306a36Sopenharmony_ci			{ }
799962306a36Sopenharmony_ci		},
800062306a36Sopenharmony_ci		.chained = true,
800162306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_HEADSET_MODE
800262306a36Sopenharmony_ci	},
800362306a36Sopenharmony_ci	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
800462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
800562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
800662306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
800762306a36Sopenharmony_ci			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
800862306a36Sopenharmony_ci			{ }
800962306a36Sopenharmony_ci		},
801062306a36Sopenharmony_ci		.chained = true,
801162306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_HEADSET_MODE
801262306a36Sopenharmony_ci	},
801362306a36Sopenharmony_ci	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
801462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
801562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
801662306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
801762306a36Sopenharmony_ci			{ }
801862306a36Sopenharmony_ci		},
801962306a36Sopenharmony_ci		.chained = true,
802062306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
802162306a36Sopenharmony_ci	},
802262306a36Sopenharmony_ci	[ALC255_FIXUP_HEADSET_MODE] = {
802362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
802462306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_alc255,
802562306a36Sopenharmony_ci		.chained = true,
802662306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
802762306a36Sopenharmony_ci	},
802862306a36Sopenharmony_ci	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
802962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
803062306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
803162306a36Sopenharmony_ci	},
803262306a36Sopenharmony_ci	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
803362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
803462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
803562306a36Sopenharmony_ci			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
803662306a36Sopenharmony_ci			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
803762306a36Sopenharmony_ci			{ }
803862306a36Sopenharmony_ci		},
803962306a36Sopenharmony_ci		.chained = true,
804062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
804162306a36Sopenharmony_ci	},
804262306a36Sopenharmony_ci	[ALC292_FIXUP_TPT440_DOCK] = {
804362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
804462306a36Sopenharmony_ci		.v.func = alc_fixup_tpt440_dock,
804562306a36Sopenharmony_ci		.chained = true,
804662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
804762306a36Sopenharmony_ci	},
804862306a36Sopenharmony_ci	[ALC292_FIXUP_TPT440] = {
804962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
805062306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
805162306a36Sopenharmony_ci		.chained = true,
805262306a36Sopenharmony_ci		.chain_id = ALC292_FIXUP_TPT440_DOCK,
805362306a36Sopenharmony_ci	},
805462306a36Sopenharmony_ci	[ALC283_FIXUP_HEADSET_MIC] = {
805562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
805662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
805762306a36Sopenharmony_ci			{ 0x19, 0x04a110f0 },
805862306a36Sopenharmony_ci			{ },
805962306a36Sopenharmony_ci		},
806062306a36Sopenharmony_ci	},
806162306a36Sopenharmony_ci	[ALC255_FIXUP_MIC_MUTE_LED] = {
806262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
806362306a36Sopenharmony_ci		.v.func = alc_fixup_micmute_led,
806462306a36Sopenharmony_ci	},
806562306a36Sopenharmony_ci	[ALC282_FIXUP_ASPIRE_V5_PINS] = {
806662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
806762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
806862306a36Sopenharmony_ci			{ 0x12, 0x90a60130 },
806962306a36Sopenharmony_ci			{ 0x14, 0x90170110 },
807062306a36Sopenharmony_ci			{ 0x17, 0x40000008 },
807162306a36Sopenharmony_ci			{ 0x18, 0x411111f0 },
807262306a36Sopenharmony_ci			{ 0x19, 0x01a1913c },
807362306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 },
807462306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 },
807562306a36Sopenharmony_ci			{ 0x1d, 0x40f89b2d },
807662306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 },
807762306a36Sopenharmony_ci			{ 0x21, 0x0321101f },
807862306a36Sopenharmony_ci			{ },
807962306a36Sopenharmony_ci		},
808062306a36Sopenharmony_ci	},
808162306a36Sopenharmony_ci	[ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
808262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
808362306a36Sopenharmony_ci		.v.func = alc269vb_fixup_aspire_e1_coef,
808462306a36Sopenharmony_ci	},
808562306a36Sopenharmony_ci	[ALC280_FIXUP_HP_GPIO4] = {
808662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
808762306a36Sopenharmony_ci		.v.func = alc280_fixup_hp_gpio4,
808862306a36Sopenharmony_ci	},
808962306a36Sopenharmony_ci	[ALC286_FIXUP_HP_GPIO_LED] = {
809062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
809162306a36Sopenharmony_ci		.v.func = alc286_fixup_hp_gpio_led,
809262306a36Sopenharmony_ci	},
809362306a36Sopenharmony_ci	[ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
809462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
809562306a36Sopenharmony_ci		.v.func = alc280_fixup_hp_gpio2_mic_hotkey,
809662306a36Sopenharmony_ci	},
809762306a36Sopenharmony_ci	[ALC280_FIXUP_HP_DOCK_PINS] = {
809862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
809962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
810062306a36Sopenharmony_ci			{ 0x1b, 0x21011020 }, /* line-out */
810162306a36Sopenharmony_ci			{ 0x1a, 0x01a1903c }, /* headset mic */
810262306a36Sopenharmony_ci			{ 0x18, 0x2181103f }, /* line-in */
810362306a36Sopenharmony_ci			{ },
810462306a36Sopenharmony_ci		},
810562306a36Sopenharmony_ci		.chained = true,
810662306a36Sopenharmony_ci		.chain_id = ALC280_FIXUP_HP_GPIO4
810762306a36Sopenharmony_ci	},
810862306a36Sopenharmony_ci	[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
810962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
811062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
811162306a36Sopenharmony_ci			{ 0x1b, 0x21011020 }, /* line-out */
811262306a36Sopenharmony_ci			{ 0x18, 0x2181103f }, /* line-in */
811362306a36Sopenharmony_ci			{ },
811462306a36Sopenharmony_ci		},
811562306a36Sopenharmony_ci		.chained = true,
811662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
811762306a36Sopenharmony_ci	},
811862306a36Sopenharmony_ci	[ALC280_FIXUP_HP_9480M] = {
811962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
812062306a36Sopenharmony_ci		.v.func = alc280_fixup_hp_9480m,
812162306a36Sopenharmony_ci	},
812262306a36Sopenharmony_ci	[ALC245_FIXUP_HP_X360_AMP] = {
812362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
812462306a36Sopenharmony_ci		.v.func = alc245_fixup_hp_x360_amp,
812562306a36Sopenharmony_ci		.chained = true,
812662306a36Sopenharmony_ci		.chain_id = ALC245_FIXUP_HP_GPIO_LED
812762306a36Sopenharmony_ci	},
812862306a36Sopenharmony_ci	[ALC288_FIXUP_DELL_HEADSET_MODE] = {
812962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
813062306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_dell_alc288,
813162306a36Sopenharmony_ci		.chained = true,
813262306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
813362306a36Sopenharmony_ci	},
813462306a36Sopenharmony_ci	[ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
813562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
813662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
813762306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
813862306a36Sopenharmony_ci			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
813962306a36Sopenharmony_ci			{ }
814062306a36Sopenharmony_ci		},
814162306a36Sopenharmony_ci		.chained = true,
814262306a36Sopenharmony_ci		.chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
814362306a36Sopenharmony_ci	},
814462306a36Sopenharmony_ci	[ALC288_FIXUP_DISABLE_AAMIX] = {
814562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
814662306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
814762306a36Sopenharmony_ci		.chained = true,
814862306a36Sopenharmony_ci		.chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
814962306a36Sopenharmony_ci	},
815062306a36Sopenharmony_ci	[ALC288_FIXUP_DELL_XPS_13] = {
815162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
815262306a36Sopenharmony_ci		.v.func = alc_fixup_dell_xps13,
815362306a36Sopenharmony_ci		.chained = true,
815462306a36Sopenharmony_ci		.chain_id = ALC288_FIXUP_DISABLE_AAMIX
815562306a36Sopenharmony_ci	},
815662306a36Sopenharmony_ci	[ALC292_FIXUP_DISABLE_AAMIX] = {
815762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
815862306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
815962306a36Sopenharmony_ci		.chained = true,
816062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
816162306a36Sopenharmony_ci	},
816262306a36Sopenharmony_ci	[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
816362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
816462306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
816562306a36Sopenharmony_ci		.chained = true,
816662306a36Sopenharmony_ci		.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
816762306a36Sopenharmony_ci	},
816862306a36Sopenharmony_ci	[ALC292_FIXUP_DELL_E7X_AAMIX] = {
816962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
817062306a36Sopenharmony_ci		.v.func = alc_fixup_dell_xps13,
817162306a36Sopenharmony_ci		.chained = true,
817262306a36Sopenharmony_ci		.chain_id = ALC292_FIXUP_DISABLE_AAMIX
817362306a36Sopenharmony_ci	},
817462306a36Sopenharmony_ci	[ALC292_FIXUP_DELL_E7X] = {
817562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
817662306a36Sopenharmony_ci		.v.func = alc_fixup_micmute_led,
817762306a36Sopenharmony_ci		/* micmute fixup must be applied at last */
817862306a36Sopenharmony_ci		.chained_before = true,
817962306a36Sopenharmony_ci		.chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
818062306a36Sopenharmony_ci	},
818162306a36Sopenharmony_ci	[ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
818262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
818362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
818462306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
818562306a36Sopenharmony_ci			{ }
818662306a36Sopenharmony_ci		},
818762306a36Sopenharmony_ci		.chained_before = true,
818862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE,
818962306a36Sopenharmony_ci	},
819062306a36Sopenharmony_ci	[ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
819162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
819262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
819362306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
819462306a36Sopenharmony_ci			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
819562306a36Sopenharmony_ci			{ }
819662306a36Sopenharmony_ci		},
819762306a36Sopenharmony_ci		.chained = true,
819862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
819962306a36Sopenharmony_ci	},
820062306a36Sopenharmony_ci	[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
820162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
820262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
820362306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
820462306a36Sopenharmony_ci			{ }
820562306a36Sopenharmony_ci		},
820662306a36Sopenharmony_ci		.chained = true,
820762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
820862306a36Sopenharmony_ci	},
820962306a36Sopenharmony_ci	[ALC275_FIXUP_DELL_XPS] = {
821062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
821162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
821262306a36Sopenharmony_ci			/* Enables internal speaker */
821362306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
821462306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
821562306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x30},
821662306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
821762306a36Sopenharmony_ci			{}
821862306a36Sopenharmony_ci		}
821962306a36Sopenharmony_ci	},
822062306a36Sopenharmony_ci	[ALC293_FIXUP_LENOVO_SPK_NOISE] = {
822162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
822262306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
822362306a36Sopenharmony_ci		.chained = true,
822462306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
822562306a36Sopenharmony_ci	},
822662306a36Sopenharmony_ci	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
822762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
822862306a36Sopenharmony_ci		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
822962306a36Sopenharmony_ci	},
823062306a36Sopenharmony_ci	[ALC233_FIXUP_INTEL_NUC8_DMIC] = {
823162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
823262306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
823362306a36Sopenharmony_ci		.chained = true,
823462306a36Sopenharmony_ci		.chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
823562306a36Sopenharmony_ci	},
823662306a36Sopenharmony_ci	[ALC233_FIXUP_INTEL_NUC8_BOOST] = {
823762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
823862306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost
823962306a36Sopenharmony_ci	},
824062306a36Sopenharmony_ci	[ALC255_FIXUP_DELL_SPK_NOISE] = {
824162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
824262306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
824362306a36Sopenharmony_ci		.chained = true,
824462306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
824562306a36Sopenharmony_ci	},
824662306a36Sopenharmony_ci	[ALC225_FIXUP_DISABLE_MIC_VREF] = {
824762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
824862306a36Sopenharmony_ci		.v.func = alc_fixup_disable_mic_vref,
824962306a36Sopenharmony_ci		.chained = true,
825062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
825162306a36Sopenharmony_ci	},
825262306a36Sopenharmony_ci	[ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
825362306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
825462306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
825562306a36Sopenharmony_ci			/* Disable pass-through path for FRONT 14h */
825662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
825762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
825862306a36Sopenharmony_ci			{}
825962306a36Sopenharmony_ci		},
826062306a36Sopenharmony_ci		.chained = true,
826162306a36Sopenharmony_ci		.chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
826262306a36Sopenharmony_ci	},
826362306a36Sopenharmony_ci	[ALC280_FIXUP_HP_HEADSET_MIC] = {
826462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
826562306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
826662306a36Sopenharmony_ci		.chained = true,
826762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC,
826862306a36Sopenharmony_ci	},
826962306a36Sopenharmony_ci	[ALC221_FIXUP_HP_FRONT_MIC] = {
827062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
827162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
827262306a36Sopenharmony_ci			{ 0x19, 0x02a19020 }, /* Front Mic */
827362306a36Sopenharmony_ci			{ }
827462306a36Sopenharmony_ci		},
827562306a36Sopenharmony_ci	},
827662306a36Sopenharmony_ci	[ALC292_FIXUP_TPT460] = {
827762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
827862306a36Sopenharmony_ci		.v.func = alc_fixup_tpt440_dock,
827962306a36Sopenharmony_ci		.chained = true,
828062306a36Sopenharmony_ci		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
828162306a36Sopenharmony_ci	},
828262306a36Sopenharmony_ci	[ALC298_FIXUP_SPK_VOLUME] = {
828362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
828462306a36Sopenharmony_ci		.v.func = alc298_fixup_speaker_volume,
828562306a36Sopenharmony_ci		.chained = true,
828662306a36Sopenharmony_ci		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
828762306a36Sopenharmony_ci	},
828862306a36Sopenharmony_ci	[ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
828962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
829062306a36Sopenharmony_ci		.v.func = alc298_fixup_speaker_volume,
829162306a36Sopenharmony_ci	},
829262306a36Sopenharmony_ci	[ALC295_FIXUP_DISABLE_DAC3] = {
829362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
829462306a36Sopenharmony_ci		.v.func = alc295_fixup_disable_dac3,
829562306a36Sopenharmony_ci	},
829662306a36Sopenharmony_ci	[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
829762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
829862306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
829962306a36Sopenharmony_ci		.chained = true,
830062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
830162306a36Sopenharmony_ci	},
830262306a36Sopenharmony_ci	[ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
830362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
830462306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
830562306a36Sopenharmony_ci		.chained = true,
830662306a36Sopenharmony_ci		.chain_id = ALC245_FIXUP_CS35L41_SPI_2
830762306a36Sopenharmony_ci	},
830862306a36Sopenharmony_ci	[ALC285_FIXUP_ASUS_HEADSET_MIC] = {
830962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
831062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
831162306a36Sopenharmony_ci			{ 0x19, 0x03a11050 },
831262306a36Sopenharmony_ci			{ 0x1b, 0x03a11c30 },
831362306a36Sopenharmony_ci			{ }
831462306a36Sopenharmony_ci		},
831562306a36Sopenharmony_ci		.chained = true,
831662306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
831762306a36Sopenharmony_ci	},
831862306a36Sopenharmony_ci	[ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
831962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
832062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
832162306a36Sopenharmony_ci			{ 0x14, 0x90170120 },
832262306a36Sopenharmony_ci			{ }
832362306a36Sopenharmony_ci		},
832462306a36Sopenharmony_ci		.chained = true,
832562306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
832662306a36Sopenharmony_ci	},
832762306a36Sopenharmony_ci	[ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
832862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
832962306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
833062306a36Sopenharmony_ci		.chained = true,
833162306a36Sopenharmony_ci		.chain_id = ALC287_FIXUP_CS35L41_I2C_2
833262306a36Sopenharmony_ci	},
833362306a36Sopenharmony_ci	[ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
833462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
833562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
833662306a36Sopenharmony_ci			{ 0x19, 0x03a11050 },
833762306a36Sopenharmony_ci			{ 0x1b, 0x03a11c30 },
833862306a36Sopenharmony_ci			{ }
833962306a36Sopenharmony_ci		},
834062306a36Sopenharmony_ci		.chained = true,
834162306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
834262306a36Sopenharmony_ci	},
834362306a36Sopenharmony_ci	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
834462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
834562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
834662306a36Sopenharmony_ci			{ 0x1b, 0x90170151 },
834762306a36Sopenharmony_ci			{ }
834862306a36Sopenharmony_ci		},
834962306a36Sopenharmony_ci		.chained = true,
835062306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
835162306a36Sopenharmony_ci	},
835262306a36Sopenharmony_ci	[ALC269_FIXUP_ATIV_BOOK_8] = {
835362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
835462306a36Sopenharmony_ci		.v.func = alc_fixup_auto_mute_via_amp,
835562306a36Sopenharmony_ci		.chained = true,
835662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_NO_SHUTUP
835762306a36Sopenharmony_ci	},
835862306a36Sopenharmony_ci	[ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
835962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
836062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
836162306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
836262306a36Sopenharmony_ci			{ 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
836362306a36Sopenharmony_ci			{ }
836462306a36Sopenharmony_ci		},
836562306a36Sopenharmony_ci		.chained = true,
836662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
836762306a36Sopenharmony_ci	},
836862306a36Sopenharmony_ci	[ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
836962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
837062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
837162306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
837262306a36Sopenharmony_ci			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
837362306a36Sopenharmony_ci			{ }
837462306a36Sopenharmony_ci		},
837562306a36Sopenharmony_ci		.chained = true,
837662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
837762306a36Sopenharmony_ci	},
837862306a36Sopenharmony_ci	[ALC256_FIXUP_ASUS_HEADSET_MODE] = {
837962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
838062306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode,
838162306a36Sopenharmony_ci	},
838262306a36Sopenharmony_ci	[ALC256_FIXUP_ASUS_MIC] = {
838362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
838462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
838562306a36Sopenharmony_ci			{ 0x13, 0x90a60160 }, /* use as internal mic */
838662306a36Sopenharmony_ci			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
838762306a36Sopenharmony_ci			{ }
838862306a36Sopenharmony_ci		},
838962306a36Sopenharmony_ci		.chained = true,
839062306a36Sopenharmony_ci		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
839162306a36Sopenharmony_ci	},
839262306a36Sopenharmony_ci	[ALC256_FIXUP_ASUS_AIO_GPIO2] = {
839362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
839462306a36Sopenharmony_ci		/* Set up GPIO2 for the speaker amp */
839562306a36Sopenharmony_ci		.v.func = alc_fixup_gpio4,
839662306a36Sopenharmony_ci	},
839762306a36Sopenharmony_ci	[ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
839862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
839962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
840062306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
840162306a36Sopenharmony_ci			{ }
840262306a36Sopenharmony_ci		},
840362306a36Sopenharmony_ci		.chained = true,
840462306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
840562306a36Sopenharmony_ci	},
840662306a36Sopenharmony_ci	[ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
840762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
840862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
840962306a36Sopenharmony_ci			/* Enables internal speaker */
841062306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x40},
841162306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x8800},
841262306a36Sopenharmony_ci			{}
841362306a36Sopenharmony_ci		},
841462306a36Sopenharmony_ci		.chained = true,
841562306a36Sopenharmony_ci		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
841662306a36Sopenharmony_ci	},
841762306a36Sopenharmony_ci	[ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
841862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
841962306a36Sopenharmony_ci		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
842062306a36Sopenharmony_ci		.chained = true,
842162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_GPIO2
842262306a36Sopenharmony_ci	},
842362306a36Sopenharmony_ci	[ALC233_FIXUP_ACER_HEADSET_MIC] = {
842462306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
842562306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
842662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
842762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
842862306a36Sopenharmony_ci			{ }
842962306a36Sopenharmony_ci		},
843062306a36Sopenharmony_ci		.chained = true,
843162306a36Sopenharmony_ci		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
843262306a36Sopenharmony_ci	},
843362306a36Sopenharmony_ci	[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
843462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
843562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
843662306a36Sopenharmony_ci			/* Change the mic location from front to right, otherwise there are
843762306a36Sopenharmony_ci			   two front mics with the same name, pulseaudio can't handle them.
843862306a36Sopenharmony_ci			   This is just a temporary workaround, after applying this fixup,
843962306a36Sopenharmony_ci			   there will be one "Front Mic" and one "Mic" in this machine.
844062306a36Sopenharmony_ci			 */
844162306a36Sopenharmony_ci			{ 0x1a, 0x04a19040 },
844262306a36Sopenharmony_ci			{ }
844362306a36Sopenharmony_ci		},
844462306a36Sopenharmony_ci	},
844562306a36Sopenharmony_ci	[ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
844662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
844762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
844862306a36Sopenharmony_ci			{ 0x16, 0x0101102f }, /* Rear Headset HP */
844962306a36Sopenharmony_ci			{ 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
845062306a36Sopenharmony_ci			{ 0x1a, 0x01a19030 }, /* Rear Headset MIC */
845162306a36Sopenharmony_ci			{ 0x1b, 0x02011020 },
845262306a36Sopenharmony_ci			{ }
845362306a36Sopenharmony_ci		},
845462306a36Sopenharmony_ci		.chained = true,
845562306a36Sopenharmony_ci		.chain_id = ALC225_FIXUP_S3_POP_NOISE
845662306a36Sopenharmony_ci	},
845762306a36Sopenharmony_ci	[ALC225_FIXUP_S3_POP_NOISE] = {
845862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
845962306a36Sopenharmony_ci		.v.func = alc225_fixup_s3_pop_noise,
846062306a36Sopenharmony_ci		.chained = true,
846162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
846262306a36Sopenharmony_ci	},
846362306a36Sopenharmony_ci	[ALC700_FIXUP_INTEL_REFERENCE] = {
846462306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
846562306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
846662306a36Sopenharmony_ci			/* Enables internal speaker */
846762306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x45},
846862306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x5289},
846962306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
847062306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x001b},
847162306a36Sopenharmony_ci			{0x58, AC_VERB_SET_COEF_INDEX, 0x00},
847262306a36Sopenharmony_ci			{0x58, AC_VERB_SET_PROC_COEF, 0x3888},
847362306a36Sopenharmony_ci			{0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
847462306a36Sopenharmony_ci			{0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
847562306a36Sopenharmony_ci			{}
847662306a36Sopenharmony_ci		}
847762306a36Sopenharmony_ci	},
847862306a36Sopenharmony_ci	[ALC274_FIXUP_DELL_BIND_DACS] = {
847962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
848062306a36Sopenharmony_ci		.v.func = alc274_fixup_bind_dacs,
848162306a36Sopenharmony_ci		.chained = true,
848262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
848362306a36Sopenharmony_ci	},
848462306a36Sopenharmony_ci	[ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
848562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
848662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
848762306a36Sopenharmony_ci			{ 0x1b, 0x0401102f },
848862306a36Sopenharmony_ci			{ }
848962306a36Sopenharmony_ci		},
849062306a36Sopenharmony_ci		.chained = true,
849162306a36Sopenharmony_ci		.chain_id = ALC274_FIXUP_DELL_BIND_DACS
849262306a36Sopenharmony_ci	},
849362306a36Sopenharmony_ci	[ALC298_FIXUP_TPT470_DOCK_FIX] = {
849462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
849562306a36Sopenharmony_ci		.v.func = alc_fixup_tpt470_dock,
849662306a36Sopenharmony_ci		.chained = true,
849762306a36Sopenharmony_ci		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
849862306a36Sopenharmony_ci	},
849962306a36Sopenharmony_ci	[ALC298_FIXUP_TPT470_DOCK] = {
850062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
850162306a36Sopenharmony_ci		.v.func = alc_fixup_tpt470_dacs,
850262306a36Sopenharmony_ci		.chained = true,
850362306a36Sopenharmony_ci		.chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
850462306a36Sopenharmony_ci	},
850562306a36Sopenharmony_ci	[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
850662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
850762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
850862306a36Sopenharmony_ci			{ 0x14, 0x0201101f },
850962306a36Sopenharmony_ci			{ }
851062306a36Sopenharmony_ci		},
851162306a36Sopenharmony_ci		.chained = true,
851262306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
851362306a36Sopenharmony_ci	},
851462306a36Sopenharmony_ci	[ALC255_FIXUP_DELL_HEADSET_MIC] = {
851562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
851662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
851762306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
851862306a36Sopenharmony_ci			{ }
851962306a36Sopenharmony_ci		},
852062306a36Sopenharmony_ci		.chained = true,
852162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
852262306a36Sopenharmony_ci	},
852362306a36Sopenharmony_ci	[ALC295_FIXUP_HP_X360] = {
852462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
852562306a36Sopenharmony_ci		.v.func = alc295_fixup_hp_top_speakers,
852662306a36Sopenharmony_ci		.chained = true,
852762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
852862306a36Sopenharmony_ci	},
852962306a36Sopenharmony_ci	[ALC221_FIXUP_HP_HEADSET_MIC] = {
853062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
853162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
853262306a36Sopenharmony_ci			{ 0x19, 0x0181313f},
853362306a36Sopenharmony_ci			{ }
853462306a36Sopenharmony_ci		},
853562306a36Sopenharmony_ci		.chained = true,
853662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
853762306a36Sopenharmony_ci	},
853862306a36Sopenharmony_ci	[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
853962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
854062306a36Sopenharmony_ci		.v.func = alc285_fixup_invalidate_dacs,
854162306a36Sopenharmony_ci		.chained = true,
854262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
854362306a36Sopenharmony_ci	},
854462306a36Sopenharmony_ci	[ALC295_FIXUP_HP_AUTO_MUTE] = {
854562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
854662306a36Sopenharmony_ci		.v.func = alc_fixup_auto_mute_via_amp,
854762306a36Sopenharmony_ci	},
854862306a36Sopenharmony_ci	[ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
854962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
855062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
855162306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
855262306a36Sopenharmony_ci			{ }
855362306a36Sopenharmony_ci		},
855462306a36Sopenharmony_ci		.chained = true,
855562306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
855662306a36Sopenharmony_ci	},
855762306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_MIC] = {
855862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
855962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
856062306a36Sopenharmony_ci			{ 0x13, 0x90a60160 }, /* use as internal mic */
856162306a36Sopenharmony_ci			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
856262306a36Sopenharmony_ci			{ }
856362306a36Sopenharmony_ci		},
856462306a36Sopenharmony_ci		.chained = true,
856562306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
856662306a36Sopenharmony_ci	},
856762306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_HEADSET_MIC] = {
856862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
856962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
857062306a36Sopenharmony_ci			{ 0x19, 0x01a1103c }, /* use as headset mic */
857162306a36Sopenharmony_ci			{ }
857262306a36Sopenharmony_ci		},
857362306a36Sopenharmony_ci		.chained = true,
857462306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
857562306a36Sopenharmony_ci	},
857662306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_SPK] = {
857762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
857862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
857962306a36Sopenharmony_ci			/* Set EAPD high */
858062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
858162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
858262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
858362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
858462306a36Sopenharmony_ci			{ }
858562306a36Sopenharmony_ci		},
858662306a36Sopenharmony_ci		.chained = true,
858762306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
858862306a36Sopenharmony_ci	},
858962306a36Sopenharmony_ci	[ALC295_FIXUP_CHROME_BOOK] = {
859062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
859162306a36Sopenharmony_ci		.v.func = alc295_fixup_chromebook,
859262306a36Sopenharmony_ci		.chained = true,
859362306a36Sopenharmony_ci		.chain_id = ALC225_FIXUP_HEADSET_JACK
859462306a36Sopenharmony_ci	},
859562306a36Sopenharmony_ci	[ALC225_FIXUP_HEADSET_JACK] = {
859662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
859762306a36Sopenharmony_ci		.v.func = alc_fixup_headset_jack,
859862306a36Sopenharmony_ci	},
859962306a36Sopenharmony_ci	[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
860062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
860162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
860262306a36Sopenharmony_ci			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
860362306a36Sopenharmony_ci			{ }
860462306a36Sopenharmony_ci		},
860562306a36Sopenharmony_ci		.chained = true,
860662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
860762306a36Sopenharmony_ci	},
860862306a36Sopenharmony_ci	[ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
860962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
861062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
861162306a36Sopenharmony_ci			/* Disable PCBEEP-IN passthrough */
861262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
861362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
861462306a36Sopenharmony_ci			{ }
861562306a36Sopenharmony_ci		},
861662306a36Sopenharmony_ci		.chained = true,
861762306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
861862306a36Sopenharmony_ci	},
861962306a36Sopenharmony_ci	[ALC255_FIXUP_ACER_HEADSET_MIC] = {
862062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
862162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
862262306a36Sopenharmony_ci			{ 0x19, 0x03a11130 },
862362306a36Sopenharmony_ci			{ 0x1a, 0x90a60140 }, /* use as internal mic */
862462306a36Sopenharmony_ci			{ }
862562306a36Sopenharmony_ci		},
862662306a36Sopenharmony_ci		.chained = true,
862762306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
862862306a36Sopenharmony_ci	},
862962306a36Sopenharmony_ci	[ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
863062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
863162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
863262306a36Sopenharmony_ci			{ 0x16, 0x01011020 }, /* Rear Line out */
863362306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
863462306a36Sopenharmony_ci			{ }
863562306a36Sopenharmony_ci		},
863662306a36Sopenharmony_ci		.chained = true,
863762306a36Sopenharmony_ci		.chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
863862306a36Sopenharmony_ci	},
863962306a36Sopenharmony_ci	[ALC225_FIXUP_WYSE_AUTO_MUTE] = {
864062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
864162306a36Sopenharmony_ci		.v.func = alc_fixup_auto_mute_via_amp,
864262306a36Sopenharmony_ci		.chained = true,
864362306a36Sopenharmony_ci		.chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
864462306a36Sopenharmony_ci	},
864562306a36Sopenharmony_ci	[ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
864662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
864762306a36Sopenharmony_ci		.v.func = alc_fixup_disable_mic_vref,
864862306a36Sopenharmony_ci		.chained = true,
864962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
865062306a36Sopenharmony_ci	},
865162306a36Sopenharmony_ci	[ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
865262306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
865362306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
865462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
865562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
865662306a36Sopenharmony_ci			{ }
865762306a36Sopenharmony_ci		},
865862306a36Sopenharmony_ci		.chained = true,
865962306a36Sopenharmony_ci		.chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
866062306a36Sopenharmony_ci	},
866162306a36Sopenharmony_ci	[ALC256_FIXUP_ASUS_HEADSET_MIC] = {
866262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
866362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
866462306a36Sopenharmony_ci			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
866562306a36Sopenharmony_ci			{ }
866662306a36Sopenharmony_ci		},
866762306a36Sopenharmony_ci		.chained = true,
866862306a36Sopenharmony_ci		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
866962306a36Sopenharmony_ci	},
867062306a36Sopenharmony_ci	[ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
867162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
867262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
867362306a36Sopenharmony_ci			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
867462306a36Sopenharmony_ci			{ }
867562306a36Sopenharmony_ci		},
867662306a36Sopenharmony_ci		.chained = true,
867762306a36Sopenharmony_ci		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
867862306a36Sopenharmony_ci	},
867962306a36Sopenharmony_ci	[ALC299_FIXUP_PREDATOR_SPK] = {
868062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
868162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
868262306a36Sopenharmony_ci			{ 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
868362306a36Sopenharmony_ci			{ }
868462306a36Sopenharmony_ci		}
868562306a36Sopenharmony_ci	},
868662306a36Sopenharmony_ci	[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
868762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
868862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
868962306a36Sopenharmony_ci			{ 0x19, 0x04a11040 },
869062306a36Sopenharmony_ci			{ 0x21, 0x04211020 },
869162306a36Sopenharmony_ci			{ }
869262306a36Sopenharmony_ci		},
869362306a36Sopenharmony_ci		.chained = true,
869462306a36Sopenharmony_ci		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
869562306a36Sopenharmony_ci	},
869662306a36Sopenharmony_ci	[ALC289_FIXUP_DELL_SPK1] = {
869762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
869862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
869962306a36Sopenharmony_ci			{ 0x14, 0x90170140 },
870062306a36Sopenharmony_ci			{ }
870162306a36Sopenharmony_ci		},
870262306a36Sopenharmony_ci		.chained = true,
870362306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
870462306a36Sopenharmony_ci	},
870562306a36Sopenharmony_ci	[ALC289_FIXUP_DELL_SPK2] = {
870662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
870762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
870862306a36Sopenharmony_ci			{ 0x17, 0x90170130 }, /* bass spk */
870962306a36Sopenharmony_ci			{ }
871062306a36Sopenharmony_ci		},
871162306a36Sopenharmony_ci		.chained = true,
871262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
871362306a36Sopenharmony_ci	},
871462306a36Sopenharmony_ci	[ALC289_FIXUP_DUAL_SPK] = {
871562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
871662306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
871762306a36Sopenharmony_ci		.chained = true,
871862306a36Sopenharmony_ci		.chain_id = ALC289_FIXUP_DELL_SPK2
871962306a36Sopenharmony_ci	},
872062306a36Sopenharmony_ci	[ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {
872162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
872262306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
872362306a36Sopenharmony_ci		.chained = true,
872462306a36Sopenharmony_ci		.chain_id = ALC289_FIXUP_DELL_SPK1
872562306a36Sopenharmony_ci	},
872662306a36Sopenharmony_ci	[ALC294_FIXUP_SPK2_TO_DAC1] = {
872762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
872862306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
872962306a36Sopenharmony_ci		.chained = true,
873062306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
873162306a36Sopenharmony_ci	},
873262306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_DUAL_SPK] = {
873362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
873462306a36Sopenharmony_ci		/* The GPIO must be pulled to initialize the AMP */
873562306a36Sopenharmony_ci		.v.func = alc_fixup_gpio4,
873662306a36Sopenharmony_ci		.chained = true,
873762306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_SPK2_TO_DAC1
873862306a36Sopenharmony_ci	},
873962306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_ALLY] = {
874062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
874162306a36Sopenharmony_ci		.v.func = cs35l41_fixup_i2c_two,
874262306a36Sopenharmony_ci		.chained = true,
874362306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
874462306a36Sopenharmony_ci	},
874562306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_ALLY_PINS] = {
874662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
874762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
874862306a36Sopenharmony_ci			{ 0x19, 0x03a11050 },
874962306a36Sopenharmony_ci			{ 0x1a, 0x03a11c30 },
875062306a36Sopenharmony_ci			{ 0x21, 0x03211420 },
875162306a36Sopenharmony_ci			{ }
875262306a36Sopenharmony_ci		},
875362306a36Sopenharmony_ci		.chained = true,
875462306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
875562306a36Sopenharmony_ci	},
875662306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_ALLY_VERBS] = {
875762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
875862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
875962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
876062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
876162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
876262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
876362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
876462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
876562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
876662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
876762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
876862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
876962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
877062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
877162306a36Sopenharmony_ci			{ }
877262306a36Sopenharmony_ci		},
877362306a36Sopenharmony_ci		.chained = true,
877462306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
877562306a36Sopenharmony_ci	},
877662306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
877762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
877862306a36Sopenharmony_ci		.v.func = alc285_fixup_speaker2_to_dac1,
877962306a36Sopenharmony_ci	},
878062306a36Sopenharmony_ci	[ALC285_FIXUP_THINKPAD_X1_GEN7] = {
878162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
878262306a36Sopenharmony_ci		.v.func = alc285_fixup_thinkpad_x1_gen7,
878362306a36Sopenharmony_ci		.chained = true,
878462306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
878562306a36Sopenharmony_ci	},
878662306a36Sopenharmony_ci	[ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
878762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
878862306a36Sopenharmony_ci		.v.func = alc_fixup_headset_jack,
878962306a36Sopenharmony_ci		.chained = true,
879062306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
879162306a36Sopenharmony_ci	},
879262306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_HPE] = {
879362306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
879462306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
879562306a36Sopenharmony_ci			/* Set EAPD high */
879662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
879762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
879862306a36Sopenharmony_ci			{ }
879962306a36Sopenharmony_ci		},
880062306a36Sopenharmony_ci		.chained = true,
880162306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
880262306a36Sopenharmony_ci	},
880362306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_GX502_PINS] = {
880462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
880562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
880662306a36Sopenharmony_ci			{ 0x19, 0x03a11050 }, /* front HP mic */
880762306a36Sopenharmony_ci			{ 0x1a, 0x01a11830 }, /* rear external mic */
880862306a36Sopenharmony_ci			{ 0x21, 0x03211020 }, /* front HP out */
880962306a36Sopenharmony_ci			{ }
881062306a36Sopenharmony_ci		},
881162306a36Sopenharmony_ci		.chained = true,
881262306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
881362306a36Sopenharmony_ci	},
881462306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_GX502_VERBS] = {
881562306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
881662306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
881762306a36Sopenharmony_ci			/* set 0x15 to HP-OUT ctrl */
881862306a36Sopenharmony_ci			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
881962306a36Sopenharmony_ci			/* unmute the 0x15 amp */
882062306a36Sopenharmony_ci			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
882162306a36Sopenharmony_ci			{ }
882262306a36Sopenharmony_ci		},
882362306a36Sopenharmony_ci		.chained = true,
882462306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_GX502_HP
882562306a36Sopenharmony_ci	},
882662306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_GX502_HP] = {
882762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
882862306a36Sopenharmony_ci		.v.func = alc294_fixup_gx502_hp,
882962306a36Sopenharmony_ci	},
883062306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_GU502_PINS] = {
883162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
883262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
883362306a36Sopenharmony_ci			{ 0x19, 0x01a11050 }, /* rear HP mic */
883462306a36Sopenharmony_ci			{ 0x1a, 0x01a11830 }, /* rear external mic */
883562306a36Sopenharmony_ci			{ 0x21, 0x012110f0 }, /* rear HP out */
883662306a36Sopenharmony_ci			{ }
883762306a36Sopenharmony_ci		},
883862306a36Sopenharmony_ci		.chained = true,
883962306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
884062306a36Sopenharmony_ci	},
884162306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_GU502_VERBS] = {
884262306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
884362306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
884462306a36Sopenharmony_ci			/* set 0x15 to HP-OUT ctrl */
884562306a36Sopenharmony_ci			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
884662306a36Sopenharmony_ci			/* unmute the 0x15 amp */
884762306a36Sopenharmony_ci			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
884862306a36Sopenharmony_ci			/* set 0x1b to HP-OUT */
884962306a36Sopenharmony_ci			{ 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
885062306a36Sopenharmony_ci			{ }
885162306a36Sopenharmony_ci		},
885262306a36Sopenharmony_ci		.chained = true,
885362306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_GU502_HP
885462306a36Sopenharmony_ci	},
885562306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_GU502_HP] = {
885662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
885762306a36Sopenharmony_ci		.v.func = alc294_fixup_gu502_hp,
885862306a36Sopenharmony_ci	},
885962306a36Sopenharmony_ci	 [ALC294_FIXUP_ASUS_G513_PINS] = {
886062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
886162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
886262306a36Sopenharmony_ci				{ 0x19, 0x03a11050 }, /* front HP mic */
886362306a36Sopenharmony_ci				{ 0x1a, 0x03a11c30 }, /* rear external mic */
886462306a36Sopenharmony_ci				{ 0x21, 0x03211420 }, /* front HP out */
886562306a36Sopenharmony_ci				{ }
886662306a36Sopenharmony_ci		},
886762306a36Sopenharmony_ci	},
886862306a36Sopenharmony_ci	[ALC285_FIXUP_ASUS_G533Z_PINS] = {
886962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
887062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
887162306a36Sopenharmony_ci			{ 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
887262306a36Sopenharmony_ci			{ 0x19, 0x03a19020 }, /* Mic Boost Volume */
887362306a36Sopenharmony_ci			{ 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
887462306a36Sopenharmony_ci			{ 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
887562306a36Sopenharmony_ci			{ 0x21, 0x03211420 },
887662306a36Sopenharmony_ci			{ }
887762306a36Sopenharmony_ci		},
887862306a36Sopenharmony_ci	},
887962306a36Sopenharmony_ci	[ALC294_FIXUP_ASUS_COEF_1B] = {
888062306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
888162306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
888262306a36Sopenharmony_ci			/* Set bit 10 to correct noisy output after reboot from
888362306a36Sopenharmony_ci			 * Windows 10 (due to pop noise reduction?)
888462306a36Sopenharmony_ci			 */
888562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
888662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
888762306a36Sopenharmony_ci			{ }
888862306a36Sopenharmony_ci		},
888962306a36Sopenharmony_ci		.chained = true,
889062306a36Sopenharmony_ci		.chain_id = ALC289_FIXUP_ASUS_GA401,
889162306a36Sopenharmony_ci	},
889262306a36Sopenharmony_ci	[ALC285_FIXUP_HP_GPIO_LED] = {
889362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
889462306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_gpio_led,
889562306a36Sopenharmony_ci	},
889662306a36Sopenharmony_ci	[ALC285_FIXUP_HP_MUTE_LED] = {
889762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
889862306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_mute_led,
889962306a36Sopenharmony_ci	},
890062306a36Sopenharmony_ci	[ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
890162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
890262306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_spectre_x360_mute_led,
890362306a36Sopenharmony_ci	},
890462306a36Sopenharmony_ci	[ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
890562306a36Sopenharmony_ci	    .type = HDA_FIXUP_FUNC,
890662306a36Sopenharmony_ci	    .v.func = alc236_fixup_hp_mute_led_coefbit2,
890762306a36Sopenharmony_ci	},
890862306a36Sopenharmony_ci	[ALC236_FIXUP_HP_GPIO_LED] = {
890962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
891062306a36Sopenharmony_ci		.v.func = alc236_fixup_hp_gpio_led,
891162306a36Sopenharmony_ci	},
891262306a36Sopenharmony_ci	[ALC236_FIXUP_HP_MUTE_LED] = {
891362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
891462306a36Sopenharmony_ci		.v.func = alc236_fixup_hp_mute_led,
891562306a36Sopenharmony_ci	},
891662306a36Sopenharmony_ci	[ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
891762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
891862306a36Sopenharmony_ci		.v.func = alc236_fixup_hp_mute_led_micmute_vref,
891962306a36Sopenharmony_ci	},
892062306a36Sopenharmony_ci	[ALC298_FIXUP_SAMSUNG_AMP] = {
892162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
892262306a36Sopenharmony_ci		.v.func = alc298_fixup_samsung_amp,
892362306a36Sopenharmony_ci		.chained = true,
892462306a36Sopenharmony_ci		.chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
892562306a36Sopenharmony_ci	},
892662306a36Sopenharmony_ci	[ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
892762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
892862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
892962306a36Sopenharmony_ci			{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
893062306a36Sopenharmony_ci			{ }
893162306a36Sopenharmony_ci		},
893262306a36Sopenharmony_ci	},
893362306a36Sopenharmony_ci	[ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
893462306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
893562306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
893662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
893762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
893862306a36Sopenharmony_ci			{ }
893962306a36Sopenharmony_ci		},
894062306a36Sopenharmony_ci	},
894162306a36Sopenharmony_ci	[ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
894262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
894362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
894462306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
894562306a36Sopenharmony_ci			{ }
894662306a36Sopenharmony_ci		},
894762306a36Sopenharmony_ci		.chained = true,
894862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
894962306a36Sopenharmony_ci	},
895062306a36Sopenharmony_ci	[ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
895162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
895262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
895362306a36Sopenharmony_ci			{ 0x14, 0x90100120 }, /* use as internal speaker */
895462306a36Sopenharmony_ci			{ 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
895562306a36Sopenharmony_ci			{ 0x1a, 0x01011020 }, /* use as line out */
895662306a36Sopenharmony_ci			{ },
895762306a36Sopenharmony_ci		},
895862306a36Sopenharmony_ci		.chained = true,
895962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
896062306a36Sopenharmony_ci	},
896162306a36Sopenharmony_ci	[ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
896262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
896362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
896462306a36Sopenharmony_ci			{ 0x18, 0x02a11030 }, /* use as headset mic */
896562306a36Sopenharmony_ci			{ }
896662306a36Sopenharmony_ci		},
896762306a36Sopenharmony_ci		.chained = true,
896862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
896962306a36Sopenharmony_ci	},
897062306a36Sopenharmony_ci	[ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
897162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
897262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
897362306a36Sopenharmony_ci			{ 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
897462306a36Sopenharmony_ci			{ }
897562306a36Sopenharmony_ci		},
897662306a36Sopenharmony_ci		.chained = true,
897762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MIC
897862306a36Sopenharmony_ci	},
897962306a36Sopenharmony_ci	[ALC289_FIXUP_ASUS_GA401] = {
898062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
898162306a36Sopenharmony_ci		.v.func = alc289_fixup_asus_ga401,
898262306a36Sopenharmony_ci		.chained = true,
898362306a36Sopenharmony_ci		.chain_id = ALC289_FIXUP_ASUS_GA502,
898462306a36Sopenharmony_ci	},
898562306a36Sopenharmony_ci	[ALC289_FIXUP_ASUS_GA502] = {
898662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
898762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
898862306a36Sopenharmony_ci			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
898962306a36Sopenharmony_ci			{ }
899062306a36Sopenharmony_ci		},
899162306a36Sopenharmony_ci	},
899262306a36Sopenharmony_ci	[ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
899362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
899462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
899562306a36Sopenharmony_ci			{ 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
899662306a36Sopenharmony_ci			{ }
899762306a36Sopenharmony_ci		},
899862306a36Sopenharmony_ci		.chained = true,
899962306a36Sopenharmony_ci		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
900062306a36Sopenharmony_ci	},
900162306a36Sopenharmony_ci	[ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
900262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
900362306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_gpio_amp_init,
900462306a36Sopenharmony_ci		.chained = true,
900562306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_GPIO_LED
900662306a36Sopenharmony_ci	},
900762306a36Sopenharmony_ci	[ALC269_FIXUP_CZC_B20] = {
900862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
900962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
901062306a36Sopenharmony_ci			{ 0x12, 0x411111f0 },
901162306a36Sopenharmony_ci			{ 0x14, 0x90170110 }, /* speaker */
901262306a36Sopenharmony_ci			{ 0x15, 0x032f1020 }, /* HP out */
901362306a36Sopenharmony_ci			{ 0x17, 0x411111f0 },
901462306a36Sopenharmony_ci			{ 0x18, 0x03ab1040 }, /* mic */
901562306a36Sopenharmony_ci			{ 0x19, 0xb7a7013f },
901662306a36Sopenharmony_ci			{ 0x1a, 0x0181305f },
901762306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 },
901862306a36Sopenharmony_ci			{ 0x1d, 0x411111f0 },
901962306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 },
902062306a36Sopenharmony_ci			{ }
902162306a36Sopenharmony_ci		},
902262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DMIC,
902362306a36Sopenharmony_ci	},
902462306a36Sopenharmony_ci	[ALC269_FIXUP_CZC_TMI] = {
902562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
902662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
902762306a36Sopenharmony_ci			{ 0x12, 0x4000c000 },
902862306a36Sopenharmony_ci			{ 0x14, 0x90170110 }, /* speaker */
902962306a36Sopenharmony_ci			{ 0x15, 0x0421401f }, /* HP out */
903062306a36Sopenharmony_ci			{ 0x17, 0x411111f0 },
903162306a36Sopenharmony_ci			{ 0x18, 0x04a19020 }, /* mic */
903262306a36Sopenharmony_ci			{ 0x19, 0x411111f0 },
903362306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 },
903462306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 },
903562306a36Sopenharmony_ci			{ 0x1d, 0x40448505 },
903662306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 },
903762306a36Sopenharmony_ci			{ 0x20, 0x8000ffff },
903862306a36Sopenharmony_ci			{ }
903962306a36Sopenharmony_ci		},
904062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DMIC,
904162306a36Sopenharmony_ci	},
904262306a36Sopenharmony_ci	[ALC269_FIXUP_CZC_L101] = {
904362306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
904462306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
904562306a36Sopenharmony_ci			{ 0x12, 0x40000000 },
904662306a36Sopenharmony_ci			{ 0x14, 0x01014010 }, /* speaker */
904762306a36Sopenharmony_ci			{ 0x15, 0x411111f0 }, /* HP out */
904862306a36Sopenharmony_ci			{ 0x16, 0x411111f0 },
904962306a36Sopenharmony_ci			{ 0x18, 0x01a19020 }, /* mic */
905062306a36Sopenharmony_ci			{ 0x19, 0x02a19021 },
905162306a36Sopenharmony_ci			{ 0x1a, 0x0181302f },
905262306a36Sopenharmony_ci			{ 0x1b, 0x0221401f },
905362306a36Sopenharmony_ci			{ 0x1c, 0x411111f0 },
905462306a36Sopenharmony_ci			{ 0x1d, 0x4044c601 },
905562306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 },
905662306a36Sopenharmony_ci			{ }
905762306a36Sopenharmony_ci		},
905862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DMIC,
905962306a36Sopenharmony_ci	},
906062306a36Sopenharmony_ci	[ALC269_FIXUP_LEMOTE_A1802] = {
906162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
906262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
906362306a36Sopenharmony_ci			{ 0x12, 0x40000000 },
906462306a36Sopenharmony_ci			{ 0x14, 0x90170110 }, /* speaker */
906562306a36Sopenharmony_ci			{ 0x17, 0x411111f0 },
906662306a36Sopenharmony_ci			{ 0x18, 0x03a19040 }, /* mic1 */
906762306a36Sopenharmony_ci			{ 0x19, 0x90a70130 }, /* mic2 */
906862306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 },
906962306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 },
907062306a36Sopenharmony_ci			{ 0x1d, 0x40489d2d },
907162306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 },
907262306a36Sopenharmony_ci			{ 0x20, 0x0003ffff },
907362306a36Sopenharmony_ci			{ 0x21, 0x03214020 },
907462306a36Sopenharmony_ci			{ }
907562306a36Sopenharmony_ci		},
907662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DMIC,
907762306a36Sopenharmony_ci	},
907862306a36Sopenharmony_ci	[ALC269_FIXUP_LEMOTE_A190X] = {
907962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
908062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
908162306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
908262306a36Sopenharmony_ci			{ 0x15, 0x0121401f }, /* HP out */
908362306a36Sopenharmony_ci			{ 0x18, 0x01a19c20 }, /* rear  mic */
908462306a36Sopenharmony_ci			{ 0x19, 0x99a3092f }, /* front mic */
908562306a36Sopenharmony_ci			{ 0x1b, 0x0201401f }, /* front lineout */
908662306a36Sopenharmony_ci			{ }
908762306a36Sopenharmony_ci		},
908862306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DMIC,
908962306a36Sopenharmony_ci	},
909062306a36Sopenharmony_ci	[ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
909162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
909262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
909362306a36Sopenharmony_ci			{ 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
909462306a36Sopenharmony_ci			{ }
909562306a36Sopenharmony_ci		},
909662306a36Sopenharmony_ci		.chained = true,
909762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
909862306a36Sopenharmony_ci	},
909962306a36Sopenharmony_ci	[ALC256_FIXUP_INTEL_NUC10] = {
910062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
910162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
910262306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
910362306a36Sopenharmony_ci			{ }
910462306a36Sopenharmony_ci		},
910562306a36Sopenharmony_ci		.chained = true,
910662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
910762306a36Sopenharmony_ci	},
910862306a36Sopenharmony_ci	[ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
910962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
911062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
911162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
911262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
911362306a36Sopenharmony_ci			{ }
911462306a36Sopenharmony_ci		},
911562306a36Sopenharmony_ci		.chained = true,
911662306a36Sopenharmony_ci		.chain_id = ALC289_FIXUP_ASUS_GA502
911762306a36Sopenharmony_ci	},
911862306a36Sopenharmony_ci	[ALC274_FIXUP_HP_MIC] = {
911962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
912062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
912162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
912262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
912362306a36Sopenharmony_ci			{ }
912462306a36Sopenharmony_ci		},
912562306a36Sopenharmony_ci	},
912662306a36Sopenharmony_ci	[ALC274_FIXUP_HP_HEADSET_MIC] = {
912762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
912862306a36Sopenharmony_ci		.v.func = alc274_fixup_hp_headset_mic,
912962306a36Sopenharmony_ci		.chained = true,
913062306a36Sopenharmony_ci		.chain_id = ALC274_FIXUP_HP_MIC
913162306a36Sopenharmony_ci	},
913262306a36Sopenharmony_ci	[ALC274_FIXUP_HP_ENVY_GPIO] = {
913362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
913462306a36Sopenharmony_ci		.v.func = alc274_fixup_hp_envy_gpio,
913562306a36Sopenharmony_ci	},
913662306a36Sopenharmony_ci	[ALC256_FIXUP_ASUS_HPE] = {
913762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
913862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
913962306a36Sopenharmony_ci			/* Set EAPD high */
914062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
914162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
914262306a36Sopenharmony_ci			{ }
914362306a36Sopenharmony_ci		},
914462306a36Sopenharmony_ci		.chained = true,
914562306a36Sopenharmony_ci		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
914662306a36Sopenharmony_ci	},
914762306a36Sopenharmony_ci	[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
914862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
914962306a36Sopenharmony_ci		.v.func = alc_fixup_headset_jack,
915062306a36Sopenharmony_ci		.chained = true,
915162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
915262306a36Sopenharmony_ci	},
915362306a36Sopenharmony_ci	[ALC287_FIXUP_HP_GPIO_LED] = {
915462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
915562306a36Sopenharmony_ci		.v.func = alc287_fixup_hp_gpio_led,
915662306a36Sopenharmony_ci	},
915762306a36Sopenharmony_ci	[ALC256_FIXUP_HP_HEADSET_MIC] = {
915862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
915962306a36Sopenharmony_ci		.v.func = alc274_fixup_hp_headset_mic,
916062306a36Sopenharmony_ci	},
916162306a36Sopenharmony_ci	[ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
916262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
916362306a36Sopenharmony_ci		.v.func = alc_fixup_no_int_mic,
916462306a36Sopenharmony_ci		.chained = true,
916562306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
916662306a36Sopenharmony_ci	},
916762306a36Sopenharmony_ci	[ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
916862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
916962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
917062306a36Sopenharmony_ci			{ 0x1b, 0x411111f0 },
917162306a36Sopenharmony_ci			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
917262306a36Sopenharmony_ci			{ },
917362306a36Sopenharmony_ci		},
917462306a36Sopenharmony_ci		.chained = true,
917562306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE
917662306a36Sopenharmony_ci	},
917762306a36Sopenharmony_ci	[ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
917862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
917962306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
918062306a36Sopenharmony_ci		.chained = true,
918162306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
918262306a36Sopenharmony_ci	},
918362306a36Sopenharmony_ci	[ALC256_FIXUP_ACER_HEADSET_MIC] = {
918462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
918562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
918662306a36Sopenharmony_ci			{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
918762306a36Sopenharmony_ci			{ 0x1a, 0x90a1092f }, /* use as internal mic */
918862306a36Sopenharmony_ci			{ }
918962306a36Sopenharmony_ci		},
919062306a36Sopenharmony_ci		.chained = true,
919162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
919262306a36Sopenharmony_ci	},
919362306a36Sopenharmony_ci	[ALC285_FIXUP_IDEAPAD_S740_COEF] = {
919462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
919562306a36Sopenharmony_ci		.v.func = alc285_fixup_ideapad_s740_coef,
919662306a36Sopenharmony_ci		.chained = true,
919762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
919862306a36Sopenharmony_ci	},
919962306a36Sopenharmony_ci	[ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
920062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
920162306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
920262306a36Sopenharmony_ci		.chained = true,
920362306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
920462306a36Sopenharmony_ci	},
920562306a36Sopenharmony_ci	[ALC295_FIXUP_ASUS_DACS] = {
920662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
920762306a36Sopenharmony_ci		.v.func = alc295_fixup_asus_dacs,
920862306a36Sopenharmony_ci	},
920962306a36Sopenharmony_ci	[ALC295_FIXUP_HP_OMEN] = {
921062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
921162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
921262306a36Sopenharmony_ci			{ 0x12, 0xb7a60130 },
921362306a36Sopenharmony_ci			{ 0x13, 0x40000000 },
921462306a36Sopenharmony_ci			{ 0x14, 0x411111f0 },
921562306a36Sopenharmony_ci			{ 0x16, 0x411111f0 },
921662306a36Sopenharmony_ci			{ 0x17, 0x90170110 },
921762306a36Sopenharmony_ci			{ 0x18, 0x411111f0 },
921862306a36Sopenharmony_ci			{ 0x19, 0x02a11030 },
921962306a36Sopenharmony_ci			{ 0x1a, 0x411111f0 },
922062306a36Sopenharmony_ci			{ 0x1b, 0x04a19030 },
922162306a36Sopenharmony_ci			{ 0x1d, 0x40600001 },
922262306a36Sopenharmony_ci			{ 0x1e, 0x411111f0 },
922362306a36Sopenharmony_ci			{ 0x21, 0x03211020 },
922462306a36Sopenharmony_ci			{}
922562306a36Sopenharmony_ci		},
922662306a36Sopenharmony_ci		.chained = true,
922762306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
922862306a36Sopenharmony_ci	},
922962306a36Sopenharmony_ci	[ALC285_FIXUP_HP_SPECTRE_X360] = {
923062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
923162306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_spectre_x360,
923262306a36Sopenharmony_ci	},
923362306a36Sopenharmony_ci	[ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
923462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
923562306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_spectre_x360_eb1
923662306a36Sopenharmony_ci	},
923762306a36Sopenharmony_ci	[ALC285_FIXUP_HP_ENVY_X360] = {
923862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
923962306a36Sopenharmony_ci		.v.func = alc285_fixup_hp_envy_x360,
924062306a36Sopenharmony_ci		.chained = true,
924162306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,
924262306a36Sopenharmony_ci	},
924362306a36Sopenharmony_ci	[ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
924462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
924562306a36Sopenharmony_ci		.v.func = alc285_fixup_ideapad_s740_coef,
924662306a36Sopenharmony_ci		.chained = true,
924762306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
924862306a36Sopenharmony_ci	},
924962306a36Sopenharmony_ci	[ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
925062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
925162306a36Sopenharmony_ci		.v.func = alc_fixup_no_shutup,
925262306a36Sopenharmony_ci		.chained = true,
925362306a36Sopenharmony_ci		.chain_id = ALC283_FIXUP_HEADSET_MIC,
925462306a36Sopenharmony_ci	},
925562306a36Sopenharmony_ci	[ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
925662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
925762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
925862306a36Sopenharmony_ci			{ 0x21, 0x03211030 }, /* Change the Headphone location to Left */
925962306a36Sopenharmony_ci			{ }
926062306a36Sopenharmony_ci		},
926162306a36Sopenharmony_ci		.chained = true,
926262306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
926362306a36Sopenharmony_ci	},
926462306a36Sopenharmony_ci	[ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
926562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
926662306a36Sopenharmony_ci		.v.func = alc269_fixup_limit_int_mic_boost,
926762306a36Sopenharmony_ci		.chained = true,
926862306a36Sopenharmony_ci		.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
926962306a36Sopenharmony_ci	},
927062306a36Sopenharmony_ci	[ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
927162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
927262306a36Sopenharmony_ci		.v.func = alc285_fixup_ideapad_s740_coef,
927362306a36Sopenharmony_ci		.chained = true,
927462306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
927562306a36Sopenharmony_ci	},
927662306a36Sopenharmony_ci	[ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
927762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
927862306a36Sopenharmony_ci		.v.func = alc287_fixup_legion_15imhg05_speakers,
927962306a36Sopenharmony_ci		.chained = true,
928062306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
928162306a36Sopenharmony_ci	},
928262306a36Sopenharmony_ci	[ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
928362306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
928462306a36Sopenharmony_ci		//.v.verbs = legion_15imhg05_coefs,
928562306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
928662306a36Sopenharmony_ci			 // set left speaker Legion 7i.
928762306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
928862306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
928962306a36Sopenharmony_ci
929062306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
929162306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
929262306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
929362306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
929462306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
929562306a36Sopenharmony_ci
929662306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
929762306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
929862306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
929962306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
930062306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
930162306a36Sopenharmony_ci
930262306a36Sopenharmony_ci			 // set right speaker Legion 7i.
930362306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
930462306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
930562306a36Sopenharmony_ci
930662306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
930762306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
930862306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
930962306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
931062306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
931162306a36Sopenharmony_ci
931262306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
931362306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
931462306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
931562306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
931662306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
931762306a36Sopenharmony_ci			 {}
931862306a36Sopenharmony_ci		},
931962306a36Sopenharmony_ci		.chained = true,
932062306a36Sopenharmony_ci		.chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
932162306a36Sopenharmony_ci	},
932262306a36Sopenharmony_ci	[ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
932362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
932462306a36Sopenharmony_ci		.v.func = alc287_fixup_legion_15imhg05_speakers,
932562306a36Sopenharmony_ci		.chained = true,
932662306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE,
932762306a36Sopenharmony_ci	},
932862306a36Sopenharmony_ci	[ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
932962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
933062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
933162306a36Sopenharmony_ci			 // set left speaker Yoga 7i.
933262306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
933362306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
933462306a36Sopenharmony_ci
933562306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
933662306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
933762306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
933862306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
933962306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
934062306a36Sopenharmony_ci
934162306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
934262306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
934362306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
934462306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
934562306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
934662306a36Sopenharmony_ci
934762306a36Sopenharmony_ci			 // set right speaker Yoga 7i.
934862306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
934962306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
935062306a36Sopenharmony_ci
935162306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
935262306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
935362306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
935462306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
935562306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
935662306a36Sopenharmony_ci
935762306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
935862306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
935962306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
936062306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
936162306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
936262306a36Sopenharmony_ci			 {}
936362306a36Sopenharmony_ci		},
936462306a36Sopenharmony_ci		.chained = true,
936562306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE,
936662306a36Sopenharmony_ci	},
936762306a36Sopenharmony_ci	[ALC298_FIXUP_LENOVO_C940_DUET7] = {
936862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
936962306a36Sopenharmony_ci		.v.func = alc298_fixup_lenovo_c940_duet7,
937062306a36Sopenharmony_ci	},
937162306a36Sopenharmony_ci	[ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = {
937262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
937362306a36Sopenharmony_ci		.v.func = alc287_fixup_lenovo_14irp8_duetitl,
937462306a36Sopenharmony_ci	},
937562306a36Sopenharmony_ci	[ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
937662306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
937762306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
937862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
937962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
938062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
938162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
938262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
938362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
938462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
938562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
938662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
938762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
938862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
938962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
939062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
939162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
939262306a36Sopenharmony_ci			{}
939362306a36Sopenharmony_ci		},
939462306a36Sopenharmony_ci		.chained = true,
939562306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE,
939662306a36Sopenharmony_ci	},
939762306a36Sopenharmony_ci	[ALC256_FIXUP_SET_COEF_DEFAULTS] = {
939862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
939962306a36Sopenharmony_ci		.v.func = alc256_fixup_set_coef_defaults,
940062306a36Sopenharmony_ci	},
940162306a36Sopenharmony_ci	[ALC245_FIXUP_HP_GPIO_LED] = {
940262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
940362306a36Sopenharmony_ci		.v.func = alc245_fixup_hp_gpio_led,
940462306a36Sopenharmony_ci	},
940562306a36Sopenharmony_ci	[ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
940662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
940762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
940862306a36Sopenharmony_ci			{ 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
940962306a36Sopenharmony_ci			{ }
941062306a36Sopenharmony_ci		},
941162306a36Sopenharmony_ci		.chained = true,
941262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
941362306a36Sopenharmony_ci	},
941462306a36Sopenharmony_ci	[ALC233_FIXUP_NO_AUDIO_JACK] = {
941562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
941662306a36Sopenharmony_ci		.v.func = alc233_fixup_no_audio_jack,
941762306a36Sopenharmony_ci	},
941862306a36Sopenharmony_ci	[ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
941962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
942062306a36Sopenharmony_ci		.v.func = alc256_fixup_mic_no_presence_and_resume,
942162306a36Sopenharmony_ci		.chained = true,
942262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
942362306a36Sopenharmony_ci	},
942462306a36Sopenharmony_ci	[ALC287_FIXUP_LEGION_16ACHG6] = {
942562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
942662306a36Sopenharmony_ci		.v.func = alc287_fixup_legion_16achg6_speakers,
942762306a36Sopenharmony_ci	},
942862306a36Sopenharmony_ci	[ALC287_FIXUP_CS35L41_I2C_2] = {
942962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
943062306a36Sopenharmony_ci		.v.func = cs35l41_fixup_i2c_two,
943162306a36Sopenharmony_ci	},
943262306a36Sopenharmony_ci	[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
943362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
943462306a36Sopenharmony_ci		.v.func = cs35l41_fixup_i2c_two,
943562306a36Sopenharmony_ci		.chained = true,
943662306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
943762306a36Sopenharmony_ci	},
943862306a36Sopenharmony_ci	[ALC245_FIXUP_CS35L41_SPI_2] = {
943962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
944062306a36Sopenharmony_ci		.v.func = cs35l41_fixup_spi_two,
944162306a36Sopenharmony_ci	},
944262306a36Sopenharmony_ci	[ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
944362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
944462306a36Sopenharmony_ci		.v.func = cs35l41_fixup_spi_two,
944562306a36Sopenharmony_ci		.chained = true,
944662306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_GPIO_LED,
944762306a36Sopenharmony_ci	},
944862306a36Sopenharmony_ci	[ALC245_FIXUP_CS35L41_SPI_4] = {
944962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
945062306a36Sopenharmony_ci		.v.func = cs35l41_fixup_spi_four,
945162306a36Sopenharmony_ci	},
945262306a36Sopenharmony_ci	[ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
945362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
945462306a36Sopenharmony_ci		.v.func = cs35l41_fixup_spi_four,
945562306a36Sopenharmony_ci		.chained = true,
945662306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_GPIO_LED,
945762306a36Sopenharmony_ci	},
945862306a36Sopenharmony_ci	[ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
945962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
946062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
946162306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
946262306a36Sopenharmony_ci			 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
946362306a36Sopenharmony_ci			 { }
946462306a36Sopenharmony_ci		},
946562306a36Sopenharmony_ci		.chained = true,
946662306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
946762306a36Sopenharmony_ci	},
946862306a36Sopenharmony_ci	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
946962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
947062306a36Sopenharmony_ci		.v.func = alc_fixup_dell4_mic_no_presence_quiet,
947162306a36Sopenharmony_ci		.chained = true,
947262306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
947362306a36Sopenharmony_ci	},
947462306a36Sopenharmony_ci	[ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
947562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
947662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
947762306a36Sopenharmony_ci			{ 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
947862306a36Sopenharmony_ci			{ }
947962306a36Sopenharmony_ci		},
948062306a36Sopenharmony_ci		.chained = true,
948162306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
948262306a36Sopenharmony_ci	},
948362306a36Sopenharmony_ci	[ALC287_FIXUP_LEGION_16ITHG6] = {
948462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
948562306a36Sopenharmony_ci		.v.func = alc287_fixup_legion_16ithg6_speakers,
948662306a36Sopenharmony_ci	},
948762306a36Sopenharmony_ci	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
948862306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
948962306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
949062306a36Sopenharmony_ci			// enable left speaker
949162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
949262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
949362306a36Sopenharmony_ci
949462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
949562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
949662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
949762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
949862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
949962306a36Sopenharmony_ci
950062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
950162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },
950262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
950362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
950462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
950562306a36Sopenharmony_ci
950662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
950762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
950862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
950962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
951062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
951162306a36Sopenharmony_ci
951262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
951362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
951462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
951562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
951662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
951762306a36Sopenharmony_ci
951862306a36Sopenharmony_ci			// enable right speaker
951962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
952062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
952162306a36Sopenharmony_ci
952262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
952362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
952462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
952562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
952662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
952762306a36Sopenharmony_ci
952862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
952962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },
953062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
953162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
953262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
953362306a36Sopenharmony_ci
953462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
953562306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
953662306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
953762306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
953862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
953962306a36Sopenharmony_ci
954062306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
954162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
954262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
954362306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
954462306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
954562306a36Sopenharmony_ci
954662306a36Sopenharmony_ci			{ },
954762306a36Sopenharmony_ci		},
954862306a36Sopenharmony_ci	},
954962306a36Sopenharmony_ci	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
955062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
955162306a36Sopenharmony_ci		.v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
955262306a36Sopenharmony_ci		.chained = true,
955362306a36Sopenharmony_ci		.chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
955462306a36Sopenharmony_ci	},
955562306a36Sopenharmony_ci	[ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
955662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
955762306a36Sopenharmony_ci		.v.func = alc295_fixup_dell_inspiron_top_speakers,
955862306a36Sopenharmony_ci		.chained = true,
955962306a36Sopenharmony_ci		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
956062306a36Sopenharmony_ci	},
956162306a36Sopenharmony_ci	[ALC236_FIXUP_DELL_DUAL_CODECS] = {
956262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
956362306a36Sopenharmony_ci		.v.func = alc1220_fixup_gb_dual_codecs,
956462306a36Sopenharmony_ci		.chained = true,
956562306a36Sopenharmony_ci		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
956662306a36Sopenharmony_ci	},
956762306a36Sopenharmony_ci	[ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
956862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
956962306a36Sopenharmony_ci		.v.func = cs35l41_fixup_i2c_two,
957062306a36Sopenharmony_ci		.chained = true,
957162306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
957262306a36Sopenharmony_ci	},
957362306a36Sopenharmony_ci	[ALC287_FIXUP_TAS2781_I2C] = {
957462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
957562306a36Sopenharmony_ci		.v.func = tas2781_fixup_i2c,
957662306a36Sopenharmony_ci		.chained = true,
957762306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
957862306a36Sopenharmony_ci	},
957962306a36Sopenharmony_ci	[ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
958062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
958162306a36Sopenharmony_ci		.v.func = alc245_fixup_hp_mute_led_coefbit,
958262306a36Sopenharmony_ci	},
958362306a36Sopenharmony_ci	[ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
958462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
958562306a36Sopenharmony_ci		.v.func = alc245_fixup_hp_mute_led_coefbit,
958662306a36Sopenharmony_ci		.chained = true,
958762306a36Sopenharmony_ci		.chain_id = ALC245_FIXUP_HP_GPIO_LED
958862306a36Sopenharmony_ci	},
958962306a36Sopenharmony_ci	[ALC287_FIXUP_THINKPAD_I2S_SPK] = {
959062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
959162306a36Sopenharmony_ci		.v.func = alc287_fixup_bind_dacs,
959262306a36Sopenharmony_ci		.chained = true,
959362306a36Sopenharmony_ci		.chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
959462306a36Sopenharmony_ci	},
959562306a36Sopenharmony_ci	[ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {
959662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
959762306a36Sopenharmony_ci		.v.func = alc287_fixup_bind_dacs,
959862306a36Sopenharmony_ci		.chained = true,
959962306a36Sopenharmony_ci		.chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
960062306a36Sopenharmony_ci	},
960162306a36Sopenharmony_ci	[ALC2XX_FIXUP_HEADSET_MIC] = {
960262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
960362306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mic,
960462306a36Sopenharmony_ci	},
960562306a36Sopenharmony_ci	[ALC289_FIXUP_DELL_CS35L41_SPI_2] = {
960662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
960762306a36Sopenharmony_ci		.v.func = cs35l41_fixup_spi_two,
960862306a36Sopenharmony_ci		.chained = true,
960962306a36Sopenharmony_ci		.chain_id = ALC289_FIXUP_DUAL_SPK
961062306a36Sopenharmony_ci	},
961162306a36Sopenharmony_ci	[ALC294_FIXUP_CS35L41_I2C_2] = {
961262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
961362306a36Sopenharmony_ci		.v.func = cs35l41_fixup_i2c_two,
961462306a36Sopenharmony_ci	},
961562306a36Sopenharmony_ci};
961662306a36Sopenharmony_ci
961762306a36Sopenharmony_cistatic const struct snd_pci_quirk alc269_fixup_tbl[] = {
961862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
961962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
962062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
962162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
962262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
962362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
962462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
962562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
962662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
962762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
962862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
962962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
963062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
963162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
963262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
963362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
963462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
963562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
963662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
963762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
963862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
963962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
964062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
964162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
964262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
964362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
964462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
964562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
964662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
964762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
964862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
964962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
965062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
965162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
965262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
965362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
965462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
965562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
965662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
965762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
965862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
965962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
966062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
966162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
966262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
966362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
966462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
966562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
966662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
966762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
966862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
966962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
967062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
967162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
967262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
967362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
967462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
967562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
967662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
967762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
967862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
967962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
968062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
968162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
968262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
968362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
968462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
968562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
968662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
968762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
968862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
968962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
969062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
969162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
969262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
969362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
969462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
969562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
969662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
969762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
969862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
969962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
970062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
970162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
970262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
970362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
970462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
970562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
970662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
970762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
970862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
970962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
971062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
971162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
971262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
971362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
971462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
971562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
971662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
971762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
971862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
971962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),
972062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
972162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
972262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
972362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
972462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
972562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
972662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
972762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
972862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
972962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
973062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
973462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
973862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
973962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
974062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
974162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
974262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
974362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
974462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
974562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
974662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
974762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
974862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
974962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
975062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
975162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
975262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
975362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
975462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
975562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
975662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
975762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
975862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
975962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
976062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
976162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
976262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
976362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
976462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
976562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
976662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
976762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
976862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
976962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
977062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
977162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
977262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
977362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
977462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
977562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
977662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
977762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
977862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
977962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
978962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
979062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
979162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
979262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
979362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
979462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
979562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
979662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
979762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
979862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
979962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
980062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
980162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
980262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
980362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
980462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
980562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
980662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
980762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
980862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
980962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
981062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
981162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
981262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
981362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
981462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
981562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
981662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
981762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),
981862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
981962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
982062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
982162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
982262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
982362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
982462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
982562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
982662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
982762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
982862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
982962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
983062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
983162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
983262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
983362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
983462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
983562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
983662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
983762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
983862306a36Sopenharmony_ci		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
983962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
984062306a36Sopenharmony_ci		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
984162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
984262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
984362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
984462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
984562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
984662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
984762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
984862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
984962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
985062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
985162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
985262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
985362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
985462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
985562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
985662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
985762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
985862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
985962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
986062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
986162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
986262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
986362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
986462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
986562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
986662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
986762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
986862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
986962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
987062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
987162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
987262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
987362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
987462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
987562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
987662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
987762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
987862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
987962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
988662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED),
988762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
988862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
988962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
989062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
989162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
989262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
989362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
989462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
989562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
989662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
989762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
989862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
989962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
990062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
990162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
990262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
990362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
990462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
990562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
990662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
990762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
990862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
990962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
991062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
991162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
991262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED),
991362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
991462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
991562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
991662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
991762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
991862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED),
991962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
992062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
992162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
992262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
992362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
992462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
992562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
992662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
992762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
992862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
992962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
993062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
993162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
993262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
993362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
993462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
993562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
993662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
993762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
993862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
993962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
994062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
994162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
994262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
994362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
994462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
994562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
994662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
994762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
994862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
994962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
995062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
995162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
995262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
995362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
995462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
995562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
995662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
995762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
995862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
995962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
996062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
996162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
996262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
996362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
996462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
996562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
996662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
996762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
996862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
996962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
997062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
997162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
997262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
997362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
997462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
997562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
997662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
997762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
997862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
997962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
998062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
998162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
998262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
998362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
998462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC),
998562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
998662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA", ALC287_FIXUP_CS35L41_I2C_2),
998762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC),
998862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
998962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),
999062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
999162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
999262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
999362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
999462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
999562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY),
999662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
999762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
999862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),
999962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
1000062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
1000162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
1000262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
1000362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
1000462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
1000562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
1000662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
1000762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
1000862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
1000962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
1001062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
1001162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
1001262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
1001362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
1001462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2),
1001562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1001662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),
1001762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
1001862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
1001962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
1002062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
1002162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
1002262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
1002362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
1002462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
1002562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
1002662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),
1002762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
1002862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
1002962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
1003062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
1003162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
1003262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
1003362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
1003462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
1003562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
1003662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
1003762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
1003862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
1003962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
1004062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
1004162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
1004262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
1004362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
1004462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
1004562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
1004662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
1004762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
1004862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
1004962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
1005062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
1005162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
1005262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
1005362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
1005462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
1005562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
1005662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
1005762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
1005862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
1005962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
1006062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
1006162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
1006262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
1006362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
1006462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
1006562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
1006662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
1006762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
1006862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
1006962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
1007062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
1007162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
1007262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
1007362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
1007462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
1007562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
1007662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
1007762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
1007862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
1007962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
1008062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
1008162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
1008262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
1008362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
1008462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
1008562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
1008662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
1008762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
1008862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
1008962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1009962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1010962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1011962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1012962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1013962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
1014062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
1014162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
1014262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1014362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1014462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1014562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1014662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1014762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
1014862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1014962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1015962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1016062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1016162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1016262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1016362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1016462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1016562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
1016662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
1016762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
1016862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
1016962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
1017062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
1017162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
1017262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
1017362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
1017462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
1017562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
1017662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
1017762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
1017862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
1017962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
1018062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
1018162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
1018262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
1018362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
1018462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1018562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
1018662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
1018762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
1018862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1018962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1019062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
1019162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
1019262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
1019362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1019462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1019562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
1019662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1019762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1019862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1019962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1020062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
1020162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
1020262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
1020362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
1020462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1020562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1020662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1020762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1020862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1020962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1021062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1021162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1021262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
1021362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
1021462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
1021562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
1021662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
1021762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
1021862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
1021962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
1022062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
1022162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
1022262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
1022362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),
1022462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
1022562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL),
1022662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
1022762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
1022862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
1022962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
1023062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
1023162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
1023262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
1023362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
1023462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
1023562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
1023662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
1023762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
1023862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
1023962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
1024062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
1024162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
1024262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
1024362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
1024462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
1024562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
1024662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
1024762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
1024862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
1024962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
1025062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
1025162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
1025262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
1025362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
1025462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
1025562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
1025662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
1025762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
1025862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
1025962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
1026062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1026162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
1026262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
1026362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1026462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
1026562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
1026662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
1026762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
1026862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
1026962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
1027062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
1027162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
1027262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1027362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1027462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1027562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
1027662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1027762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1027862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1027962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
1028062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
1028162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
1028262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
1028362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
1028462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
1028562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
1028662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
1028762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
1028862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
1028962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
1029062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
1029162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
1029262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
1029362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
1029462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
1029562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
1029662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
1029762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
1029862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
1029962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
1030062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
1030162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
1030262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
1030362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
1030462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
1030562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
1030662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
1030762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
1030862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
1030962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
1031062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
1031162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),
1031262306a36Sopenharmony_ci	SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
1031362306a36Sopenharmony_ci	SND_PCI_QUIRK(0xf111, 0x0005, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
1031462306a36Sopenharmony_ci	SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
1031562306a36Sopenharmony_ci
1031662306a36Sopenharmony_ci#if 0
1031762306a36Sopenharmony_ci	/* Below is a quirk table taken from the old code.
1031862306a36Sopenharmony_ci	 * Basically the device should work as is without the fixup table.
1031962306a36Sopenharmony_ci	 * If BIOS doesn't give a proper info, enable the corresponding
1032062306a36Sopenharmony_ci	 * fixup entry.
1032162306a36Sopenharmony_ci	 */
1032262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
1032362306a36Sopenharmony_ci		      ALC269_FIXUP_AMIC),
1032462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
1032562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
1032662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
1032762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
1032862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
1032962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
1033062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
1033162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
1033262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
1033362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
1033462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
1033562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
1033662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
1033762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
1033862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
1033962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
1034062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
1034162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
1034262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
1034362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
1034462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
1034562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
1034662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
1034762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
1034862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
1034962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
1035062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
1035162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
1035262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
1035362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
1035462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
1035562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
1035662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
1035762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
1035862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
1035962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
1036062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
1036162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
1036262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
1036362306a36Sopenharmony_ci#endif
1036462306a36Sopenharmony_ci	{}
1036562306a36Sopenharmony_ci};
1036662306a36Sopenharmony_ci
1036762306a36Sopenharmony_cistatic const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
1036862306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
1036962306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
1037062306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
1037162306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
1037262306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
1037362306a36Sopenharmony_ci	{}
1037462306a36Sopenharmony_ci};
1037562306a36Sopenharmony_ci
1037662306a36Sopenharmony_cistatic const struct hda_model_fixup alc269_fixup_models[] = {
1037762306a36Sopenharmony_ci	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
1037862306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
1037962306a36Sopenharmony_ci	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
1038062306a36Sopenharmony_ci	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
1038162306a36Sopenharmony_ci	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
1038262306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
1038362306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
1038462306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
1038562306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
1038662306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
1038762306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
1038862306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
1038962306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
1039062306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
1039162306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
1039262306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
1039362306a36Sopenharmony_ci	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
1039462306a36Sopenharmony_ci	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
1039562306a36Sopenharmony_ci	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
1039662306a36Sopenharmony_ci	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
1039762306a36Sopenharmony_ci	{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
1039862306a36Sopenharmony_ci	{.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
1039962306a36Sopenharmony_ci	{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
1040062306a36Sopenharmony_ci	{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
1040162306a36Sopenharmony_ci	{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
1040262306a36Sopenharmony_ci	{.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
1040362306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
1040462306a36Sopenharmony_ci	{.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
1040562306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
1040662306a36Sopenharmony_ci	{.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
1040762306a36Sopenharmony_ci	{.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
1040862306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
1040962306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
1041062306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
1041162306a36Sopenharmony_ci	{.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
1041262306a36Sopenharmony_ci	{.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
1041362306a36Sopenharmony_ci	{.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
1041462306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
1041562306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
1041662306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
1041762306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
1041862306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
1041962306a36Sopenharmony_ci	{.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
1042062306a36Sopenharmony_ci	{.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
1042162306a36Sopenharmony_ci	{.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
1042262306a36Sopenharmony_ci	{.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
1042362306a36Sopenharmony_ci	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
1042462306a36Sopenharmony_ci	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
1042562306a36Sopenharmony_ci	{.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
1042662306a36Sopenharmony_ci	{.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
1042762306a36Sopenharmony_ci	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
1042862306a36Sopenharmony_ci	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
1042962306a36Sopenharmony_ci	{.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
1043062306a36Sopenharmony_ci	{.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
1043162306a36Sopenharmony_ci	{.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
1043262306a36Sopenharmony_ci	{.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
1043362306a36Sopenharmony_ci	{.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
1043462306a36Sopenharmony_ci	{.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
1043562306a36Sopenharmony_ci	{.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
1043662306a36Sopenharmony_ci	{.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
1043762306a36Sopenharmony_ci	{.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
1043862306a36Sopenharmony_ci	{.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
1043962306a36Sopenharmony_ci	{.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
1044062306a36Sopenharmony_ci	{.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
1044162306a36Sopenharmony_ci	{.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
1044262306a36Sopenharmony_ci	{.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
1044362306a36Sopenharmony_ci	{.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
1044462306a36Sopenharmony_ci	{.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
1044562306a36Sopenharmony_ci	{.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
1044662306a36Sopenharmony_ci	{.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
1044762306a36Sopenharmony_ci	{.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
1044862306a36Sopenharmony_ci	{.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
1044962306a36Sopenharmony_ci	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
1045062306a36Sopenharmony_ci	{.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
1045162306a36Sopenharmony_ci	{.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
1045262306a36Sopenharmony_ci	{.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
1045362306a36Sopenharmony_ci	{.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
1045462306a36Sopenharmony_ci	{.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
1045562306a36Sopenharmony_ci	{.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
1045662306a36Sopenharmony_ci	{.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
1045762306a36Sopenharmony_ci	{.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
1045862306a36Sopenharmony_ci	{.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
1045962306a36Sopenharmony_ci	{.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
1046062306a36Sopenharmony_ci	{.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
1046162306a36Sopenharmony_ci	{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
1046262306a36Sopenharmony_ci	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
1046362306a36Sopenharmony_ci	{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
1046462306a36Sopenharmony_ci	{.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
1046562306a36Sopenharmony_ci	{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
1046662306a36Sopenharmony_ci	{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
1046762306a36Sopenharmony_ci	{.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
1046862306a36Sopenharmony_ci	{.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
1046962306a36Sopenharmony_ci	{.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
1047062306a36Sopenharmony_ci	{.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
1047162306a36Sopenharmony_ci	{.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
1047262306a36Sopenharmony_ci	{.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
1047362306a36Sopenharmony_ci	{.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
1047462306a36Sopenharmony_ci	{.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
1047562306a36Sopenharmony_ci	{.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
1047662306a36Sopenharmony_ci	{.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
1047762306a36Sopenharmony_ci	{.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
1047862306a36Sopenharmony_ci	{.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
1047962306a36Sopenharmony_ci	{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
1048062306a36Sopenharmony_ci	{.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
1048162306a36Sopenharmony_ci	{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
1048262306a36Sopenharmony_ci	{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
1048362306a36Sopenharmony_ci	{.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
1048462306a36Sopenharmony_ci	{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
1048562306a36Sopenharmony_ci	{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
1048662306a36Sopenharmony_ci	{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
1048762306a36Sopenharmony_ci	{.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
1048862306a36Sopenharmony_ci	{.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
1048962306a36Sopenharmony_ci	{.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
1049062306a36Sopenharmony_ci	{.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
1049162306a36Sopenharmony_ci	{.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
1049262306a36Sopenharmony_ci	{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
1049362306a36Sopenharmony_ci	{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
1049462306a36Sopenharmony_ci	{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
1049562306a36Sopenharmony_ci	{.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
1049662306a36Sopenharmony_ci	{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
1049762306a36Sopenharmony_ci	{.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
1049862306a36Sopenharmony_ci	{.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
1049962306a36Sopenharmony_ci	{.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
1050062306a36Sopenharmony_ci	{.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
1050162306a36Sopenharmony_ci	{}
1050262306a36Sopenharmony_ci};
1050362306a36Sopenharmony_ci#define ALC225_STANDARD_PINS \
1050462306a36Sopenharmony_ci	{0x21, 0x04211020}
1050562306a36Sopenharmony_ci
1050662306a36Sopenharmony_ci#define ALC256_STANDARD_PINS \
1050762306a36Sopenharmony_ci	{0x12, 0x90a60140}, \
1050862306a36Sopenharmony_ci	{0x14, 0x90170110}, \
1050962306a36Sopenharmony_ci	{0x21, 0x02211020}
1051062306a36Sopenharmony_ci
1051162306a36Sopenharmony_ci#define ALC282_STANDARD_PINS \
1051262306a36Sopenharmony_ci	{0x14, 0x90170110}
1051362306a36Sopenharmony_ci
1051462306a36Sopenharmony_ci#define ALC290_STANDARD_PINS \
1051562306a36Sopenharmony_ci	{0x12, 0x99a30130}
1051662306a36Sopenharmony_ci
1051762306a36Sopenharmony_ci#define ALC292_STANDARD_PINS \
1051862306a36Sopenharmony_ci	{0x14, 0x90170110}, \
1051962306a36Sopenharmony_ci	{0x15, 0x0221401f}
1052062306a36Sopenharmony_ci
1052162306a36Sopenharmony_ci#define ALC295_STANDARD_PINS \
1052262306a36Sopenharmony_ci	{0x12, 0xb7a60130}, \
1052362306a36Sopenharmony_ci	{0x14, 0x90170110}, \
1052462306a36Sopenharmony_ci	{0x21, 0x04211020}
1052562306a36Sopenharmony_ci
1052662306a36Sopenharmony_ci#define ALC298_STANDARD_PINS \
1052762306a36Sopenharmony_ci	{0x12, 0x90a60130}, \
1052862306a36Sopenharmony_ci	{0x21, 0x03211020}
1052962306a36Sopenharmony_ci
1053062306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
1053162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
1053262306a36Sopenharmony_ci		{0x14, 0x01014020},
1053362306a36Sopenharmony_ci		{0x17, 0x90170110},
1053462306a36Sopenharmony_ci		{0x18, 0x02a11030},
1053562306a36Sopenharmony_ci		{0x19, 0x0181303F},
1053662306a36Sopenharmony_ci		{0x21, 0x0221102f}),
1053762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
1053862306a36Sopenharmony_ci		{0x12, 0x90a601c0},
1053962306a36Sopenharmony_ci		{0x14, 0x90171120},
1054062306a36Sopenharmony_ci		{0x21, 0x02211030}),
1054162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
1054262306a36Sopenharmony_ci		{0x14, 0x90170110},
1054362306a36Sopenharmony_ci		{0x1b, 0x90a70130},
1054462306a36Sopenharmony_ci		{0x21, 0x03211020}),
1054562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
1054662306a36Sopenharmony_ci		{0x1a, 0x90a70130},
1054762306a36Sopenharmony_ci		{0x1b, 0x90170110},
1054862306a36Sopenharmony_ci		{0x21, 0x03211020}),
1054962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
1055062306a36Sopenharmony_ci		ALC225_STANDARD_PINS,
1055162306a36Sopenharmony_ci		{0x12, 0xb7a60130},
1055262306a36Sopenharmony_ci		{0x14, 0x901701a0}),
1055362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
1055462306a36Sopenharmony_ci		ALC225_STANDARD_PINS,
1055562306a36Sopenharmony_ci		{0x12, 0xb7a60130},
1055662306a36Sopenharmony_ci		{0x14, 0x901701b0}),
1055762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
1055862306a36Sopenharmony_ci		ALC225_STANDARD_PINS,
1055962306a36Sopenharmony_ci		{0x12, 0xb7a60150},
1056062306a36Sopenharmony_ci		{0x14, 0x901701a0}),
1056162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
1056262306a36Sopenharmony_ci		ALC225_STANDARD_PINS,
1056362306a36Sopenharmony_ci		{0x12, 0xb7a60150},
1056462306a36Sopenharmony_ci		{0x14, 0x901701b0}),
1056562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
1056662306a36Sopenharmony_ci		ALC225_STANDARD_PINS,
1056762306a36Sopenharmony_ci		{0x12, 0xb7a60130},
1056862306a36Sopenharmony_ci		{0x1b, 0x90170110}),
1056962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
1057062306a36Sopenharmony_ci		{0x1b, 0x01111010},
1057162306a36Sopenharmony_ci		{0x1e, 0x01451130},
1057262306a36Sopenharmony_ci		{0x21, 0x02211020}),
1057362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
1057462306a36Sopenharmony_ci		{0x12, 0x90a60140},
1057562306a36Sopenharmony_ci		{0x14, 0x90170110},
1057662306a36Sopenharmony_ci		{0x19, 0x02a11030},
1057762306a36Sopenharmony_ci		{0x21, 0x02211020}),
1057862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
1057962306a36Sopenharmony_ci		{0x14, 0x90170110},
1058062306a36Sopenharmony_ci		{0x19, 0x02a11030},
1058162306a36Sopenharmony_ci		{0x1a, 0x02a11040},
1058262306a36Sopenharmony_ci		{0x1b, 0x01014020},
1058362306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1058462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
1058562306a36Sopenharmony_ci		{0x14, 0x90170110},
1058662306a36Sopenharmony_ci		{0x19, 0x02a11030},
1058762306a36Sopenharmony_ci		{0x1a, 0x02a11040},
1058862306a36Sopenharmony_ci		{0x1b, 0x01011020},
1058962306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1059062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
1059162306a36Sopenharmony_ci		{0x14, 0x90170110},
1059262306a36Sopenharmony_ci		{0x19, 0x02a11020},
1059362306a36Sopenharmony_ci		{0x1a, 0x02a11030},
1059462306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1059562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
1059662306a36Sopenharmony_ci		{0x21, 0x02211010}),
1059762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
1059862306a36Sopenharmony_ci		{0x14, 0x90170110},
1059962306a36Sopenharmony_ci		{0x19, 0x02a11020},
1060062306a36Sopenharmony_ci		{0x21, 0x02211030}),
1060162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
1060262306a36Sopenharmony_ci		{0x14, 0x90170110},
1060362306a36Sopenharmony_ci		{0x21, 0x02211020}),
1060462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1060562306a36Sopenharmony_ci		{0x14, 0x90170130},
1060662306a36Sopenharmony_ci		{0x21, 0x02211040}),
1060762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1060862306a36Sopenharmony_ci		{0x12, 0x90a60140},
1060962306a36Sopenharmony_ci		{0x14, 0x90170110},
1061062306a36Sopenharmony_ci		{0x21, 0x02211020}),
1061162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1061262306a36Sopenharmony_ci		{0x12, 0x90a60160},
1061362306a36Sopenharmony_ci		{0x14, 0x90170120},
1061462306a36Sopenharmony_ci		{0x21, 0x02211030}),
1061562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1061662306a36Sopenharmony_ci		{0x14, 0x90170110},
1061762306a36Sopenharmony_ci		{0x1b, 0x02011020},
1061862306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1061962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1062062306a36Sopenharmony_ci		{0x14, 0x90170110},
1062162306a36Sopenharmony_ci		{0x1b, 0x01011020},
1062262306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1062362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1062462306a36Sopenharmony_ci		{0x14, 0x90170130},
1062562306a36Sopenharmony_ci		{0x1b, 0x01014020},
1062662306a36Sopenharmony_ci		{0x21, 0x0221103f}),
1062762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1062862306a36Sopenharmony_ci		{0x14, 0x90170130},
1062962306a36Sopenharmony_ci		{0x1b, 0x01011020},
1063062306a36Sopenharmony_ci		{0x21, 0x0221103f}),
1063162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1063262306a36Sopenharmony_ci		{0x14, 0x90170130},
1063362306a36Sopenharmony_ci		{0x1b, 0x02011020},
1063462306a36Sopenharmony_ci		{0x21, 0x0221103f}),
1063562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1063662306a36Sopenharmony_ci		{0x14, 0x90170150},
1063762306a36Sopenharmony_ci		{0x1b, 0x02011020},
1063862306a36Sopenharmony_ci		{0x21, 0x0221105f}),
1063962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1064062306a36Sopenharmony_ci		{0x14, 0x90170110},
1064162306a36Sopenharmony_ci		{0x1b, 0x01014020},
1064262306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1064362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1064462306a36Sopenharmony_ci		{0x12, 0x90a60160},
1064562306a36Sopenharmony_ci		{0x14, 0x90170120},
1064662306a36Sopenharmony_ci		{0x17, 0x90170140},
1064762306a36Sopenharmony_ci		{0x21, 0x0321102f}),
1064862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1064962306a36Sopenharmony_ci		{0x12, 0x90a60160},
1065062306a36Sopenharmony_ci		{0x14, 0x90170130},
1065162306a36Sopenharmony_ci		{0x21, 0x02211040}),
1065262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1065362306a36Sopenharmony_ci		{0x12, 0x90a60160},
1065462306a36Sopenharmony_ci		{0x14, 0x90170140},
1065562306a36Sopenharmony_ci		{0x21, 0x02211050}),
1065662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1065762306a36Sopenharmony_ci		{0x12, 0x90a60170},
1065862306a36Sopenharmony_ci		{0x14, 0x90170120},
1065962306a36Sopenharmony_ci		{0x21, 0x02211030}),
1066062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1066162306a36Sopenharmony_ci		{0x12, 0x90a60170},
1066262306a36Sopenharmony_ci		{0x14, 0x90170130},
1066362306a36Sopenharmony_ci		{0x21, 0x02211040}),
1066462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1066562306a36Sopenharmony_ci		{0x12, 0x90a60170},
1066662306a36Sopenharmony_ci		{0x14, 0x90171130},
1066762306a36Sopenharmony_ci		{0x21, 0x02211040}),
1066862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1066962306a36Sopenharmony_ci		{0x12, 0x90a60170},
1067062306a36Sopenharmony_ci		{0x14, 0x90170140},
1067162306a36Sopenharmony_ci		{0x21, 0x02211050}),
1067262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1067362306a36Sopenharmony_ci		{0x12, 0x90a60180},
1067462306a36Sopenharmony_ci		{0x14, 0x90170130},
1067562306a36Sopenharmony_ci		{0x21, 0x02211040}),
1067662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1067762306a36Sopenharmony_ci		{0x12, 0x90a60180},
1067862306a36Sopenharmony_ci		{0x14, 0x90170120},
1067962306a36Sopenharmony_ci		{0x21, 0x02211030}),
1068062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1068162306a36Sopenharmony_ci		{0x1b, 0x01011020},
1068262306a36Sopenharmony_ci		{0x21, 0x02211010}),
1068362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
1068462306a36Sopenharmony_ci		{0x14, 0x90170110},
1068562306a36Sopenharmony_ci		{0x1b, 0x90a70130},
1068662306a36Sopenharmony_ci		{0x21, 0x04211020}),
1068762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
1068862306a36Sopenharmony_ci		{0x14, 0x90170110},
1068962306a36Sopenharmony_ci		{0x1b, 0x90a70130},
1069062306a36Sopenharmony_ci		{0x21, 0x03211020}),
1069162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
1069262306a36Sopenharmony_ci		{0x12, 0x90a60130},
1069362306a36Sopenharmony_ci		{0x14, 0x90170110},
1069462306a36Sopenharmony_ci		{0x21, 0x03211020}),
1069562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
1069662306a36Sopenharmony_ci		{0x12, 0x90a60130},
1069762306a36Sopenharmony_ci		{0x14, 0x90170110},
1069862306a36Sopenharmony_ci		{0x21, 0x04211020}),
1069962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
1070062306a36Sopenharmony_ci		{0x1a, 0x90a70130},
1070162306a36Sopenharmony_ci		{0x1b, 0x90170110},
1070262306a36Sopenharmony_ci		{0x21, 0x03211020}),
1070362306a36Sopenharmony_ci       SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
1070462306a36Sopenharmony_ci		{0x14, 0x90170110},
1070562306a36Sopenharmony_ci		{0x19, 0x02a11020},
1070662306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1070762306a36Sopenharmony_ci       SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
1070862306a36Sopenharmony_ci		{0x17, 0x90170110},
1070962306a36Sopenharmony_ci		{0x19, 0x03a11030},
1071062306a36Sopenharmony_ci		{0x21, 0x03211020}),
1071162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
1071262306a36Sopenharmony_ci		{0x12, 0x90a60130},
1071362306a36Sopenharmony_ci		{0x14, 0x90170110},
1071462306a36Sopenharmony_ci		{0x15, 0x0421101f},
1071562306a36Sopenharmony_ci		{0x1a, 0x04a11020}),
1071662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
1071762306a36Sopenharmony_ci		{0x12, 0x90a60140},
1071862306a36Sopenharmony_ci		{0x14, 0x90170110},
1071962306a36Sopenharmony_ci		{0x15, 0x0421101f},
1072062306a36Sopenharmony_ci		{0x18, 0x02811030},
1072162306a36Sopenharmony_ci		{0x1a, 0x04a1103f},
1072262306a36Sopenharmony_ci		{0x1b, 0x02011020}),
1072362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1072462306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1072562306a36Sopenharmony_ci		{0x12, 0x99a30130},
1072662306a36Sopenharmony_ci		{0x19, 0x03a11020},
1072762306a36Sopenharmony_ci		{0x21, 0x0321101f}),
1072862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1072962306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1073062306a36Sopenharmony_ci		{0x12, 0x99a30130},
1073162306a36Sopenharmony_ci		{0x19, 0x03a11020},
1073262306a36Sopenharmony_ci		{0x21, 0x03211040}),
1073362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1073462306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1073562306a36Sopenharmony_ci		{0x12, 0x99a30130},
1073662306a36Sopenharmony_ci		{0x19, 0x03a11030},
1073762306a36Sopenharmony_ci		{0x21, 0x03211020}),
1073862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1073962306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1074062306a36Sopenharmony_ci		{0x12, 0x99a30130},
1074162306a36Sopenharmony_ci		{0x19, 0x04a11020},
1074262306a36Sopenharmony_ci		{0x21, 0x0421101f}),
1074362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
1074462306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1074562306a36Sopenharmony_ci		{0x12, 0x90a60140},
1074662306a36Sopenharmony_ci		{0x19, 0x04a11030},
1074762306a36Sopenharmony_ci		{0x21, 0x04211020}),
1074862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
1074962306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1075062306a36Sopenharmony_ci		{0x12, 0x90a609c0},
1075162306a36Sopenharmony_ci		{0x18, 0x03a11830},
1075262306a36Sopenharmony_ci		{0x19, 0x04a19831},
1075362306a36Sopenharmony_ci		{0x1a, 0x0481303f},
1075462306a36Sopenharmony_ci		{0x1b, 0x04211020},
1075562306a36Sopenharmony_ci		{0x21, 0x0321101f}),
1075662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
1075762306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1075862306a36Sopenharmony_ci		{0x12, 0x90a60940},
1075962306a36Sopenharmony_ci		{0x18, 0x03a11830},
1076062306a36Sopenharmony_ci		{0x19, 0x04a19831},
1076162306a36Sopenharmony_ci		{0x1a, 0x0481303f},
1076262306a36Sopenharmony_ci		{0x1b, 0x04211020},
1076362306a36Sopenharmony_ci		{0x21, 0x0321101f}),
1076462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
1076562306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1076662306a36Sopenharmony_ci		{0x12, 0x90a60130},
1076762306a36Sopenharmony_ci		{0x21, 0x0321101f}),
1076862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
1076962306a36Sopenharmony_ci		{0x12, 0x90a60160},
1077062306a36Sopenharmony_ci		{0x14, 0x90170120},
1077162306a36Sopenharmony_ci		{0x21, 0x02211030}),
1077262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
1077362306a36Sopenharmony_ci		ALC282_STANDARD_PINS,
1077462306a36Sopenharmony_ci		{0x12, 0x90a60130},
1077562306a36Sopenharmony_ci		{0x19, 0x03a11020},
1077662306a36Sopenharmony_ci		{0x21, 0x0321101f}),
1077762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
1077862306a36Sopenharmony_ci		{0x12, 0x90a60130},
1077962306a36Sopenharmony_ci		{0x14, 0x90170110},
1078062306a36Sopenharmony_ci		{0x19, 0x04a11040},
1078162306a36Sopenharmony_ci		{0x21, 0x04211020}),
1078262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
1078362306a36Sopenharmony_ci		{0x14, 0x90170110},
1078462306a36Sopenharmony_ci		{0x19, 0x04a11040},
1078562306a36Sopenharmony_ci		{0x1d, 0x40600001},
1078662306a36Sopenharmony_ci		{0x21, 0x04211020}),
1078762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
1078862306a36Sopenharmony_ci		{0x14, 0x90170110},
1078962306a36Sopenharmony_ci		{0x19, 0x04a11040},
1079062306a36Sopenharmony_ci		{0x21, 0x04211020}),
1079162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
1079262306a36Sopenharmony_ci		{0x14, 0x90170110},
1079362306a36Sopenharmony_ci		{0x17, 0x90170111},
1079462306a36Sopenharmony_ci		{0x19, 0x03a11030},
1079562306a36Sopenharmony_ci		{0x21, 0x03211020}),
1079662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
1079762306a36Sopenharmony_ci		{0x17, 0x90170110},
1079862306a36Sopenharmony_ci		{0x19, 0x03a11030},
1079962306a36Sopenharmony_ci		{0x21, 0x03211020}),
1080062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
1080162306a36Sopenharmony_ci		{0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
1080262306a36Sopenharmony_ci		{0x19, 0x04a11040},
1080362306a36Sopenharmony_ci		{0x21, 0x04211020}),
1080462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
1080562306a36Sopenharmony_ci		{0x12, 0x90a60130},
1080662306a36Sopenharmony_ci		{0x17, 0x90170110},
1080762306a36Sopenharmony_ci		{0x21, 0x02211020}),
1080862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
1080962306a36Sopenharmony_ci		{0x12, 0x90a60120},
1081062306a36Sopenharmony_ci		{0x14, 0x90170110},
1081162306a36Sopenharmony_ci		{0x21, 0x0321101f}),
1081262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1081362306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1081462306a36Sopenharmony_ci		{0x15, 0x04211040},
1081562306a36Sopenharmony_ci		{0x18, 0x90170112},
1081662306a36Sopenharmony_ci		{0x1a, 0x04a11020}),
1081762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1081862306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1081962306a36Sopenharmony_ci		{0x15, 0x04211040},
1082062306a36Sopenharmony_ci		{0x18, 0x90170110},
1082162306a36Sopenharmony_ci		{0x1a, 0x04a11020}),
1082262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1082362306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1082462306a36Sopenharmony_ci		{0x15, 0x0421101f},
1082562306a36Sopenharmony_ci		{0x1a, 0x04a11020}),
1082662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1082762306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1082862306a36Sopenharmony_ci		{0x15, 0x04211020},
1082962306a36Sopenharmony_ci		{0x1a, 0x04a11040}),
1083062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1083162306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1083262306a36Sopenharmony_ci		{0x14, 0x90170110},
1083362306a36Sopenharmony_ci		{0x15, 0x04211020},
1083462306a36Sopenharmony_ci		{0x1a, 0x04a11040}),
1083562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1083662306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1083762306a36Sopenharmony_ci		{0x14, 0x90170110},
1083862306a36Sopenharmony_ci		{0x15, 0x04211020},
1083962306a36Sopenharmony_ci		{0x1a, 0x04a11020}),
1084062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
1084162306a36Sopenharmony_ci		ALC290_STANDARD_PINS,
1084262306a36Sopenharmony_ci		{0x14, 0x90170110},
1084362306a36Sopenharmony_ci		{0x15, 0x0421101f},
1084462306a36Sopenharmony_ci		{0x1a, 0x04a11020}),
1084562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
1084662306a36Sopenharmony_ci		ALC292_STANDARD_PINS,
1084762306a36Sopenharmony_ci		{0x12, 0x90a60140},
1084862306a36Sopenharmony_ci		{0x16, 0x01014020},
1084962306a36Sopenharmony_ci		{0x19, 0x01a19030}),
1085062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
1085162306a36Sopenharmony_ci		ALC292_STANDARD_PINS,
1085262306a36Sopenharmony_ci		{0x12, 0x90a60140},
1085362306a36Sopenharmony_ci		{0x16, 0x01014020},
1085462306a36Sopenharmony_ci		{0x18, 0x02a19031},
1085562306a36Sopenharmony_ci		{0x19, 0x01a1903e}),
1085662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
1085762306a36Sopenharmony_ci		ALC292_STANDARD_PINS,
1085862306a36Sopenharmony_ci		{0x12, 0x90a60140}),
1085962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
1086062306a36Sopenharmony_ci		ALC292_STANDARD_PINS,
1086162306a36Sopenharmony_ci		{0x13, 0x90a60140},
1086262306a36Sopenharmony_ci		{0x16, 0x21014020},
1086362306a36Sopenharmony_ci		{0x19, 0x21a19030}),
1086462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
1086562306a36Sopenharmony_ci		ALC292_STANDARD_PINS,
1086662306a36Sopenharmony_ci		{0x13, 0x90a60140}),
1086762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
1086862306a36Sopenharmony_ci		{0x17, 0x90170110},
1086962306a36Sopenharmony_ci		{0x21, 0x04211020}),
1087062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
1087162306a36Sopenharmony_ci		{0x14, 0x90170110},
1087262306a36Sopenharmony_ci		{0x1b, 0x90a70130},
1087362306a36Sopenharmony_ci		{0x21, 0x04211020}),
1087462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
1087562306a36Sopenharmony_ci		{0x12, 0x90a60130},
1087662306a36Sopenharmony_ci		{0x17, 0x90170110},
1087762306a36Sopenharmony_ci		{0x21, 0x03211020}),
1087862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
1087962306a36Sopenharmony_ci		{0x12, 0x90a60130},
1088062306a36Sopenharmony_ci		{0x17, 0x90170110},
1088162306a36Sopenharmony_ci		{0x21, 0x04211020}),
1088262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
1088362306a36Sopenharmony_ci		{0x12, 0x90a60130},
1088462306a36Sopenharmony_ci		{0x17, 0x90170110},
1088562306a36Sopenharmony_ci		{0x21, 0x03211020}),
1088662306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
1088762306a36Sopenharmony_ci		{0x12, 0x90a60120},
1088862306a36Sopenharmony_ci		{0x17, 0x90170110},
1088962306a36Sopenharmony_ci		{0x21, 0x04211030}),
1089062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
1089162306a36Sopenharmony_ci		{0x12, 0x90a60130},
1089262306a36Sopenharmony_ci		{0x17, 0x90170110},
1089362306a36Sopenharmony_ci		{0x21, 0x03211020}),
1089462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
1089562306a36Sopenharmony_ci		{0x12, 0x90a60130},
1089662306a36Sopenharmony_ci		{0x17, 0x90170110},
1089762306a36Sopenharmony_ci		{0x21, 0x03211020}),
1089862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
1089962306a36Sopenharmony_ci		ALC298_STANDARD_PINS,
1090062306a36Sopenharmony_ci		{0x17, 0x90170110}),
1090162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
1090262306a36Sopenharmony_ci		ALC298_STANDARD_PINS,
1090362306a36Sopenharmony_ci		{0x17, 0x90170140}),
1090462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
1090562306a36Sopenharmony_ci		ALC298_STANDARD_PINS,
1090662306a36Sopenharmony_ci		{0x17, 0x90170150}),
1090762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
1090862306a36Sopenharmony_ci		{0x12, 0xb7a60140},
1090962306a36Sopenharmony_ci		{0x13, 0xb7a60150},
1091062306a36Sopenharmony_ci		{0x17, 0x90170110},
1091162306a36Sopenharmony_ci		{0x1a, 0x03011020},
1091262306a36Sopenharmony_ci		{0x21, 0x03211030}),
1091362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
1091462306a36Sopenharmony_ci		{0x12, 0xb7a60140},
1091562306a36Sopenharmony_ci		{0x17, 0x90170110},
1091662306a36Sopenharmony_ci		{0x1a, 0x03a11030},
1091762306a36Sopenharmony_ci		{0x21, 0x03211020}),
1091862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
1091962306a36Sopenharmony_ci		ALC225_STANDARD_PINS,
1092062306a36Sopenharmony_ci		{0x12, 0xb7a60130},
1092162306a36Sopenharmony_ci		{0x17, 0x90170110}),
1092262306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
1092362306a36Sopenharmony_ci		{0x14, 0x01014010},
1092462306a36Sopenharmony_ci		{0x17, 0x90170120},
1092562306a36Sopenharmony_ci		{0x18, 0x02a11030},
1092662306a36Sopenharmony_ci		{0x19, 0x02a1103f},
1092762306a36Sopenharmony_ci		{0x21, 0x0221101f}),
1092862306a36Sopenharmony_ci	{}
1092962306a36Sopenharmony_ci};
1093062306a36Sopenharmony_ci
1093162306a36Sopenharmony_ci/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
1093262306a36Sopenharmony_ci * more machines, don't need to match all valid pins, just need to match
1093362306a36Sopenharmony_ci * all the pins defined in the tbl. Just because of this reason, it is possible
1093462306a36Sopenharmony_ci * that a single machine matches multiple tbls, so there is one limitation:
1093562306a36Sopenharmony_ci *   at most one tbl is allowed to define for the same vendor and same codec
1093662306a36Sopenharmony_ci */
1093762306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
1093862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
1093962306a36Sopenharmony_ci		{0x19, 0x40000000},
1094062306a36Sopenharmony_ci		{0x1b, 0x40000000}),
1094162306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
1094262306a36Sopenharmony_ci		{0x19, 0x40000000},
1094362306a36Sopenharmony_ci		{0x1b, 0x40000000}),
1094462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1094562306a36Sopenharmony_ci		{0x19, 0x40000000},
1094662306a36Sopenharmony_ci		{0x1a, 0x40000000}),
1094762306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
1094862306a36Sopenharmony_ci		{0x19, 0x40000000},
1094962306a36Sopenharmony_ci		{0x1a, 0x40000000}),
1095062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
1095162306a36Sopenharmony_ci		{0x19, 0x40000000},
1095262306a36Sopenharmony_ci		{0x1a, 0x40000000}),
1095362306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
1095462306a36Sopenharmony_ci		{0x19, 0x40000000}),
1095562306a36Sopenharmony_ci	{}
1095662306a36Sopenharmony_ci};
1095762306a36Sopenharmony_ci
1095862306a36Sopenharmony_cistatic void alc269_fill_coef(struct hda_codec *codec)
1095962306a36Sopenharmony_ci{
1096062306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1096162306a36Sopenharmony_ci	int val;
1096262306a36Sopenharmony_ci
1096362306a36Sopenharmony_ci	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
1096462306a36Sopenharmony_ci		return;
1096562306a36Sopenharmony_ci
1096662306a36Sopenharmony_ci	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
1096762306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0xf, 0x960b);
1096862306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0xe, 0x8817);
1096962306a36Sopenharmony_ci	}
1097062306a36Sopenharmony_ci
1097162306a36Sopenharmony_ci	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
1097262306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0xf, 0x960b);
1097362306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0xe, 0x8814);
1097462306a36Sopenharmony_ci	}
1097562306a36Sopenharmony_ci
1097662306a36Sopenharmony_ci	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
1097762306a36Sopenharmony_ci		/* Power up output pin */
1097862306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x04, 0, 1<<11);
1097962306a36Sopenharmony_ci	}
1098062306a36Sopenharmony_ci
1098162306a36Sopenharmony_ci	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
1098262306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0xd);
1098362306a36Sopenharmony_ci		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
1098462306a36Sopenharmony_ci			/* Capless ramp up clock control */
1098562306a36Sopenharmony_ci			alc_write_coef_idx(codec, 0xd, val | (1<<10));
1098662306a36Sopenharmony_ci		}
1098762306a36Sopenharmony_ci		val = alc_read_coef_idx(codec, 0x17);
1098862306a36Sopenharmony_ci		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
1098962306a36Sopenharmony_ci			/* Class D power on reset */
1099062306a36Sopenharmony_ci			alc_write_coef_idx(codec, 0x17, val | (1<<7));
1099162306a36Sopenharmony_ci		}
1099262306a36Sopenharmony_ci	}
1099362306a36Sopenharmony_ci
1099462306a36Sopenharmony_ci	/* HP */
1099562306a36Sopenharmony_ci	alc_update_coef_idx(codec, 0x4, 0, 1<<11);
1099662306a36Sopenharmony_ci}
1099762306a36Sopenharmony_ci
1099862306a36Sopenharmony_ci/*
1099962306a36Sopenharmony_ci */
1100062306a36Sopenharmony_cistatic int patch_alc269(struct hda_codec *codec)
1100162306a36Sopenharmony_ci{
1100262306a36Sopenharmony_ci	struct alc_spec *spec;
1100362306a36Sopenharmony_ci	int err;
1100462306a36Sopenharmony_ci
1100562306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x0b);
1100662306a36Sopenharmony_ci	if (err < 0)
1100762306a36Sopenharmony_ci		return err;
1100862306a36Sopenharmony_ci
1100962306a36Sopenharmony_ci	spec = codec->spec;
1101062306a36Sopenharmony_ci	spec->gen.shared_mic_vref_pin = 0x18;
1101162306a36Sopenharmony_ci	codec->power_save_node = 0;
1101262306a36Sopenharmony_ci	spec->en_3kpull_low = true;
1101362306a36Sopenharmony_ci
1101462306a36Sopenharmony_ci#ifdef CONFIG_PM
1101562306a36Sopenharmony_ci	codec->patch_ops.suspend = alc269_suspend;
1101662306a36Sopenharmony_ci	codec->patch_ops.resume = alc269_resume;
1101762306a36Sopenharmony_ci#endif
1101862306a36Sopenharmony_ci	spec->shutup = alc_default_shutup;
1101962306a36Sopenharmony_ci	spec->init_hook = alc_default_init;
1102062306a36Sopenharmony_ci
1102162306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
1102262306a36Sopenharmony_ci	case 0x10ec0269:
1102362306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC269VA;
1102462306a36Sopenharmony_ci		switch (alc_get_coef0(codec) & 0x00f0) {
1102562306a36Sopenharmony_ci		case 0x0010:
1102662306a36Sopenharmony_ci			if (codec->bus->pci &&
1102762306a36Sopenharmony_ci			    codec->bus->pci->subsystem_vendor == 0x1025 &&
1102862306a36Sopenharmony_ci			    spec->cdefine.platform_type == 1)
1102962306a36Sopenharmony_ci				err = alc_codec_rename(codec, "ALC271X");
1103062306a36Sopenharmony_ci			spec->codec_variant = ALC269_TYPE_ALC269VB;
1103162306a36Sopenharmony_ci			break;
1103262306a36Sopenharmony_ci		case 0x0020:
1103362306a36Sopenharmony_ci			if (codec->bus->pci &&
1103462306a36Sopenharmony_ci			    codec->bus->pci->subsystem_vendor == 0x17aa &&
1103562306a36Sopenharmony_ci			    codec->bus->pci->subsystem_device == 0x21f3)
1103662306a36Sopenharmony_ci				err = alc_codec_rename(codec, "ALC3202");
1103762306a36Sopenharmony_ci			spec->codec_variant = ALC269_TYPE_ALC269VC;
1103862306a36Sopenharmony_ci			break;
1103962306a36Sopenharmony_ci		case 0x0030:
1104062306a36Sopenharmony_ci			spec->codec_variant = ALC269_TYPE_ALC269VD;
1104162306a36Sopenharmony_ci			break;
1104262306a36Sopenharmony_ci		default:
1104362306a36Sopenharmony_ci			alc_fix_pll_init(codec, 0x20, 0x04, 15);
1104462306a36Sopenharmony_ci		}
1104562306a36Sopenharmony_ci		if (err < 0)
1104662306a36Sopenharmony_ci			goto error;
1104762306a36Sopenharmony_ci		spec->shutup = alc269_shutup;
1104862306a36Sopenharmony_ci		spec->init_hook = alc269_fill_coef;
1104962306a36Sopenharmony_ci		alc269_fill_coef(codec);
1105062306a36Sopenharmony_ci		break;
1105162306a36Sopenharmony_ci
1105262306a36Sopenharmony_ci	case 0x10ec0280:
1105362306a36Sopenharmony_ci	case 0x10ec0290:
1105462306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC280;
1105562306a36Sopenharmony_ci		break;
1105662306a36Sopenharmony_ci	case 0x10ec0282:
1105762306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC282;
1105862306a36Sopenharmony_ci		spec->shutup = alc282_shutup;
1105962306a36Sopenharmony_ci		spec->init_hook = alc282_init;
1106062306a36Sopenharmony_ci		break;
1106162306a36Sopenharmony_ci	case 0x10ec0233:
1106262306a36Sopenharmony_ci	case 0x10ec0283:
1106362306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC283;
1106462306a36Sopenharmony_ci		spec->shutup = alc283_shutup;
1106562306a36Sopenharmony_ci		spec->init_hook = alc283_init;
1106662306a36Sopenharmony_ci		break;
1106762306a36Sopenharmony_ci	case 0x10ec0284:
1106862306a36Sopenharmony_ci	case 0x10ec0292:
1106962306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC284;
1107062306a36Sopenharmony_ci		break;
1107162306a36Sopenharmony_ci	case 0x10ec0293:
1107262306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC293;
1107362306a36Sopenharmony_ci		break;
1107462306a36Sopenharmony_ci	case 0x10ec0286:
1107562306a36Sopenharmony_ci	case 0x10ec0288:
1107662306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC286;
1107762306a36Sopenharmony_ci		break;
1107862306a36Sopenharmony_ci	case 0x10ec0298:
1107962306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC298;
1108062306a36Sopenharmony_ci		break;
1108162306a36Sopenharmony_ci	case 0x10ec0235:
1108262306a36Sopenharmony_ci	case 0x10ec0255:
1108362306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC255;
1108462306a36Sopenharmony_ci		spec->shutup = alc256_shutup;
1108562306a36Sopenharmony_ci		spec->init_hook = alc256_init;
1108662306a36Sopenharmony_ci		break;
1108762306a36Sopenharmony_ci	case 0x10ec0230:
1108862306a36Sopenharmony_ci	case 0x10ec0236:
1108962306a36Sopenharmony_ci	case 0x10ec0256:
1109062306a36Sopenharmony_ci	case 0x19e58326:
1109162306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC256;
1109262306a36Sopenharmony_ci		spec->shutup = alc256_shutup;
1109362306a36Sopenharmony_ci		spec->init_hook = alc256_init;
1109462306a36Sopenharmony_ci		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
1109562306a36Sopenharmony_ci		if (codec->core.vendor_id == 0x10ec0236 &&
1109662306a36Sopenharmony_ci		    codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
1109762306a36Sopenharmony_ci			spec->en_3kpull_low = false;
1109862306a36Sopenharmony_ci		break;
1109962306a36Sopenharmony_ci	case 0x10ec0257:
1110062306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC257;
1110162306a36Sopenharmony_ci		spec->shutup = alc256_shutup;
1110262306a36Sopenharmony_ci		spec->init_hook = alc256_init;
1110362306a36Sopenharmony_ci		spec->gen.mixer_nid = 0;
1110462306a36Sopenharmony_ci		spec->en_3kpull_low = false;
1110562306a36Sopenharmony_ci		break;
1110662306a36Sopenharmony_ci	case 0x10ec0215:
1110762306a36Sopenharmony_ci	case 0x10ec0245:
1110862306a36Sopenharmony_ci	case 0x10ec0285:
1110962306a36Sopenharmony_ci	case 0x10ec0289:
1111062306a36Sopenharmony_ci		if (alc_get_coef0(codec) & 0x0010)
1111162306a36Sopenharmony_ci			spec->codec_variant = ALC269_TYPE_ALC245;
1111262306a36Sopenharmony_ci		else
1111362306a36Sopenharmony_ci			spec->codec_variant = ALC269_TYPE_ALC215;
1111462306a36Sopenharmony_ci		spec->shutup = alc225_shutup;
1111562306a36Sopenharmony_ci		spec->init_hook = alc225_init;
1111662306a36Sopenharmony_ci		spec->gen.mixer_nid = 0;
1111762306a36Sopenharmony_ci		break;
1111862306a36Sopenharmony_ci	case 0x10ec0225:
1111962306a36Sopenharmony_ci	case 0x10ec0295:
1112062306a36Sopenharmony_ci	case 0x10ec0299:
1112162306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC225;
1112262306a36Sopenharmony_ci		spec->shutup = alc225_shutup;
1112362306a36Sopenharmony_ci		spec->init_hook = alc225_init;
1112462306a36Sopenharmony_ci		spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
1112562306a36Sopenharmony_ci		break;
1112662306a36Sopenharmony_ci	case 0x10ec0287:
1112762306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC287;
1112862306a36Sopenharmony_ci		spec->shutup = alc225_shutup;
1112962306a36Sopenharmony_ci		spec->init_hook = alc225_init;
1113062306a36Sopenharmony_ci		spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
1113162306a36Sopenharmony_ci		break;
1113262306a36Sopenharmony_ci	case 0x10ec0234:
1113362306a36Sopenharmony_ci	case 0x10ec0274:
1113462306a36Sopenharmony_ci	case 0x10ec0294:
1113562306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC294;
1113662306a36Sopenharmony_ci		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
1113762306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
1113862306a36Sopenharmony_ci		spec->init_hook = alc294_init;
1113962306a36Sopenharmony_ci		break;
1114062306a36Sopenharmony_ci	case 0x10ec0300:
1114162306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC300;
1114262306a36Sopenharmony_ci		spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
1114362306a36Sopenharmony_ci		break;
1114462306a36Sopenharmony_ci	case 0x10ec0623:
1114562306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC623;
1114662306a36Sopenharmony_ci		break;
1114762306a36Sopenharmony_ci	case 0x10ec0700:
1114862306a36Sopenharmony_ci	case 0x10ec0701:
1114962306a36Sopenharmony_ci	case 0x10ec0703:
1115062306a36Sopenharmony_ci	case 0x10ec0711:
1115162306a36Sopenharmony_ci		spec->codec_variant = ALC269_TYPE_ALC700;
1115262306a36Sopenharmony_ci		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
1115362306a36Sopenharmony_ci		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
1115462306a36Sopenharmony_ci		spec->init_hook = alc294_init;
1115562306a36Sopenharmony_ci		break;
1115662306a36Sopenharmony_ci
1115762306a36Sopenharmony_ci	}
1115862306a36Sopenharmony_ci
1115962306a36Sopenharmony_ci	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
1116062306a36Sopenharmony_ci		spec->has_alc5505_dsp = 1;
1116162306a36Sopenharmony_ci		spec->init_hook = alc5505_dsp_init;
1116262306a36Sopenharmony_ci	}
1116362306a36Sopenharmony_ci
1116462306a36Sopenharmony_ci	alc_pre_init(codec);
1116562306a36Sopenharmony_ci
1116662306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc269_fixup_models,
1116762306a36Sopenharmony_ci		       alc269_fixup_tbl, alc269_fixups);
1116862306a36Sopenharmony_ci	/* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
1116962306a36Sopenharmony_ci	 * the quirk breaks the latter (bko#214101).
1117062306a36Sopenharmony_ci	 * Clear the wrong entry.
1117162306a36Sopenharmony_ci	 */
1117262306a36Sopenharmony_ci	if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
1117362306a36Sopenharmony_ci	    codec->core.vendor_id == 0x10ec0294) {
1117462306a36Sopenharmony_ci		codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
1117562306a36Sopenharmony_ci		codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
1117662306a36Sopenharmony_ci	}
1117762306a36Sopenharmony_ci
1117862306a36Sopenharmony_ci	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
1117962306a36Sopenharmony_ci	snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
1118062306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,
1118162306a36Sopenharmony_ci			   alc269_fixups);
1118262306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1118362306a36Sopenharmony_ci
1118462306a36Sopenharmony_ci	alc_auto_parse_customize_define(codec);
1118562306a36Sopenharmony_ci
1118662306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
1118762306a36Sopenharmony_ci		spec->gen.beep_nid = 0x01;
1118862306a36Sopenharmony_ci
1118962306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
1119062306a36Sopenharmony_ci	err = alc269_parse_auto_config(codec);
1119162306a36Sopenharmony_ci	if (err < 0)
1119262306a36Sopenharmony_ci		goto error;
1119362306a36Sopenharmony_ci
1119462306a36Sopenharmony_ci	if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
1119562306a36Sopenharmony_ci		err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
1119662306a36Sopenharmony_ci		if (err < 0)
1119762306a36Sopenharmony_ci			goto error;
1119862306a36Sopenharmony_ci	}
1119962306a36Sopenharmony_ci
1120062306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1120162306a36Sopenharmony_ci
1120262306a36Sopenharmony_ci	return 0;
1120362306a36Sopenharmony_ci
1120462306a36Sopenharmony_ci error:
1120562306a36Sopenharmony_ci	alc_free(codec);
1120662306a36Sopenharmony_ci	return err;
1120762306a36Sopenharmony_ci}
1120862306a36Sopenharmony_ci
1120962306a36Sopenharmony_ci/*
1121062306a36Sopenharmony_ci * ALC861
1121162306a36Sopenharmony_ci */
1121262306a36Sopenharmony_ci
1121362306a36Sopenharmony_cistatic int alc861_parse_auto_config(struct hda_codec *codec)
1121462306a36Sopenharmony_ci{
1121562306a36Sopenharmony_ci	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
1121662306a36Sopenharmony_ci	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
1121762306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
1121862306a36Sopenharmony_ci}
1121962306a36Sopenharmony_ci
1122062306a36Sopenharmony_ci/* Pin config fixes */
1122162306a36Sopenharmony_cienum {
1122262306a36Sopenharmony_ci	ALC861_FIXUP_FSC_AMILO_PI1505,
1122362306a36Sopenharmony_ci	ALC861_FIXUP_AMP_VREF_0F,
1122462306a36Sopenharmony_ci	ALC861_FIXUP_NO_JACK_DETECT,
1122562306a36Sopenharmony_ci	ALC861_FIXUP_ASUS_A6RP,
1122662306a36Sopenharmony_ci	ALC660_FIXUP_ASUS_W7J,
1122762306a36Sopenharmony_ci};
1122862306a36Sopenharmony_ci
1122962306a36Sopenharmony_ci/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
1123062306a36Sopenharmony_cistatic void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
1123162306a36Sopenharmony_ci			const struct hda_fixup *fix, int action)
1123262306a36Sopenharmony_ci{
1123362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1123462306a36Sopenharmony_ci	unsigned int val;
1123562306a36Sopenharmony_ci
1123662306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_INIT)
1123762306a36Sopenharmony_ci		return;
1123862306a36Sopenharmony_ci	val = snd_hda_codec_get_pin_target(codec, 0x0f);
1123962306a36Sopenharmony_ci	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
1124062306a36Sopenharmony_ci		val |= AC_PINCTL_IN_EN;
1124162306a36Sopenharmony_ci	val |= AC_PINCTL_VREF_50;
1124262306a36Sopenharmony_ci	snd_hda_set_pin_ctl(codec, 0x0f, val);
1124362306a36Sopenharmony_ci	spec->gen.keep_vref_in_automute = 1;
1124462306a36Sopenharmony_ci}
1124562306a36Sopenharmony_ci
1124662306a36Sopenharmony_ci/* suppress the jack-detection */
1124762306a36Sopenharmony_cistatic void alc_fixup_no_jack_detect(struct hda_codec *codec,
1124862306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
1124962306a36Sopenharmony_ci{
1125062306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
1125162306a36Sopenharmony_ci		codec->no_jack_detect = 1;
1125262306a36Sopenharmony_ci}
1125362306a36Sopenharmony_ci
1125462306a36Sopenharmony_cistatic const struct hda_fixup alc861_fixups[] = {
1125562306a36Sopenharmony_ci	[ALC861_FIXUP_FSC_AMILO_PI1505] = {
1125662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1125762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1125862306a36Sopenharmony_ci			{ 0x0b, 0x0221101f }, /* HP */
1125962306a36Sopenharmony_ci			{ 0x0f, 0x90170310 }, /* speaker */
1126062306a36Sopenharmony_ci			{ }
1126162306a36Sopenharmony_ci		}
1126262306a36Sopenharmony_ci	},
1126362306a36Sopenharmony_ci	[ALC861_FIXUP_AMP_VREF_0F] = {
1126462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1126562306a36Sopenharmony_ci		.v.func = alc861_fixup_asus_amp_vref_0f,
1126662306a36Sopenharmony_ci	},
1126762306a36Sopenharmony_ci	[ALC861_FIXUP_NO_JACK_DETECT] = {
1126862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1126962306a36Sopenharmony_ci		.v.func = alc_fixup_no_jack_detect,
1127062306a36Sopenharmony_ci	},
1127162306a36Sopenharmony_ci	[ALC861_FIXUP_ASUS_A6RP] = {
1127262306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1127362306a36Sopenharmony_ci		.v.func = alc861_fixup_asus_amp_vref_0f,
1127462306a36Sopenharmony_ci		.chained = true,
1127562306a36Sopenharmony_ci		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,
1127662306a36Sopenharmony_ci	},
1127762306a36Sopenharmony_ci	[ALC660_FIXUP_ASUS_W7J] = {
1127862306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
1127962306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
1128062306a36Sopenharmony_ci			/* ASUS W7J needs a magic pin setup on unused NID 0x10
1128162306a36Sopenharmony_ci			 * for enabling outputs
1128262306a36Sopenharmony_ci			 */
1128362306a36Sopenharmony_ci			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
1128462306a36Sopenharmony_ci			{ }
1128562306a36Sopenharmony_ci		},
1128662306a36Sopenharmony_ci	}
1128762306a36Sopenharmony_ci};
1128862306a36Sopenharmony_ci
1128962306a36Sopenharmony_cistatic const struct snd_pci_quirk alc861_fixup_tbl[] = {
1129062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
1129162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
1129262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
1129362306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
1129462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
1129562306a36Sopenharmony_ci	SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
1129662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
1129762306a36Sopenharmony_ci	{}
1129862306a36Sopenharmony_ci};
1129962306a36Sopenharmony_ci
1130062306a36Sopenharmony_ci/*
1130162306a36Sopenharmony_ci */
1130262306a36Sopenharmony_cistatic int patch_alc861(struct hda_codec *codec)
1130362306a36Sopenharmony_ci{
1130462306a36Sopenharmony_ci	struct alc_spec *spec;
1130562306a36Sopenharmony_ci	int err;
1130662306a36Sopenharmony_ci
1130762306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x15);
1130862306a36Sopenharmony_ci	if (err < 0)
1130962306a36Sopenharmony_ci		return err;
1131062306a36Sopenharmony_ci
1131162306a36Sopenharmony_ci	spec = codec->spec;
1131262306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
1131362306a36Sopenharmony_ci		spec->gen.beep_nid = 0x23;
1131462306a36Sopenharmony_ci
1131562306a36Sopenharmony_ci#ifdef CONFIG_PM
1131662306a36Sopenharmony_ci	spec->power_hook = alc_power_eapd;
1131762306a36Sopenharmony_ci#endif
1131862306a36Sopenharmony_ci
1131962306a36Sopenharmony_ci	alc_pre_init(codec);
1132062306a36Sopenharmony_ci
1132162306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
1132262306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1132362306a36Sopenharmony_ci
1132462306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
1132562306a36Sopenharmony_ci	err = alc861_parse_auto_config(codec);
1132662306a36Sopenharmony_ci	if (err < 0)
1132762306a36Sopenharmony_ci		goto error;
1132862306a36Sopenharmony_ci
1132962306a36Sopenharmony_ci	if (!spec->gen.no_analog) {
1133062306a36Sopenharmony_ci		err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
1133162306a36Sopenharmony_ci		if (err < 0)
1133262306a36Sopenharmony_ci			goto error;
1133362306a36Sopenharmony_ci	}
1133462306a36Sopenharmony_ci
1133562306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1133662306a36Sopenharmony_ci
1133762306a36Sopenharmony_ci	return 0;
1133862306a36Sopenharmony_ci
1133962306a36Sopenharmony_ci error:
1134062306a36Sopenharmony_ci	alc_free(codec);
1134162306a36Sopenharmony_ci	return err;
1134262306a36Sopenharmony_ci}
1134362306a36Sopenharmony_ci
1134462306a36Sopenharmony_ci/*
1134562306a36Sopenharmony_ci * ALC861-VD support
1134662306a36Sopenharmony_ci *
1134762306a36Sopenharmony_ci * Based on ALC882
1134862306a36Sopenharmony_ci *
1134962306a36Sopenharmony_ci * In addition, an independent DAC
1135062306a36Sopenharmony_ci */
1135162306a36Sopenharmony_cistatic int alc861vd_parse_auto_config(struct hda_codec *codec)
1135262306a36Sopenharmony_ci{
1135362306a36Sopenharmony_ci	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
1135462306a36Sopenharmony_ci	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1135562306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
1135662306a36Sopenharmony_ci}
1135762306a36Sopenharmony_ci
1135862306a36Sopenharmony_cienum {
1135962306a36Sopenharmony_ci	ALC660VD_FIX_ASUS_GPIO1,
1136062306a36Sopenharmony_ci	ALC861VD_FIX_DALLAS,
1136162306a36Sopenharmony_ci};
1136262306a36Sopenharmony_ci
1136362306a36Sopenharmony_ci/* exclude VREF80 */
1136462306a36Sopenharmony_cistatic void alc861vd_fixup_dallas(struct hda_codec *codec,
1136562306a36Sopenharmony_ci				  const struct hda_fixup *fix, int action)
1136662306a36Sopenharmony_ci{
1136762306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1136862306a36Sopenharmony_ci		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
1136962306a36Sopenharmony_ci		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
1137062306a36Sopenharmony_ci	}
1137162306a36Sopenharmony_ci}
1137262306a36Sopenharmony_ci
1137362306a36Sopenharmony_ci/* reset GPIO1 */
1137462306a36Sopenharmony_cistatic void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
1137562306a36Sopenharmony_ci				      const struct hda_fixup *fix, int action)
1137662306a36Sopenharmony_ci{
1137762306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1137862306a36Sopenharmony_ci
1137962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE)
1138062306a36Sopenharmony_ci		spec->gpio_mask |= 0x02;
1138162306a36Sopenharmony_ci	alc_fixup_gpio(codec, action, 0x01);
1138262306a36Sopenharmony_ci}
1138362306a36Sopenharmony_ci
1138462306a36Sopenharmony_cistatic const struct hda_fixup alc861vd_fixups[] = {
1138562306a36Sopenharmony_ci	[ALC660VD_FIX_ASUS_GPIO1] = {
1138662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1138762306a36Sopenharmony_ci		.v.func = alc660vd_fixup_asus_gpio1,
1138862306a36Sopenharmony_ci	},
1138962306a36Sopenharmony_ci	[ALC861VD_FIX_DALLAS] = {
1139062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1139162306a36Sopenharmony_ci		.v.func = alc861vd_fixup_dallas,
1139262306a36Sopenharmony_ci	},
1139362306a36Sopenharmony_ci};
1139462306a36Sopenharmony_ci
1139562306a36Sopenharmony_cistatic const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
1139662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
1139762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
1139862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
1139962306a36Sopenharmony_ci	{}
1140062306a36Sopenharmony_ci};
1140162306a36Sopenharmony_ci
1140262306a36Sopenharmony_ci/*
1140362306a36Sopenharmony_ci */
1140462306a36Sopenharmony_cistatic int patch_alc861vd(struct hda_codec *codec)
1140562306a36Sopenharmony_ci{
1140662306a36Sopenharmony_ci	struct alc_spec *spec;
1140762306a36Sopenharmony_ci	int err;
1140862306a36Sopenharmony_ci
1140962306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x0b);
1141062306a36Sopenharmony_ci	if (err < 0)
1141162306a36Sopenharmony_ci		return err;
1141262306a36Sopenharmony_ci
1141362306a36Sopenharmony_ci	spec = codec->spec;
1141462306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
1141562306a36Sopenharmony_ci		spec->gen.beep_nid = 0x23;
1141662306a36Sopenharmony_ci
1141762306a36Sopenharmony_ci	spec->shutup = alc_eapd_shutup;
1141862306a36Sopenharmony_ci
1141962306a36Sopenharmony_ci	alc_pre_init(codec);
1142062306a36Sopenharmony_ci
1142162306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
1142262306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1142362306a36Sopenharmony_ci
1142462306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
1142562306a36Sopenharmony_ci	err = alc861vd_parse_auto_config(codec);
1142662306a36Sopenharmony_ci	if (err < 0)
1142762306a36Sopenharmony_ci		goto error;
1142862306a36Sopenharmony_ci
1142962306a36Sopenharmony_ci	if (!spec->gen.no_analog) {
1143062306a36Sopenharmony_ci		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1143162306a36Sopenharmony_ci		if (err < 0)
1143262306a36Sopenharmony_ci			goto error;
1143362306a36Sopenharmony_ci	}
1143462306a36Sopenharmony_ci
1143562306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1143662306a36Sopenharmony_ci
1143762306a36Sopenharmony_ci	return 0;
1143862306a36Sopenharmony_ci
1143962306a36Sopenharmony_ci error:
1144062306a36Sopenharmony_ci	alc_free(codec);
1144162306a36Sopenharmony_ci	return err;
1144262306a36Sopenharmony_ci}
1144362306a36Sopenharmony_ci
1144462306a36Sopenharmony_ci/*
1144562306a36Sopenharmony_ci * ALC662 support
1144662306a36Sopenharmony_ci *
1144762306a36Sopenharmony_ci * ALC662 is almost identical with ALC880 but has cleaner and more flexible
1144862306a36Sopenharmony_ci * configuration.  Each pin widget can choose any input DACs and a mixer.
1144962306a36Sopenharmony_ci * Each ADC is connected from a mixer of all inputs.  This makes possible
1145062306a36Sopenharmony_ci * 6-channel independent captures.
1145162306a36Sopenharmony_ci *
1145262306a36Sopenharmony_ci * In addition, an independent DAC for the multi-playback (not used in this
1145362306a36Sopenharmony_ci * driver yet).
1145462306a36Sopenharmony_ci */
1145562306a36Sopenharmony_ci
1145662306a36Sopenharmony_ci/*
1145762306a36Sopenharmony_ci * BIOS auto configuration
1145862306a36Sopenharmony_ci */
1145962306a36Sopenharmony_ci
1146062306a36Sopenharmony_cistatic int alc662_parse_auto_config(struct hda_codec *codec)
1146162306a36Sopenharmony_ci{
1146262306a36Sopenharmony_ci	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
1146362306a36Sopenharmony_ci	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
1146462306a36Sopenharmony_ci	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1146562306a36Sopenharmony_ci	const hda_nid_t *ssids;
1146662306a36Sopenharmony_ci
1146762306a36Sopenharmony_ci	if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
1146862306a36Sopenharmony_ci	    codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
1146962306a36Sopenharmony_ci	    codec->core.vendor_id == 0x10ec0671)
1147062306a36Sopenharmony_ci		ssids = alc663_ssids;
1147162306a36Sopenharmony_ci	else
1147262306a36Sopenharmony_ci		ssids = alc662_ssids;
1147362306a36Sopenharmony_ci	return alc_parse_auto_config(codec, alc662_ignore, ssids);
1147462306a36Sopenharmony_ci}
1147562306a36Sopenharmony_ci
1147662306a36Sopenharmony_cistatic void alc272_fixup_mario(struct hda_codec *codec,
1147762306a36Sopenharmony_ci			       const struct hda_fixup *fix, int action)
1147862306a36Sopenharmony_ci{
1147962306a36Sopenharmony_ci	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1148062306a36Sopenharmony_ci		return;
1148162306a36Sopenharmony_ci	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
1148262306a36Sopenharmony_ci				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
1148362306a36Sopenharmony_ci				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
1148462306a36Sopenharmony_ci				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
1148562306a36Sopenharmony_ci				      (0 << AC_AMPCAP_MUTE_SHIFT)))
1148662306a36Sopenharmony_ci		codec_warn(codec, "failed to override amp caps for NID 0x2\n");
1148762306a36Sopenharmony_ci}
1148862306a36Sopenharmony_ci
1148962306a36Sopenharmony_cistatic const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
1149062306a36Sopenharmony_ci	{ .channels = 2,
1149162306a36Sopenharmony_ci	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
1149262306a36Sopenharmony_ci	{ .channels = 4,
1149362306a36Sopenharmony_ci	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
1149462306a36Sopenharmony_ci		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
1149562306a36Sopenharmony_ci	{ }
1149662306a36Sopenharmony_ci};
1149762306a36Sopenharmony_ci
1149862306a36Sopenharmony_ci/* override the 2.1 chmap */
1149962306a36Sopenharmony_cistatic void alc_fixup_bass_chmap(struct hda_codec *codec,
1150062306a36Sopenharmony_ci				    const struct hda_fixup *fix, int action)
1150162306a36Sopenharmony_ci{
1150262306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_BUILD) {
1150362306a36Sopenharmony_ci		struct alc_spec *spec = codec->spec;
1150462306a36Sopenharmony_ci		spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
1150562306a36Sopenharmony_ci	}
1150662306a36Sopenharmony_ci}
1150762306a36Sopenharmony_ci
1150862306a36Sopenharmony_ci/* avoid D3 for keeping GPIO up */
1150962306a36Sopenharmony_cistatic unsigned int gpio_led_power_filter(struct hda_codec *codec,
1151062306a36Sopenharmony_ci					  hda_nid_t nid,
1151162306a36Sopenharmony_ci					  unsigned int power_state)
1151262306a36Sopenharmony_ci{
1151362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1151462306a36Sopenharmony_ci	if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
1151562306a36Sopenharmony_ci		return AC_PWRST_D0;
1151662306a36Sopenharmony_ci	return power_state;
1151762306a36Sopenharmony_ci}
1151862306a36Sopenharmony_ci
1151962306a36Sopenharmony_cistatic void alc662_fixup_led_gpio1(struct hda_codec *codec,
1152062306a36Sopenharmony_ci				   const struct hda_fixup *fix, int action)
1152162306a36Sopenharmony_ci{
1152262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1152362306a36Sopenharmony_ci
1152462306a36Sopenharmony_ci	alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
1152562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1152662306a36Sopenharmony_ci		spec->mute_led_polarity = 1;
1152762306a36Sopenharmony_ci		codec->power_filter = gpio_led_power_filter;
1152862306a36Sopenharmony_ci	}
1152962306a36Sopenharmony_ci}
1153062306a36Sopenharmony_ci
1153162306a36Sopenharmony_cistatic void alc662_usi_automute_hook(struct hda_codec *codec,
1153262306a36Sopenharmony_ci					 struct hda_jack_callback *jack)
1153362306a36Sopenharmony_ci{
1153462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1153562306a36Sopenharmony_ci	int vref;
1153662306a36Sopenharmony_ci	msleep(200);
1153762306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
1153862306a36Sopenharmony_ci
1153962306a36Sopenharmony_ci	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
1154062306a36Sopenharmony_ci	msleep(100);
1154162306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
1154262306a36Sopenharmony_ci			    vref);
1154362306a36Sopenharmony_ci}
1154462306a36Sopenharmony_ci
1154562306a36Sopenharmony_cistatic void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
1154662306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
1154762306a36Sopenharmony_ci{
1154862306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1154962306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1155062306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
1155162306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc662_usi_automute_hook;
1155262306a36Sopenharmony_ci	}
1155362306a36Sopenharmony_ci}
1155462306a36Sopenharmony_ci
1155562306a36Sopenharmony_cistatic void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
1155662306a36Sopenharmony_ci					struct hda_jack_callback *cb)
1155762306a36Sopenharmony_ci{
1155862306a36Sopenharmony_ci	/* surround speakers at 0x1b already get muted automatically when
1155962306a36Sopenharmony_ci	 * headphones are plugged in, but we have to mute/unmute the remaining
1156062306a36Sopenharmony_ci	 * channels manually:
1156162306a36Sopenharmony_ci	 * 0x15 - front left/front right
1156262306a36Sopenharmony_ci	 * 0x18 - front center/ LFE
1156362306a36Sopenharmony_ci	 */
1156462306a36Sopenharmony_ci	if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
1156562306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
1156662306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
1156762306a36Sopenharmony_ci	} else {
1156862306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
1156962306a36Sopenharmony_ci		snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
1157062306a36Sopenharmony_ci	}
1157162306a36Sopenharmony_ci}
1157262306a36Sopenharmony_ci
1157362306a36Sopenharmony_cistatic void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
1157462306a36Sopenharmony_ci					const struct hda_fixup *fix, int action)
1157562306a36Sopenharmony_ci{
1157662306a36Sopenharmony_ci    /* Pin 0x1b: shared headphones jack and surround speakers */
1157762306a36Sopenharmony_ci	if (!is_jack_detectable(codec, 0x1b))
1157862306a36Sopenharmony_ci		return;
1157962306a36Sopenharmony_ci
1158062306a36Sopenharmony_ci	switch (action) {
1158162306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
1158262306a36Sopenharmony_ci		snd_hda_jack_detect_enable_callback(codec, 0x1b,
1158362306a36Sopenharmony_ci				alc662_aspire_ethos_mute_speakers);
1158462306a36Sopenharmony_ci		/* subwoofer needs an extra GPIO setting to become audible */
1158562306a36Sopenharmony_ci		alc_setup_gpio(codec, 0x02);
1158662306a36Sopenharmony_ci		break;
1158762306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
1158862306a36Sopenharmony_ci		/* Make sure to start in a correct state, i.e. if
1158962306a36Sopenharmony_ci		 * headphones have been plugged in before powering up the system
1159062306a36Sopenharmony_ci		 */
1159162306a36Sopenharmony_ci		alc662_aspire_ethos_mute_speakers(codec, NULL);
1159262306a36Sopenharmony_ci		break;
1159362306a36Sopenharmony_ci	}
1159462306a36Sopenharmony_ci}
1159562306a36Sopenharmony_ci
1159662306a36Sopenharmony_cistatic void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
1159762306a36Sopenharmony_ci					     const struct hda_fixup *fix, int action)
1159862306a36Sopenharmony_ci{
1159962306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1160062306a36Sopenharmony_ci
1160162306a36Sopenharmony_ci	static const struct hda_pintbl pincfgs[] = {
1160262306a36Sopenharmony_ci		{ 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
1160362306a36Sopenharmony_ci		{ 0x1b, 0x0181304f },
1160462306a36Sopenharmony_ci		{ }
1160562306a36Sopenharmony_ci	};
1160662306a36Sopenharmony_ci
1160762306a36Sopenharmony_ci	switch (action) {
1160862306a36Sopenharmony_ci	case HDA_FIXUP_ACT_PRE_PROBE:
1160962306a36Sopenharmony_ci		spec->gen.mixer_nid = 0;
1161062306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
1161162306a36Sopenharmony_ci		snd_hda_apply_pincfgs(codec, pincfgs);
1161262306a36Sopenharmony_ci		break;
1161362306a36Sopenharmony_ci	case HDA_FIXUP_ACT_INIT:
1161462306a36Sopenharmony_ci		alc_write_coef_idx(codec, 0x19, 0xa054);
1161562306a36Sopenharmony_ci		break;
1161662306a36Sopenharmony_ci	}
1161762306a36Sopenharmony_ci}
1161862306a36Sopenharmony_ci
1161962306a36Sopenharmony_cistatic void alc897_hp_automute_hook(struct hda_codec *codec,
1162062306a36Sopenharmony_ci					 struct hda_jack_callback *jack)
1162162306a36Sopenharmony_ci{
1162262306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1162362306a36Sopenharmony_ci	int vref;
1162462306a36Sopenharmony_ci
1162562306a36Sopenharmony_ci	snd_hda_gen_hp_automute(codec, jack);
1162662306a36Sopenharmony_ci	vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
1162762306a36Sopenharmony_ci	snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
1162862306a36Sopenharmony_ci			    vref);
1162962306a36Sopenharmony_ci}
1163062306a36Sopenharmony_ci
1163162306a36Sopenharmony_cistatic void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
1163262306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
1163362306a36Sopenharmony_ci{
1163462306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1163562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1163662306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
1163762306a36Sopenharmony_ci	}
1163862306a36Sopenharmony_ci}
1163962306a36Sopenharmony_ci
1164062306a36Sopenharmony_cistatic void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
1164162306a36Sopenharmony_ci				     const struct hda_fixup *fix, int action)
1164262306a36Sopenharmony_ci{
1164362306a36Sopenharmony_ci	struct alc_spec *spec = codec->spec;
1164462306a36Sopenharmony_ci
1164562306a36Sopenharmony_ci	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1164662306a36Sopenharmony_ci		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
1164762306a36Sopenharmony_ci		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
1164862306a36Sopenharmony_ci	}
1164962306a36Sopenharmony_ci}
1165062306a36Sopenharmony_ci
1165162306a36Sopenharmony_cistatic const struct coef_fw alc668_coefs[] = {
1165262306a36Sopenharmony_ci	WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
1165362306a36Sopenharmony_ci	WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
1165462306a36Sopenharmony_ci	WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
1165562306a36Sopenharmony_ci	WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
1165662306a36Sopenharmony_ci	WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
1165762306a36Sopenharmony_ci	WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
1165862306a36Sopenharmony_ci	WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
1165962306a36Sopenharmony_ci	WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
1166062306a36Sopenharmony_ci	WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
1166162306a36Sopenharmony_ci	WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
1166262306a36Sopenharmony_ci	WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
1166362306a36Sopenharmony_ci	WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
1166462306a36Sopenharmony_ci	WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
1166562306a36Sopenharmony_ci	WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
1166662306a36Sopenharmony_ci	WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
1166762306a36Sopenharmony_ci	WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
1166862306a36Sopenharmony_ci	WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
1166962306a36Sopenharmony_ci	WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
1167062306a36Sopenharmony_ci	WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
1167162306a36Sopenharmony_ci	WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
1167262306a36Sopenharmony_ci	{}
1167362306a36Sopenharmony_ci};
1167462306a36Sopenharmony_ci
1167562306a36Sopenharmony_cistatic void alc668_restore_default_value(struct hda_codec *codec)
1167662306a36Sopenharmony_ci{
1167762306a36Sopenharmony_ci	alc_process_coef_fw(codec, alc668_coefs);
1167862306a36Sopenharmony_ci}
1167962306a36Sopenharmony_ci
1168062306a36Sopenharmony_cienum {
1168162306a36Sopenharmony_ci	ALC662_FIXUP_ASPIRE,
1168262306a36Sopenharmony_ci	ALC662_FIXUP_LED_GPIO1,
1168362306a36Sopenharmony_ci	ALC662_FIXUP_IDEAPAD,
1168462306a36Sopenharmony_ci	ALC272_FIXUP_MARIO,
1168562306a36Sopenharmony_ci	ALC662_FIXUP_CZC_ET26,
1168662306a36Sopenharmony_ci	ALC662_FIXUP_CZC_P10T,
1168762306a36Sopenharmony_ci	ALC662_FIXUP_SKU_IGNORE,
1168862306a36Sopenharmony_ci	ALC662_FIXUP_HP_RP5800,
1168962306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE1,
1169062306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE2,
1169162306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE3,
1169262306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE4,
1169362306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE5,
1169462306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE6,
1169562306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE7,
1169662306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_MODE8,
1169762306a36Sopenharmony_ci	ALC662_FIXUP_NO_JACK_DETECT,
1169862306a36Sopenharmony_ci	ALC662_FIXUP_ZOTAC_Z68,
1169962306a36Sopenharmony_ci	ALC662_FIXUP_INV_DMIC,
1170062306a36Sopenharmony_ci	ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
1170162306a36Sopenharmony_ci	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
1170262306a36Sopenharmony_ci	ALC662_FIXUP_HEADSET_MODE,
1170362306a36Sopenharmony_ci	ALC668_FIXUP_HEADSET_MODE,
1170462306a36Sopenharmony_ci	ALC662_FIXUP_BASS_MODE4_CHMAP,
1170562306a36Sopenharmony_ci	ALC662_FIXUP_BASS_16,
1170662306a36Sopenharmony_ci	ALC662_FIXUP_BASS_1A,
1170762306a36Sopenharmony_ci	ALC662_FIXUP_BASS_CHMAP,
1170862306a36Sopenharmony_ci	ALC668_FIXUP_AUTO_MUTE,
1170962306a36Sopenharmony_ci	ALC668_FIXUP_DELL_DISABLE_AAMIX,
1171062306a36Sopenharmony_ci	ALC668_FIXUP_DELL_XPS13,
1171162306a36Sopenharmony_ci	ALC662_FIXUP_ASUS_Nx50,
1171262306a36Sopenharmony_ci	ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
1171362306a36Sopenharmony_ci	ALC668_FIXUP_ASUS_Nx51,
1171462306a36Sopenharmony_ci	ALC668_FIXUP_MIC_COEF,
1171562306a36Sopenharmony_ci	ALC668_FIXUP_ASUS_G751,
1171662306a36Sopenharmony_ci	ALC891_FIXUP_HEADSET_MODE,
1171762306a36Sopenharmony_ci	ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
1171862306a36Sopenharmony_ci	ALC662_FIXUP_ACER_VERITON,
1171962306a36Sopenharmony_ci	ALC892_FIXUP_ASROCK_MOBO,
1172062306a36Sopenharmony_ci	ALC662_FIXUP_USI_FUNC,
1172162306a36Sopenharmony_ci	ALC662_FIXUP_USI_HEADSET_MODE,
1172262306a36Sopenharmony_ci	ALC662_FIXUP_LENOVO_MULTI_CODECS,
1172362306a36Sopenharmony_ci	ALC669_FIXUP_ACER_ASPIRE_ETHOS,
1172462306a36Sopenharmony_ci	ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
1172562306a36Sopenharmony_ci	ALC671_FIXUP_HP_HEADSET_MIC2,
1172662306a36Sopenharmony_ci	ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
1172762306a36Sopenharmony_ci	ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
1172862306a36Sopenharmony_ci	ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
1172962306a36Sopenharmony_ci	ALC668_FIXUP_HEADSET_MIC,
1173062306a36Sopenharmony_ci	ALC668_FIXUP_MIC_DET_COEF,
1173162306a36Sopenharmony_ci	ALC897_FIXUP_LENOVO_HEADSET_MIC,
1173262306a36Sopenharmony_ci	ALC897_FIXUP_HEADSET_MIC_PIN,
1173362306a36Sopenharmony_ci	ALC897_FIXUP_HP_HSMIC_VERB,
1173462306a36Sopenharmony_ci	ALC897_FIXUP_LENOVO_HEADSET_MODE,
1173562306a36Sopenharmony_ci	ALC897_FIXUP_HEADSET_MIC_PIN2,
1173662306a36Sopenharmony_ci	ALC897_FIXUP_UNIS_H3C_X500S,
1173762306a36Sopenharmony_ci};
1173862306a36Sopenharmony_ci
1173962306a36Sopenharmony_cistatic const struct hda_fixup alc662_fixups[] = {
1174062306a36Sopenharmony_ci	[ALC662_FIXUP_ASPIRE] = {
1174162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1174262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1174362306a36Sopenharmony_ci			{ 0x15, 0x99130112 }, /* subwoofer */
1174462306a36Sopenharmony_ci			{ }
1174562306a36Sopenharmony_ci		}
1174662306a36Sopenharmony_ci	},
1174762306a36Sopenharmony_ci	[ALC662_FIXUP_LED_GPIO1] = {
1174862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1174962306a36Sopenharmony_ci		.v.func = alc662_fixup_led_gpio1,
1175062306a36Sopenharmony_ci	},
1175162306a36Sopenharmony_ci	[ALC662_FIXUP_IDEAPAD] = {
1175262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1175362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1175462306a36Sopenharmony_ci			{ 0x17, 0x99130112 }, /* subwoofer */
1175562306a36Sopenharmony_ci			{ }
1175662306a36Sopenharmony_ci		},
1175762306a36Sopenharmony_ci		.chained = true,
1175862306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_LED_GPIO1,
1175962306a36Sopenharmony_ci	},
1176062306a36Sopenharmony_ci	[ALC272_FIXUP_MARIO] = {
1176162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1176262306a36Sopenharmony_ci		.v.func = alc272_fixup_mario,
1176362306a36Sopenharmony_ci	},
1176462306a36Sopenharmony_ci	[ALC662_FIXUP_CZC_ET26] = {
1176562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1176662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1176762306a36Sopenharmony_ci			{0x12, 0x403cc000},
1176862306a36Sopenharmony_ci			{0x14, 0x90170110}, /* speaker */
1176962306a36Sopenharmony_ci			{0x15, 0x411111f0},
1177062306a36Sopenharmony_ci			{0x16, 0x411111f0},
1177162306a36Sopenharmony_ci			{0x18, 0x01a19030}, /* mic */
1177262306a36Sopenharmony_ci			{0x19, 0x90a7013f}, /* int-mic */
1177362306a36Sopenharmony_ci			{0x1a, 0x01014020},
1177462306a36Sopenharmony_ci			{0x1b, 0x0121401f},
1177562306a36Sopenharmony_ci			{0x1c, 0x411111f0},
1177662306a36Sopenharmony_ci			{0x1d, 0x411111f0},
1177762306a36Sopenharmony_ci			{0x1e, 0x40478e35},
1177862306a36Sopenharmony_ci			{}
1177962306a36Sopenharmony_ci		},
1178062306a36Sopenharmony_ci		.chained = true,
1178162306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1178262306a36Sopenharmony_ci	},
1178362306a36Sopenharmony_ci	[ALC662_FIXUP_CZC_P10T] = {
1178462306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
1178562306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
1178662306a36Sopenharmony_ci			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
1178762306a36Sopenharmony_ci			{}
1178862306a36Sopenharmony_ci		}
1178962306a36Sopenharmony_ci	},
1179062306a36Sopenharmony_ci	[ALC662_FIXUP_SKU_IGNORE] = {
1179162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1179262306a36Sopenharmony_ci		.v.func = alc_fixup_sku_ignore,
1179362306a36Sopenharmony_ci	},
1179462306a36Sopenharmony_ci	[ALC662_FIXUP_HP_RP5800] = {
1179562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1179662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1179762306a36Sopenharmony_ci			{ 0x14, 0x0221201f }, /* HP out */
1179862306a36Sopenharmony_ci			{ }
1179962306a36Sopenharmony_ci		},
1180062306a36Sopenharmony_ci		.chained = true,
1180162306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1180262306a36Sopenharmony_ci	},
1180362306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE1] = {
1180462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1180562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1180662306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1180762306a36Sopenharmony_ci			{ 0x18, 0x01a19c20 }, /* mic */
1180862306a36Sopenharmony_ci			{ 0x19, 0x99a3092f }, /* int-mic */
1180962306a36Sopenharmony_ci			{ 0x21, 0x0121401f }, /* HP out */
1181062306a36Sopenharmony_ci			{ }
1181162306a36Sopenharmony_ci		},
1181262306a36Sopenharmony_ci		.chained = true,
1181362306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1181462306a36Sopenharmony_ci	},
1181562306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE2] = {
1181662306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1181762306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1181862306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1181962306a36Sopenharmony_ci			{ 0x18, 0x01a19820 }, /* mic */
1182062306a36Sopenharmony_ci			{ 0x19, 0x99a3092f }, /* int-mic */
1182162306a36Sopenharmony_ci			{ 0x1b, 0x0121401f }, /* HP out */
1182262306a36Sopenharmony_ci			{ }
1182362306a36Sopenharmony_ci		},
1182462306a36Sopenharmony_ci		.chained = true,
1182562306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1182662306a36Sopenharmony_ci	},
1182762306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE3] = {
1182862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1182962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1183062306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1183162306a36Sopenharmony_ci			{ 0x15, 0x0121441f }, /* HP */
1183262306a36Sopenharmony_ci			{ 0x18, 0x01a19840 }, /* mic */
1183362306a36Sopenharmony_ci			{ 0x19, 0x99a3094f }, /* int-mic */
1183462306a36Sopenharmony_ci			{ 0x21, 0x01211420 }, /* HP2 */
1183562306a36Sopenharmony_ci			{ }
1183662306a36Sopenharmony_ci		},
1183762306a36Sopenharmony_ci		.chained = true,
1183862306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1183962306a36Sopenharmony_ci	},
1184062306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE4] = {
1184162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1184262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1184362306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1184462306a36Sopenharmony_ci			{ 0x16, 0x99130111 }, /* speaker */
1184562306a36Sopenharmony_ci			{ 0x18, 0x01a19840 }, /* mic */
1184662306a36Sopenharmony_ci			{ 0x19, 0x99a3094f }, /* int-mic */
1184762306a36Sopenharmony_ci			{ 0x21, 0x0121441f }, /* HP */
1184862306a36Sopenharmony_ci			{ }
1184962306a36Sopenharmony_ci		},
1185062306a36Sopenharmony_ci		.chained = true,
1185162306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1185262306a36Sopenharmony_ci	},
1185362306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE5] = {
1185462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1185562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1185662306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1185762306a36Sopenharmony_ci			{ 0x15, 0x0121441f }, /* HP */
1185862306a36Sopenharmony_ci			{ 0x16, 0x99130111 }, /* speaker */
1185962306a36Sopenharmony_ci			{ 0x18, 0x01a19840 }, /* mic */
1186062306a36Sopenharmony_ci			{ 0x19, 0x99a3094f }, /* int-mic */
1186162306a36Sopenharmony_ci			{ }
1186262306a36Sopenharmony_ci		},
1186362306a36Sopenharmony_ci		.chained = true,
1186462306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1186562306a36Sopenharmony_ci	},
1186662306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE6] = {
1186762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1186862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1186962306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1187062306a36Sopenharmony_ci			{ 0x15, 0x01211420 }, /* HP2 */
1187162306a36Sopenharmony_ci			{ 0x18, 0x01a19840 }, /* mic */
1187262306a36Sopenharmony_ci			{ 0x19, 0x99a3094f }, /* int-mic */
1187362306a36Sopenharmony_ci			{ 0x1b, 0x0121441f }, /* HP */
1187462306a36Sopenharmony_ci			{ }
1187562306a36Sopenharmony_ci		},
1187662306a36Sopenharmony_ci		.chained = true,
1187762306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1187862306a36Sopenharmony_ci	},
1187962306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE7] = {
1188062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1188162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1188262306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1188362306a36Sopenharmony_ci			{ 0x17, 0x99130111 }, /* speaker */
1188462306a36Sopenharmony_ci			{ 0x18, 0x01a19840 }, /* mic */
1188562306a36Sopenharmony_ci			{ 0x19, 0x99a3094f }, /* int-mic */
1188662306a36Sopenharmony_ci			{ 0x1b, 0x01214020 }, /* HP */
1188762306a36Sopenharmony_ci			{ 0x21, 0x0121401f }, /* HP */
1188862306a36Sopenharmony_ci			{ }
1188962306a36Sopenharmony_ci		},
1189062306a36Sopenharmony_ci		.chained = true,
1189162306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1189262306a36Sopenharmony_ci	},
1189362306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_MODE8] = {
1189462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1189562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1189662306a36Sopenharmony_ci			{ 0x14, 0x99130110 }, /* speaker */
1189762306a36Sopenharmony_ci			{ 0x12, 0x99a30970 }, /* int-mic */
1189862306a36Sopenharmony_ci			{ 0x15, 0x01214020 }, /* HP */
1189962306a36Sopenharmony_ci			{ 0x17, 0x99130111 }, /* speaker */
1190062306a36Sopenharmony_ci			{ 0x18, 0x01a19840 }, /* mic */
1190162306a36Sopenharmony_ci			{ 0x21, 0x0121401f }, /* HP */
1190262306a36Sopenharmony_ci			{ }
1190362306a36Sopenharmony_ci		},
1190462306a36Sopenharmony_ci		.chained = true,
1190562306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_SKU_IGNORE
1190662306a36Sopenharmony_ci	},
1190762306a36Sopenharmony_ci	[ALC662_FIXUP_NO_JACK_DETECT] = {
1190862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1190962306a36Sopenharmony_ci		.v.func = alc_fixup_no_jack_detect,
1191062306a36Sopenharmony_ci	},
1191162306a36Sopenharmony_ci	[ALC662_FIXUP_ZOTAC_Z68] = {
1191262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1191362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1191462306a36Sopenharmony_ci			{ 0x1b, 0x02214020 }, /* Front HP */
1191562306a36Sopenharmony_ci			{ }
1191662306a36Sopenharmony_ci		}
1191762306a36Sopenharmony_ci	},
1191862306a36Sopenharmony_ci	[ALC662_FIXUP_INV_DMIC] = {
1191962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1192062306a36Sopenharmony_ci		.v.func = alc_fixup_inv_dmic,
1192162306a36Sopenharmony_ci	},
1192262306a36Sopenharmony_ci	[ALC668_FIXUP_DELL_XPS13] = {
1192362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1192462306a36Sopenharmony_ci		.v.func = alc_fixup_dell_xps13,
1192562306a36Sopenharmony_ci		.chained = true,
1192662306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
1192762306a36Sopenharmony_ci	},
1192862306a36Sopenharmony_ci	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
1192962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1193062306a36Sopenharmony_ci		.v.func = alc_fixup_disable_aamix,
1193162306a36Sopenharmony_ci		.chained = true,
1193262306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
1193362306a36Sopenharmony_ci	},
1193462306a36Sopenharmony_ci	[ALC668_FIXUP_AUTO_MUTE] = {
1193562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1193662306a36Sopenharmony_ci		.v.func = alc_fixup_auto_mute_via_amp,
1193762306a36Sopenharmony_ci		.chained = true,
1193862306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
1193962306a36Sopenharmony_ci	},
1194062306a36Sopenharmony_ci	[ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
1194162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1194262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1194362306a36Sopenharmony_ci			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
1194462306a36Sopenharmony_ci			/* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
1194562306a36Sopenharmony_ci			{ }
1194662306a36Sopenharmony_ci		},
1194762306a36Sopenharmony_ci		.chained = true,
1194862306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_HEADSET_MODE
1194962306a36Sopenharmony_ci	},
1195062306a36Sopenharmony_ci	[ALC662_FIXUP_HEADSET_MODE] = {
1195162306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1195262306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_alc662,
1195362306a36Sopenharmony_ci	},
1195462306a36Sopenharmony_ci	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
1195562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1195662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1195762306a36Sopenharmony_ci			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
1195862306a36Sopenharmony_ci			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
1195962306a36Sopenharmony_ci			{ }
1196062306a36Sopenharmony_ci		},
1196162306a36Sopenharmony_ci		.chained = true,
1196262306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_HEADSET_MODE
1196362306a36Sopenharmony_ci	},
1196462306a36Sopenharmony_ci	[ALC668_FIXUP_HEADSET_MODE] = {
1196562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1196662306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_alc668,
1196762306a36Sopenharmony_ci	},
1196862306a36Sopenharmony_ci	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {
1196962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1197062306a36Sopenharmony_ci		.v.func = alc_fixup_bass_chmap,
1197162306a36Sopenharmony_ci		.chained = true,
1197262306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_ASUS_MODE4
1197362306a36Sopenharmony_ci	},
1197462306a36Sopenharmony_ci	[ALC662_FIXUP_BASS_16] = {
1197562306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1197662306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1197762306a36Sopenharmony_ci			{0x16, 0x80106111}, /* bass speaker */
1197862306a36Sopenharmony_ci			{}
1197962306a36Sopenharmony_ci		},
1198062306a36Sopenharmony_ci		.chained = true,
1198162306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_BASS_CHMAP,
1198262306a36Sopenharmony_ci	},
1198362306a36Sopenharmony_ci	[ALC662_FIXUP_BASS_1A] = {
1198462306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1198562306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1198662306a36Sopenharmony_ci			{0x1a, 0x80106111}, /* bass speaker */
1198762306a36Sopenharmony_ci			{}
1198862306a36Sopenharmony_ci		},
1198962306a36Sopenharmony_ci		.chained = true,
1199062306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_BASS_CHMAP,
1199162306a36Sopenharmony_ci	},
1199262306a36Sopenharmony_ci	[ALC662_FIXUP_BASS_CHMAP] = {
1199362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1199462306a36Sopenharmony_ci		.v.func = alc_fixup_bass_chmap,
1199562306a36Sopenharmony_ci	},
1199662306a36Sopenharmony_ci	[ALC662_FIXUP_ASUS_Nx50] = {
1199762306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1199862306a36Sopenharmony_ci		.v.func = alc_fixup_auto_mute_via_amp,
1199962306a36Sopenharmony_ci		.chained = true,
1200062306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_BASS_1A
1200162306a36Sopenharmony_ci	},
1200262306a36Sopenharmony_ci	[ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
1200362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1200462306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode_alc668,
1200562306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_BASS_CHMAP
1200662306a36Sopenharmony_ci	},
1200762306a36Sopenharmony_ci	[ALC668_FIXUP_ASUS_Nx51] = {
1200862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1200962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1201062306a36Sopenharmony_ci			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
1201162306a36Sopenharmony_ci			{ 0x1a, 0x90170151 }, /* bass speaker */
1201262306a36Sopenharmony_ci			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
1201362306a36Sopenharmony_ci			{}
1201462306a36Sopenharmony_ci		},
1201562306a36Sopenharmony_ci		.chained = true,
1201662306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
1201762306a36Sopenharmony_ci	},
1201862306a36Sopenharmony_ci	[ALC668_FIXUP_MIC_COEF] = {
1201962306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
1202062306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
1202162306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
1202262306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
1202362306a36Sopenharmony_ci			{}
1202462306a36Sopenharmony_ci		},
1202562306a36Sopenharmony_ci	},
1202662306a36Sopenharmony_ci	[ALC668_FIXUP_ASUS_G751] = {
1202762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1202862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1202962306a36Sopenharmony_ci			{ 0x16, 0x0421101f }, /* HP */
1203062306a36Sopenharmony_ci			{}
1203162306a36Sopenharmony_ci		},
1203262306a36Sopenharmony_ci		.chained = true,
1203362306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_MIC_COEF
1203462306a36Sopenharmony_ci	},
1203562306a36Sopenharmony_ci	[ALC891_FIXUP_HEADSET_MODE] = {
1203662306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1203762306a36Sopenharmony_ci		.v.func = alc_fixup_headset_mode,
1203862306a36Sopenharmony_ci	},
1203962306a36Sopenharmony_ci	[ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
1204062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1204162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1204262306a36Sopenharmony_ci			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
1204362306a36Sopenharmony_ci			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
1204462306a36Sopenharmony_ci			{ }
1204562306a36Sopenharmony_ci		},
1204662306a36Sopenharmony_ci		.chained = true,
1204762306a36Sopenharmony_ci		.chain_id = ALC891_FIXUP_HEADSET_MODE
1204862306a36Sopenharmony_ci	},
1204962306a36Sopenharmony_ci	[ALC662_FIXUP_ACER_VERITON] = {
1205062306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1205162306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1205262306a36Sopenharmony_ci			{ 0x15, 0x50170120 }, /* no internal speaker */
1205362306a36Sopenharmony_ci			{ }
1205462306a36Sopenharmony_ci		}
1205562306a36Sopenharmony_ci	},
1205662306a36Sopenharmony_ci	[ALC892_FIXUP_ASROCK_MOBO] = {
1205762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1205862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1205962306a36Sopenharmony_ci			{ 0x15, 0x40f000f0 }, /* disabled */
1206062306a36Sopenharmony_ci			{ 0x16, 0x40f000f0 }, /* disabled */
1206162306a36Sopenharmony_ci			{ }
1206262306a36Sopenharmony_ci		}
1206362306a36Sopenharmony_ci	},
1206462306a36Sopenharmony_ci	[ALC662_FIXUP_USI_FUNC] = {
1206562306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1206662306a36Sopenharmony_ci		.v.func = alc662_fixup_usi_headset_mic,
1206762306a36Sopenharmony_ci	},
1206862306a36Sopenharmony_ci	[ALC662_FIXUP_USI_HEADSET_MODE] = {
1206962306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1207062306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1207162306a36Sopenharmony_ci			{ 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
1207262306a36Sopenharmony_ci			{ 0x18, 0x01a1903d },
1207362306a36Sopenharmony_ci			{ }
1207462306a36Sopenharmony_ci		},
1207562306a36Sopenharmony_ci		.chained = true,
1207662306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_USI_FUNC
1207762306a36Sopenharmony_ci	},
1207862306a36Sopenharmony_ci	[ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
1207962306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1208062306a36Sopenharmony_ci		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
1208162306a36Sopenharmony_ci	},
1208262306a36Sopenharmony_ci	[ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
1208362306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1208462306a36Sopenharmony_ci		.v.func = alc662_fixup_aspire_ethos_hp,
1208562306a36Sopenharmony_ci	},
1208662306a36Sopenharmony_ci	[ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
1208762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1208862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1208962306a36Sopenharmony_ci			{ 0x15, 0x92130110 }, /* front speakers */
1209062306a36Sopenharmony_ci			{ 0x18, 0x99130111 }, /* center/subwoofer */
1209162306a36Sopenharmony_ci			{ 0x1b, 0x11130012 }, /* surround plus jack for HP */
1209262306a36Sopenharmony_ci			{ }
1209362306a36Sopenharmony_ci		},
1209462306a36Sopenharmony_ci		.chained = true,
1209562306a36Sopenharmony_ci		.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
1209662306a36Sopenharmony_ci	},
1209762306a36Sopenharmony_ci	[ALC671_FIXUP_HP_HEADSET_MIC2] = {
1209862306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1209962306a36Sopenharmony_ci		.v.func = alc671_fixup_hp_headset_mic2,
1210062306a36Sopenharmony_ci	},
1210162306a36Sopenharmony_ci	[ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
1210262306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1210362306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1210462306a36Sopenharmony_ci			{ 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
1210562306a36Sopenharmony_ci			{ }
1210662306a36Sopenharmony_ci		},
1210762306a36Sopenharmony_ci		.chained = true,
1210862306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_USI_FUNC
1210962306a36Sopenharmony_ci	},
1211062306a36Sopenharmony_ci	[ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
1211162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1211262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1211362306a36Sopenharmony_ci			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
1211462306a36Sopenharmony_ci			{ 0x1b, 0x0221144f },
1211562306a36Sopenharmony_ci			{ }
1211662306a36Sopenharmony_ci		},
1211762306a36Sopenharmony_ci		.chained = true,
1211862306a36Sopenharmony_ci		.chain_id = ALC662_FIXUP_USI_FUNC
1211962306a36Sopenharmony_ci	},
1212062306a36Sopenharmony_ci	[ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
1212162306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1212262306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1212362306a36Sopenharmony_ci			{ 0x1b, 0x04a1112c },
1212462306a36Sopenharmony_ci			{ }
1212562306a36Sopenharmony_ci		},
1212662306a36Sopenharmony_ci		.chained = true,
1212762306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_HEADSET_MIC
1212862306a36Sopenharmony_ci	},
1212962306a36Sopenharmony_ci	[ALC668_FIXUP_HEADSET_MIC] = {
1213062306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1213162306a36Sopenharmony_ci		.v.func = alc269_fixup_headset_mic,
1213262306a36Sopenharmony_ci		.chained = true,
1213362306a36Sopenharmony_ci		.chain_id = ALC668_FIXUP_MIC_DET_COEF
1213462306a36Sopenharmony_ci	},
1213562306a36Sopenharmony_ci	[ALC668_FIXUP_MIC_DET_COEF] = {
1213662306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
1213762306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
1213862306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
1213962306a36Sopenharmony_ci			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
1214062306a36Sopenharmony_ci			{}
1214162306a36Sopenharmony_ci		},
1214262306a36Sopenharmony_ci	},
1214362306a36Sopenharmony_ci	[ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
1214462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1214562306a36Sopenharmony_ci		.v.func = alc897_fixup_lenovo_headset_mic,
1214662306a36Sopenharmony_ci	},
1214762306a36Sopenharmony_ci	[ALC897_FIXUP_HEADSET_MIC_PIN] = {
1214862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1214962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1215062306a36Sopenharmony_ci			{ 0x1a, 0x03a11050 },
1215162306a36Sopenharmony_ci			{ }
1215262306a36Sopenharmony_ci		},
1215362306a36Sopenharmony_ci		.chained = true,
1215462306a36Sopenharmony_ci		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
1215562306a36Sopenharmony_ci	},
1215662306a36Sopenharmony_ci	[ALC897_FIXUP_HP_HSMIC_VERB] = {
1215762306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1215862306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1215962306a36Sopenharmony_ci			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
1216062306a36Sopenharmony_ci			{ }
1216162306a36Sopenharmony_ci		},
1216262306a36Sopenharmony_ci	},
1216362306a36Sopenharmony_ci	[ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
1216462306a36Sopenharmony_ci		.type = HDA_FIXUP_FUNC,
1216562306a36Sopenharmony_ci		.v.func = alc897_fixup_lenovo_headset_mode,
1216662306a36Sopenharmony_ci	},
1216762306a36Sopenharmony_ci	[ALC897_FIXUP_HEADSET_MIC_PIN2] = {
1216862306a36Sopenharmony_ci		.type = HDA_FIXUP_PINS,
1216962306a36Sopenharmony_ci		.v.pins = (const struct hda_pintbl[]) {
1217062306a36Sopenharmony_ci			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
1217162306a36Sopenharmony_ci			{ }
1217262306a36Sopenharmony_ci		},
1217362306a36Sopenharmony_ci		.chained = true,
1217462306a36Sopenharmony_ci		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
1217562306a36Sopenharmony_ci	},
1217662306a36Sopenharmony_ci	[ALC897_FIXUP_UNIS_H3C_X500S] = {
1217762306a36Sopenharmony_ci		.type = HDA_FIXUP_VERBS,
1217862306a36Sopenharmony_ci		.v.verbs = (const struct hda_verb[]) {
1217962306a36Sopenharmony_ci			{ 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
1218062306a36Sopenharmony_ci			{}
1218162306a36Sopenharmony_ci		},
1218262306a36Sopenharmony_ci	},
1218362306a36Sopenharmony_ci};
1218462306a36Sopenharmony_ci
1218562306a36Sopenharmony_cistatic const struct snd_pci_quirk alc662_fixup_tbl[] = {
1218662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
1218762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
1218862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
1218962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
1219062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
1219162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
1219262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
1219362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
1219462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
1219562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
1219662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
1219762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1219862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1219962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
1220062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
1220162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
1220262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1220362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1220462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1220562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1220662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
1220762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
1220862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
1220962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
1221062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
1221162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
1221262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
1221362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
1221462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
1221562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
1221662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
1221762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
1221862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
1221962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
1222062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
1222162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
1222262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
1222362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
1222462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
1222562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
1222662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
1222762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
1222862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
1222962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
1223062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
1223162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
1223262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
1223362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
1223462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
1223562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
1223662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
1223762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
1223862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
1223962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
1224062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
1224162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),
1224262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
1224362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
1224462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
1224562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
1224662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
1224762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
1224862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
1224962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
1225062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
1225162306a36Sopenharmony_ci
1225262306a36Sopenharmony_ci#if 0
1225362306a36Sopenharmony_ci	/* Below is a quirk table taken from the old code.
1225462306a36Sopenharmony_ci	 * Basically the device should work as is without the fixup table.
1225562306a36Sopenharmony_ci	 * If BIOS doesn't give a proper info, enable the corresponding
1225662306a36Sopenharmony_ci	 * fixup entry.
1225762306a36Sopenharmony_ci	 */
1225862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
1225962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
1226062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
1226162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
1226262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
1226362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1226462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
1226562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
1226662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
1226762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1226862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
1226962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
1227062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
1227162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
1227262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
1227362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1227462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
1227562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
1227662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1227762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
1227862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
1227962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1228062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
1228162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
1228262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
1228362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1228462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
1228562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
1228662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1228762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
1228862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1228962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1229062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
1229162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
1229262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
1229362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
1229462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
1229562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
1229662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
1229762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
1229862306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
1229962306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
1230062306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
1230162306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
1230262306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
1230362306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
1230462306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
1230562306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
1230662306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
1230762306a36Sopenharmony_ci	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
1230862306a36Sopenharmony_ci#endif
1230962306a36Sopenharmony_ci	{}
1231062306a36Sopenharmony_ci};
1231162306a36Sopenharmony_ci
1231262306a36Sopenharmony_cistatic const struct hda_model_fixup alc662_fixup_models[] = {
1231362306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
1231462306a36Sopenharmony_ci	{.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
1231562306a36Sopenharmony_ci	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
1231662306a36Sopenharmony_ci	{.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
1231762306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
1231862306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
1231962306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
1232062306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
1232162306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
1232262306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
1232362306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
1232462306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
1232562306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
1232662306a36Sopenharmony_ci	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
1232762306a36Sopenharmony_ci	{.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
1232862306a36Sopenharmony_ci	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
1232962306a36Sopenharmony_ci	{.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
1233062306a36Sopenharmony_ci	{.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
1233162306a36Sopenharmony_ci	{.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
1233262306a36Sopenharmony_ci	{.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
1233362306a36Sopenharmony_ci	{.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
1233462306a36Sopenharmony_ci	{.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
1233562306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
1233662306a36Sopenharmony_ci	{.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
1233762306a36Sopenharmony_ci	{.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
1233862306a36Sopenharmony_ci	{.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
1233962306a36Sopenharmony_ci	{.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
1234062306a36Sopenharmony_ci	{.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
1234162306a36Sopenharmony_ci	{.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
1234262306a36Sopenharmony_ci	{.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
1234362306a36Sopenharmony_ci	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
1234462306a36Sopenharmony_ci	{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
1234562306a36Sopenharmony_ci	{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
1234662306a36Sopenharmony_ci	{}
1234762306a36Sopenharmony_ci};
1234862306a36Sopenharmony_ci
1234962306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
1235062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
1235162306a36Sopenharmony_ci		{0x17, 0x02211010},
1235262306a36Sopenharmony_ci		{0x18, 0x01a19030},
1235362306a36Sopenharmony_ci		{0x1a, 0x01813040},
1235462306a36Sopenharmony_ci		{0x21, 0x01014020}),
1235562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
1235662306a36Sopenharmony_ci		{0x16, 0x01813030},
1235762306a36Sopenharmony_ci		{0x17, 0x02211010},
1235862306a36Sopenharmony_ci		{0x18, 0x01a19040},
1235962306a36Sopenharmony_ci		{0x21, 0x01014020}),
1236062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
1236162306a36Sopenharmony_ci		{0x14, 0x01014010},
1236262306a36Sopenharmony_ci		{0x18, 0x01a19020},
1236362306a36Sopenharmony_ci		{0x1a, 0x0181302f},
1236462306a36Sopenharmony_ci		{0x1b, 0x0221401f}),
1236562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
1236662306a36Sopenharmony_ci		{0x12, 0x99a30130},
1236762306a36Sopenharmony_ci		{0x14, 0x90170110},
1236862306a36Sopenharmony_ci		{0x15, 0x0321101f},
1236962306a36Sopenharmony_ci		{0x16, 0x03011020}),
1237062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
1237162306a36Sopenharmony_ci		{0x12, 0x99a30140},
1237262306a36Sopenharmony_ci		{0x14, 0x90170110},
1237362306a36Sopenharmony_ci		{0x15, 0x0321101f},
1237462306a36Sopenharmony_ci		{0x16, 0x03011020}),
1237562306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
1237662306a36Sopenharmony_ci		{0x12, 0x99a30150},
1237762306a36Sopenharmony_ci		{0x14, 0x90170110},
1237862306a36Sopenharmony_ci		{0x15, 0x0321101f},
1237962306a36Sopenharmony_ci		{0x16, 0x03011020}),
1238062306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
1238162306a36Sopenharmony_ci		{0x14, 0x90170110},
1238262306a36Sopenharmony_ci		{0x15, 0x0321101f},
1238362306a36Sopenharmony_ci		{0x16, 0x03011020}),
1238462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
1238562306a36Sopenharmony_ci		{0x12, 0x90a60130},
1238662306a36Sopenharmony_ci		{0x14, 0x90170110},
1238762306a36Sopenharmony_ci		{0x15, 0x0321101f}),
1238862306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
1238962306a36Sopenharmony_ci		{0x14, 0x01014010},
1239062306a36Sopenharmony_ci		{0x17, 0x90170150},
1239162306a36Sopenharmony_ci		{0x19, 0x02a11060},
1239262306a36Sopenharmony_ci		{0x1b, 0x01813030},
1239362306a36Sopenharmony_ci		{0x21, 0x02211020}),
1239462306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
1239562306a36Sopenharmony_ci		{0x14, 0x01014010},
1239662306a36Sopenharmony_ci		{0x18, 0x01a19040},
1239762306a36Sopenharmony_ci		{0x1b, 0x01813030},
1239862306a36Sopenharmony_ci		{0x21, 0x02211020}),
1239962306a36Sopenharmony_ci	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
1240062306a36Sopenharmony_ci		{0x14, 0x01014020},
1240162306a36Sopenharmony_ci		{0x17, 0x90170110},
1240262306a36Sopenharmony_ci		{0x18, 0x01a19050},
1240362306a36Sopenharmony_ci		{0x1b, 0x01813040},
1240462306a36Sopenharmony_ci		{0x21, 0x02211030}),
1240562306a36Sopenharmony_ci	{}
1240662306a36Sopenharmony_ci};
1240762306a36Sopenharmony_ci
1240862306a36Sopenharmony_ci/*
1240962306a36Sopenharmony_ci */
1241062306a36Sopenharmony_cistatic int patch_alc662(struct hda_codec *codec)
1241162306a36Sopenharmony_ci{
1241262306a36Sopenharmony_ci	struct alc_spec *spec;
1241362306a36Sopenharmony_ci	int err;
1241462306a36Sopenharmony_ci
1241562306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0x0b);
1241662306a36Sopenharmony_ci	if (err < 0)
1241762306a36Sopenharmony_ci		return err;
1241862306a36Sopenharmony_ci
1241962306a36Sopenharmony_ci	spec = codec->spec;
1242062306a36Sopenharmony_ci
1242162306a36Sopenharmony_ci	spec->shutup = alc_eapd_shutup;
1242262306a36Sopenharmony_ci
1242362306a36Sopenharmony_ci	/* handle multiple HPs as is */
1242462306a36Sopenharmony_ci	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
1242562306a36Sopenharmony_ci
1242662306a36Sopenharmony_ci	alc_fix_pll_init(codec, 0x20, 0x04, 15);
1242762306a36Sopenharmony_ci
1242862306a36Sopenharmony_ci	switch (codec->core.vendor_id) {
1242962306a36Sopenharmony_ci	case 0x10ec0668:
1243062306a36Sopenharmony_ci		spec->init_hook = alc668_restore_default_value;
1243162306a36Sopenharmony_ci		break;
1243262306a36Sopenharmony_ci	}
1243362306a36Sopenharmony_ci
1243462306a36Sopenharmony_ci	alc_pre_init(codec);
1243562306a36Sopenharmony_ci
1243662306a36Sopenharmony_ci	snd_hda_pick_fixup(codec, alc662_fixup_models,
1243762306a36Sopenharmony_ci		       alc662_fixup_tbl, alc662_fixups);
1243862306a36Sopenharmony_ci	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
1243962306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1244062306a36Sopenharmony_ci
1244162306a36Sopenharmony_ci	alc_auto_parse_customize_define(codec);
1244262306a36Sopenharmony_ci
1244362306a36Sopenharmony_ci	if (has_cdefine_beep(codec))
1244462306a36Sopenharmony_ci		spec->gen.beep_nid = 0x01;
1244562306a36Sopenharmony_ci
1244662306a36Sopenharmony_ci	if ((alc_get_coef0(codec) & (1 << 14)) &&
1244762306a36Sopenharmony_ci	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
1244862306a36Sopenharmony_ci	    spec->cdefine.platform_type == 1) {
1244962306a36Sopenharmony_ci		err = alc_codec_rename(codec, "ALC272X");
1245062306a36Sopenharmony_ci		if (err < 0)
1245162306a36Sopenharmony_ci			goto error;
1245262306a36Sopenharmony_ci	}
1245362306a36Sopenharmony_ci
1245462306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
1245562306a36Sopenharmony_ci	err = alc662_parse_auto_config(codec);
1245662306a36Sopenharmony_ci	if (err < 0)
1245762306a36Sopenharmony_ci		goto error;
1245862306a36Sopenharmony_ci
1245962306a36Sopenharmony_ci	if (!spec->gen.no_analog && spec->gen.beep_nid) {
1246062306a36Sopenharmony_ci		switch (codec->core.vendor_id) {
1246162306a36Sopenharmony_ci		case 0x10ec0662:
1246262306a36Sopenharmony_ci			err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1246362306a36Sopenharmony_ci			break;
1246462306a36Sopenharmony_ci		case 0x10ec0272:
1246562306a36Sopenharmony_ci		case 0x10ec0663:
1246662306a36Sopenharmony_ci		case 0x10ec0665:
1246762306a36Sopenharmony_ci		case 0x10ec0668:
1246862306a36Sopenharmony_ci			err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
1246962306a36Sopenharmony_ci			break;
1247062306a36Sopenharmony_ci		case 0x10ec0273:
1247162306a36Sopenharmony_ci			err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
1247262306a36Sopenharmony_ci			break;
1247362306a36Sopenharmony_ci		}
1247462306a36Sopenharmony_ci		if (err < 0)
1247562306a36Sopenharmony_ci			goto error;
1247662306a36Sopenharmony_ci	}
1247762306a36Sopenharmony_ci
1247862306a36Sopenharmony_ci	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1247962306a36Sopenharmony_ci
1248062306a36Sopenharmony_ci	return 0;
1248162306a36Sopenharmony_ci
1248262306a36Sopenharmony_ci error:
1248362306a36Sopenharmony_ci	alc_free(codec);
1248462306a36Sopenharmony_ci	return err;
1248562306a36Sopenharmony_ci}
1248662306a36Sopenharmony_ci
1248762306a36Sopenharmony_ci/*
1248862306a36Sopenharmony_ci * ALC680 support
1248962306a36Sopenharmony_ci */
1249062306a36Sopenharmony_ci
1249162306a36Sopenharmony_cistatic int alc680_parse_auto_config(struct hda_codec *codec)
1249262306a36Sopenharmony_ci{
1249362306a36Sopenharmony_ci	return alc_parse_auto_config(codec, NULL, NULL);
1249462306a36Sopenharmony_ci}
1249562306a36Sopenharmony_ci
1249662306a36Sopenharmony_ci/*
1249762306a36Sopenharmony_ci */
1249862306a36Sopenharmony_cistatic int patch_alc680(struct hda_codec *codec)
1249962306a36Sopenharmony_ci{
1250062306a36Sopenharmony_ci	int err;
1250162306a36Sopenharmony_ci
1250262306a36Sopenharmony_ci	/* ALC680 has no aa-loopback mixer */
1250362306a36Sopenharmony_ci	err = alc_alloc_spec(codec, 0);
1250462306a36Sopenharmony_ci	if (err < 0)
1250562306a36Sopenharmony_ci		return err;
1250662306a36Sopenharmony_ci
1250762306a36Sopenharmony_ci	/* automatic parse from the BIOS config */
1250862306a36Sopenharmony_ci	err = alc680_parse_auto_config(codec);
1250962306a36Sopenharmony_ci	if (err < 0) {
1251062306a36Sopenharmony_ci		alc_free(codec);
1251162306a36Sopenharmony_ci		return err;
1251262306a36Sopenharmony_ci	}
1251362306a36Sopenharmony_ci
1251462306a36Sopenharmony_ci	return 0;
1251562306a36Sopenharmony_ci}
1251662306a36Sopenharmony_ci
1251762306a36Sopenharmony_ci/*
1251862306a36Sopenharmony_ci * patch entries
1251962306a36Sopenharmony_ci */
1252062306a36Sopenharmony_cistatic const struct hda_device_id snd_hda_id_realtek[] = {
1252162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
1252262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
1252362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
1252462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
1252562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
1252662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
1252762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
1252862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
1252962306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
1253062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
1253162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
1253262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
1253362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
1253462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
1253562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
1253662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
1253762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
1253862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
1253962306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
1254062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
1254162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
1254262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
1254362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
1254462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
1254562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
1254662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
1254762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
1254862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
1254962306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
1255062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
1255162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
1255262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
1255362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
1255462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
1255562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
1255662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
1255762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
1255862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
1255962306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
1256062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
1256162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
1256262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
1256362306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
1256462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
1256562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
1256662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
1256762306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
1256862306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
1256962306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
1257062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
1257162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
1257262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
1257362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
1257462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
1257562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
1257662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
1257762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
1257862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
1257962306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
1258062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
1258162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
1258262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
1258362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
1258462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
1258562306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
1258662306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
1258762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
1258862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
1258962306a36Sopenharmony_ci	HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
1259062306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
1259162306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
1259262306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
1259362306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
1259462306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
1259562306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
1259662306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
1259762306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
1259862306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
1259962306a36Sopenharmony_ci	HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
1260062306a36Sopenharmony_ci	{} /* terminator */
1260162306a36Sopenharmony_ci};
1260262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
1260362306a36Sopenharmony_ci
1260462306a36Sopenharmony_ciMODULE_LICENSE("GPL");
1260562306a36Sopenharmony_ciMODULE_DESCRIPTION("Realtek HD-audio codec");
1260662306a36Sopenharmony_ci
1260762306a36Sopenharmony_cistatic struct hda_codec_driver realtek_driver = {
1260862306a36Sopenharmony_ci	.id = snd_hda_id_realtek,
1260962306a36Sopenharmony_ci};
1261062306a36Sopenharmony_ci
1261162306a36Sopenharmony_cimodule_hda_codec_driver(realtek_driver);
12612