brintos

brintos / linux-shallow public Read only

0
0
Text · 437.0 KiB · 24b4fe9 Raw
13358 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Universal Interface for Intel High Definition Audio Codec4 *5 * HD audio interface patch for Realtek ALC codecs6 *7 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>8 *                    PeiSen Hou <pshou@realtek.com.tw>9 *                    Takashi Iwai <tiwai@suse.de>10 *                    Jonathan Woithe <jwoithe@just42.net>11 */12 13#include <linux/acpi.h>14#include <linux/cleanup.h>15#include <linux/init.h>16#include <linux/delay.h>17#include <linux/slab.h>18#include <linux/pci.h>19#include <linux/dmi.h>20#include <linux/module.h>21#include <linux/i2c.h>22#include <linux/input.h>23#include <linux/leds.h>24#include <linux/ctype.h>25#include <linux/spi/spi.h>26#include <sound/core.h>27#include <sound/jack.h>28#include <sound/hda_codec.h>29#include "hda_local.h"30#include "hda_auto_parser.h"31#include "hda_jack.h"32#include "hda_generic.h"33#include "hda_component.h"34 35/* keep halting ALC5505 DSP, for power saving */36#define HALT_REALTEK_ALC550537 38/* extra amp-initialization sequence types */39enum {40	ALC_INIT_UNDEFINED,41	ALC_INIT_NONE,42	ALC_INIT_DEFAULT,43};44 45enum {46	ALC_HEADSET_MODE_UNKNOWN,47	ALC_HEADSET_MODE_UNPLUGGED,48	ALC_HEADSET_MODE_HEADSET,49	ALC_HEADSET_MODE_MIC,50	ALC_HEADSET_MODE_HEADPHONE,51};52 53enum {54	ALC_HEADSET_TYPE_UNKNOWN,55	ALC_HEADSET_TYPE_CTIA,56	ALC_HEADSET_TYPE_OMTP,57};58 59enum {60	ALC_KEY_MICMUTE_INDEX,61};62 63struct alc_customize_define {64	unsigned int  sku_cfg;65	unsigned char port_connectivity;66	unsigned char check_sum;67	unsigned char customization;68	unsigned char external_amp;69	unsigned int  enable_pcbeep:1;70	unsigned int  platform_type:1;71	unsigned int  swap:1;72	unsigned int  override:1;73	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */74};75 76struct alc_coef_led {77	unsigned int idx;78	unsigned int mask;79	unsigned int on;80	unsigned int off;81};82 83struct alc_spec {84	struct hda_gen_spec gen; /* must be at head */85 86	/* codec parameterization */87	struct alc_customize_define cdefine;88	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */89 90	/* GPIO bits */91	unsigned int gpio_mask;92	unsigned int gpio_dir;93	unsigned int gpio_data;94	bool gpio_write_delay;	/* add a delay before writing gpio_data */95 96	/* mute LED for HP laptops, see vref_mute_led_set() */97	int mute_led_polarity;98	int micmute_led_polarity;99	hda_nid_t mute_led_nid;100	hda_nid_t cap_mute_led_nid;101 102	unsigned int gpio_mute_led_mask;103	unsigned int gpio_mic_led_mask;104	struct alc_coef_led mute_led_coef;105	struct alc_coef_led mic_led_coef;106	struct mutex coef_mutex;107 108	hda_nid_t headset_mic_pin;109	hda_nid_t headphone_mic_pin;110	int current_headset_mode;111	int current_headset_type;112 113	/* hooks */114	void (*init_hook)(struct hda_codec *codec);115	void (*power_hook)(struct hda_codec *codec);116	void (*shutup)(struct hda_codec *codec);117 118	int init_amp;119	int codec_variant;	/* flag for other variants */120	unsigned int has_alc5505_dsp:1;121	unsigned int no_depop_delay:1;122	unsigned int done_hp_init:1;123	unsigned int no_shutup_pins:1;124	unsigned int ultra_low_power:1;125	unsigned int has_hs_key:1;126	unsigned int no_internal_mic_pin:1;127	unsigned int en_3kpull_low:1;128	int num_speaker_amps;129 130	/* for PLL fix */131	hda_nid_t pll_nid;132	unsigned int pll_coef_idx, pll_coef_bit;133	unsigned int coef0;134	struct input_dev *kb_dev;135	u8 alc_mute_keycode_map[1];136 137	/* component binding */138	struct hda_component_parent comps;139};140 141/*142 * COEF access helper functions143 */144 145static void coef_mutex_lock(struct hda_codec *codec)146{147	struct alc_spec *spec = codec->spec;148 149	snd_hda_power_up_pm(codec);150	mutex_lock(&spec->coef_mutex);151}152 153static void coef_mutex_unlock(struct hda_codec *codec)154{155	struct alc_spec *spec = codec->spec;156 157	mutex_unlock(&spec->coef_mutex);158	snd_hda_power_down_pm(codec);159}160 161static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,162				 unsigned int coef_idx)163{164	unsigned int val;165 166	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);167	val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);168	return val;169}170 171static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,172			       unsigned int coef_idx)173{174	unsigned int val;175 176	coef_mutex_lock(codec);177	val = __alc_read_coefex_idx(codec, nid, coef_idx);178	coef_mutex_unlock(codec);179	return val;180}181 182#define alc_read_coef_idx(codec, coef_idx) \183	alc_read_coefex_idx(codec, 0x20, coef_idx)184 185static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,186				   unsigned int coef_idx, unsigned int coef_val)187{188	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);189	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);190}191 192static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,193				 unsigned int coef_idx, unsigned int coef_val)194{195	coef_mutex_lock(codec);196	__alc_write_coefex_idx(codec, nid, coef_idx, coef_val);197	coef_mutex_unlock(codec);198}199 200#define alc_write_coef_idx(codec, coef_idx, coef_val) \201	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)202 203static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,204				    unsigned int coef_idx, unsigned int mask,205				    unsigned int bits_set)206{207	unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);208 209	if (val != -1)210		__alc_write_coefex_idx(codec, nid, coef_idx,211				       (val & ~mask) | bits_set);212}213 214static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,215				  unsigned int coef_idx, unsigned int mask,216				  unsigned int bits_set)217{218	coef_mutex_lock(codec);219	__alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);220	coef_mutex_unlock(codec);221}222 223#define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\224	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)225 226/* a special bypass for COEF 0; read the cached value at the second time */227static unsigned int alc_get_coef0(struct hda_codec *codec)228{229	struct alc_spec *spec = codec->spec;230 231	if (!spec->coef0)232		spec->coef0 = alc_read_coef_idx(codec, 0);233	return spec->coef0;234}235 236/* coef writes/updates batch */237struct coef_fw {238	unsigned char nid;239	unsigned char idx;240	unsigned short mask;241	unsigned short val;242};243 244#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \245	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }246#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)247#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)248#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)249 250static void alc_process_coef_fw(struct hda_codec *codec,251				const struct coef_fw *fw)252{253	coef_mutex_lock(codec);254	for (; fw->nid; fw++) {255		if (fw->mask == (unsigned short)-1)256			__alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);257		else258			__alc_update_coefex_idx(codec, fw->nid, fw->idx,259						fw->mask, fw->val);260	}261	coef_mutex_unlock(codec);262}263 264/*265 * GPIO setup tables, used in initialization266 */267 268/* Enable GPIO mask and set output */269static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)270{271	struct alc_spec *spec = codec->spec;272 273	spec->gpio_mask |= mask;274	spec->gpio_dir |= mask;275	spec->gpio_data |= mask;276}277 278static void alc_write_gpio_data(struct hda_codec *codec)279{280	struct alc_spec *spec = codec->spec;281 282	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,283			    spec->gpio_data);284}285 286static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,287				 bool on)288{289	struct alc_spec *spec = codec->spec;290	unsigned int oldval = spec->gpio_data;291 292	if (on)293		spec->gpio_data |= mask;294	else295		spec->gpio_data &= ~mask;296	if (oldval != spec->gpio_data)297		alc_write_gpio_data(codec);298}299 300static void alc_write_gpio(struct hda_codec *codec)301{302	struct alc_spec *spec = codec->spec;303 304	if (!spec->gpio_mask)305		return;306 307	snd_hda_codec_write(codec, codec->core.afg, 0,308			    AC_VERB_SET_GPIO_MASK, spec->gpio_mask);309	snd_hda_codec_write(codec, codec->core.afg, 0,310			    AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);311	if (spec->gpio_write_delay)312		msleep(1);313	alc_write_gpio_data(codec);314}315 316static void alc_fixup_gpio(struct hda_codec *codec, int action,317			   unsigned int mask)318{319	if (action == HDA_FIXUP_ACT_PRE_PROBE)320		alc_setup_gpio(codec, mask);321}322 323static void alc_fixup_gpio1(struct hda_codec *codec,324			    const struct hda_fixup *fix, int action)325{326	alc_fixup_gpio(codec, action, 0x01);327}328 329static void alc_fixup_gpio2(struct hda_codec *codec,330			    const struct hda_fixup *fix, int action)331{332	alc_fixup_gpio(codec, action, 0x02);333}334 335static void alc_fixup_gpio3(struct hda_codec *codec,336			    const struct hda_fixup *fix, int action)337{338	alc_fixup_gpio(codec, action, 0x03);339}340 341static void alc_fixup_gpio4(struct hda_codec *codec,342			    const struct hda_fixup *fix, int action)343{344	alc_fixup_gpio(codec, action, 0x04);345}346 347static void alc_fixup_micmute_led(struct hda_codec *codec,348				  const struct hda_fixup *fix, int action)349{350	if (action == HDA_FIXUP_ACT_PRE_PROBE)351		snd_hda_gen_add_micmute_led_cdev(codec, NULL);352}353 354/*355 * Fix hardware PLL issue356 * On some codecs, the analog PLL gating control must be off while357 * the default value is 1.358 */359static void alc_fix_pll(struct hda_codec *codec)360{361	struct alc_spec *spec = codec->spec;362 363	if (spec->pll_nid)364		alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,365				      1 << spec->pll_coef_bit, 0);366}367 368static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,369			     unsigned int coef_idx, unsigned int coef_bit)370{371	struct alc_spec *spec = codec->spec;372	spec->pll_nid = nid;373	spec->pll_coef_idx = coef_idx;374	spec->pll_coef_bit = coef_bit;375	alc_fix_pll(codec);376}377 378/* update the master volume per volume-knob's unsol event */379static void alc_update_knob_master(struct hda_codec *codec,380				   struct hda_jack_callback *jack)381{382	unsigned int val;383	struct snd_kcontrol *kctl;384	struct snd_ctl_elem_value *uctl;385 386	kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");387	if (!kctl)388		return;389	uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);390	if (!uctl)391		return;392	val = snd_hda_codec_read(codec, jack->nid, 0,393				 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);394	val &= HDA_AMP_VOLMASK;395	uctl->value.integer.value[0] = val;396	uctl->value.integer.value[1] = val;397	kctl->put(kctl, uctl);398	kfree(uctl);399}400 401static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)402{403	/* For some reason, the res given from ALC880 is broken.404	   Here we adjust it properly. */405	snd_hda_jack_unsol_event(codec, res >> 2);406}407 408/* Change EAPD to verb control */409static void alc_fill_eapd_coef(struct hda_codec *codec)410{411	int coef;412 413	coef = alc_get_coef0(codec);414 415	switch (codec->core.vendor_id) {416	case 0x10ec0262:417		alc_update_coef_idx(codec, 0x7, 0, 1<<5);418		break;419	case 0x10ec0267:420	case 0x10ec0268:421		alc_update_coef_idx(codec, 0x7, 0, 1<<13);422		break;423	case 0x10ec0269:424		if ((coef & 0x00f0) == 0x0010)425			alc_update_coef_idx(codec, 0xd, 0, 1<<14);426		if ((coef & 0x00f0) == 0x0020)427			alc_update_coef_idx(codec, 0x4, 1<<15, 0);428		if ((coef & 0x00f0) == 0x0030)429			alc_update_coef_idx(codec, 0x10, 1<<9, 0);430		break;431	case 0x10ec0280:432	case 0x10ec0284:433	case 0x10ec0290:434	case 0x10ec0292:435		alc_update_coef_idx(codec, 0x4, 1<<15, 0);436		break;437	case 0x10ec0225:438	case 0x10ec0295:439	case 0x10ec0299:440		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);441		fallthrough;442	case 0x10ec0215:443	case 0x10ec0285:444	case 0x10ec0289:445		alc_update_coef_idx(codec, 0x36, 1<<13, 0);446		fallthrough;447	case 0x10ec0230:448	case 0x10ec0233:449	case 0x10ec0235:450	case 0x10ec0236:451	case 0x10ec0245:452	case 0x10ec0255:453	case 0x10ec0256:454	case 0x19e58326:455	case 0x10ec0257:456	case 0x10ec0282:457	case 0x10ec0283:458	case 0x10ec0286:459	case 0x10ec0288:460	case 0x10ec0298:461	case 0x10ec0300:462		alc_update_coef_idx(codec, 0x10, 1<<9, 0);463		break;464	case 0x10ec0275:465		alc_update_coef_idx(codec, 0xe, 0, 1<<0);466		break;467	case 0x10ec0287:468		alc_update_coef_idx(codec, 0x10, 1<<9, 0);469		alc_write_coef_idx(codec, 0x8, 0x4ab7);470		break;471	case 0x10ec0293:472		alc_update_coef_idx(codec, 0xa, 1<<13, 0);473		break;474	case 0x10ec0234:475	case 0x10ec0274:476	case 0x10ec0294:477	case 0x10ec0700:478	case 0x10ec0701:479	case 0x10ec0703:480	case 0x10ec0711:481		alc_update_coef_idx(codec, 0x10, 1<<15, 0);482		break;483	case 0x10ec0662:484		if ((coef & 0x00f0) == 0x0030)485			alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */486		break;487	case 0x10ec0272:488	case 0x10ec0273:489	case 0x10ec0663:490	case 0x10ec0665:491	case 0x10ec0670:492	case 0x10ec0671:493	case 0x10ec0672:494		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */495		break;496	case 0x10ec0222:497	case 0x10ec0623:498		alc_update_coef_idx(codec, 0x19, 1<<13, 0);499		break;500	case 0x10ec0668:501		alc_update_coef_idx(codec, 0x7, 3<<13, 0);502		break;503	case 0x10ec0867:504		alc_update_coef_idx(codec, 0x4, 1<<10, 0);505		break;506	case 0x10ec0888:507		if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)508			alc_update_coef_idx(codec, 0x7, 1<<5, 0);509		break;510	case 0x10ec0892:511	case 0x10ec0897:512		alc_update_coef_idx(codec, 0x7, 1<<5, 0);513		break;514	case 0x10ec0899:515	case 0x10ec0900:516	case 0x10ec0b00:517	case 0x10ec1168:518	case 0x10ec1220:519		alc_update_coef_idx(codec, 0x7, 1<<1, 0);520		break;521	}522}523 524/* additional initialization for ALC888 variants */525static void alc888_coef_init(struct hda_codec *codec)526{527	switch (alc_get_coef0(codec) & 0x00f0) {528	/* alc888-VA */529	case 0x00:530	/* alc888-VB */531	case 0x10:532		alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */533		break;534	}535}536 537/* turn on/off EAPD control (only if available) */538static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)539{540	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)541		return;542	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)543		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,544				    on ? 2 : 0);545}546 547/* turn on/off EAPD controls of the codec */548static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)549{550	/* We currently only handle front, HP */551	static const hda_nid_t pins[] = {552		0x0f, 0x10, 0x14, 0x15, 0x17, 0553	};554	const hda_nid_t *p;555	for (p = pins; *p; p++)556		set_eapd(codec, *p, on);557}558 559static int find_ext_mic_pin(struct hda_codec *codec);560 561static void alc_headset_mic_no_shutup(struct hda_codec *codec)562{563	const struct hda_pincfg *pin;564	int mic_pin = find_ext_mic_pin(codec);565	int i;566 567	/* don't shut up pins when unloading the driver; otherwise it breaks568	 * the default pin setup at the next load of the driver569	 */570	if (codec->bus->shutdown)571		return;572 573	snd_array_for_each(&codec->init_pins, i, pin) {574		/* use read here for syncing after issuing each verb */575		if (pin->nid != mic_pin)576			snd_hda_codec_read(codec, pin->nid, 0,577					AC_VERB_SET_PIN_WIDGET_CONTROL, 0);578	}579 580	codec->pins_shutup = 1;581}582 583static void alc_shutup_pins(struct hda_codec *codec)584{585	struct alc_spec *spec = codec->spec;586 587	switch (codec->core.vendor_id) {588	case 0x10ec0236:589	case 0x10ec0256:590	case 0x10ec0257:591	case 0x19e58326:592	case 0x10ec0283:593	case 0x10ec0285:594	case 0x10ec0286:595	case 0x10ec0287:596	case 0x10ec0288:597	case 0x10ec0295:598	case 0x10ec0298:599		alc_headset_mic_no_shutup(codec);600		break;601	default:602		if (!spec->no_shutup_pins)603			snd_hda_shutup_pins(codec);604		break;605	}606}607 608/* generic shutup callback;609 * just turning off EAPD and a little pause for avoiding pop-noise610 */611static void alc_eapd_shutup(struct hda_codec *codec)612{613	struct alc_spec *spec = codec->spec;614 615	alc_auto_setup_eapd(codec, false);616	if (!spec->no_depop_delay)617		msleep(200);618	alc_shutup_pins(codec);619}620 621/* generic EAPD initialization */622static void alc_auto_init_amp(struct hda_codec *codec, int type)623{624	alc_auto_setup_eapd(codec, true);625	alc_write_gpio(codec);626	switch (type) {627	case ALC_INIT_DEFAULT:628		switch (codec->core.vendor_id) {629		case 0x10ec0260:630			alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);631			break;632		case 0x10ec0880:633		case 0x10ec0882:634		case 0x10ec0883:635		case 0x10ec0885:636			alc_update_coef_idx(codec, 7, 0, 0x2030);637			break;638		case 0x10ec0888:639			alc888_coef_init(codec);640			break;641		}642		break;643	}644}645 646/* get a primary headphone pin if available */647static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)648{649	if (spec->gen.autocfg.hp_pins[0])650		return spec->gen.autocfg.hp_pins[0];651	if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)652		return spec->gen.autocfg.line_out_pins[0];653	return 0;654}655 656/*657 * Realtek SSID verification658 */659 660/* Could be any non-zero and even value. When used as fixup, tells661 * the driver to ignore any present sku defines.662 */663#define ALC_FIXUP_SKU_IGNORE (2)664 665static void alc_fixup_sku_ignore(struct hda_codec *codec,666				 const struct hda_fixup *fix, int action)667{668	struct alc_spec *spec = codec->spec;669	if (action == HDA_FIXUP_ACT_PRE_PROBE) {670		spec->cdefine.fixup = 1;671		spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;672	}673}674 675static void alc_fixup_no_depop_delay(struct hda_codec *codec,676				    const struct hda_fixup *fix, int action)677{678	struct alc_spec *spec = codec->spec;679 680	if (action == HDA_FIXUP_ACT_PROBE) {681		spec->no_depop_delay = 1;682		codec->depop_delay = 0;683	}684}685 686static int alc_auto_parse_customize_define(struct hda_codec *codec)687{688	unsigned int ass, tmp, i;689	unsigned nid = 0;690	struct alc_spec *spec = codec->spec;691 692	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */693 694	if (spec->cdefine.fixup) {695		ass = spec->cdefine.sku_cfg;696		if (ass == ALC_FIXUP_SKU_IGNORE)697			return -1;698		goto do_sku;699	}700 701	if (!codec->bus->pci)702		return -1;703	ass = codec->core.subsystem_id & 0xffff;704	if (ass != codec->bus->pci->subsystem_device && (ass & 1))705		goto do_sku;706 707	nid = 0x1d;708	if (codec->core.vendor_id == 0x10ec0260)709		nid = 0x17;710	ass = snd_hda_codec_get_pincfg(codec, nid);711 712	if (!(ass & 1)) {713		codec_info(codec, "%s: SKU not ready 0x%08x\n",714			   codec->core.chip_name, ass);715		return -1;716	}717 718	/* check sum */719	tmp = 0;720	for (i = 1; i < 16; i++) {721		if ((ass >> i) & 1)722			tmp++;723	}724	if (((ass >> 16) & 0xf) != tmp)725		return -1;726 727	spec->cdefine.port_connectivity = ass >> 30;728	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;729	spec->cdefine.check_sum = (ass >> 16) & 0xf;730	spec->cdefine.customization = ass >> 8;731do_sku:732	spec->cdefine.sku_cfg = ass;733	spec->cdefine.external_amp = (ass & 0x38) >> 3;734	spec->cdefine.platform_type = (ass & 0x4) >> 2;735	spec->cdefine.swap = (ass & 0x2) >> 1;736	spec->cdefine.override = ass & 0x1;737 738	codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",739		   nid, spec->cdefine.sku_cfg);740	codec_dbg(codec, "SKU: port_connectivity=0x%x\n",741		   spec->cdefine.port_connectivity);742	codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);743	codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);744	codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);745	codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);746	codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);747	codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);748	codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);749 750	return 0;751}752 753/* return the position of NID in the list, or -1 if not found */754static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)755{756	int i;757	for (i = 0; i < nums; i++)758		if (list[i] == nid)759			return i;760	return -1;761}762/* return true if the given NID is found in the list */763static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)764{765	return find_idx_in_nid_list(nid, list, nums) >= 0;766}767 768/* check subsystem ID and set up device-specific initialization;769 * return 1 if initialized, 0 if invalid SSID770 */771/* 32-bit subsystem ID for BIOS loading in HD Audio codec.772 *	31 ~ 16 :	Manufacture ID773 *	15 ~ 8	:	SKU ID774 *	7  ~ 0	:	Assembly ID775 *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36776 */777static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)778{779	unsigned int ass, tmp, i;780	unsigned nid;781	struct alc_spec *spec = codec->spec;782 783	if (spec->cdefine.fixup) {784		ass = spec->cdefine.sku_cfg;785		if (ass == ALC_FIXUP_SKU_IGNORE)786			return 0;787		goto do_sku;788	}789 790	ass = codec->core.subsystem_id & 0xffff;791	if (codec->bus->pci &&792	    ass != codec->bus->pci->subsystem_device && (ass & 1))793		goto do_sku;794 795	/* invalid SSID, check the special NID pin defcfg instead */796	/*797	 * 31~30	: port connectivity798	 * 29~21	: reserve799	 * 20		: PCBEEP input800	 * 19~16	: Check sum (15:1)801	 * 15~1		: Custom802	 * 0		: override803	*/804	nid = 0x1d;805	if (codec->core.vendor_id == 0x10ec0260)806		nid = 0x17;807	ass = snd_hda_codec_get_pincfg(codec, nid);808	codec_dbg(codec,809		  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",810		   ass, nid);811	if (!(ass & 1))812		return 0;813	if ((ass >> 30) != 1)	/* no physical connection */814		return 0;815 816	/* check sum */817	tmp = 0;818	for (i = 1; i < 16; i++) {819		if ((ass >> i) & 1)820			tmp++;821	}822	if (((ass >> 16) & 0xf) != tmp)823		return 0;824do_sku:825	codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",826		   ass & 0xffff, codec->core.vendor_id);827	/*828	 * 0 : override829	 * 1 :	Swap Jack830	 * 2 : 0 --> Desktop, 1 --> Laptop831	 * 3~5 : External Amplifier control832	 * 7~6 : Reserved833	*/834	tmp = (ass & 0x38) >> 3;	/* external Amp control */835	if (spec->init_amp == ALC_INIT_UNDEFINED) {836		switch (tmp) {837		case 1:838			alc_setup_gpio(codec, 0x01);839			break;840		case 3:841			alc_setup_gpio(codec, 0x02);842			break;843		case 7:844			alc_setup_gpio(codec, 0x04);845			break;846		case 5:847		default:848			spec->init_amp = ALC_INIT_DEFAULT;849			break;850		}851	}852 853	/* is laptop or Desktop and enable the function "Mute internal speaker854	 * when the external headphone out jack is plugged"855	 */856	if (!(ass & 0x8000))857		return 1;858	/*859	 * 10~8 : Jack location860	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered861	 * 14~13: Resvered862	 * 15   : 1 --> enable the function "Mute internal speaker863	 *	        when the external headphone out jack is plugged"864	 */865	if (!alc_get_hp_pin(spec)) {866		hda_nid_t nid;867		tmp = (ass >> 11) & 0x3;	/* HP to chassis */868		nid = ports[tmp];869		if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,870				      spec->gen.autocfg.line_outs))871			return 1;872		spec->gen.autocfg.hp_pins[0] = nid;873	}874	return 1;875}876 877/* Check the validity of ALC subsystem-id878 * ports contains an array of 4 pin NIDs for port-A, E, D and I */879static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)880{881	if (!alc_subsystem_id(codec, ports)) {882		struct alc_spec *spec = codec->spec;883		if (spec->init_amp == ALC_INIT_UNDEFINED) {884			codec_dbg(codec,885				  "realtek: Enable default setup for auto mode as fallback\n");886			spec->init_amp = ALC_INIT_DEFAULT;887		}888	}889}890 891/*892 */893 894static void alc_fixup_inv_dmic(struct hda_codec *codec,895			       const struct hda_fixup *fix, int action)896{897	struct alc_spec *spec = codec->spec;898 899	spec->gen.inv_dmic_split = 1;900}901 902 903static int alc_build_controls(struct hda_codec *codec)904{905	int err;906 907	err = snd_hda_gen_build_controls(codec);908	if (err < 0)909		return err;910 911	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);912	return 0;913}914 915 916/*917 * Common callbacks918 */919 920static void alc_pre_init(struct hda_codec *codec)921{922	alc_fill_eapd_coef(codec);923}924 925#define is_s3_resume(codec) \926	((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)927#define is_s4_resume(codec) \928	((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)929#define is_s4_suspend(codec) \930	((codec)->core.dev.power.power_state.event == PM_EVENT_FREEZE)931 932static int alc_init(struct hda_codec *codec)933{934	struct alc_spec *spec = codec->spec;935 936	/* hibernation resume needs the full chip initialization */937	if (is_s4_resume(codec))938		alc_pre_init(codec);939 940	if (spec->init_hook)941		spec->init_hook(codec);942 943	spec->gen.skip_verbs = 1; /* applied in below */944	snd_hda_gen_init(codec);945	alc_fix_pll(codec);946	alc_auto_init_amp(codec, spec->init_amp);947	snd_hda_apply_verbs(codec); /* apply verbs here after own init */948 949	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);950 951	return 0;952}953 954/* forward declaration */955static const struct component_master_ops comp_master_ops;956 957static void alc_free(struct hda_codec *codec)958{959	struct alc_spec *spec = codec->spec;960 961	if (spec)962		hda_component_manager_free(&spec->comps, &comp_master_ops);963 964	snd_hda_gen_free(codec);965}966 967static inline void alc_shutup(struct hda_codec *codec)968{969	struct alc_spec *spec = codec->spec;970 971	if (!snd_hda_get_bool_hint(codec, "shutup"))972		return; /* disabled explicitly by hints */973 974	if (spec && spec->shutup)975		spec->shutup(codec);976	else977		alc_shutup_pins(codec);978}979 980static void alc_power_eapd(struct hda_codec *codec)981{982	alc_auto_setup_eapd(codec, false);983}984 985static int alc_suspend(struct hda_codec *codec)986{987	struct alc_spec *spec = codec->spec;988	alc_shutup(codec);989	if (spec && spec->power_hook)990		spec->power_hook(codec);991	return 0;992}993 994static int alc_resume(struct hda_codec *codec)995{996	struct alc_spec *spec = codec->spec;997 998	if (!spec->no_depop_delay)999		msleep(150); /* to avoid pop noise */1000	codec->patch_ops.init(codec);1001	snd_hda_regmap_sync(codec);1002	hda_call_check_power_status(codec, 0x01);1003	return 0;1004}1005 1006/*1007 */1008static const struct hda_codec_ops alc_patch_ops = {1009	.build_controls = alc_build_controls,1010	.build_pcms = snd_hda_gen_build_pcms,1011	.init = alc_init,1012	.free = alc_free,1013	.unsol_event = snd_hda_jack_unsol_event,1014	.resume = alc_resume,1015	.suspend = alc_suspend,1016	.check_power_status = snd_hda_gen_check_power_status,1017};1018 1019 1020#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)1021 1022/*1023 * Rename codecs appropriately from COEF value or subvendor id1024 */1025struct alc_codec_rename_table {1026	unsigned int vendor_id;1027	unsigned short coef_mask;1028	unsigned short coef_bits;1029	const char *name;1030};1031 1032struct alc_codec_rename_pci_table {1033	unsigned int codec_vendor_id;1034	unsigned short pci_subvendor;1035	unsigned short pci_subdevice;1036	const char *name;1037};1038 1039static const struct alc_codec_rename_table rename_tbl[] = {1040	{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },1041	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },1042	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },1043	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },1044	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },1045	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },1046	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },1047	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },1048	{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },1049	{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },1050	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },1051	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },1052	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },1053	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },1054	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },1055	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },1056	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },1057	{ } /* terminator */1058};1059 1060static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {1061	{ 0x10ec0280, 0x1028, 0, "ALC3220" },1062	{ 0x10ec0282, 0x1028, 0, "ALC3221" },1063	{ 0x10ec0283, 0x1028, 0, "ALC3223" },1064	{ 0x10ec0288, 0x1028, 0, "ALC3263" },1065	{ 0x10ec0292, 0x1028, 0, "ALC3226" },1066	{ 0x10ec0293, 0x1028, 0, "ALC3235" },1067	{ 0x10ec0255, 0x1028, 0, "ALC3234" },1068	{ 0x10ec0668, 0x1028, 0, "ALC3661" },1069	{ 0x10ec0275, 0x1028, 0, "ALC3260" },1070	{ 0x10ec0899, 0x1028, 0, "ALC3861" },1071	{ 0x10ec0298, 0x1028, 0, "ALC3266" },1072	{ 0x10ec0236, 0x1028, 0, "ALC3204" },1073	{ 0x10ec0256, 0x1028, 0, "ALC3246" },1074	{ 0x10ec0225, 0x1028, 0, "ALC3253" },1075	{ 0x10ec0295, 0x1028, 0, "ALC3254" },1076	{ 0x10ec0299, 0x1028, 0, "ALC3271" },1077	{ 0x10ec0670, 0x1025, 0, "ALC669X" },1078	{ 0x10ec0676, 0x1025, 0, "ALC679X" },1079	{ 0x10ec0282, 0x1043, 0, "ALC3229" },1080	{ 0x10ec0233, 0x1043, 0, "ALC3236" },1081	{ 0x10ec0280, 0x103c, 0, "ALC3228" },1082	{ 0x10ec0282, 0x103c, 0, "ALC3227" },1083	{ 0x10ec0286, 0x103c, 0, "ALC3242" },1084	{ 0x10ec0290, 0x103c, 0, "ALC3241" },1085	{ 0x10ec0668, 0x103c, 0, "ALC3662" },1086	{ 0x10ec0283, 0x17aa, 0, "ALC3239" },1087	{ 0x10ec0292, 0x17aa, 0, "ALC3232" },1088	{ } /* terminator */1089};1090 1091static int alc_codec_rename_from_preset(struct hda_codec *codec)1092{1093	const struct alc_codec_rename_table *p;1094	const struct alc_codec_rename_pci_table *q;1095 1096	for (p = rename_tbl; p->vendor_id; p++) {1097		if (p->vendor_id != codec->core.vendor_id)1098			continue;1099		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)1100			return alc_codec_rename(codec, p->name);1101	}1102 1103	if (!codec->bus->pci)1104		return 0;1105	for (q = rename_pci_tbl; q->codec_vendor_id; q++) {1106		if (q->codec_vendor_id != codec->core.vendor_id)1107			continue;1108		if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)1109			continue;1110		if (!q->pci_subdevice ||1111		    q->pci_subdevice == codec->bus->pci->subsystem_device)1112			return alc_codec_rename(codec, q->name);1113	}1114 1115	return 0;1116}1117 1118 1119/*1120 * Digital-beep handlers1121 */1122#ifdef CONFIG_SND_HDA_INPUT_BEEP1123 1124/* additional beep mixers; private_value will be overwritten */1125static const struct snd_kcontrol_new alc_beep_mixer[] = {1126	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),1127	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),1128};1129 1130/* set up and create beep controls */1131static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,1132			int idx, int dir)1133{1134	struct snd_kcontrol_new *knew;1135	unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);1136	int i;1137 1138	for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {1139		knew = snd_hda_gen_add_kctl(&spec->gen, NULL,1140					    &alc_beep_mixer[i]);1141		if (!knew)1142			return -ENOMEM;1143		knew->private_value = beep_amp;1144	}1145	return 0;1146}1147 1148static const struct snd_pci_quirk beep_allow_list[] = {1149	SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),1150	SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),1151	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),1152	SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),1153	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),1154	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),1155	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),1156	SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),1157	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),1158	/* denylist -- no beep available */1159	SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),1160	SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),1161	{}1162};1163 1164static inline int has_cdefine_beep(struct hda_codec *codec)1165{1166	struct alc_spec *spec = codec->spec;1167	const struct snd_pci_quirk *q;1168	q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);1169	if (q)1170		return q->value;1171	return spec->cdefine.enable_pcbeep;1172}1173#else1174#define set_beep_amp(spec, nid, idx, dir)	01175#define has_cdefine_beep(codec)		01176#endif1177 1178/* parse the BIOS configuration and set up the alc_spec */1179/* return 1 if successful, 0 if the proper config is not found,1180 * or a negative error code1181 */1182static int alc_parse_auto_config(struct hda_codec *codec,1183				 const hda_nid_t *ignore_nids,1184				 const hda_nid_t *ssid_nids)1185{1186	struct alc_spec *spec = codec->spec;1187	struct auto_pin_cfg *cfg = &spec->gen.autocfg;1188	int err;1189 1190	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,1191				       spec->parse_flags);1192	if (err < 0)1193		return err;1194 1195	if (ssid_nids)1196		alc_ssid_check(codec, ssid_nids);1197 1198	err = snd_hda_gen_parse_auto_config(codec, cfg);1199	if (err < 0)1200		return err;1201 1202	return 1;1203}1204 1205/* common preparation job for alc_spec */1206static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)1207{1208	struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);1209	int err;1210 1211	if (!spec)1212		return -ENOMEM;1213	codec->spec = spec;1214	snd_hda_gen_spec_init(&spec->gen);1215	spec->gen.mixer_nid = mixer_nid;1216	spec->gen.own_eapd_ctl = 1;1217	codec->single_adc_amp = 1;1218	/* FIXME: do we need this for all Realtek codec models? */1219	codec->spdif_status_reset = 1;1220	codec->forced_resume = 1;1221	codec->patch_ops = alc_patch_ops;1222	mutex_init(&spec->coef_mutex);1223 1224	err = alc_codec_rename_from_preset(codec);1225	if (err < 0) {1226		kfree(spec);1227		return err;1228	}1229	return 0;1230}1231 1232static int alc880_parse_auto_config(struct hda_codec *codec)1233{1234	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };1235	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };1236	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);1237}1238 1239/*1240 * ALC880 fix-ups1241 */1242enum {1243	ALC880_FIXUP_GPIO1,1244	ALC880_FIXUP_GPIO2,1245	ALC880_FIXUP_MEDION_RIM,1246	ALC880_FIXUP_LG,1247	ALC880_FIXUP_LG_LW25,1248	ALC880_FIXUP_W810,1249	ALC880_FIXUP_EAPD_COEF,1250	ALC880_FIXUP_TCL_S700,1251	ALC880_FIXUP_VOL_KNOB,1252	ALC880_FIXUP_FUJITSU,1253	ALC880_FIXUP_F1734,1254	ALC880_FIXUP_UNIWILL,1255	ALC880_FIXUP_UNIWILL_DIG,1256	ALC880_FIXUP_Z71V,1257	ALC880_FIXUP_ASUS_W5A,1258	ALC880_FIXUP_3ST_BASE,1259	ALC880_FIXUP_3ST,1260	ALC880_FIXUP_3ST_DIG,1261	ALC880_FIXUP_5ST_BASE,1262	ALC880_FIXUP_5ST,1263	ALC880_FIXUP_5ST_DIG,1264	ALC880_FIXUP_6ST_BASE,1265	ALC880_FIXUP_6ST,1266	ALC880_FIXUP_6ST_DIG,1267	ALC880_FIXUP_6ST_AUTOMUTE,1268};1269 1270/* enable the volume-knob widget support on NID 0x21 */1271static void alc880_fixup_vol_knob(struct hda_codec *codec,1272				  const struct hda_fixup *fix, int action)1273{1274	if (action == HDA_FIXUP_ACT_PROBE)1275		snd_hda_jack_detect_enable_callback(codec, 0x21,1276						    alc_update_knob_master);1277}1278 1279static const struct hda_fixup alc880_fixups[] = {1280	[ALC880_FIXUP_GPIO1] = {1281		.type = HDA_FIXUP_FUNC,1282		.v.func = alc_fixup_gpio1,1283	},1284	[ALC880_FIXUP_GPIO2] = {1285		.type = HDA_FIXUP_FUNC,1286		.v.func = alc_fixup_gpio2,1287	},1288	[ALC880_FIXUP_MEDION_RIM] = {1289		.type = HDA_FIXUP_VERBS,1290		.v.verbs = (const struct hda_verb[]) {1291			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },1292			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },1293			{ }1294		},1295		.chained = true,1296		.chain_id = ALC880_FIXUP_GPIO2,1297	},1298	[ALC880_FIXUP_LG] = {1299		.type = HDA_FIXUP_PINS,1300		.v.pins = (const struct hda_pintbl[]) {1301			/* disable bogus unused pins */1302			{ 0x16, 0x411111f0 },1303			{ 0x18, 0x411111f0 },1304			{ 0x1a, 0x411111f0 },1305			{ }1306		}1307	},1308	[ALC880_FIXUP_LG_LW25] = {1309		.type = HDA_FIXUP_PINS,1310		.v.pins = (const struct hda_pintbl[]) {1311			{ 0x1a, 0x0181344f }, /* line-in */1312			{ 0x1b, 0x0321403f }, /* headphone */1313			{ }1314		}1315	},1316	[ALC880_FIXUP_W810] = {1317		.type = HDA_FIXUP_PINS,1318		.v.pins = (const struct hda_pintbl[]) {1319			/* disable bogus unused pins */1320			{ 0x17, 0x411111f0 },1321			{ }1322		},1323		.chained = true,1324		.chain_id = ALC880_FIXUP_GPIO2,1325	},1326	[ALC880_FIXUP_EAPD_COEF] = {1327		.type = HDA_FIXUP_VERBS,1328		.v.verbs = (const struct hda_verb[]) {1329			/* change to EAPD mode */1330			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },1331			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },1332			{}1333		},1334	},1335	[ALC880_FIXUP_TCL_S700] = {1336		.type = HDA_FIXUP_VERBS,1337		.v.verbs = (const struct hda_verb[]) {1338			/* change to EAPD mode */1339			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },1340			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },1341			{}1342		},1343		.chained = true,1344		.chain_id = ALC880_FIXUP_GPIO2,1345	},1346	[ALC880_FIXUP_VOL_KNOB] = {1347		.type = HDA_FIXUP_FUNC,1348		.v.func = alc880_fixup_vol_knob,1349	},1350	[ALC880_FIXUP_FUJITSU] = {1351		/* override all pins as BIOS on old Amilo is broken */1352		.type = HDA_FIXUP_PINS,1353		.v.pins = (const struct hda_pintbl[]) {1354			{ 0x14, 0x0121401f }, /* HP */1355			{ 0x15, 0x99030120 }, /* speaker */1356			{ 0x16, 0x99030130 }, /* bass speaker */1357			{ 0x17, 0x411111f0 }, /* N/A */1358			{ 0x18, 0x411111f0 }, /* N/A */1359			{ 0x19, 0x01a19950 }, /* mic-in */1360			{ 0x1a, 0x411111f0 }, /* N/A */1361			{ 0x1b, 0x411111f0 }, /* N/A */1362			{ 0x1c, 0x411111f0 }, /* N/A */1363			{ 0x1d, 0x411111f0 }, /* N/A */1364			{ 0x1e, 0x01454140 }, /* SPDIF out */1365			{ }1366		},1367		.chained = true,1368		.chain_id = ALC880_FIXUP_VOL_KNOB,1369	},1370	[ALC880_FIXUP_F1734] = {1371		/* almost compatible with FUJITSU, but no bass and SPDIF */1372		.type = HDA_FIXUP_PINS,1373		.v.pins = (const struct hda_pintbl[]) {1374			{ 0x14, 0x0121401f }, /* HP */1375			{ 0x15, 0x99030120 }, /* speaker */1376			{ 0x16, 0x411111f0 }, /* N/A */1377			{ 0x17, 0x411111f0 }, /* N/A */1378			{ 0x18, 0x411111f0 }, /* N/A */1379			{ 0x19, 0x01a19950 }, /* mic-in */1380			{ 0x1a, 0x411111f0 }, /* N/A */1381			{ 0x1b, 0x411111f0 }, /* N/A */1382			{ 0x1c, 0x411111f0 }, /* N/A */1383			{ 0x1d, 0x411111f0 }, /* N/A */1384			{ 0x1e, 0x411111f0 }, /* N/A */1385			{ }1386		},1387		.chained = true,1388		.chain_id = ALC880_FIXUP_VOL_KNOB,1389	},1390	[ALC880_FIXUP_UNIWILL] = {1391		/* need to fix HP and speaker pins to be parsed correctly */1392		.type = HDA_FIXUP_PINS,1393		.v.pins = (const struct hda_pintbl[]) {1394			{ 0x14, 0x0121411f }, /* HP */1395			{ 0x15, 0x99030120 }, /* speaker */1396			{ 0x16, 0x99030130 }, /* bass speaker */1397			{ }1398		},1399	},1400	[ALC880_FIXUP_UNIWILL_DIG] = {1401		.type = HDA_FIXUP_PINS,1402		.v.pins = (const struct hda_pintbl[]) {1403			/* disable bogus unused pins */1404			{ 0x17, 0x411111f0 },1405			{ 0x19, 0x411111f0 },1406			{ 0x1b, 0x411111f0 },1407			{ 0x1f, 0x411111f0 },1408			{ }1409		}1410	},1411	[ALC880_FIXUP_Z71V] = {1412		.type = HDA_FIXUP_PINS,1413		.v.pins = (const struct hda_pintbl[]) {1414			/* set up the whole pins as BIOS is utterly broken */1415			{ 0x14, 0x99030120 }, /* speaker */1416			{ 0x15, 0x0121411f }, /* HP */1417			{ 0x16, 0x411111f0 }, /* N/A */1418			{ 0x17, 0x411111f0 }, /* N/A */1419			{ 0x18, 0x01a19950 }, /* mic-in */1420			{ 0x19, 0x411111f0 }, /* N/A */1421			{ 0x1a, 0x01813031 }, /* line-in */1422			{ 0x1b, 0x411111f0 }, /* N/A */1423			{ 0x1c, 0x411111f0 }, /* N/A */1424			{ 0x1d, 0x411111f0 }, /* N/A */1425			{ 0x1e, 0x0144111e }, /* SPDIF */1426			{ }1427		}1428	},1429	[ALC880_FIXUP_ASUS_W5A] = {1430		.type = HDA_FIXUP_PINS,1431		.v.pins = (const struct hda_pintbl[]) {1432			/* set up the whole pins as BIOS is utterly broken */1433			{ 0x14, 0x0121411f }, /* HP */1434			{ 0x15, 0x411111f0 }, /* N/A */1435			{ 0x16, 0x411111f0 }, /* N/A */1436			{ 0x17, 0x411111f0 }, /* N/A */1437			{ 0x18, 0x90a60160 }, /* mic */1438			{ 0x19, 0x411111f0 }, /* N/A */1439			{ 0x1a, 0x411111f0 }, /* N/A */1440			{ 0x1b, 0x411111f0 }, /* N/A */1441			{ 0x1c, 0x411111f0 }, /* N/A */1442			{ 0x1d, 0x411111f0 }, /* N/A */1443			{ 0x1e, 0xb743111e }, /* SPDIF out */1444			{ }1445		},1446		.chained = true,1447		.chain_id = ALC880_FIXUP_GPIO1,1448	},1449	[ALC880_FIXUP_3ST_BASE] = {1450		.type = HDA_FIXUP_PINS,1451		.v.pins = (const struct hda_pintbl[]) {1452			{ 0x14, 0x01014010 }, /* line-out */1453			{ 0x15, 0x411111f0 }, /* N/A */1454			{ 0x16, 0x411111f0 }, /* N/A */1455			{ 0x17, 0x411111f0 }, /* N/A */1456			{ 0x18, 0x01a19c30 }, /* mic-in */1457			{ 0x19, 0x0121411f }, /* HP */1458			{ 0x1a, 0x01813031 }, /* line-in */1459			{ 0x1b, 0x02a19c40 }, /* front-mic */1460			{ 0x1c, 0x411111f0 }, /* N/A */1461			{ 0x1d, 0x411111f0 }, /* N/A */1462			/* 0x1e is filled in below */1463			{ 0x1f, 0x411111f0 }, /* N/A */1464			{ }1465		}1466	},1467	[ALC880_FIXUP_3ST] = {1468		.type = HDA_FIXUP_PINS,1469		.v.pins = (const struct hda_pintbl[]) {1470			{ 0x1e, 0x411111f0 }, /* N/A */1471			{ }1472		},1473		.chained = true,1474		.chain_id = ALC880_FIXUP_3ST_BASE,1475	},1476	[ALC880_FIXUP_3ST_DIG] = {1477		.type = HDA_FIXUP_PINS,1478		.v.pins = (const struct hda_pintbl[]) {1479			{ 0x1e, 0x0144111e }, /* SPDIF */1480			{ }1481		},1482		.chained = true,1483		.chain_id = ALC880_FIXUP_3ST_BASE,1484	},1485	[ALC880_FIXUP_5ST_BASE] = {1486		.type = HDA_FIXUP_PINS,1487		.v.pins = (const struct hda_pintbl[]) {1488			{ 0x14, 0x01014010 }, /* front */1489			{ 0x15, 0x411111f0 }, /* N/A */1490			{ 0x16, 0x01011411 }, /* CLFE */1491			{ 0x17, 0x01016412 }, /* surr */1492			{ 0x18, 0x01a19c30 }, /* mic-in */1493			{ 0x19, 0x0121411f }, /* HP */1494			{ 0x1a, 0x01813031 }, /* line-in */1495			{ 0x1b, 0x02a19c40 }, /* front-mic */1496			{ 0x1c, 0x411111f0 }, /* N/A */1497			{ 0x1d, 0x411111f0 }, /* N/A */1498			/* 0x1e is filled in below */1499			{ 0x1f, 0x411111f0 }, /* N/A */1500			{ }1501		}1502	},1503	[ALC880_FIXUP_5ST] = {1504		.type = HDA_FIXUP_PINS,1505		.v.pins = (const struct hda_pintbl[]) {1506			{ 0x1e, 0x411111f0 }, /* N/A */1507			{ }1508		},1509		.chained = true,1510		.chain_id = ALC880_FIXUP_5ST_BASE,1511	},1512	[ALC880_FIXUP_5ST_DIG] = {1513		.type = HDA_FIXUP_PINS,1514		.v.pins = (const struct hda_pintbl[]) {1515			{ 0x1e, 0x0144111e }, /* SPDIF */1516			{ }1517		},1518		.chained = true,1519		.chain_id = ALC880_FIXUP_5ST_BASE,1520	},1521	[ALC880_FIXUP_6ST_BASE] = {1522		.type = HDA_FIXUP_PINS,1523		.v.pins = (const struct hda_pintbl[]) {1524			{ 0x14, 0x01014010 }, /* front */1525			{ 0x15, 0x01016412 }, /* surr */1526			{ 0x16, 0x01011411 }, /* CLFE */1527			{ 0x17, 0x01012414 }, /* side */1528			{ 0x18, 0x01a19c30 }, /* mic-in */1529			{ 0x19, 0x02a19c40 }, /* front-mic */1530			{ 0x1a, 0x01813031 }, /* line-in */1531			{ 0x1b, 0x0121411f }, /* HP */1532			{ 0x1c, 0x411111f0 }, /* N/A */1533			{ 0x1d, 0x411111f0 }, /* N/A */1534			/* 0x1e is filled in below */1535			{ 0x1f, 0x411111f0 }, /* N/A */1536			{ }1537		}1538	},1539	[ALC880_FIXUP_6ST] = {1540		.type = HDA_FIXUP_PINS,1541		.v.pins = (const struct hda_pintbl[]) {1542			{ 0x1e, 0x411111f0 }, /* N/A */1543			{ }1544		},1545		.chained = true,1546		.chain_id = ALC880_FIXUP_6ST_BASE,1547	},1548	[ALC880_FIXUP_6ST_DIG] = {1549		.type = HDA_FIXUP_PINS,1550		.v.pins = (const struct hda_pintbl[]) {1551			{ 0x1e, 0x0144111e }, /* SPDIF */1552			{ }1553		},1554		.chained = true,1555		.chain_id = ALC880_FIXUP_6ST_BASE,1556	},1557	[ALC880_FIXUP_6ST_AUTOMUTE] = {1558		.type = HDA_FIXUP_PINS,1559		.v.pins = (const struct hda_pintbl[]) {1560			{ 0x1b, 0x0121401f }, /* HP with jack detect */1561			{ }1562		},1563		.chained_before = true,1564		.chain_id = ALC880_FIXUP_6ST_BASE,1565	},1566};1567 1568static const struct snd_pci_quirk alc880_fixup_tbl[] = {1569	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),1570	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),1571	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),1572	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),1573	SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),1574	SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),1575	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),1576	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),1577	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),1578	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),1579	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),1580	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),1581	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),1582	SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),1583	SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),1584	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),1585	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),1586	SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),1587	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),1588	SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),1589	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),1590	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),1591	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),1592 1593	/* Below is the copied entries from alc880_quirks.c.1594	 * It's not quite sure whether BIOS sets the correct pin-config table1595	 * on these machines, thus they are kept to be compatible with1596	 * the old static quirks.  Once when it's confirmed to work without1597	 * these overrides, it'd be better to remove.1598	 */1599	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),1600	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),1601	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),1602	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),1603	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),1604	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),1605	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),1606	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),1607	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),1608	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),1609	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),1610	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),1611	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),1612	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),1613	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),1614	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),1615	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),1616	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),1617	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),1618	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),1619	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),1620	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */1621	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),1622	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),1623	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),1624	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),1625	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),1626	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),1627	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),1628	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),1629	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),1630	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),1631	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),1632	/* default Intel */1633	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),1634	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),1635	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),1636	{}1637};1638 1639static const struct hda_model_fixup alc880_fixup_models[] = {1640	{.id = ALC880_FIXUP_3ST, .name = "3stack"},1641	{.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},1642	{.id = ALC880_FIXUP_5ST, .name = "5stack"},1643	{.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},1644	{.id = ALC880_FIXUP_6ST, .name = "6stack"},1645	{.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},1646	{.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},1647	{}1648};1649 1650 1651/*1652 * OK, here we have finally the patch for ALC8801653 */1654static int patch_alc880(struct hda_codec *codec)1655{1656	struct alc_spec *spec;1657	int err;1658 1659	err = alc_alloc_spec(codec, 0x0b);1660	if (err < 0)1661		return err;1662 1663	spec = codec->spec;1664	spec->gen.need_dac_fix = 1;1665	spec->gen.beep_nid = 0x01;1666 1667	codec->patch_ops.unsol_event = alc880_unsol_event;1668 1669	alc_pre_init(codec);1670 1671	snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,1672		       alc880_fixups);1673	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);1674 1675	/* automatic parse from the BIOS config */1676	err = alc880_parse_auto_config(codec);1677	if (err < 0)1678		goto error;1679 1680	if (!spec->gen.no_analog) {1681		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);1682		if (err < 0)1683			goto error;1684	}1685 1686	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);1687 1688	return 0;1689 1690 error:1691	alc_free(codec);1692	return err;1693}1694 1695 1696/*1697 * ALC260 support1698 */1699static int alc260_parse_auto_config(struct hda_codec *codec)1700{1701	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };1702	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };1703	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);1704}1705 1706/*1707 * Pin config fixes1708 */1709enum {1710	ALC260_FIXUP_HP_DC5750,1711	ALC260_FIXUP_HP_PIN_0F,1712	ALC260_FIXUP_COEF,1713	ALC260_FIXUP_GPIO1,1714	ALC260_FIXUP_GPIO1_TOGGLE,1715	ALC260_FIXUP_REPLACER,1716	ALC260_FIXUP_HP_B1900,1717	ALC260_FIXUP_KN1,1718	ALC260_FIXUP_FSC_S7020,1719	ALC260_FIXUP_FSC_S7020_JWSE,1720	ALC260_FIXUP_VAIO_PINS,1721};1722 1723static void alc260_gpio1_automute(struct hda_codec *codec)1724{1725	struct alc_spec *spec = codec->spec;1726 1727	alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);1728}1729 1730static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,1731				      const struct hda_fixup *fix, int action)1732{1733	struct alc_spec *spec = codec->spec;1734	if (action == HDA_FIXUP_ACT_PROBE) {1735		/* although the machine has only one output pin, we need to1736		 * toggle GPIO1 according to the jack state1737		 */1738		spec->gen.automute_hook = alc260_gpio1_automute;1739		spec->gen.detect_hp = 1;1740		spec->gen.automute_speaker = 1;1741		spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */1742		snd_hda_jack_detect_enable_callback(codec, 0x0f,1743						    snd_hda_gen_hp_automute);1744		alc_setup_gpio(codec, 0x01);1745	}1746}1747 1748static void alc260_fixup_kn1(struct hda_codec *codec,1749			     const struct hda_fixup *fix, int action)1750{1751	struct alc_spec *spec = codec->spec;1752	static const struct hda_pintbl pincfgs[] = {1753		{ 0x0f, 0x02214000 }, /* HP/speaker */1754		{ 0x12, 0x90a60160 }, /* int mic */1755		{ 0x13, 0x02a19000 }, /* ext mic */1756		{ 0x18, 0x01446000 }, /* SPDIF out */1757		/* disable bogus I/O pins */1758		{ 0x10, 0x411111f0 },1759		{ 0x11, 0x411111f0 },1760		{ 0x14, 0x411111f0 },1761		{ 0x15, 0x411111f0 },1762		{ 0x16, 0x411111f0 },1763		{ 0x17, 0x411111f0 },1764		{ 0x19, 0x411111f0 },1765		{ }1766	};1767 1768	switch (action) {1769	case HDA_FIXUP_ACT_PRE_PROBE:1770		snd_hda_apply_pincfgs(codec, pincfgs);1771		spec->init_amp = ALC_INIT_NONE;1772		break;1773	}1774}1775 1776static void alc260_fixup_fsc_s7020(struct hda_codec *codec,1777				   const struct hda_fixup *fix, int action)1778{1779	struct alc_spec *spec = codec->spec;1780	if (action == HDA_FIXUP_ACT_PRE_PROBE)1781		spec->init_amp = ALC_INIT_NONE;1782}1783 1784static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,1785				   const struct hda_fixup *fix, int action)1786{1787	struct alc_spec *spec = codec->spec;1788	if (action == HDA_FIXUP_ACT_PRE_PROBE) {1789		spec->gen.add_jack_modes = 1;1790		spec->gen.hp_mic = 1;1791	}1792}1793 1794static const struct hda_fixup alc260_fixups[] = {1795	[ALC260_FIXUP_HP_DC5750] = {1796		.type = HDA_FIXUP_PINS,1797		.v.pins = (const struct hda_pintbl[]) {1798			{ 0x11, 0x90130110 }, /* speaker */1799			{ }1800		}1801	},1802	[ALC260_FIXUP_HP_PIN_0F] = {1803		.type = HDA_FIXUP_PINS,1804		.v.pins = (const struct hda_pintbl[]) {1805			{ 0x0f, 0x01214000 }, /* HP */1806			{ }1807		}1808	},1809	[ALC260_FIXUP_COEF] = {1810		.type = HDA_FIXUP_VERBS,1811		.v.verbs = (const struct hda_verb[]) {1812			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },1813			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },1814			{ }1815		},1816	},1817	[ALC260_FIXUP_GPIO1] = {1818		.type = HDA_FIXUP_FUNC,1819		.v.func = alc_fixup_gpio1,1820	},1821	[ALC260_FIXUP_GPIO1_TOGGLE] = {1822		.type = HDA_FIXUP_FUNC,1823		.v.func = alc260_fixup_gpio1_toggle,1824		.chained = true,1825		.chain_id = ALC260_FIXUP_HP_PIN_0F,1826	},1827	[ALC260_FIXUP_REPLACER] = {1828		.type = HDA_FIXUP_VERBS,1829		.v.verbs = (const struct hda_verb[]) {1830			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },1831			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },1832			{ }1833		},1834		.chained = true,1835		.chain_id = ALC260_FIXUP_GPIO1_TOGGLE,1836	},1837	[ALC260_FIXUP_HP_B1900] = {1838		.type = HDA_FIXUP_FUNC,1839		.v.func = alc260_fixup_gpio1_toggle,1840		.chained = true,1841		.chain_id = ALC260_FIXUP_COEF,1842	},1843	[ALC260_FIXUP_KN1] = {1844		.type = HDA_FIXUP_FUNC,1845		.v.func = alc260_fixup_kn1,1846	},1847	[ALC260_FIXUP_FSC_S7020] = {1848		.type = HDA_FIXUP_FUNC,1849		.v.func = alc260_fixup_fsc_s7020,1850	},1851	[ALC260_FIXUP_FSC_S7020_JWSE] = {1852		.type = HDA_FIXUP_FUNC,1853		.v.func = alc260_fixup_fsc_s7020_jwse,1854		.chained = true,1855		.chain_id = ALC260_FIXUP_FSC_S7020,1856	},1857	[ALC260_FIXUP_VAIO_PINS] = {1858		.type = HDA_FIXUP_PINS,1859		.v.pins = (const struct hda_pintbl[]) {1860			/* Pin configs are missing completely on some VAIOs */1861			{ 0x0f, 0x01211020 },1862			{ 0x10, 0x0001003f },1863			{ 0x11, 0x411111f0 },1864			{ 0x12, 0x01a15930 },1865			{ 0x13, 0x411111f0 },1866			{ 0x14, 0x411111f0 },1867			{ 0x15, 0x411111f0 },1868			{ 0x16, 0x411111f0 },1869			{ 0x17, 0x411111f0 },1870			{ 0x18, 0x411111f0 },1871			{ 0x19, 0x411111f0 },1872			{ }1873		}1874	},1875};1876 1877static const struct snd_pci_quirk alc260_fixup_tbl[] = {1878	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),1879	SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),1880	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),1881	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),1882	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),1883	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),1884	SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),1885	SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),1886	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),1887	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),1888	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),1889	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),1890	{}1891};1892 1893static const struct hda_model_fixup alc260_fixup_models[] = {1894	{.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},1895	{.id = ALC260_FIXUP_COEF, .name = "coef"},1896	{.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},1897	{.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},1898	{}1899};1900 1901/*1902 */1903static int patch_alc260(struct hda_codec *codec)1904{1905	struct alc_spec *spec;1906	int err;1907 1908	err = alc_alloc_spec(codec, 0x07);1909	if (err < 0)1910		return err;1911 1912	spec = codec->spec;1913	/* as quite a few machines require HP amp for speaker outputs,1914	 * it's easier to enable it unconditionally; even if it's unneeded,1915	 * it's almost harmless.1916	 */1917	spec->gen.prefer_hp_amp = 1;1918	spec->gen.beep_nid = 0x01;1919 1920	spec->shutup = alc_eapd_shutup;1921 1922	alc_pre_init(codec);1923 1924	snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,1925			   alc260_fixups);1926	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);1927 1928	/* automatic parse from the BIOS config */1929	err = alc260_parse_auto_config(codec);1930	if (err < 0)1931		goto error;1932 1933	if (!spec->gen.no_analog) {1934		err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);1935		if (err < 0)1936			goto error;1937	}1938 1939	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);1940 1941	return 0;1942 1943 error:1944	alc_free(codec);1945	return err;1946}1947 1948 1949/*1950 * ALC882/883/885/888/889 support1951 *1952 * ALC882 is almost identical with ALC880 but has cleaner and more flexible1953 * configuration.  Each pin widget can choose any input DACs and a mixer.1954 * Each ADC is connected from a mixer of all inputs.  This makes possible1955 * 6-channel independent captures.1956 *1957 * In addition, an independent DAC for the multi-playback (not used in this1958 * driver yet).1959 */1960 1961/*1962 * Pin config fixes1963 */1964enum {1965	ALC882_FIXUP_ABIT_AW9D_MAX,1966	ALC882_FIXUP_LENOVO_Y530,1967	ALC882_FIXUP_PB_M5210,1968	ALC882_FIXUP_ACER_ASPIRE_7736,1969	ALC882_FIXUP_ASUS_W90V,1970	ALC889_FIXUP_CD,1971	ALC889_FIXUP_FRONT_HP_NO_PRESENCE,1972	ALC889_FIXUP_VAIO_TT,1973	ALC888_FIXUP_EEE1601,1974	ALC886_FIXUP_EAPD,1975	ALC882_FIXUP_EAPD,1976	ALC883_FIXUP_EAPD,1977	ALC883_FIXUP_ACER_EAPD,1978	ALC882_FIXUP_GPIO1,1979	ALC882_FIXUP_GPIO2,1980	ALC882_FIXUP_GPIO3,1981	ALC889_FIXUP_COEF,1982	ALC882_FIXUP_ASUS_W2JC,1983	ALC882_FIXUP_ACER_ASPIRE_4930G,1984	ALC882_FIXUP_ACER_ASPIRE_8930G,1985	ALC882_FIXUP_ASPIRE_8930G_VERBS,1986	ALC885_FIXUP_MACPRO_GPIO,1987	ALC889_FIXUP_DAC_ROUTE,1988	ALC889_FIXUP_MBP_VREF,1989	ALC889_FIXUP_IMAC91_VREF,1990	ALC889_FIXUP_MBA11_VREF,1991	ALC889_FIXUP_MBA21_VREF,1992	ALC889_FIXUP_MP11_VREF,1993	ALC889_FIXUP_MP41_VREF,1994	ALC882_FIXUP_INV_DMIC,1995	ALC882_FIXUP_NO_PRIMARY_HP,1996	ALC887_FIXUP_ASUS_BASS,1997	ALC887_FIXUP_BASS_CHMAP,1998	ALC1220_FIXUP_GB_DUAL_CODECS,1999	ALC1220_FIXUP_GB_X570,2000	ALC1220_FIXUP_CLEVO_P950,2001	ALC1220_FIXUP_CLEVO_PB51ED,2002	ALC1220_FIXUP_CLEVO_PB51ED_PINS,2003	ALC887_FIXUP_ASUS_AUDIO,2004	ALC887_FIXUP_ASUS_HMIC,2005	ALCS1200A_FIXUP_MIC_VREF,2006	ALC888VD_FIXUP_MIC_100VREF,2007};2008 2009static void alc889_fixup_coef(struct hda_codec *codec,2010			      const struct hda_fixup *fix, int action)2011{2012	if (action != HDA_FIXUP_ACT_INIT)2013		return;2014	alc_update_coef_idx(codec, 7, 0, 0x2030);2015}2016 2017/* set up GPIO at initialization */2018static void alc885_fixup_macpro_gpio(struct hda_codec *codec,2019				     const struct hda_fixup *fix, int action)2020{2021	struct alc_spec *spec = codec->spec;2022 2023	spec->gpio_write_delay = true;2024	alc_fixup_gpio3(codec, fix, action);2025}2026 2027/* Fix the connection of some pins for ALC889:2028 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't2029 * work correctly (bko#42740)2030 */2031static void alc889_fixup_dac_route(struct hda_codec *codec,2032				   const struct hda_fixup *fix, int action)2033{2034	if (action == HDA_FIXUP_ACT_PRE_PROBE) {2035		/* fake the connections during parsing the tree */2036		static const hda_nid_t conn1[] = { 0x0c, 0x0d };2037		static const hda_nid_t conn2[] = { 0x0e, 0x0f };2038		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);2039		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);2040		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);2041		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);2042	} else if (action == HDA_FIXUP_ACT_PROBE) {2043		/* restore the connections */2044		static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };2045		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);2046		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);2047		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);2048		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);2049	}2050}2051 2052/* Set VREF on HP pin */2053static void alc889_fixup_mbp_vref(struct hda_codec *codec,2054				  const struct hda_fixup *fix, int action)2055{2056	static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };2057	struct alc_spec *spec = codec->spec;2058	int i;2059 2060	if (action != HDA_FIXUP_ACT_INIT)2061		return;2062	for (i = 0; i < ARRAY_SIZE(nids); i++) {2063		unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);2064		if (get_defcfg_device(val) != AC_JACK_HP_OUT)2065			continue;2066		val = snd_hda_codec_get_pin_target(codec, nids[i]);2067		val |= AC_PINCTL_VREF_80;2068		snd_hda_set_pin_ctl(codec, nids[i], val);2069		spec->gen.keep_vref_in_automute = 1;2070		break;2071	}2072}2073 2074static void alc889_fixup_mac_pins(struct hda_codec *codec,2075				  const hda_nid_t *nids, int num_nids)2076{2077	struct alc_spec *spec = codec->spec;2078	int i;2079 2080	for (i = 0; i < num_nids; i++) {2081		unsigned int val;2082		val = snd_hda_codec_get_pin_target(codec, nids[i]);2083		val |= AC_PINCTL_VREF_50;2084		snd_hda_set_pin_ctl(codec, nids[i], val);2085	}2086	spec->gen.keep_vref_in_automute = 1;2087}2088 2089/* Set VREF on speaker pins on imac91 */2090static void alc889_fixup_imac91_vref(struct hda_codec *codec,2091				     const struct hda_fixup *fix, int action)2092{2093	static const hda_nid_t nids[] = { 0x18, 0x1a };2094 2095	if (action == HDA_FIXUP_ACT_INIT)2096		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));2097}2098 2099/* Set VREF on speaker pins on mba11 */2100static void alc889_fixup_mba11_vref(struct hda_codec *codec,2101				    const struct hda_fixup *fix, int action)2102{2103	static const hda_nid_t nids[] = { 0x18 };2104 2105	if (action == HDA_FIXUP_ACT_INIT)2106		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));2107}2108 2109/* Set VREF on speaker pins on mba21 */2110static void alc889_fixup_mba21_vref(struct hda_codec *codec,2111				    const struct hda_fixup *fix, int action)2112{2113	static const hda_nid_t nids[] = { 0x18, 0x19 };2114 2115	if (action == HDA_FIXUP_ACT_INIT)2116		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));2117}2118 2119/* Don't take HP output as primary2120 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio2121 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x052122 */2123static void alc882_fixup_no_primary_hp(struct hda_codec *codec,2124				       const struct hda_fixup *fix, int action)2125{2126	struct alc_spec *spec = codec->spec;2127	if (action == HDA_FIXUP_ACT_PRE_PROBE) {2128		spec->gen.no_primary_hp = 1;2129		spec->gen.no_multi_io = 1;2130	}2131}2132 2133static void alc_fixup_bass_chmap(struct hda_codec *codec,2134				 const struct hda_fixup *fix, int action);2135 2136/* For dual-codec configuration, we need to disable some features to avoid2137 * conflicts of kctls and PCM streams2138 */2139static void alc_fixup_dual_codecs(struct hda_codec *codec,2140				  const struct hda_fixup *fix, int action)2141{2142	struct alc_spec *spec = codec->spec;2143 2144	if (action != HDA_FIXUP_ACT_PRE_PROBE)2145		return;2146	/* disable vmaster */2147	spec->gen.suppress_vmaster = 1;2148	/* auto-mute and auto-mic switch don't work with multiple codecs */2149	spec->gen.suppress_auto_mute = 1;2150	spec->gen.suppress_auto_mic = 1;2151	/* disable aamix as well */2152	spec->gen.mixer_nid = 0;2153	/* add location prefix to avoid conflicts */2154	codec->force_pin_prefix = 1;2155}2156 2157static void rename_ctl(struct hda_codec *codec, const char *oldname,2158		       const char *newname)2159{2160	struct snd_kcontrol *kctl;2161 2162	kctl = snd_hda_find_mixer_ctl(codec, oldname);2163	if (kctl)2164		snd_ctl_rename(codec->card, kctl, newname);2165}2166 2167static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,2168					 const struct hda_fixup *fix,2169					 int action)2170{2171	alc_fixup_dual_codecs(codec, fix, action);2172	switch (action) {2173	case HDA_FIXUP_ACT_PRE_PROBE:2174		/* override card longname to provide a unique UCM profile */2175		strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");2176		break;2177	case HDA_FIXUP_ACT_BUILD:2178		/* rename Capture controls depending on the codec */2179		rename_ctl(codec, "Capture Volume",2180			   codec->addr == 0 ?2181			   "Rear-Panel Capture Volume" :2182			   "Front-Panel Capture Volume");2183		rename_ctl(codec, "Capture Switch",2184			   codec->addr == 0 ?2185			   "Rear-Panel Capture Switch" :2186			   "Front-Panel Capture Switch");2187		break;2188	}2189}2190 2191static void alc1220_fixup_gb_x570(struct hda_codec *codec,2192				     const struct hda_fixup *fix,2193				     int action)2194{2195	static const hda_nid_t conn1[] = { 0x0c };2196	static const struct coef_fw gb_x570_coefs[] = {2197		WRITE_COEF(0x07, 0x03c0),2198		WRITE_COEF(0x1a, 0x01c1),2199		WRITE_COEF(0x1b, 0x0202),2200		WRITE_COEF(0x43, 0x3005),2201		{}2202	};2203 2204	switch (action) {2205	case HDA_FIXUP_ACT_PRE_PROBE:2206		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);2207		snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);2208		break;2209	case HDA_FIXUP_ACT_INIT:2210		alc_process_coef_fw(codec, gb_x570_coefs);2211		break;2212	}2213}2214 2215static void alc1220_fixup_clevo_p950(struct hda_codec *codec,2216				     const struct hda_fixup *fix,2217				     int action)2218{2219	static const hda_nid_t conn1[] = { 0x0c };2220 2221	if (action != HDA_FIXUP_ACT_PRE_PROBE)2222		return;2223 2224	alc_update_coef_idx(codec, 0x7, 0, 0x3c3);2225	/* We therefore want to make sure 0x14 (front headphone) and2226	 * 0x1b (speakers) use the stereo DAC 0x022227	 */2228	snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);2229	snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);2230}2231 2232static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,2233				const struct hda_fixup *fix, int action);2234 2235static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,2236				     const struct hda_fixup *fix,2237				     int action)2238{2239	alc1220_fixup_clevo_p950(codec, fix, action);2240	alc_fixup_headset_mode_no_hp_mic(codec, fix, action);2241}2242 2243static void alc887_asus_hp_automute_hook(struct hda_codec *codec,2244					 struct hda_jack_callback *jack)2245{2246	struct alc_spec *spec = codec->spec;2247	unsigned int vref;2248 2249	snd_hda_gen_hp_automute(codec, jack);2250 2251	if (spec->gen.hp_jack_present)2252		vref = AC_PINCTL_VREF_80;2253	else2254		vref = AC_PINCTL_VREF_HIZ;2255	snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);2256}2257 2258static void alc887_fixup_asus_jack(struct hda_codec *codec,2259				     const struct hda_fixup *fix, int action)2260{2261	struct alc_spec *spec = codec->spec;2262	if (action != HDA_FIXUP_ACT_PROBE)2263		return;2264	snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);2265	spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;2266}2267 2268static const struct hda_fixup alc882_fixups[] = {2269	[ALC882_FIXUP_ABIT_AW9D_MAX] = {2270		.type = HDA_FIXUP_PINS,2271		.v.pins = (const struct hda_pintbl[]) {2272			{ 0x15, 0x01080104 }, /* side */2273			{ 0x16, 0x01011012 }, /* rear */2274			{ 0x17, 0x01016011 }, /* clfe */2275			{ }2276		}2277	},2278	[ALC882_FIXUP_LENOVO_Y530] = {2279		.type = HDA_FIXUP_PINS,2280		.v.pins = (const struct hda_pintbl[]) {2281			{ 0x15, 0x99130112 }, /* rear int speakers */2282			{ 0x16, 0x99130111 }, /* subwoofer */2283			{ }2284		}2285	},2286	[ALC882_FIXUP_PB_M5210] = {2287		.type = HDA_FIXUP_PINCTLS,2288		.v.pins = (const struct hda_pintbl[]) {2289			{ 0x19, PIN_VREF50 },2290			{}2291		}2292	},2293	[ALC882_FIXUP_ACER_ASPIRE_7736] = {2294		.type = HDA_FIXUP_FUNC,2295		.v.func = alc_fixup_sku_ignore,2296	},2297	[ALC882_FIXUP_ASUS_W90V] = {2298		.type = HDA_FIXUP_PINS,2299		.v.pins = (const struct hda_pintbl[]) {2300			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */2301			{ }2302		}2303	},2304	[ALC889_FIXUP_CD] = {2305		.type = HDA_FIXUP_PINS,2306		.v.pins = (const struct hda_pintbl[]) {2307			{ 0x1c, 0x993301f0 }, /* CD */2308			{ }2309		}2310	},2311	[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {2312		.type = HDA_FIXUP_PINS,2313		.v.pins = (const struct hda_pintbl[]) {2314			{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */2315			{ }2316		},2317		.chained = true,2318		.chain_id = ALC889_FIXUP_CD,2319	},2320	[ALC889_FIXUP_VAIO_TT] = {2321		.type = HDA_FIXUP_PINS,2322		.v.pins = (const struct hda_pintbl[]) {2323			{ 0x17, 0x90170111 }, /* hidden surround speaker */2324			{ }2325		}2326	},2327	[ALC888_FIXUP_EEE1601] = {2328		.type = HDA_FIXUP_VERBS,2329		.v.verbs = (const struct hda_verb[]) {2330			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },2331			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },2332			{ }2333		}2334	},2335	[ALC886_FIXUP_EAPD] = {2336		.type = HDA_FIXUP_VERBS,2337		.v.verbs = (const struct hda_verb[]) {2338			/* change to EAPD mode */2339			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2340			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },2341			{ }2342		}2343	},2344	[ALC882_FIXUP_EAPD] = {2345		.type = HDA_FIXUP_VERBS,2346		.v.verbs = (const struct hda_verb[]) {2347			/* change to EAPD mode */2348			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2349			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },2350			{ }2351		}2352	},2353	[ALC883_FIXUP_EAPD] = {2354		.type = HDA_FIXUP_VERBS,2355		.v.verbs = (const struct hda_verb[]) {2356			/* change to EAPD mode */2357			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2358			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },2359			{ }2360		}2361	},2362	[ALC883_FIXUP_ACER_EAPD] = {2363		.type = HDA_FIXUP_VERBS,2364		.v.verbs = (const struct hda_verb[]) {2365			/* eanable EAPD on Acer laptops */2366			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2367			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },2368			{ }2369		}2370	},2371	[ALC882_FIXUP_GPIO1] = {2372		.type = HDA_FIXUP_FUNC,2373		.v.func = alc_fixup_gpio1,2374	},2375	[ALC882_FIXUP_GPIO2] = {2376		.type = HDA_FIXUP_FUNC,2377		.v.func = alc_fixup_gpio2,2378	},2379	[ALC882_FIXUP_GPIO3] = {2380		.type = HDA_FIXUP_FUNC,2381		.v.func = alc_fixup_gpio3,2382	},2383	[ALC882_FIXUP_ASUS_W2JC] = {2384		.type = HDA_FIXUP_FUNC,2385		.v.func = alc_fixup_gpio1,2386		.chained = true,2387		.chain_id = ALC882_FIXUP_EAPD,2388	},2389	[ALC889_FIXUP_COEF] = {2390		.type = HDA_FIXUP_FUNC,2391		.v.func = alc889_fixup_coef,2392	},2393	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {2394		.type = HDA_FIXUP_PINS,2395		.v.pins = (const struct hda_pintbl[]) {2396			{ 0x16, 0x99130111 }, /* CLFE speaker */2397			{ 0x17, 0x99130112 }, /* surround speaker */2398			{ }2399		},2400		.chained = true,2401		.chain_id = ALC882_FIXUP_GPIO1,2402	},2403	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {2404		.type = HDA_FIXUP_PINS,2405		.v.pins = (const struct hda_pintbl[]) {2406			{ 0x16, 0x99130111 }, /* CLFE speaker */2407			{ 0x1b, 0x99130112 }, /* surround speaker */2408			{ }2409		},2410		.chained = true,2411		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,2412	},2413	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {2414		/* additional init verbs for Acer Aspire 8930G */2415		.type = HDA_FIXUP_VERBS,2416		.v.verbs = (const struct hda_verb[]) {2417			/* Enable all DACs */2418			/* DAC DISABLE/MUTE 1? */2419			/*  setting bits 1-5 disables DAC nids 0x02-0x062420			 *  apparently. Init=0x38 */2421			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },2422			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },2423			/* DAC DISABLE/MUTE 2? */2424			/*  some bit here disables the other DACs.2425			 *  Init=0x4900 */2426			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },2427			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },2428			/* DMIC fix2429			 * This laptop has a stereo digital microphone.2430			 * The mics are only 1cm apart which makes the stereo2431			 * useless. However, either the mic or the ALC8892432			 * makes the signal become a difference/sum signal2433			 * instead of standard stereo, which is annoying.2434			 * So instead we flip this bit which makes the2435			 * codec replicate the sum signal to both channels,2436			 * turning it into a normal mono mic.2437			 */2438			/* DMIC_CONTROL? Init value = 0x0001 */2439			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },2440			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },2441			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2442			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },2443			{ }2444		},2445		.chained = true,2446		.chain_id = ALC882_FIXUP_GPIO1,2447	},2448	[ALC885_FIXUP_MACPRO_GPIO] = {2449		.type = HDA_FIXUP_FUNC,2450		.v.func = alc885_fixup_macpro_gpio,2451	},2452	[ALC889_FIXUP_DAC_ROUTE] = {2453		.type = HDA_FIXUP_FUNC,2454		.v.func = alc889_fixup_dac_route,2455	},2456	[ALC889_FIXUP_MBP_VREF] = {2457		.type = HDA_FIXUP_FUNC,2458		.v.func = alc889_fixup_mbp_vref,2459		.chained = true,2460		.chain_id = ALC882_FIXUP_GPIO1,2461	},2462	[ALC889_FIXUP_IMAC91_VREF] = {2463		.type = HDA_FIXUP_FUNC,2464		.v.func = alc889_fixup_imac91_vref,2465		.chained = true,2466		.chain_id = ALC882_FIXUP_GPIO1,2467	},2468	[ALC889_FIXUP_MBA11_VREF] = {2469		.type = HDA_FIXUP_FUNC,2470		.v.func = alc889_fixup_mba11_vref,2471		.chained = true,2472		.chain_id = ALC889_FIXUP_MBP_VREF,2473	},2474	[ALC889_FIXUP_MBA21_VREF] = {2475		.type = HDA_FIXUP_FUNC,2476		.v.func = alc889_fixup_mba21_vref,2477		.chained = true,2478		.chain_id = ALC889_FIXUP_MBP_VREF,2479	},2480	[ALC889_FIXUP_MP11_VREF] = {2481		.type = HDA_FIXUP_FUNC,2482		.v.func = alc889_fixup_mba11_vref,2483		.chained = true,2484		.chain_id = ALC885_FIXUP_MACPRO_GPIO,2485	},2486	[ALC889_FIXUP_MP41_VREF] = {2487		.type = HDA_FIXUP_FUNC,2488		.v.func = alc889_fixup_mbp_vref,2489		.chained = true,2490		.chain_id = ALC885_FIXUP_MACPRO_GPIO,2491	},2492	[ALC882_FIXUP_INV_DMIC] = {2493		.type = HDA_FIXUP_FUNC,2494		.v.func = alc_fixup_inv_dmic,2495	},2496	[ALC882_FIXUP_NO_PRIMARY_HP] = {2497		.type = HDA_FIXUP_FUNC,2498		.v.func = alc882_fixup_no_primary_hp,2499	},2500	[ALC887_FIXUP_ASUS_BASS] = {2501		.type = HDA_FIXUP_PINS,2502		.v.pins = (const struct hda_pintbl[]) {2503			{0x16, 0x99130130}, /* bass speaker */2504			{}2505		},2506		.chained = true,2507		.chain_id = ALC887_FIXUP_BASS_CHMAP,2508	},2509	[ALC887_FIXUP_BASS_CHMAP] = {2510		.type = HDA_FIXUP_FUNC,2511		.v.func = alc_fixup_bass_chmap,2512	},2513	[ALC1220_FIXUP_GB_DUAL_CODECS] = {2514		.type = HDA_FIXUP_FUNC,2515		.v.func = alc1220_fixup_gb_dual_codecs,2516	},2517	[ALC1220_FIXUP_GB_X570] = {2518		.type = HDA_FIXUP_FUNC,2519		.v.func = alc1220_fixup_gb_x570,2520	},2521	[ALC1220_FIXUP_CLEVO_P950] = {2522		.type = HDA_FIXUP_FUNC,2523		.v.func = alc1220_fixup_clevo_p950,2524	},2525	[ALC1220_FIXUP_CLEVO_PB51ED] = {2526		.type = HDA_FIXUP_FUNC,2527		.v.func = alc1220_fixup_clevo_pb51ed,2528	},2529	[ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {2530		.type = HDA_FIXUP_PINS,2531		.v.pins = (const struct hda_pintbl[]) {2532			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */2533			{}2534		},2535		.chained = true,2536		.chain_id = ALC1220_FIXUP_CLEVO_PB51ED,2537	},2538	[ALC887_FIXUP_ASUS_AUDIO] = {2539		.type = HDA_FIXUP_PINS,2540		.v.pins = (const struct hda_pintbl[]) {2541			{ 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */2542			{ 0x19, 0x22219420 },2543			{}2544		},2545	},2546	[ALC887_FIXUP_ASUS_HMIC] = {2547		.type = HDA_FIXUP_FUNC,2548		.v.func = alc887_fixup_asus_jack,2549		.chained = true,2550		.chain_id = ALC887_FIXUP_ASUS_AUDIO,2551	},2552	[ALCS1200A_FIXUP_MIC_VREF] = {2553		.type = HDA_FIXUP_PINCTLS,2554		.v.pins = (const struct hda_pintbl[]) {2555			{ 0x18, PIN_VREF50 }, /* rear mic */2556			{ 0x19, PIN_VREF50 }, /* front mic */2557			{}2558		}2559	},2560	[ALC888VD_FIXUP_MIC_100VREF] = {2561		.type = HDA_FIXUP_PINCTLS,2562		.v.pins = (const struct hda_pintbl[]) {2563			{ 0x18, PIN_VREF100 }, /* headset mic */2564			{}2565		}2566	},2567};2568 2569static const struct snd_pci_quirk alc882_fixup_tbl[] = {2570	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),2571	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),2572	SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),2573	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),2574	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),2575	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),2576	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),2577	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",2578		      ALC882_FIXUP_ACER_ASPIRE_4930G),2579	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",2580		      ALC882_FIXUP_ACER_ASPIRE_4930G),2581	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",2582		      ALC882_FIXUP_ACER_ASPIRE_8930G),2583	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",2584		      ALC882_FIXUP_ACER_ASPIRE_8930G),2585	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",2586		      ALC882_FIXUP_ACER_ASPIRE_4930G),2587	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),2588	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",2589		      ALC882_FIXUP_ACER_ASPIRE_4930G),2590	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",2591		      ALC882_FIXUP_ACER_ASPIRE_4930G),2592	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",2593		      ALC882_FIXUP_ACER_ASPIRE_4930G),2594	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),2595	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),2596	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),2597	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),2598	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),2599	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),2600	SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),2601	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),2602	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),2603	SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),2604	SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),2605	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),2606	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),2607	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),2608	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),2609	SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),2610 2611	/* All Apple entries are in codec SSIDs */2612	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),2613	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),2614	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),2615	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),2616	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),2617	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),2618	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),2619	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),2620	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),2621	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),2622	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),2623	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),2624	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),2625	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),2626	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),2627	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),2628	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),2629	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),2630	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),2631	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),2632	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),2633	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),2634 2635	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),2636	SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),2637	SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),2638	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),2639	SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),2640	SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),2641	SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),2642	SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),2643	SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),2644	SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),2645	SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),2646	SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),2647	SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),2648	SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),2649	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),2650	SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),2651	SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),2652	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),2653	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),2654	SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2655	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2656	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2657	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2658	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2659	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2660	SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2661	SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2662	SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2663	SND_PCI_QUIRK(0x1558, 0x66a6, "Clevo PE60SN[CDE]-[GS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2664	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2665	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2666	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2667	SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2668	SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2669	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2670	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2671	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),2672	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),2673	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),2674	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),2675	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),2676	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),2677	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),2678	SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),2679	SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),2680	SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),2681	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),2682	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),2683	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),2684	SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),2685	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),2686	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),2687	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),2688	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),2689	{}2690};2691 2692static const struct hda_model_fixup alc882_fixup_models[] = {2693	{.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},2694	{.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},2695	{.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},2696	{.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},2697	{.id = ALC889_FIXUP_CD, .name = "cd"},2698	{.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},2699	{.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},2700	{.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},2701	{.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},2702	{.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},2703	{.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},2704	{.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},2705	{.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},2706	{.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},2707	{.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},2708	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},2709	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},2710	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},2711	{.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},2712	{.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},2713	{.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},2714	{.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},2715	{.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},2716	{.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},2717	{.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},2718	{.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},2719	{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},2720	{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},2721	{.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},2722	{.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},2723	{.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},2724	{.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},2725	{}2726};2727 2728static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {2729	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,2730		{0x14, 0x01014010},2731		{0x15, 0x01011012},2732		{0x16, 0x01016011},2733		{0x18, 0x01a19040},2734		{0x19, 0x02a19050},2735		{0x1a, 0x0181304f},2736		{0x1b, 0x0221401f},2737		{0x1e, 0x01456130}),2738	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,2739		{0x14, 0x01015010},2740		{0x15, 0x01011012},2741		{0x16, 0x01011011},2742		{0x18, 0x01a11040},2743		{0x19, 0x02a19050},2744		{0x1a, 0x0181104f},2745		{0x1b, 0x0221401f},2746		{0x1e, 0x01451130}),2747	{}2748};2749 2750/*2751 * BIOS auto configuration2752 */2753/* almost identical with ALC880 parser... */2754static int alc882_parse_auto_config(struct hda_codec *codec)2755{2756	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };2757	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };2758	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);2759}2760 2761/*2762 */2763static int patch_alc882(struct hda_codec *codec)2764{2765	struct alc_spec *spec;2766	int err;2767 2768	err = alc_alloc_spec(codec, 0x0b);2769	if (err < 0)2770		return err;2771 2772	spec = codec->spec;2773 2774	switch (codec->core.vendor_id) {2775	case 0x10ec0882:2776	case 0x10ec0885:2777	case 0x10ec0900:2778	case 0x10ec0b00:2779	case 0x10ec1220:2780		break;2781	default:2782		/* ALC883 and variants */2783		alc_fix_pll_init(codec, 0x20, 0x0a, 10);2784		break;2785	}2786 2787	alc_pre_init(codec);2788 2789	snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,2790		       alc882_fixups);2791	snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);2792	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);2793 2794	alc_auto_parse_customize_define(codec);2795 2796	if (has_cdefine_beep(codec))2797		spec->gen.beep_nid = 0x01;2798 2799	/* automatic parse from the BIOS config */2800	err = alc882_parse_auto_config(codec);2801	if (err < 0)2802		goto error;2803 2804	if (!spec->gen.no_analog && spec->gen.beep_nid) {2805		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);2806		if (err < 0)2807			goto error;2808	}2809 2810	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);2811 2812	return 0;2813 2814 error:2815	alc_free(codec);2816	return err;2817}2818 2819 2820/*2821 * ALC262 support2822 */2823static int alc262_parse_auto_config(struct hda_codec *codec)2824{2825	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };2826	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };2827	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);2828}2829 2830/*2831 * Pin config fixes2832 */2833enum {2834	ALC262_FIXUP_FSC_H270,2835	ALC262_FIXUP_FSC_S7110,2836	ALC262_FIXUP_HP_Z200,2837	ALC262_FIXUP_TYAN,2838	ALC262_FIXUP_LENOVO_3000,2839	ALC262_FIXUP_BENQ,2840	ALC262_FIXUP_BENQ_T31,2841	ALC262_FIXUP_INV_DMIC,2842	ALC262_FIXUP_INTEL_BAYLEYBAY,2843};2844 2845static const struct hda_fixup alc262_fixups[] = {2846	[ALC262_FIXUP_FSC_H270] = {2847		.type = HDA_FIXUP_PINS,2848		.v.pins = (const struct hda_pintbl[]) {2849			{ 0x14, 0x99130110 }, /* speaker */2850			{ 0x15, 0x0221142f }, /* front HP */2851			{ 0x1b, 0x0121141f }, /* rear HP */2852			{ }2853		}2854	},2855	[ALC262_FIXUP_FSC_S7110] = {2856		.type = HDA_FIXUP_PINS,2857		.v.pins = (const struct hda_pintbl[]) {2858			{ 0x15, 0x90170110 }, /* speaker */2859			{ }2860		},2861		.chained = true,2862		.chain_id = ALC262_FIXUP_BENQ,2863	},2864	[ALC262_FIXUP_HP_Z200] = {2865		.type = HDA_FIXUP_PINS,2866		.v.pins = (const struct hda_pintbl[]) {2867			{ 0x16, 0x99130120 }, /* internal speaker */2868			{ }2869		}2870	},2871	[ALC262_FIXUP_TYAN] = {2872		.type = HDA_FIXUP_PINS,2873		.v.pins = (const struct hda_pintbl[]) {2874			{ 0x14, 0x1993e1f0 }, /* int AUX */2875			{ }2876		}2877	},2878	[ALC262_FIXUP_LENOVO_3000] = {2879		.type = HDA_FIXUP_PINCTLS,2880		.v.pins = (const struct hda_pintbl[]) {2881			{ 0x19, PIN_VREF50 },2882			{}2883		},2884		.chained = true,2885		.chain_id = ALC262_FIXUP_BENQ,2886	},2887	[ALC262_FIXUP_BENQ] = {2888		.type = HDA_FIXUP_VERBS,2889		.v.verbs = (const struct hda_verb[]) {2890			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2891			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },2892			{}2893		}2894	},2895	[ALC262_FIXUP_BENQ_T31] = {2896		.type = HDA_FIXUP_VERBS,2897		.v.verbs = (const struct hda_verb[]) {2898			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },2899			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },2900			{}2901		}2902	},2903	[ALC262_FIXUP_INV_DMIC] = {2904		.type = HDA_FIXUP_FUNC,2905		.v.func = alc_fixup_inv_dmic,2906	},2907	[ALC262_FIXUP_INTEL_BAYLEYBAY] = {2908		.type = HDA_FIXUP_FUNC,2909		.v.func = alc_fixup_no_depop_delay,2910	},2911};2912 2913static const struct snd_pci_quirk alc262_fixup_tbl[] = {2914	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),2915	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),2916	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),2917	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),2918	SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),2919	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),2920	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),2921	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),2922	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),2923	SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),2924	{}2925};2926 2927static const struct hda_model_fixup alc262_fixup_models[] = {2928	{.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},2929	{.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},2930	{.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},2931	{.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},2932	{.id = ALC262_FIXUP_TYAN, .name = "tyan"},2933	{.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},2934	{.id = ALC262_FIXUP_BENQ, .name = "benq"},2935	{.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},2936	{.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},2937	{}2938};2939 2940/*2941 */2942static int patch_alc262(struct hda_codec *codec)2943{2944	struct alc_spec *spec;2945	int err;2946 2947	err = alc_alloc_spec(codec, 0x0b);2948	if (err < 0)2949		return err;2950 2951	spec = codec->spec;2952	spec->gen.shared_mic_vref_pin = 0x18;2953 2954	spec->shutup = alc_eapd_shutup;2955 2956#if 02957	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is2958	 * under-run2959	 */2960	alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);2961#endif2962	alc_fix_pll_init(codec, 0x20, 0x0a, 10);2963 2964	alc_pre_init(codec);2965 2966	snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,2967		       alc262_fixups);2968	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);2969 2970	alc_auto_parse_customize_define(codec);2971 2972	if (has_cdefine_beep(codec))2973		spec->gen.beep_nid = 0x01;2974 2975	/* automatic parse from the BIOS config */2976	err = alc262_parse_auto_config(codec);2977	if (err < 0)2978		goto error;2979 2980	if (!spec->gen.no_analog && spec->gen.beep_nid) {2981		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);2982		if (err < 0)2983			goto error;2984	}2985 2986	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);2987 2988	return 0;2989 2990 error:2991	alc_free(codec);2992	return err;2993}2994 2995/*2996 *  ALC2682997 */2998/* bind Beep switches of both NID 0x0f and 0x10 */2999static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,3000				  struct snd_ctl_elem_value *ucontrol)3001{3002	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);3003	unsigned long pval;3004	int err;3005 3006	mutex_lock(&codec->control_mutex);3007	pval = kcontrol->private_value;3008	kcontrol->private_value = (pval & ~0xff) | 0x0f;3009	err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);3010	if (err >= 0) {3011		kcontrol->private_value = (pval & ~0xff) | 0x10;3012		err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);3013	}3014	kcontrol->private_value = pval;3015	mutex_unlock(&codec->control_mutex);3016	return err;3017}3018 3019static const struct snd_kcontrol_new alc268_beep_mixer[] = {3020	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),3021	{3022		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,3023		.name = "Beep Playback Switch",3024		.subdevice = HDA_SUBDEV_AMP_FLAG,3025		.info = snd_hda_mixer_amp_switch_info,3026		.get = snd_hda_mixer_amp_switch_get,3027		.put = alc268_beep_switch_put,3028		.private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)3029	},3030};3031 3032/* set PCBEEP vol = 0, mute connections */3033static const struct hda_verb alc268_beep_init_verbs[] = {3034	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},3035	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},3036	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},3037	{ }3038};3039 3040enum {3041	ALC268_FIXUP_INV_DMIC,3042	ALC268_FIXUP_HP_EAPD,3043	ALC268_FIXUP_SPDIF,3044};3045 3046static const struct hda_fixup alc268_fixups[] = {3047	[ALC268_FIXUP_INV_DMIC] = {3048		.type = HDA_FIXUP_FUNC,3049		.v.func = alc_fixup_inv_dmic,3050	},3051	[ALC268_FIXUP_HP_EAPD] = {3052		.type = HDA_FIXUP_VERBS,3053		.v.verbs = (const struct hda_verb[]) {3054			{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},3055			{}3056		}3057	},3058	[ALC268_FIXUP_SPDIF] = {3059		.type = HDA_FIXUP_PINS,3060		.v.pins = (const struct hda_pintbl[]) {3061			{ 0x1e, 0x014b1180 }, /* enable SPDIF out */3062			{}3063		}3064	},3065};3066 3067static const struct hda_model_fixup alc268_fixup_models[] = {3068	{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},3069	{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},3070	{.id = ALC268_FIXUP_SPDIF, .name = "spdif"},3071	{}3072};3073 3074static const struct snd_pci_quirk alc268_fixup_tbl[] = {3075	SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),3076	SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),3077	/* below is codec SSID since multiple Toshiba laptops have the3078	 * same PCI SSID 1179:ff003079	 */3080	SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),3081	{}3082};3083 3084/*3085 * BIOS auto configuration3086 */3087static int alc268_parse_auto_config(struct hda_codec *codec)3088{3089	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };3090	return alc_parse_auto_config(codec, NULL, alc268_ssids);3091}3092 3093/*3094 */3095static int patch_alc268(struct hda_codec *codec)3096{3097	struct alc_spec *spec;3098	int i, err;3099 3100	/* ALC268 has no aa-loopback mixer */3101	err = alc_alloc_spec(codec, 0);3102	if (err < 0)3103		return err;3104 3105	spec = codec->spec;3106	if (has_cdefine_beep(codec))3107		spec->gen.beep_nid = 0x01;3108 3109	spec->shutup = alc_eapd_shutup;3110 3111	alc_pre_init(codec);3112 3113	snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);3114	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);3115 3116	/* automatic parse from the BIOS config */3117	err = alc268_parse_auto_config(codec);3118	if (err < 0)3119		goto error;3120 3121	if (err > 0 && !spec->gen.no_analog &&3122	    spec->gen.autocfg.speaker_pins[0] != 0x1d) {3123		for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {3124			if (!snd_hda_gen_add_kctl(&spec->gen, NULL,3125						  &alc268_beep_mixer[i])) {3126				err = -ENOMEM;3127				goto error;3128			}3129		}3130		snd_hda_add_verbs(codec, alc268_beep_init_verbs);3131		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))3132			/* override the amp caps for beep generator */3133			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,3134					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |3135					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |3136					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |3137					  (0 << AC_AMPCAP_MUTE_SHIFT));3138	}3139 3140	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);3141 3142	return 0;3143 3144 error:3145	alc_free(codec);3146	return err;3147}3148 3149/*3150 * ALC2693151 */3152 3153static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {3154	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */3155};3156 3157static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {3158	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */3159};3160 3161/* different alc269-variants */3162enum {3163	ALC269_TYPE_ALC269VA,3164	ALC269_TYPE_ALC269VB,3165	ALC269_TYPE_ALC269VC,3166	ALC269_TYPE_ALC269VD,3167	ALC269_TYPE_ALC280,3168	ALC269_TYPE_ALC282,3169	ALC269_TYPE_ALC283,3170	ALC269_TYPE_ALC284,3171	ALC269_TYPE_ALC293,3172	ALC269_TYPE_ALC286,3173	ALC269_TYPE_ALC298,3174	ALC269_TYPE_ALC255,3175	ALC269_TYPE_ALC256,3176	ALC269_TYPE_ALC257,3177	ALC269_TYPE_ALC215,3178	ALC269_TYPE_ALC225,3179	ALC269_TYPE_ALC245,3180	ALC269_TYPE_ALC287,3181	ALC269_TYPE_ALC294,3182	ALC269_TYPE_ALC300,3183	ALC269_TYPE_ALC623,3184	ALC269_TYPE_ALC700,3185};3186 3187/*3188 * BIOS auto configuration3189 */3190static int alc269_parse_auto_config(struct hda_codec *codec)3191{3192	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };3193	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };3194	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };3195	struct alc_spec *spec = codec->spec;3196	const hda_nid_t *ssids;3197 3198	switch (spec->codec_variant) {3199	case ALC269_TYPE_ALC269VA:3200	case ALC269_TYPE_ALC269VC:3201	case ALC269_TYPE_ALC280:3202	case ALC269_TYPE_ALC284:3203	case ALC269_TYPE_ALC293:3204		ssids = alc269va_ssids;3205		break;3206	case ALC269_TYPE_ALC269VB:3207	case ALC269_TYPE_ALC269VD:3208	case ALC269_TYPE_ALC282:3209	case ALC269_TYPE_ALC283:3210	case ALC269_TYPE_ALC286:3211	case ALC269_TYPE_ALC298:3212	case ALC269_TYPE_ALC255:3213	case ALC269_TYPE_ALC256:3214	case ALC269_TYPE_ALC257:3215	case ALC269_TYPE_ALC215:3216	case ALC269_TYPE_ALC225:3217	case ALC269_TYPE_ALC245:3218	case ALC269_TYPE_ALC287:3219	case ALC269_TYPE_ALC294:3220	case ALC269_TYPE_ALC300:3221	case ALC269_TYPE_ALC623:3222	case ALC269_TYPE_ALC700:3223		ssids = alc269_ssids;3224		break;3225	default:3226		ssids = alc269_ssids;3227		break;3228	}3229 3230	return alc_parse_auto_config(codec, alc269_ignore, ssids);3231}3232 3233static const struct hda_jack_keymap alc_headset_btn_keymap[] = {3234	{ SND_JACK_BTN_0, KEY_PLAYPAUSE },3235	{ SND_JACK_BTN_1, KEY_VOICECOMMAND },3236	{ SND_JACK_BTN_2, KEY_VOLUMEUP },3237	{ SND_JACK_BTN_3, KEY_VOLUMEDOWN },3238	{}3239};3240 3241static void alc_headset_btn_callback(struct hda_codec *codec,3242				     struct hda_jack_callback *jack)3243{3244	int report = 0;3245 3246	if (jack->unsol_res & (7 << 13))3247		report |= SND_JACK_BTN_0;3248 3249	if (jack->unsol_res  & (1 << 16 | 3 << 8))3250		report |= SND_JACK_BTN_1;3251 3252	/* Volume up key */3253	if (jack->unsol_res & (7 << 23))3254		report |= SND_JACK_BTN_2;3255 3256	/* Volume down key */3257	if (jack->unsol_res & (7 << 10))3258		report |= SND_JACK_BTN_3;3259 3260	snd_hda_jack_set_button_state(codec, jack->nid, report);3261}3262 3263static void alc_disable_headset_jack_key(struct hda_codec *codec)3264{3265	struct alc_spec *spec = codec->spec;3266 3267	if (!spec->has_hs_key)3268		return;3269 3270	switch (codec->core.vendor_id) {3271	case 0x10ec0215:3272	case 0x10ec0225:3273	case 0x10ec0285:3274	case 0x10ec0287:3275	case 0x10ec0295:3276	case 0x10ec0289:3277	case 0x10ec0299:3278		alc_write_coef_idx(codec, 0x48, 0x0);3279		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);3280		alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);3281		break;3282	case 0x10ec0230:3283	case 0x10ec0236:3284	case 0x10ec0256:3285	case 0x10ec0257:3286	case 0x19e58326:3287		alc_write_coef_idx(codec, 0x48, 0x0);3288		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);3289		break;3290	}3291}3292 3293static void alc_enable_headset_jack_key(struct hda_codec *codec)3294{3295	struct alc_spec *spec = codec->spec;3296 3297	if (!spec->has_hs_key)3298		return;3299 3300	switch (codec->core.vendor_id) {3301	case 0x10ec0215:3302	case 0x10ec0225:3303	case 0x10ec0285:3304	case 0x10ec0287:3305	case 0x10ec0295:3306	case 0x10ec0289:3307	case 0x10ec0299:3308		alc_write_coef_idx(codec, 0x48, 0xd011);3309		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);3310		alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);3311		break;3312	case 0x10ec0230:3313	case 0x10ec0236:3314	case 0x10ec0256:3315	case 0x10ec0257:3316	case 0x19e58326:3317		alc_write_coef_idx(codec, 0x48, 0xd011);3318		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);3319		break;3320	}3321}3322 3323static void alc_fixup_headset_jack(struct hda_codec *codec,3324				    const struct hda_fixup *fix, int action)3325{3326	struct alc_spec *spec = codec->spec;3327	hda_nid_t hp_pin;3328 3329	switch (action) {3330	case HDA_FIXUP_ACT_PRE_PROBE:3331		spec->has_hs_key = 1;3332		snd_hda_jack_detect_enable_callback(codec, 0x55,3333						    alc_headset_btn_callback);3334		break;3335	case HDA_FIXUP_ACT_BUILD:3336		hp_pin = alc_get_hp_pin(spec);3337		if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,3338							alc_headset_btn_keymap,3339							hp_pin))3340			snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",3341					      false, SND_JACK_HEADSET,3342					      alc_headset_btn_keymap);3343 3344		alc_enable_headset_jack_key(codec);3345		break;3346	}3347}3348 3349static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)3350{3351	alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);3352}3353 3354static void alc269_shutup(struct hda_codec *codec)3355{3356	struct alc_spec *spec = codec->spec;3357 3358	if (spec->codec_variant == ALC269_TYPE_ALC269VB)3359		alc269vb_toggle_power_output(codec, 0);3360	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&3361			(alc_get_coef0(codec) & 0x00ff) == 0x018) {3362		msleep(150);3363	}3364	alc_shutup_pins(codec);3365}3366 3367static const struct coef_fw alc282_coefs[] = {3368	WRITE_COEF(0x03, 0x0002), /* Power Down Control */3369	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */3370	WRITE_COEF(0x07, 0x0200), /* DMIC control */3371	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */3372	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */3373	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */3374	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */3375	WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */3376	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */3377	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */3378	WRITE_COEF(0x6f, 0x0), /* Class D test 4 */3379	UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */3380	WRITE_COEF(0x34, 0xa0c0), /* ANC */3381	UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */3382	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */3383	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */3384	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */3385	WRITE_COEF(0x63, 0x2902), /* PLL */3386	WRITE_COEF(0x68, 0xa080), /* capless control 2 */3387	WRITE_COEF(0x69, 0x3400), /* capless control 3 */3388	WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */3389	WRITE_COEF(0x6b, 0x0), /* capless control 5 */3390	UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */3391	WRITE_COEF(0x6e, 0x110a), /* class D test 3 */3392	UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */3393	WRITE_COEF(0x71, 0x0014), /* class D test 6 */3394	WRITE_COEF(0x72, 0xc2ba), /* classD OCP */3395	UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */3396	WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */3397	{}3398};3399 3400static void alc282_restore_default_value(struct hda_codec *codec)3401{3402	alc_process_coef_fw(codec, alc282_coefs);3403}3404 3405static void alc282_init(struct hda_codec *codec)3406{3407	struct alc_spec *spec = codec->spec;3408	hda_nid_t hp_pin = alc_get_hp_pin(spec);3409	bool hp_pin_sense;3410	int coef78;3411 3412	alc282_restore_default_value(codec);3413 3414	if (!hp_pin)3415		return;3416	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3417	coef78 = alc_read_coef_idx(codec, 0x78);3418 3419	/* Index 0x78 Direct Drive HP AMP LPM Control 1 */3420	/* Headphone capless set to high power mode */3421	alc_write_coef_idx(codec, 0x78, 0x9004);3422 3423	if (hp_pin_sense)3424		msleep(2);3425 3426	snd_hda_codec_write(codec, hp_pin, 0,3427			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3428 3429	if (hp_pin_sense)3430		msleep(85);3431 3432	snd_hda_codec_write(codec, hp_pin, 0,3433			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);3434 3435	if (hp_pin_sense)3436		msleep(100);3437 3438	/* Headphone capless set to normal mode */3439	alc_write_coef_idx(codec, 0x78, coef78);3440}3441 3442static void alc282_shutup(struct hda_codec *codec)3443{3444	struct alc_spec *spec = codec->spec;3445	hda_nid_t hp_pin = alc_get_hp_pin(spec);3446	bool hp_pin_sense;3447	int coef78;3448 3449	if (!hp_pin) {3450		alc269_shutup(codec);3451		return;3452	}3453 3454	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3455	coef78 = alc_read_coef_idx(codec, 0x78);3456	alc_write_coef_idx(codec, 0x78, 0x9004);3457 3458	if (hp_pin_sense)3459		msleep(2);3460 3461	snd_hda_codec_write(codec, hp_pin, 0,3462			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3463 3464	if (hp_pin_sense)3465		msleep(85);3466 3467	if (!spec->no_shutup_pins)3468		snd_hda_codec_write(codec, hp_pin, 0,3469				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3470 3471	if (hp_pin_sense)3472		msleep(100);3473 3474	alc_auto_setup_eapd(codec, false);3475	alc_shutup_pins(codec);3476	alc_write_coef_idx(codec, 0x78, coef78);3477}3478 3479static const struct coef_fw alc283_coefs[] = {3480	WRITE_COEF(0x03, 0x0002), /* Power Down Control */3481	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */3482	WRITE_COEF(0x07, 0x0200), /* DMIC control */3483	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */3484	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */3485	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */3486	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */3487	WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */3488	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */3489	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */3490	WRITE_COEF(0x3a, 0x0), /* Class D test 4 */3491	UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */3492	WRITE_COEF(0x22, 0xa0c0), /* ANC */3493	UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */3494	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */3495	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */3496	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */3497	WRITE_COEF(0x2e, 0x2902), /* PLL */3498	WRITE_COEF(0x33, 0xa080), /* capless control 2 */3499	WRITE_COEF(0x34, 0x3400), /* capless control 3 */3500	WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */3501	WRITE_COEF(0x36, 0x0), /* capless control 5 */3502	UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */3503	WRITE_COEF(0x39, 0x110a), /* class D test 3 */3504	UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */3505	WRITE_COEF(0x3c, 0x0014), /* class D test 6 */3506	WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */3507	UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */3508	WRITE_COEF(0x49, 0x0), /* test mode */3509	UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */3510	UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */3511	WRITE_COEF(0x37, 0xfc06), /* Class D amp control */3512	UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */3513	{}3514};3515 3516static void alc283_restore_default_value(struct hda_codec *codec)3517{3518	alc_process_coef_fw(codec, alc283_coefs);3519}3520 3521static void alc283_init(struct hda_codec *codec)3522{3523	struct alc_spec *spec = codec->spec;3524	hda_nid_t hp_pin = alc_get_hp_pin(spec);3525	bool hp_pin_sense;3526 3527	alc283_restore_default_value(codec);3528 3529	if (!hp_pin)3530		return;3531 3532	msleep(30);3533	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3534 3535	/* Index 0x43 Direct Drive HP AMP LPM Control 1 */3536	/* Headphone capless set to high power mode */3537	alc_write_coef_idx(codec, 0x43, 0x9004);3538 3539	snd_hda_codec_write(codec, hp_pin, 0,3540			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3541 3542	if (hp_pin_sense)3543		msleep(85);3544 3545	snd_hda_codec_write(codec, hp_pin, 0,3546			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);3547 3548	if (hp_pin_sense)3549		msleep(85);3550	/* Index 0x46 Combo jack auto switch control 2 */3551	/* 3k pull low control for Headset jack. */3552	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);3553	/* Headphone capless set to normal mode */3554	alc_write_coef_idx(codec, 0x43, 0x9614);3555}3556 3557static void alc283_shutup(struct hda_codec *codec)3558{3559	struct alc_spec *spec = codec->spec;3560	hda_nid_t hp_pin = alc_get_hp_pin(spec);3561	bool hp_pin_sense;3562 3563	if (!hp_pin) {3564		alc269_shutup(codec);3565		return;3566	}3567 3568	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3569 3570	alc_write_coef_idx(codec, 0x43, 0x9004);3571 3572	/*depop hp during suspend*/3573	alc_write_coef_idx(codec, 0x06, 0x2100);3574 3575	snd_hda_codec_write(codec, hp_pin, 0,3576			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3577 3578	if (hp_pin_sense)3579		msleep(100);3580 3581	if (!spec->no_shutup_pins)3582		snd_hda_codec_write(codec, hp_pin, 0,3583				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3584 3585	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);3586 3587	if (hp_pin_sense)3588		msleep(100);3589	alc_auto_setup_eapd(codec, false);3590	alc_shutup_pins(codec);3591	alc_write_coef_idx(codec, 0x43, 0x9614);3592}3593 3594static void alc256_init(struct hda_codec *codec)3595{3596	struct alc_spec *spec = codec->spec;3597	hda_nid_t hp_pin = alc_get_hp_pin(spec);3598	bool hp_pin_sense;3599 3600	if (spec->ultra_low_power) {3601		alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);3602		alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);3603		alc_update_coef_idx(codec, 0x08, 7<<4, 0);3604		alc_update_coef_idx(codec, 0x3b, 1<<15, 0);3605		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);3606		msleep(30);3607	}3608 3609	if (!hp_pin)3610		hp_pin = 0x21;3611 3612	msleep(30);3613 3614	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3615 3616	if (hp_pin_sense)3617		msleep(2);3618 3619	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */3620 3621	snd_hda_codec_write(codec, hp_pin, 0,3622			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3623 3624	if (hp_pin_sense || spec->ultra_low_power)3625		msleep(85);3626 3627	snd_hda_codec_write(codec, hp_pin, 0,3628			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);3629 3630	if (hp_pin_sense || spec->ultra_low_power)3631		msleep(100);3632 3633	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);3634	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */3635	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */3636	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);3637	/*3638	 * Expose headphone mic (or possibly Line In on some machines) instead3639	 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See3640	 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of3641	 * this register.3642	 */3643	alc_write_coef_idx(codec, 0x36, 0x5757);3644}3645 3646static void alc256_shutup(struct hda_codec *codec)3647{3648	struct alc_spec *spec = codec->spec;3649	hda_nid_t hp_pin = alc_get_hp_pin(spec);3650	bool hp_pin_sense;3651 3652	if (!hp_pin)3653		hp_pin = 0x21;3654 3655	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */3656	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3657 3658	if (hp_pin_sense)3659		msleep(2);3660 3661	snd_hda_codec_write(codec, hp_pin, 0,3662			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3663 3664	if (hp_pin_sense || spec->ultra_low_power)3665		msleep(85);3666 3667	/* 3k pull low control for Headset jack. */3668	/* NOTE: call this before clearing the pin, otherwise codec stalls */3669	/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly3670	 * when booting with headset plugged. So skip setting it for the codec alc2573671	 */3672	if (spec->en_3kpull_low)3673		alc_update_coef_idx(codec, 0x46, 0, 3 << 12);3674 3675	if (!spec->no_shutup_pins)3676		snd_hda_codec_write(codec, hp_pin, 0,3677				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3678 3679	if (hp_pin_sense || spec->ultra_low_power)3680		msleep(100);3681 3682	alc_auto_setup_eapd(codec, false);3683	alc_shutup_pins(codec);3684	if (spec->ultra_low_power) {3685		msleep(50);3686		alc_update_coef_idx(codec, 0x03, 1<<1, 0);3687		alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);3688		alc_update_coef_idx(codec, 0x08, 3<<2, 0);3689		alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);3690		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);3691		msleep(30);3692	}3693}3694 3695static void alc285_hp_init(struct hda_codec *codec)3696{3697	struct alc_spec *spec = codec->spec;3698	hda_nid_t hp_pin = alc_get_hp_pin(spec);3699	int i, val;3700	int coef38, coef0d, coef36;3701 3702	alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */3703	alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */3704	coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */3705	coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */3706	coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */3707	alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);3708	alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);3709 3710	alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);3711 3712	if (hp_pin)3713		snd_hda_codec_write(codec, hp_pin, 0,3714			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3715 3716	msleep(130);3717	alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);3718	alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);3719 3720	if (hp_pin)3721		snd_hda_codec_write(codec, hp_pin, 0,3722			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3723	msleep(10);3724	alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */3725	alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);3726	alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);3727	alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);3728 3729	alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */3730	val = alc_read_coefex_idx(codec, 0x58, 0x00);3731	for (i = 0; i < 20 && val & 0x8000; i++) {3732		msleep(50);3733		val = alc_read_coefex_idx(codec, 0x58, 0x00);3734	} /* Wait for depop procedure finish  */3735 3736	alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */3737	alc_update_coef_idx(codec, 0x38, 1<<4, coef38);3738	alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);3739	alc_update_coef_idx(codec, 0x36, 3<<13, coef36);3740 3741	msleep(50);3742	alc_update_coef_idx(codec, 0x4a, 1<<15, 0);3743}3744 3745static void alc225_init(struct hda_codec *codec)3746{3747	struct alc_spec *spec = codec->spec;3748	hda_nid_t hp_pin = alc_get_hp_pin(spec);3749	bool hp1_pin_sense, hp2_pin_sense;3750 3751	if (spec->ultra_low_power) {3752		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);3753		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);3754		alc_update_coef_idx(codec, 0x33, 1<<11, 0);3755		msleep(30);3756	}3757 3758	if (spec->codec_variant != ALC269_TYPE_ALC287 &&3759		spec->codec_variant != ALC269_TYPE_ALC245)3760		/* required only at boot or S3 and S4 resume time */3761		if (!spec->done_hp_init ||3762			is_s3_resume(codec) ||3763			is_s4_resume(codec)) {3764			alc285_hp_init(codec);3765			spec->done_hp_init = true;3766		}3767 3768	if (!hp_pin)3769		hp_pin = 0x21;3770	msleep(30);3771 3772	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);3773	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);3774 3775	if (hp1_pin_sense || hp2_pin_sense)3776		msleep(2);3777 3778	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */3779 3780	if (hp1_pin_sense || spec->ultra_low_power)3781		snd_hda_codec_write(codec, hp_pin, 0,3782			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3783	if (hp2_pin_sense)3784		snd_hda_codec_write(codec, 0x16, 0,3785			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3786 3787	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)3788		msleep(85);3789 3790	if (hp1_pin_sense || spec->ultra_low_power)3791		snd_hda_codec_write(codec, hp_pin, 0,3792			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);3793	if (hp2_pin_sense)3794		snd_hda_codec_write(codec, 0x16, 0,3795			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);3796 3797	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)3798		msleep(100);3799 3800	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);3801	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */3802}3803 3804static void alc225_shutup(struct hda_codec *codec)3805{3806	struct alc_spec *spec = codec->spec;3807	hda_nid_t hp_pin = alc_get_hp_pin(spec);3808	bool hp1_pin_sense, hp2_pin_sense;3809 3810	if (!hp_pin)3811		hp_pin = 0x21;3812 3813	alc_disable_headset_jack_key(codec);3814	/* 3k pull low control for Headset jack. */3815	alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);3816 3817	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);3818	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);3819 3820	if (hp1_pin_sense || hp2_pin_sense)3821		msleep(2);3822 3823	if (hp1_pin_sense || spec->ultra_low_power)3824		snd_hda_codec_write(codec, hp_pin, 0,3825			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3826	if (hp2_pin_sense)3827		snd_hda_codec_write(codec, 0x16, 0,3828			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3829 3830	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)3831		msleep(85);3832 3833	if (hp1_pin_sense || spec->ultra_low_power)3834		snd_hda_codec_write(codec, hp_pin, 0,3835			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3836	if (hp2_pin_sense)3837		snd_hda_codec_write(codec, 0x16, 0,3838			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3839 3840	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)3841		msleep(100);3842 3843	alc_auto_setup_eapd(codec, false);3844	alc_shutup_pins(codec);3845	if (spec->ultra_low_power) {3846		msleep(50);3847		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);3848		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);3849		alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);3850		alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);3851		msleep(30);3852	}3853 3854	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);3855	alc_enable_headset_jack_key(codec);3856}3857 3858static void alc_default_init(struct hda_codec *codec)3859{3860	struct alc_spec *spec = codec->spec;3861	hda_nid_t hp_pin = alc_get_hp_pin(spec);3862	bool hp_pin_sense;3863 3864	if (!hp_pin)3865		return;3866 3867	msleep(30);3868 3869	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3870 3871	if (hp_pin_sense) {3872		msleep(2);3873 3874		snd_hda_codec_write(codec, hp_pin, 0,3875				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);3876 3877		msleep(75);3878 3879		snd_hda_codec_write(codec, hp_pin, 0,3880				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);3881		msleep(75);3882	}3883}3884 3885static void alc_default_shutup(struct hda_codec *codec)3886{3887	struct alc_spec *spec = codec->spec;3888	hda_nid_t hp_pin = alc_get_hp_pin(spec);3889	bool hp_pin_sense;3890 3891	if (!hp_pin) {3892		alc269_shutup(codec);3893		return;3894	}3895 3896	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);3897 3898	if (hp_pin_sense) {3899		msleep(2);3900 3901		snd_hda_codec_write(codec, hp_pin, 0,3902				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3903 3904		msleep(75);3905 3906		if (!spec->no_shutup_pins)3907			snd_hda_codec_write(codec, hp_pin, 0,3908					    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3909 3910		msleep(75);3911	}3912	alc_auto_setup_eapd(codec, false);3913	alc_shutup_pins(codec);3914}3915 3916static void alc294_hp_init(struct hda_codec *codec)3917{3918	struct alc_spec *spec = codec->spec;3919	hda_nid_t hp_pin = alc_get_hp_pin(spec);3920	int i, val;3921 3922	if (!hp_pin)3923		return;3924 3925	snd_hda_codec_write(codec, hp_pin, 0,3926			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);3927 3928	msleep(100);3929 3930	if (!spec->no_shutup_pins)3931		snd_hda_codec_write(codec, hp_pin, 0,3932				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);3933 3934	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */3935	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */3936 3937	/* Wait for depop procedure finish  */3938	val = alc_read_coefex_idx(codec, 0x58, 0x01);3939	for (i = 0; i < 20 && val & 0x0080; i++) {3940		msleep(50);3941		val = alc_read_coefex_idx(codec, 0x58, 0x01);3942	}3943	/* Set HP depop to auto mode */3944	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);3945	msleep(50);3946}3947 3948static void alc294_init(struct hda_codec *codec)3949{3950	struct alc_spec *spec = codec->spec;3951 3952	/* required only at boot or S4 resume time */3953	if (!spec->done_hp_init ||3954	    codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {3955		alc294_hp_init(codec);3956		spec->done_hp_init = true;3957	}3958	alc_default_init(codec);3959}3960 3961static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,3962			     unsigned int val)3963{3964	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);3965	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */3966	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */3967}3968 3969static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)3970{3971	unsigned int val;3972 3973	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);3974	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)3975		& 0xffff;3976	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)3977		<< 16;3978	return val;3979}3980 3981static void alc5505_dsp_halt(struct hda_codec *codec)3982{3983	unsigned int val;3984 3985	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */3986	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */3987	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */3988	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */3989	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */3990	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */3991	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */3992	val = alc5505_coef_get(codec, 0x6220);3993	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */3994}3995 3996static void alc5505_dsp_back_from_halt(struct hda_codec *codec)3997{3998	alc5505_coef_set(codec, 0x61b8, 0x04133302);3999	alc5505_coef_set(codec, 0x61b0, 0x00005b16);4000	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);4001	alc5505_coef_set(codec, 0x6230, 0xf80d4011);4002	alc5505_coef_set(codec, 0x6220, 0x2002010f);4003	alc5505_coef_set(codec, 0x880c, 0x00000004);4004}4005 4006static void alc5505_dsp_init(struct hda_codec *codec)4007{4008	unsigned int val;4009 4010	alc5505_dsp_halt(codec);4011	alc5505_dsp_back_from_halt(codec);4012	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */4013	alc5505_coef_set(codec, 0x61b0, 0x5b16);4014	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */4015	alc5505_coef_set(codec, 0x61b4, 0x04132b02);4016	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/4017	alc5505_coef_set(codec, 0x61b8, 0x041f3302);4018	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */4019	alc5505_coef_set(codec, 0x61b8, 0x041b3302);4020	alc5505_coef_set(codec, 0x61b8, 0x04173302);4021	alc5505_coef_set(codec, 0x61b8, 0x04163302);4022	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */4023	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */4024	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */4025 4026	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */4027	if (val <= 3)4028		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */4029	else4030		alc5505_coef_set(codec, 0x6220, 0x6002018f);4031 4032	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/4033	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */4034	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */4035	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */4036	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */4037	alc5505_coef_set(codec, 0x880c, 0x00000003);4038	alc5505_coef_set(codec, 0x880c, 0x00000010);4039 4040#ifdef HALT_REALTEK_ALC55054041	alc5505_dsp_halt(codec);4042#endif4043}4044 4045#ifdef HALT_REALTEK_ALC55054046#define alc5505_dsp_suspend(codec)	do { } while (0) /* NOP */4047#define alc5505_dsp_resume(codec)	do { } while (0) /* NOP */4048#else4049#define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)4050#define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)4051#endif4052 4053static int alc269_suspend(struct hda_codec *codec)4054{4055	struct alc_spec *spec = codec->spec;4056 4057	if (spec->has_alc5505_dsp)4058		alc5505_dsp_suspend(codec);4059 4060	return alc_suspend(codec);4061}4062 4063static int alc269_resume(struct hda_codec *codec)4064{4065	struct alc_spec *spec = codec->spec;4066 4067	if (spec->codec_variant == ALC269_TYPE_ALC269VB)4068		alc269vb_toggle_power_output(codec, 0);4069	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&4070			(alc_get_coef0(codec) & 0x00ff) == 0x018) {4071		msleep(150);4072	}4073 4074	codec->patch_ops.init(codec);4075 4076	if (spec->codec_variant == ALC269_TYPE_ALC269VB)4077		alc269vb_toggle_power_output(codec, 1);4078	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&4079			(alc_get_coef0(codec) & 0x00ff) == 0x017) {4080		msleep(200);4081	}4082 4083	snd_hda_regmap_sync(codec);4084	hda_call_check_power_status(codec, 0x01);4085 4086	/* on some machine, the BIOS will clear the codec gpio data when enter4087	 * suspend, and won't restore the data after resume, so we restore it4088	 * in the driver.4089	 */4090	if (spec->gpio_data)4091		alc_write_gpio_data(codec);4092 4093	if (spec->has_alc5505_dsp)4094		alc5505_dsp_resume(codec);4095 4096	return 0;4097}4098 4099static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,4100						 const struct hda_fixup *fix, int action)4101{4102	struct alc_spec *spec = codec->spec;4103 4104	if (action == HDA_FIXUP_ACT_PRE_PROBE)4105		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;4106}4107 4108static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,4109						 const struct hda_fixup *fix,4110						 int action)4111{4112	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);4113	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);4114 4115	if (cfg_headphone && cfg_headset_mic == 0x411111f0)4116		snd_hda_codec_set_pincfg(codec, 0x19,4117			(cfg_headphone & ~AC_DEFCFG_DEVICE) |4118			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));4119}4120 4121static void alc269_fixup_hweq(struct hda_codec *codec,4122			       const struct hda_fixup *fix, int action)4123{4124	if (action == HDA_FIXUP_ACT_INIT)4125		alc_update_coef_idx(codec, 0x1e, 0, 0x80);4126}4127 4128static void alc269_fixup_headset_mic(struct hda_codec *codec,4129				       const struct hda_fixup *fix, int action)4130{4131	struct alc_spec *spec = codec->spec;4132 4133	if (action == HDA_FIXUP_ACT_PRE_PROBE)4134		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;4135}4136 4137static void alc271_fixup_dmic(struct hda_codec *codec,4138			      const struct hda_fixup *fix, int action)4139{4140	static const struct hda_verb verbs[] = {4141		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},4142		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},4143		{}4144	};4145	unsigned int cfg;4146 4147	if (strcmp(codec->core.chip_name, "ALC271X") &&4148	    strcmp(codec->core.chip_name, "ALC269VB"))4149		return;4150	cfg = snd_hda_codec_get_pincfg(codec, 0x12);4151	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)4152		snd_hda_sequence_write(codec, verbs);4153}4154 4155/* Fix the speaker amp after resume, etc */4156static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,4157					  const struct hda_fixup *fix,4158					  int action)4159{4160	if (action == HDA_FIXUP_ACT_INIT)4161		alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);4162}4163 4164static void alc269_fixup_pcm_44k(struct hda_codec *codec,4165				 const struct hda_fixup *fix, int action)4166{4167	struct alc_spec *spec = codec->spec;4168 4169	if (action != HDA_FIXUP_ACT_PROBE)4170		return;4171 4172	/* Due to a hardware problem on Lenovo Ideadpad, we need to4173	 * fix the sample rate of analog I/O to 44.1kHz4174	 */4175	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;4176	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;4177}4178 4179static void alc269_fixup_stereo_dmic(struct hda_codec *codec,4180				     const struct hda_fixup *fix, int action)4181{4182	/* The digital-mic unit sends PDM (differential signal) instead of4183	 * the standard PCM, thus you can't record a valid mono stream as is.4184	 * Below is a workaround specific to ALC269 to control the dmic4185	 * signal source as mono.4186	 */4187	if (action == HDA_FIXUP_ACT_INIT)4188		alc_update_coef_idx(codec, 0x07, 0, 0x80);4189}4190 4191static void alc269_quanta_automute(struct hda_codec *codec)4192{4193	snd_hda_gen_update_outputs(codec);4194 4195	alc_write_coef_idx(codec, 0x0c, 0x680);4196	alc_write_coef_idx(codec, 0x0c, 0x480);4197}4198 4199static void alc269_fixup_quanta_mute(struct hda_codec *codec,4200				     const struct hda_fixup *fix, int action)4201{4202	struct alc_spec *spec = codec->spec;4203	if (action != HDA_FIXUP_ACT_PROBE)4204		return;4205	spec->gen.automute_hook = alc269_quanta_automute;4206}4207 4208static void alc269_x101_hp_automute_hook(struct hda_codec *codec,4209					 struct hda_jack_callback *jack)4210{4211	struct alc_spec *spec = codec->spec;4212	int vref;4213	msleep(200);4214	snd_hda_gen_hp_automute(codec, jack);4215 4216	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;4217	msleep(100);4218	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,4219			    vref);4220	msleep(500);4221	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,4222			    vref);4223}4224 4225/*4226 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)4227 */4228struct hda_alc298_mbxinit {4229	unsigned char value_0x23;4230	unsigned char value_0x25;4231};4232 4233static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,4234					 const struct hda_alc298_mbxinit *initval,4235					 bool first)4236{4237	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);4238	alc_write_coef_idx(codec, 0x26, 0xb000);4239 4240	if (first)4241		snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);4242 4243	snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);4244	alc_write_coef_idx(codec, 0x26, 0xf000);4245	alc_write_coef_idx(codec, 0x23, initval->value_0x23);4246 4247	if (initval->value_0x23 != 0x1e)4248		alc_write_coef_idx(codec, 0x25, initval->value_0x25);4249 4250	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);4251	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);4252}4253 4254static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,4255					   const struct hda_fixup *fix,4256					   int action)4257{4258	/* Initialization magic */4259	static const struct hda_alc298_mbxinit dac_init[] = {4260		{0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},4261		{0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},4262		{0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},4263		{0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},4264		{0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},4265		{0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},4266		{0x2f, 0x00},4267		{0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},4268		{0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},4269		{0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},4270		{}4271	};4272	const struct hda_alc298_mbxinit *seq;4273 4274	if (action != HDA_FIXUP_ACT_INIT)4275		return;4276 4277	/* Start */4278	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);4279	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);4280	alc_write_coef_idx(codec, 0x26, 0xf000);4281	alc_write_coef_idx(codec, 0x22, 0x31);4282	alc_write_coef_idx(codec, 0x23, 0x0b);4283	alc_write_coef_idx(codec, 0x25, 0x00);4284	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);4285	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);4286 4287	for (seq = dac_init; seq->value_0x23; seq++)4288		alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);4289}4290 4291static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,4292				     const struct hda_fixup *fix, int action)4293{4294	struct alc_spec *spec = codec->spec;4295	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4296		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;4297		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;4298	}4299}4300 4301static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,4302				bool polarity, bool on)4303{4304	unsigned int pinval;4305 4306	if (!pin)4307		return;4308	if (polarity)4309		on = !on;4310	pinval = snd_hda_codec_get_pin_target(codec, pin);4311	pinval &= ~AC_PINCTL_VREFEN;4312	pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;4313	/* temporarily power up/down for setting VREF */4314	snd_hda_power_up_pm(codec);4315	snd_hda_set_pin_ctl_cache(codec, pin, pinval);4316	snd_hda_power_down_pm(codec);4317}4318 4319/* update mute-LED according to the speaker mute state via mic VREF pin */4320static int vref_mute_led_set(struct led_classdev *led_cdev,4321			     enum led_brightness brightness)4322{4323	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);4324	struct alc_spec *spec = codec->spec;4325 4326	alc_update_vref_led(codec, spec->mute_led_nid,4327			    spec->mute_led_polarity, brightness);4328	return 0;4329}4330 4331/* Make sure the led works even in runtime suspend */4332static unsigned int led_power_filter(struct hda_codec *codec,4333						  hda_nid_t nid,4334						  unsigned int power_state)4335{4336	struct alc_spec *spec = codec->spec;4337 4338	if (power_state != AC_PWRST_D3 || nid == 0 ||4339	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))4340		return power_state;4341 4342	/* Set pin ctl again, it might have just been set to 0 */4343	snd_hda_set_pin_ctl(codec, nid,4344			    snd_hda_codec_get_pin_target(codec, nid));4345 4346	return snd_hda_gen_path_power_filter(codec, nid, power_state);4347}4348 4349static void alc269_fixup_hp_mute_led(struct hda_codec *codec,4350				     const struct hda_fixup *fix, int action)4351{4352	struct alc_spec *spec = codec->spec;4353	const struct dmi_device *dev = NULL;4354 4355	if (action != HDA_FIXUP_ACT_PRE_PROBE)4356		return;4357 4358	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {4359		int pol, pin;4360		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)4361			continue;4362		if (pin < 0x0a || pin >= 0x10)4363			break;4364		spec->mute_led_polarity = pol;4365		spec->mute_led_nid = pin - 0x0a + 0x18;4366		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);4367		codec->power_filter = led_power_filter;4368		codec_dbg(codec,4369			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,4370			   spec->mute_led_polarity);4371		break;4372	}4373}4374 4375static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,4376					  const struct hda_fixup *fix,4377					  int action, hda_nid_t pin)4378{4379	struct alc_spec *spec = codec->spec;4380 4381	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4382		spec->mute_led_polarity = 0;4383		spec->mute_led_nid = pin;4384		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);4385		codec->power_filter = led_power_filter;4386	}4387}4388 4389static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,4390				const struct hda_fixup *fix, int action)4391{4392	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);4393}4394 4395static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,4396				const struct hda_fixup *fix, int action)4397{4398	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);4399}4400 4401static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,4402				const struct hda_fixup *fix, int action)4403{4404	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);4405}4406 4407/* update LED status via GPIO */4408static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,4409				int polarity, bool enabled)4410{4411	if (polarity)4412		enabled = !enabled;4413	alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */4414}4415 4416/* turn on/off mute LED via GPIO per vmaster hook */4417static int gpio_mute_led_set(struct led_classdev *led_cdev,4418			     enum led_brightness brightness)4419{4420	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);4421	struct alc_spec *spec = codec->spec;4422 4423	alc_update_gpio_led(codec, spec->gpio_mute_led_mask,4424			    spec->mute_led_polarity, !brightness);4425	return 0;4426}4427 4428/* turn on/off mic-mute LED via GPIO per capture hook */4429static int micmute_led_set(struct led_classdev *led_cdev,4430			   enum led_brightness brightness)4431{4432	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);4433	struct alc_spec *spec = codec->spec;4434 4435	alc_update_gpio_led(codec, spec->gpio_mic_led_mask,4436			    spec->micmute_led_polarity, !brightness);4437	return 0;4438}4439 4440/* setup mute and mic-mute GPIO bits, add hooks appropriately */4441static void alc_fixup_hp_gpio_led(struct hda_codec *codec,4442				  int action,4443				  unsigned int mute_mask,4444				  unsigned int micmute_mask)4445{4446	struct alc_spec *spec = codec->spec;4447 4448	alc_fixup_gpio(codec, action, mute_mask | micmute_mask);4449 4450	if (action != HDA_FIXUP_ACT_PRE_PROBE)4451		return;4452	if (mute_mask) {4453		spec->gpio_mute_led_mask = mute_mask;4454		snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);4455	}4456	if (micmute_mask) {4457		spec->gpio_mic_led_mask = micmute_mask;4458		snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);4459	}4460}4461 4462static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,4463				const struct hda_fixup *fix, int action)4464{4465	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);4466}4467 4468static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,4469				const struct hda_fixup *fix, int action)4470{4471	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);4472}4473 4474static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,4475				const struct hda_fixup *fix, int action)4476{4477	alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);4478}4479 4480static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,4481				const struct hda_fixup *fix, int action)4482{4483	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);4484}4485 4486static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,4487				const struct hda_fixup *fix, int action)4488{4489	alc_fixup_hp_gpio_led(codec, action, 0x10, 0);4490}4491 4492static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,4493				const struct hda_fixup *fix, int action)4494{4495	struct alc_spec *spec = codec->spec;4496 4497	if (action == HDA_FIXUP_ACT_PRE_PROBE)4498		spec->micmute_led_polarity = 1;4499	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);4500}4501 4502/* turn on/off mic-mute LED per capture hook via VREF change */4503static int vref_micmute_led_set(struct led_classdev *led_cdev,4504				enum led_brightness brightness)4505{4506	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);4507	struct alc_spec *spec = codec->spec;4508 4509	alc_update_vref_led(codec, spec->cap_mute_led_nid,4510			    spec->micmute_led_polarity, brightness);4511	return 0;4512}4513 4514static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,4515				const struct hda_fixup *fix, int action)4516{4517	struct alc_spec *spec = codec->spec;4518 4519	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);4520	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4521		/* Like hp_gpio_mic1_led, but also needs GPIO4 low to4522		 * enable headphone amp4523		 */4524		spec->gpio_mask |= 0x10;4525		spec->gpio_dir |= 0x10;4526		spec->cap_mute_led_nid = 0x18;4527		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);4528		codec->power_filter = led_power_filter;4529	}4530}4531 4532static void alc280_fixup_hp_gpio4(struct hda_codec *codec,4533				   const struct hda_fixup *fix, int action)4534{4535	struct alc_spec *spec = codec->spec;4536 4537	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);4538	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4539		spec->cap_mute_led_nid = 0x18;4540		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);4541		codec->power_filter = led_power_filter;4542	}4543}4544 4545/* HP Spectre x360 14 model needs a unique workaround for enabling the amp;4546 * it needs to toggle the GPIO0 once on and off at each time (bko#210633)4547 */4548static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,4549				     const struct hda_fixup *fix, int action)4550{4551	struct alc_spec *spec = codec->spec;4552 4553	switch (action) {4554	case HDA_FIXUP_ACT_PRE_PROBE:4555		spec->gpio_mask |= 0x01;4556		spec->gpio_dir |= 0x01;4557		break;4558	case HDA_FIXUP_ACT_INIT:4559		/* need to toggle GPIO to enable the amp */4560		alc_update_gpio_data(codec, 0x01, true);4561		msleep(100);4562		alc_update_gpio_data(codec, 0x01, false);4563		break;4564	}4565}4566 4567/* toggle GPIO2 at each time stream is started; we use PREPARE state instead */4568static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,4569				    struct hda_codec *codec,4570				    struct snd_pcm_substream *substream,4571				    int action)4572{4573	switch (action) {4574	case HDA_GEN_PCM_ACT_PREPARE:4575		alc_update_gpio_data(codec, 0x04, true);4576		break;4577	case HDA_GEN_PCM_ACT_CLEANUP:4578		alc_update_gpio_data(codec, 0x04, false);4579		break;4580	}4581}4582 4583static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,4584				      const struct hda_fixup *fix,4585				      int action)4586{4587	struct alc_spec *spec = codec->spec;4588 4589	if (action == HDA_FIXUP_ACT_PROBE) {4590		spec->gpio_mask |= 0x04;4591		spec->gpio_dir |= 0x04;4592		spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;4593	}4594}4595 4596static void alc_update_coef_led(struct hda_codec *codec,4597				struct alc_coef_led *led,4598				bool polarity, bool on)4599{4600	if (polarity)4601		on = !on;4602	/* temporarily power up/down for setting COEF bit */4603	alc_update_coef_idx(codec, led->idx, led->mask,4604			    on ? led->on : led->off);4605}4606 4607/* update mute-LED according to the speaker mute state via COEF bit */4608static int coef_mute_led_set(struct led_classdev *led_cdev,4609			     enum led_brightness brightness)4610{4611	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);4612	struct alc_spec *spec = codec->spec;4613 4614	alc_update_coef_led(codec, &spec->mute_led_coef,4615			    spec->mute_led_polarity, brightness);4616	return 0;4617}4618 4619static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,4620					  const struct hda_fixup *fix,4621					  int action)4622{4623	struct alc_spec *spec = codec->spec;4624 4625	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4626		spec->mute_led_polarity = 0;4627		spec->mute_led_coef.idx = 0x0b;4628		spec->mute_led_coef.mask = 1 << 3;4629		spec->mute_led_coef.on = 1 << 3;4630		spec->mute_led_coef.off = 0;4631		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);4632	}4633}4634 4635static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,4636					  const struct hda_fixup *fix,4637					  int action)4638{4639	struct alc_spec *spec = codec->spec;4640 4641	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4642		spec->mute_led_polarity = 0;4643		spec->mute_led_coef.idx = 0x34;4644		spec->mute_led_coef.mask = 1 << 5;4645		spec->mute_led_coef.on = 0;4646		spec->mute_led_coef.off = 1 << 5;4647		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);4648	}4649}4650 4651static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,4652					  const struct hda_fixup *fix, int action)4653{4654	struct alc_spec *spec = codec->spec;4655 4656	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4657		spec->mute_led_polarity = 0;4658		spec->mute_led_coef.idx = 0x07;4659		spec->mute_led_coef.mask = 1;4660		spec->mute_led_coef.on = 1;4661		spec->mute_led_coef.off = 0;4662		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);4663	}4664}4665 4666static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,4667					  const struct hda_fixup *fix,4668					  int action)4669{4670	struct alc_spec *spec = codec->spec;4671 4672	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4673		spec->mute_led_polarity = 0;4674		spec->mute_led_coef.idx = 0x0b;4675		spec->mute_led_coef.mask = 3 << 2;4676		spec->mute_led_coef.on = 2 << 2;4677		spec->mute_led_coef.off = 1 << 2;4678		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);4679	}4680}4681 4682/* turn on/off mic-mute LED per capture hook by coef bit */4683static int coef_micmute_led_set(struct led_classdev *led_cdev,4684				enum led_brightness brightness)4685{4686	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);4687	struct alc_spec *spec = codec->spec;4688 4689	alc_update_coef_led(codec, &spec->mic_led_coef,4690			    spec->micmute_led_polarity, brightness);4691	return 0;4692}4693 4694static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,4695				const struct hda_fixup *fix, int action)4696{4697	struct alc_spec *spec = codec->spec;4698 4699	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4700		spec->mic_led_coef.idx = 0x19;4701		spec->mic_led_coef.mask = 1 << 13;4702		spec->mic_led_coef.on = 1 << 13;4703		spec->mic_led_coef.off = 0;4704		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);4705	}4706}4707 4708static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,4709				const struct hda_fixup *fix, int action)4710{4711	struct alc_spec *spec = codec->spec;4712 4713	if (action == HDA_FIXUP_ACT_PRE_PROBE)4714		spec->micmute_led_polarity = 1;4715	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);4716}4717 4718static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,4719				const struct hda_fixup *fix, int action)4720{4721	struct alc_spec *spec = codec->spec;4722 4723	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4724		spec->mic_led_coef.idx = 0x35;4725		spec->mic_led_coef.mask = 3 << 2;4726		spec->mic_led_coef.on = 2 << 2;4727		spec->mic_led_coef.off = 1 << 2;4728		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);4729	}4730}4731 4732static void alc285_fixup_hp_mute_led(struct hda_codec *codec,4733				const struct hda_fixup *fix, int action)4734{4735	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);4736	alc285_fixup_hp_coef_micmute_led(codec, fix, action);4737}4738 4739static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,4740				const struct hda_fixup *fix, int action)4741{4742	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);4743	alc285_fixup_hp_gpio_micmute_led(codec, fix, action);4744}4745 4746static void alc236_fixup_hp_mute_led(struct hda_codec *codec,4747				const struct hda_fixup *fix, int action)4748{4749	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);4750	alc236_fixup_hp_coef_micmute_led(codec, fix, action);4751}4752 4753static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,4754				const struct hda_fixup *fix, int action)4755{4756	struct alc_spec *spec = codec->spec;4757 4758	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4759		spec->cap_mute_led_nid = 0x1a;4760		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);4761		codec->power_filter = led_power_filter;4762	}4763}4764 4765static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,4766				const struct hda_fixup *fix, int action)4767{4768	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);4769	alc236_fixup_hp_micmute_led_vref(codec, fix, action);4770}4771 4772static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,4773						  const unsigned short coefs[2])4774{4775	alc_write_coef_idx(codec, 0x23, coefs[0]);4776	alc_write_coef_idx(codec, 0x25, coefs[1]);4777	alc_write_coef_idx(codec, 0x26, 0xb011);4778}4779 4780struct alc298_samsung_amp_desc {4781	unsigned char nid;4782	unsigned short init_seq[2][2];4783};4784 4785static void alc298_fixup_samsung_amp(struct hda_codec *codec,4786				     const struct hda_fixup *fix, int action)4787{4788	int i, j;4789	static const unsigned short init_seq[][2] = {4790		{ 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },4791		{ 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },4792		{ 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },4793		{ 0x41, 0x07 }, { 0x400, 0x1 }4794	};4795	static const struct alc298_samsung_amp_desc amps[] = {4796		{ 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },4797		{ 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }4798	};4799 4800	if (action != HDA_FIXUP_ACT_INIT)4801		return;4802 4803	for (i = 0; i < ARRAY_SIZE(amps); i++) {4804		alc_write_coef_idx(codec, 0x22, amps[i].nid);4805 4806		for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)4807			alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);4808 4809		for (j = 0; j < ARRAY_SIZE(init_seq); j++)4810			alc298_samsung_write_coef_pack(codec, init_seq[j]);4811	}4812}4813 4814struct alc298_samsung_v2_amp_desc {4815	unsigned short nid;4816	int init_seq_size;4817	unsigned short init_seq[18][2];4818};4819 4820static const struct alc298_samsung_v2_amp_desc4821alc298_samsung_v2_amp_desc_tbl[] = {4822	{ 0x38, 18, {4823		{ 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },4824		{ 0x201b, 0x0001 }, { 0x201d, 0x0001 }, { 0x201f, 0x00fe },4825		{ 0x2021, 0x0000 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },4826		{ 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },4827		{ 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x2399, 0x0003 },4828		{ 0x23a4, 0x00b5 }, { 0x23a5, 0x0001 }, { 0x23ba, 0x0094 }4829	}},4830	{ 0x39, 18, {4831		{ 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },4832		{ 0x201b, 0x0002 }, { 0x201d, 0x0002 }, { 0x201f, 0x00fd },4833		{ 0x2021, 0x0001 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },4834		{ 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },4835		{ 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x2399, 0x0003 },4836		{ 0x23a4, 0x00b5 }, { 0x23a5, 0x0001 }, { 0x23ba, 0x0094 }4837	}},4838	{ 0x3c, 15, {4839		{ 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },4840		{ 0x201b, 0x0001 }, { 0x201d, 0x0001 }, { 0x201f, 0x00fe },4841		{ 0x2021, 0x0000 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },4842		{ 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },4843		{ 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x23ba, 0x008d }4844	}},4845	{ 0x3d, 15, {4846		{ 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },4847		{ 0x201b, 0x0002 }, { 0x201d, 0x0002 }, { 0x201f, 0x00fd },4848		{ 0x2021, 0x0001 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },4849		{ 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },4850		{ 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x23ba, 0x008d }4851	}}4852};4853 4854static void alc298_samsung_v2_enable_amps(struct hda_codec *codec)4855{4856	struct alc_spec *spec = codec->spec;4857	static const unsigned short enable_seq[][2] = {4858		{ 0x203a, 0x0081 }, { 0x23ff, 0x0001 },4859	};4860	int i, j;4861 4862	for (i = 0; i < spec->num_speaker_amps; i++) {4863		alc_write_coef_idx(codec, 0x22, alc298_samsung_v2_amp_desc_tbl[i].nid);4864		for (j = 0; j < ARRAY_SIZE(enable_seq); j++)4865			alc298_samsung_write_coef_pack(codec, enable_seq[j]);4866		codec_dbg(codec, "alc298_samsung_v2: Enabled speaker amp 0x%02x\n",4867				alc298_samsung_v2_amp_desc_tbl[i].nid);4868	}4869}4870 4871static void alc298_samsung_v2_disable_amps(struct hda_codec *codec)4872{4873	struct alc_spec *spec = codec->spec;4874	static const unsigned short disable_seq[][2] = {4875		{ 0x23ff, 0x0000 }, { 0x203a, 0x0080 },4876	};4877	int i, j;4878 4879	for (i = 0; i < spec->num_speaker_amps; i++) {4880		alc_write_coef_idx(codec, 0x22, alc298_samsung_v2_amp_desc_tbl[i].nid);4881		for (j = 0; j < ARRAY_SIZE(disable_seq); j++)4882			alc298_samsung_write_coef_pack(codec, disable_seq[j]);4883		codec_dbg(codec, "alc298_samsung_v2: Disabled speaker amp 0x%02x\n",4884				alc298_samsung_v2_amp_desc_tbl[i].nid);4885	}4886}4887 4888static void alc298_samsung_v2_playback_hook(struct hda_pcm_stream *hinfo,4889				struct hda_codec *codec,4890				struct snd_pcm_substream *substream,4891				int action)4892{4893	/* Dynamically enable/disable speaker amps before and after playback */4894	if (action == HDA_GEN_PCM_ACT_OPEN)4895		alc298_samsung_v2_enable_amps(codec);4896	if (action == HDA_GEN_PCM_ACT_CLOSE)4897		alc298_samsung_v2_disable_amps(codec);4898}4899 4900static void alc298_samsung_v2_init_amps(struct hda_codec *codec,4901				int num_speaker_amps)4902{4903	struct alc_spec *spec = codec->spec;4904	int i, j;4905 4906	/* Set spec's num_speaker_amps before doing anything else */4907	spec->num_speaker_amps = num_speaker_amps;4908 4909	/* Disable speaker amps before init to prevent any physical damage */4910	alc298_samsung_v2_disable_amps(codec);4911 4912	/* Initialize the speaker amps */4913	for (i = 0; i < spec->num_speaker_amps; i++) {4914		alc_write_coef_idx(codec, 0x22, alc298_samsung_v2_amp_desc_tbl[i].nid);4915		for (j = 0; j < alc298_samsung_v2_amp_desc_tbl[i].init_seq_size; j++) {4916			alc298_samsung_write_coef_pack(codec,4917					alc298_samsung_v2_amp_desc_tbl[i].init_seq[j]);4918		}4919		alc_write_coef_idx(codec, 0x89, 0x0);4920		codec_dbg(codec, "alc298_samsung_v2: Initialized speaker amp 0x%02x\n",4921				alc298_samsung_v2_amp_desc_tbl[i].nid);4922	}4923 4924	/* register hook to enable speaker amps only when they are needed */4925	spec->gen.pcm_playback_hook = alc298_samsung_v2_playback_hook;4926}4927 4928static void alc298_fixup_samsung_amp_v2_2_amps(struct hda_codec *codec,4929				const struct hda_fixup *fix, int action)4930{4931	if (action == HDA_FIXUP_ACT_PROBE)4932		alc298_samsung_v2_init_amps(codec, 2);4933}4934 4935static void alc298_fixup_samsung_amp_v2_4_amps(struct hda_codec *codec,4936				const struct hda_fixup *fix, int action)4937{4938	if (action == HDA_FIXUP_ACT_PROBE)4939		alc298_samsung_v2_init_amps(codec, 4);4940}4941 4942#if IS_REACHABLE(CONFIG_INPUT)4943static void gpio2_mic_hotkey_event(struct hda_codec *codec,4944				   struct hda_jack_callback *event)4945{4946	struct alc_spec *spec = codec->spec;4947 4948	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore4949	   send both key on and key off event for every interrupt. */4950	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);4951	input_sync(spec->kb_dev);4952	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);4953	input_sync(spec->kb_dev);4954}4955 4956static int alc_register_micmute_input_device(struct hda_codec *codec)4957{4958	struct alc_spec *spec = codec->spec;4959	int i;4960 4961	spec->kb_dev = input_allocate_device();4962	if (!spec->kb_dev) {4963		codec_err(codec, "Out of memory (input_allocate_device)\n");4964		return -ENOMEM;4965	}4966 4967	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;4968 4969	spec->kb_dev->name = "Microphone Mute Button";4970	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);4971	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);4972	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);4973	spec->kb_dev->keycode = spec->alc_mute_keycode_map;4974	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)4975		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);4976 4977	if (input_register_device(spec->kb_dev)) {4978		codec_err(codec, "input_register_device failed\n");4979		input_free_device(spec->kb_dev);4980		spec->kb_dev = NULL;4981		return -ENOMEM;4982	}4983 4984	return 0;4985}4986 4987/* GPIO1 = set according to SKU external amp4988 * GPIO2 = mic mute hotkey4989 * GPIO3 = mute LED4990 * GPIO4 = mic mute LED4991 */4992static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,4993					     const struct hda_fixup *fix, int action)4994{4995	struct alc_spec *spec = codec->spec;4996 4997	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);4998	if (action == HDA_FIXUP_ACT_PRE_PROBE) {4999		spec->init_amp = ALC_INIT_DEFAULT;5000		if (alc_register_micmute_input_device(codec) != 0)5001			return;5002 5003		spec->gpio_mask |= 0x06;5004		spec->gpio_dir |= 0x02;5005		spec->gpio_data |= 0x02;5006		snd_hda_codec_write_cache(codec, codec->core.afg, 0,5007					  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);5008		snd_hda_jack_detect_enable_callback(codec, codec->core.afg,5009						    gpio2_mic_hotkey_event);5010		return;5011	}5012 5013	if (!spec->kb_dev)5014		return;5015 5016	switch (action) {5017	case HDA_FIXUP_ACT_FREE:5018		input_unregister_device(spec->kb_dev);5019		spec->kb_dev = NULL;5020	}5021}5022 5023/* Line2 = mic mute hotkey5024 * GPIO2 = mic mute LED5025 */5026static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,5027					     const struct hda_fixup *fix, int action)5028{5029	struct alc_spec *spec = codec->spec;5030 5031	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);5032	if (action == HDA_FIXUP_ACT_PRE_PROBE) {5033		spec->init_amp = ALC_INIT_DEFAULT;5034		if (alc_register_micmute_input_device(codec) != 0)5035			return;5036 5037		snd_hda_jack_detect_enable_callback(codec, 0x1b,5038						    gpio2_mic_hotkey_event);5039		return;5040	}5041 5042	if (!spec->kb_dev)5043		return;5044 5045	switch (action) {5046	case HDA_FIXUP_ACT_FREE:5047		input_unregister_device(spec->kb_dev);5048		spec->kb_dev = NULL;5049	}5050}5051#else /* INPUT */5052#define alc280_fixup_hp_gpio2_mic_hotkey	NULL5053#define alc233_fixup_lenovo_line2_mic_hotkey	NULL5054#endif /* INPUT */5055 5056static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,5057				const struct hda_fixup *fix, int action)5058{5059	struct alc_spec *spec = codec->spec;5060 5061	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);5062	if (action == HDA_FIXUP_ACT_PRE_PROBE) {5063		spec->cap_mute_led_nid = 0x18;5064		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);5065	}5066}5067 5068static void alc_hp_mute_disable(struct hda_codec *codec, unsigned int delay)5069{5070	if (delay <= 0)5071		delay = 75;5072	snd_hda_codec_write(codec, 0x21, 0,5073		    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);5074	msleep(delay);5075	snd_hda_codec_write(codec, 0x21, 0,5076		    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);5077	msleep(delay);5078}5079 5080static void alc_hp_enable_unmute(struct hda_codec *codec, unsigned int delay)5081{5082	if (delay <= 0)5083		delay = 75;5084	snd_hda_codec_write(codec, 0x21, 0,5085		    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);5086	msleep(delay);5087	snd_hda_codec_write(codec, 0x21, 0,5088		    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);5089	msleep(delay);5090}5091 5092static const struct coef_fw alc225_pre_hsmode[] = {5093	UPDATE_COEF(0x4a, 1<<8, 0),5094	UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),5095	UPDATE_COEF(0x63, 3<<14, 3<<14),5096	UPDATE_COEF(0x4a, 3<<4, 2<<4),5097	UPDATE_COEF(0x4a, 3<<10, 3<<10),5098	UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),5099	UPDATE_COEF(0x4a, 3<<10, 0),5100	{}5101};5102 5103static void alc_headset_mode_unplugged(struct hda_codec *codec)5104{5105	struct alc_spec *spec = codec->spec;5106	static const struct coef_fw coef0255[] = {5107		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */5108		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */5109		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/5110		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */5111		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */5112		{}5113	};5114	static const struct coef_fw coef0256[] = {5115		WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */5116		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */5117		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */5118		WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */5119		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/5120		{}5121	};5122	static const struct coef_fw coef0233[] = {5123		WRITE_COEF(0x1b, 0x0c0b),5124		WRITE_COEF(0x45, 0xc429),5125		UPDATE_COEF(0x35, 0x4000, 0),5126		WRITE_COEF(0x06, 0x2104),5127		WRITE_COEF(0x1a, 0x0001),5128		WRITE_COEF(0x26, 0x0004),5129		WRITE_COEF(0x32, 0x42a3),5130		{}5131	};5132	static const struct coef_fw coef0288[] = {5133		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),5134		UPDATE_COEF(0x50, 0x2000, 0x2000),5135		UPDATE_COEF(0x56, 0x0006, 0x0006),5136		UPDATE_COEF(0x66, 0x0008, 0),5137		UPDATE_COEF(0x67, 0x2000, 0),5138		{}5139	};5140	static const struct coef_fw coef0298[] = {5141		UPDATE_COEF(0x19, 0x1300, 0x0300),5142		{}5143	};5144	static const struct coef_fw coef0292[] = {5145		WRITE_COEF(0x76, 0x000e),5146		WRITE_COEF(0x6c, 0x2400),5147		WRITE_COEF(0x18, 0x7308),5148		WRITE_COEF(0x6b, 0xc429),5149		{}5150	};5151	static const struct coef_fw coef0293[] = {5152		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */5153		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */5154		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */5155		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */5156		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */5157		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */5158		{}5159	};5160	static const struct coef_fw coef0668[] = {5161		WRITE_COEF(0x15, 0x0d40),5162		WRITE_COEF(0xb7, 0x802b),5163		{}5164	};5165	static const struct coef_fw coef0225[] = {5166		UPDATE_COEF(0x63, 3<<14, 0),5167		{}5168	};5169	static const struct coef_fw coef0274[] = {5170		UPDATE_COEF(0x4a, 0x0100, 0),5171		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),5172		UPDATE_COEF(0x6b, 0xf000, 0x5000),5173		UPDATE_COEF(0x4a, 0x0010, 0),5174		UPDATE_COEF(0x4a, 0x0c00, 0x0c00),5175		WRITE_COEF(0x45, 0x5289),5176		UPDATE_COEF(0x4a, 0x0c00, 0),5177		{}5178	};5179 5180	if (spec->no_internal_mic_pin) {5181		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);5182		return;5183	}5184 5185	switch (codec->core.vendor_id) {5186	case 0x10ec0255:5187		alc_process_coef_fw(codec, coef0255);5188		break;5189	case 0x10ec0230:5190	case 0x10ec0236:5191	case 0x10ec0256:5192	case 0x19e58326:5193		alc_hp_mute_disable(codec, 75);5194		alc_process_coef_fw(codec, coef0256);5195		break;5196	case 0x10ec0234:5197	case 0x10ec0274:5198	case 0x10ec0294:5199		alc_process_coef_fw(codec, coef0274);5200		break;5201	case 0x10ec0233:5202	case 0x10ec0283:5203		alc_process_coef_fw(codec, coef0233);5204		break;5205	case 0x10ec0286:5206	case 0x10ec0288:5207		alc_process_coef_fw(codec, coef0288);5208		break;5209	case 0x10ec0298:5210		alc_process_coef_fw(codec, coef0298);5211		alc_process_coef_fw(codec, coef0288);5212		break;5213	case 0x10ec0292:5214		alc_process_coef_fw(codec, coef0292);5215		break;5216	case 0x10ec0293:5217		alc_process_coef_fw(codec, coef0293);5218		break;5219	case 0x10ec0668:5220		alc_process_coef_fw(codec, coef0668);5221		break;5222	case 0x10ec0215:5223	case 0x10ec0225:5224	case 0x10ec0285:5225	case 0x10ec0295:5226	case 0x10ec0289:5227	case 0x10ec0299:5228		alc_hp_mute_disable(codec, 75);5229		alc_process_coef_fw(codec, alc225_pre_hsmode);5230		alc_process_coef_fw(codec, coef0225);5231		break;5232	case 0x10ec0867:5233		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);5234		break;5235	}5236	codec_dbg(codec, "Headset jack set to unplugged mode.\n");5237}5238 5239 5240static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,5241				    hda_nid_t mic_pin)5242{5243	static const struct coef_fw coef0255[] = {5244		WRITE_COEFEX(0x57, 0x03, 0x8aa6),5245		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */5246		{}5247	};5248	static const struct coef_fw coef0256[] = {5249		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/5250		WRITE_COEFEX(0x57, 0x03, 0x09a3),5251		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */5252		{}5253	};5254	static const struct coef_fw coef0233[] = {5255		UPDATE_COEF(0x35, 0, 1<<14),5256		WRITE_COEF(0x06, 0x2100),5257		WRITE_COEF(0x1a, 0x0021),5258		WRITE_COEF(0x26, 0x008c),5259		{}5260	};5261	static const struct coef_fw coef0288[] = {5262		UPDATE_COEF(0x4f, 0x00c0, 0),5263		UPDATE_COEF(0x50, 0x2000, 0),5264		UPDATE_COEF(0x56, 0x0006, 0),5265		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),5266		UPDATE_COEF(0x66, 0x0008, 0x0008),5267		UPDATE_COEF(0x67, 0x2000, 0x2000),5268		{}5269	};5270	static const struct coef_fw coef0292[] = {5271		WRITE_COEF(0x19, 0xa208),5272		WRITE_COEF(0x2e, 0xacf0),5273		{}5274	};5275	static const struct coef_fw coef0293[] = {5276		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */5277		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */5278		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */5279		{}5280	};5281	static const struct coef_fw coef0688[] = {5282		WRITE_COEF(0xb7, 0x802b),5283		WRITE_COEF(0xb5, 0x1040),5284		UPDATE_COEF(0xc3, 0, 1<<12),5285		{}5286	};5287	static const struct coef_fw coef0225[] = {5288		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),5289		UPDATE_COEF(0x4a, 3<<4, 2<<4),5290		UPDATE_COEF(0x63, 3<<14, 0),5291		{}5292	};5293	static const struct coef_fw coef0274[] = {5294		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),5295		UPDATE_COEF(0x4a, 0x0010, 0),5296		UPDATE_COEF(0x6b, 0xf000, 0),5297		{}5298	};5299 5300	switch (codec->core.vendor_id) {5301	case 0x10ec0255:5302		alc_write_coef_idx(codec, 0x45, 0xc489);5303		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5304		alc_process_coef_fw(codec, coef0255);5305		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5306		break;5307	case 0x10ec0230:5308	case 0x10ec0236:5309	case 0x10ec0256:5310	case 0x19e58326:5311		alc_write_coef_idx(codec, 0x45, 0xc489);5312		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5313		alc_process_coef_fw(codec, coef0256);5314		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5315		break;5316	case 0x10ec0234:5317	case 0x10ec0274:5318	case 0x10ec0294:5319		alc_write_coef_idx(codec, 0x45, 0x4689);5320		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5321		alc_process_coef_fw(codec, coef0274);5322		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5323		break;5324	case 0x10ec0233:5325	case 0x10ec0283:5326		alc_write_coef_idx(codec, 0x45, 0xc429);5327		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5328		alc_process_coef_fw(codec, coef0233);5329		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5330		break;5331	case 0x10ec0286:5332	case 0x10ec0288:5333	case 0x10ec0298:5334		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5335		alc_process_coef_fw(codec, coef0288);5336		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5337		break;5338	case 0x10ec0292:5339		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5340		alc_process_coef_fw(codec, coef0292);5341		break;5342	case 0x10ec0293:5343		/* Set to TRS mode */5344		alc_write_coef_idx(codec, 0x45, 0xc429);5345		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5346		alc_process_coef_fw(codec, coef0293);5347		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5348		break;5349	case 0x10ec0867:5350		alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);5351		fallthrough;5352	case 0x10ec0221:5353	case 0x10ec0662:5354		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5355		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5356		break;5357	case 0x10ec0668:5358		alc_write_coef_idx(codec, 0x11, 0x0001);5359		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5360		alc_process_coef_fw(codec, coef0688);5361		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5362		break;5363	case 0x10ec0215:5364	case 0x10ec0225:5365	case 0x10ec0285:5366	case 0x10ec0295:5367	case 0x10ec0289:5368	case 0x10ec0299:5369		alc_process_coef_fw(codec, alc225_pre_hsmode);5370		alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);5371		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);5372		alc_process_coef_fw(codec, coef0225);5373		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);5374		break;5375	}5376	codec_dbg(codec, "Headset jack set to mic-in mode.\n");5377}5378 5379static void alc_headset_mode_default(struct hda_codec *codec)5380{5381	static const struct coef_fw coef0225[] = {5382		UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),5383		UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),5384		UPDATE_COEF(0x49, 3<<8, 0<<8),5385		UPDATE_COEF(0x4a, 3<<4, 3<<4),5386		UPDATE_COEF(0x63, 3<<14, 0),5387		UPDATE_COEF(0x67, 0xf000, 0x3000),5388		{}5389	};5390	static const struct coef_fw coef0255[] = {5391		WRITE_COEF(0x45, 0xc089),5392		WRITE_COEF(0x45, 0xc489),5393		WRITE_COEFEX(0x57, 0x03, 0x8ea6),5394		WRITE_COEF(0x49, 0x0049),5395		{}5396	};5397	static const struct coef_fw coef0256[] = {5398		WRITE_COEF(0x45, 0xc489),5399		WRITE_COEFEX(0x57, 0x03, 0x0da3),5400		WRITE_COEF(0x49, 0x0049),5401		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/5402		WRITE_COEF(0x06, 0x6100),5403		{}5404	};5405	static const struct coef_fw coef0233[] = {5406		WRITE_COEF(0x06, 0x2100),5407		WRITE_COEF(0x32, 0x4ea3),5408		{}5409	};5410	static const struct coef_fw coef0288[] = {5411		UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */5412		UPDATE_COEF(0x50, 0x2000, 0x2000),5413		UPDATE_COEF(0x56, 0x0006, 0x0006),5414		UPDATE_COEF(0x66, 0x0008, 0),5415		UPDATE_COEF(0x67, 0x2000, 0),5416		{}5417	};5418	static const struct coef_fw coef0292[] = {5419		WRITE_COEF(0x76, 0x000e),5420		WRITE_COEF(0x6c, 0x2400),5421		WRITE_COEF(0x6b, 0xc429),5422		WRITE_COEF(0x18, 0x7308),5423		{}5424	};5425	static const struct coef_fw coef0293[] = {5426		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */5427		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */5428		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */5429		{}5430	};5431	static const struct coef_fw coef0688[] = {5432		WRITE_COEF(0x11, 0x0041),5433		WRITE_COEF(0x15, 0x0d40),5434		WRITE_COEF(0xb7, 0x802b),5435		{}5436	};5437	static const struct coef_fw coef0274[] = {5438		WRITE_COEF(0x45, 0x4289),5439		UPDATE_COEF(0x4a, 0x0010, 0x0010),5440		UPDATE_COEF(0x6b, 0x0f00, 0),5441		UPDATE_COEF(0x49, 0x0300, 0x0300),5442		{}5443	};5444 5445	switch (codec->core.vendor_id) {5446	case 0x10ec0215:5447	case 0x10ec0225:5448	case 0x10ec0285:5449	case 0x10ec0295:5450	case 0x10ec0289:5451	case 0x10ec0299:5452		alc_process_coef_fw(codec, alc225_pre_hsmode);5453		alc_process_coef_fw(codec, coef0225);5454		alc_hp_enable_unmute(codec, 75);5455		break;5456	case 0x10ec0255:5457		alc_process_coef_fw(codec, coef0255);5458		break;5459	case 0x10ec0230:5460	case 0x10ec0236:5461	case 0x10ec0256:5462	case 0x19e58326:5463		alc_write_coef_idx(codec, 0x1b, 0x0e4b);5464		alc_write_coef_idx(codec, 0x45, 0xc089);5465		msleep(50);5466		alc_process_coef_fw(codec, coef0256);5467		alc_hp_enable_unmute(codec, 75);5468		break;5469	case 0x10ec0234:5470	case 0x10ec0274:5471	case 0x10ec0294:5472		alc_process_coef_fw(codec, coef0274);5473		break;5474	case 0x10ec0233:5475	case 0x10ec0283:5476		alc_process_coef_fw(codec, coef0233);5477		break;5478	case 0x10ec0286:5479	case 0x10ec0288:5480	case 0x10ec0298:5481		alc_process_coef_fw(codec, coef0288);5482		break;5483	case 0x10ec0292:5484		alc_process_coef_fw(codec, coef0292);5485		break;5486	case 0x10ec0293:5487		alc_process_coef_fw(codec, coef0293);5488		break;5489	case 0x10ec0668:5490		alc_process_coef_fw(codec, coef0688);5491		break;5492	case 0x10ec0867:5493		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);5494		break;5495	}5496	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");5497}5498 5499/* Iphone type */5500static void alc_headset_mode_ctia(struct hda_codec *codec)5501{5502	int val;5503 5504	static const struct coef_fw coef0255[] = {5505		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */5506		WRITE_COEF(0x1b, 0x0c2b),5507		WRITE_COEFEX(0x57, 0x03, 0x8ea6),5508		{}5509	};5510	static const struct coef_fw coef0256[] = {5511		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */5512		WRITE_COEF(0x1b, 0x0e6b),5513		{}5514	};5515	static const struct coef_fw coef0233[] = {5516		WRITE_COEF(0x45, 0xd429),5517		WRITE_COEF(0x1b, 0x0c2b),5518		WRITE_COEF(0x32, 0x4ea3),5519		{}5520	};5521	static const struct coef_fw coef0288[] = {5522		UPDATE_COEF(0x50, 0x2000, 0x2000),5523		UPDATE_COEF(0x56, 0x0006, 0x0006),5524		UPDATE_COEF(0x66, 0x0008, 0),5525		UPDATE_COEF(0x67, 0x2000, 0),5526		{}5527	};5528	static const struct coef_fw coef0292[] = {5529		WRITE_COEF(0x6b, 0xd429),5530		WRITE_COEF(0x76, 0x0008),5531		WRITE_COEF(0x18, 0x7388),5532		{}5533	};5534	static const struct coef_fw coef0293[] = {5535		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */5536		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */5537		{}5538	};5539	static const struct coef_fw coef0688[] = {5540		WRITE_COEF(0x11, 0x0001),5541		WRITE_COEF(0x15, 0x0d60),5542		WRITE_COEF(0xc3, 0x0000),5543		{}5544	};5545	static const struct coef_fw coef0225_1[] = {5546		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),5547		UPDATE_COEF(0x63, 3<<14, 2<<14),5548		{}5549	};5550	static const struct coef_fw coef0225_2[] = {5551		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),5552		UPDATE_COEF(0x63, 3<<14, 1<<14),5553		{}5554	};5555 5556	switch (codec->core.vendor_id) {5557	case 0x10ec0255:5558		alc_process_coef_fw(codec, coef0255);5559		break;5560	case 0x10ec0230:5561	case 0x10ec0236:5562	case 0x10ec0256:5563	case 0x19e58326:5564		alc_process_coef_fw(codec, coef0256);5565		alc_hp_enable_unmute(codec, 75);5566		break;5567	case 0x10ec0234:5568	case 0x10ec0274:5569	case 0x10ec0294:5570		alc_write_coef_idx(codec, 0x45, 0xd689);5571		break;5572	case 0x10ec0233:5573	case 0x10ec0283:5574		alc_process_coef_fw(codec, coef0233);5575		break;5576	case 0x10ec0298:5577		val = alc_read_coef_idx(codec, 0x50);5578		if (val & (1 << 12)) {5579			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);5580			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);5581			msleep(300);5582		} else {5583			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);5584			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);5585			msleep(300);5586		}5587		break;5588	case 0x10ec0286:5589	case 0x10ec0288:5590		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);5591		msleep(300);5592		alc_process_coef_fw(codec, coef0288);5593		break;5594	case 0x10ec0292:5595		alc_process_coef_fw(codec, coef0292);5596		break;5597	case 0x10ec0293:5598		alc_process_coef_fw(codec, coef0293);5599		break;5600	case 0x10ec0668:5601		alc_process_coef_fw(codec, coef0688);5602		break;5603	case 0x10ec0215:5604	case 0x10ec0225:5605	case 0x10ec0285:5606	case 0x10ec0295:5607	case 0x10ec0289:5608	case 0x10ec0299:5609		val = alc_read_coef_idx(codec, 0x45);5610		if (val & (1 << 9))5611			alc_process_coef_fw(codec, coef0225_2);5612		else5613			alc_process_coef_fw(codec, coef0225_1);5614		alc_hp_enable_unmute(codec, 75);5615		break;5616	case 0x10ec0867:5617		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);5618		break;5619	}5620	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");5621}5622 5623/* Nokia type */5624static void alc_headset_mode_omtp(struct hda_codec *codec)5625{5626	static const struct coef_fw coef0255[] = {5627		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */5628		WRITE_COEF(0x1b, 0x0c2b),5629		WRITE_COEFEX(0x57, 0x03, 0x8ea6),5630		{}5631	};5632	static const struct coef_fw coef0256[] = {5633		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */5634		WRITE_COEF(0x1b, 0x0e6b),5635		{}5636	};5637	static const struct coef_fw coef0233[] = {5638		WRITE_COEF(0x45, 0xe429),5639		WRITE_COEF(0x1b, 0x0c2b),5640		WRITE_COEF(0x32, 0x4ea3),5641		{}5642	};5643	static const struct coef_fw coef0288[] = {5644		UPDATE_COEF(0x50, 0x2000, 0x2000),5645		UPDATE_COEF(0x56, 0x0006, 0x0006),5646		UPDATE_COEF(0x66, 0x0008, 0),5647		UPDATE_COEF(0x67, 0x2000, 0),5648		{}5649	};5650	static const struct coef_fw coef0292[] = {5651		WRITE_COEF(0x6b, 0xe429),5652		WRITE_COEF(0x76, 0x0008),5653		WRITE_COEF(0x18, 0x7388),5654		{}5655	};5656	static const struct coef_fw coef0293[] = {5657		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */5658		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */5659		{}5660	};5661	static const struct coef_fw coef0688[] = {5662		WRITE_COEF(0x11, 0x0001),5663		WRITE_COEF(0x15, 0x0d50),5664		WRITE_COEF(0xc3, 0x0000),5665		{}5666	};5667	static const struct coef_fw coef0225[] = {5668		UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),5669		UPDATE_COEF(0x63, 3<<14, 2<<14),5670		{}5671	};5672 5673	switch (codec->core.vendor_id) {5674	case 0x10ec0255:5675		alc_process_coef_fw(codec, coef0255);5676		break;5677	case 0x10ec0230:5678	case 0x10ec0236:5679	case 0x10ec0256:5680	case 0x19e58326:5681		alc_process_coef_fw(codec, coef0256);5682		alc_hp_enable_unmute(codec, 75);5683		break;5684	case 0x10ec0234:5685	case 0x10ec0274:5686	case 0x10ec0294:5687		alc_write_coef_idx(codec, 0x45, 0xe689);5688		break;5689	case 0x10ec0233:5690	case 0x10ec0283:5691		alc_process_coef_fw(codec, coef0233);5692		break;5693	case 0x10ec0298:5694		alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */5695		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);5696		msleep(300);5697		break;5698	case 0x10ec0286:5699	case 0x10ec0288:5700		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);5701		msleep(300);5702		alc_process_coef_fw(codec, coef0288);5703		break;5704	case 0x10ec0292:5705		alc_process_coef_fw(codec, coef0292);5706		break;5707	case 0x10ec0293:5708		alc_process_coef_fw(codec, coef0293);5709		break;5710	case 0x10ec0668:5711		alc_process_coef_fw(codec, coef0688);5712		break;5713	case 0x10ec0215:5714	case 0x10ec0225:5715	case 0x10ec0285:5716	case 0x10ec0295:5717	case 0x10ec0289:5718	case 0x10ec0299:5719		alc_process_coef_fw(codec, coef0225);5720		alc_hp_enable_unmute(codec, 75);5721		break;5722	}5723	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");5724}5725 5726static void alc_determine_headset_type(struct hda_codec *codec)5727{5728	int val;5729	bool is_ctia = false;5730	struct alc_spec *spec = codec->spec;5731	static const struct coef_fw coef0255[] = {5732		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/5733		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref5734 conteol) */5735		{}5736	};5737	static const struct coef_fw coef0288[] = {5738		UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */5739		{}5740	};5741	static const struct coef_fw coef0298[] = {5742		UPDATE_COEF(0x50, 0x2000, 0x2000),5743		UPDATE_COEF(0x56, 0x0006, 0x0006),5744		UPDATE_COEF(0x66, 0x0008, 0),5745		UPDATE_COEF(0x67, 0x2000, 0),5746		UPDATE_COEF(0x19, 0x1300, 0x1300),5747		{}5748	};5749	static const struct coef_fw coef0293[] = {5750		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */5751		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */5752		{}5753	};5754	static const struct coef_fw coef0688[] = {5755		WRITE_COEF(0x11, 0x0001),5756		WRITE_COEF(0xb7, 0x802b),5757		WRITE_COEF(0x15, 0x0d60),5758		WRITE_COEF(0xc3, 0x0c00),5759		{}5760	};5761	static const struct coef_fw coef0274[] = {5762		UPDATE_COEF(0x4a, 0x0010, 0),5763		UPDATE_COEF(0x4a, 0x8000, 0),5764		WRITE_COEF(0x45, 0xd289),5765		UPDATE_COEF(0x49, 0x0300, 0x0300),5766		{}5767	};5768 5769	if (spec->no_internal_mic_pin) {5770		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);5771		return;5772	}5773 5774	switch (codec->core.vendor_id) {5775	case 0x10ec0255:5776		alc_process_coef_fw(codec, coef0255);5777		msleep(300);5778		val = alc_read_coef_idx(codec, 0x46);5779		is_ctia = (val & 0x0070) == 0x0070;5780		break;5781	case 0x10ec0230:5782	case 0x10ec0236:5783	case 0x10ec0256:5784	case 0x19e58326:5785		alc_write_coef_idx(codec, 0x1b, 0x0e4b);5786		alc_write_coef_idx(codec, 0x06, 0x6104);5787		alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);5788 5789		alc_process_coef_fw(codec, coef0255);5790		msleep(300);5791		val = alc_read_coef_idx(codec, 0x46);5792		is_ctia = (val & 0x0070) == 0x0070;5793		if (!is_ctia) {5794			alc_write_coef_idx(codec, 0x45, 0xe089);5795			msleep(100);5796			val = alc_read_coef_idx(codec, 0x46);5797			if ((val & 0x0070) == 0x0070)5798				is_ctia = false;5799			else5800				is_ctia = true;5801		}5802		alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);5803		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);5804		break;5805	case 0x10ec0234:5806	case 0x10ec0274:5807	case 0x10ec0294:5808		alc_process_coef_fw(codec, coef0274);5809		msleep(850);5810		val = alc_read_coef_idx(codec, 0x46);5811		is_ctia = (val & 0x00f0) == 0x00f0;5812		break;5813	case 0x10ec0233:5814	case 0x10ec0283:5815		alc_write_coef_idx(codec, 0x45, 0xd029);5816		msleep(300);5817		val = alc_read_coef_idx(codec, 0x46);5818		is_ctia = (val & 0x0070) == 0x0070;5819		break;5820	case 0x10ec0298:5821		snd_hda_codec_write(codec, 0x21, 0,5822			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);5823		msleep(100);5824		snd_hda_codec_write(codec, 0x21, 0,5825			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);5826		msleep(200);5827 5828		val = alc_read_coef_idx(codec, 0x50);5829		if (val & (1 << 12)) {5830			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);5831			alc_process_coef_fw(codec, coef0288);5832			msleep(350);5833			val = alc_read_coef_idx(codec, 0x50);5834			is_ctia = (val & 0x0070) == 0x0070;5835		} else {5836			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);5837			alc_process_coef_fw(codec, coef0288);5838			msleep(350);5839			val = alc_read_coef_idx(codec, 0x50);5840			is_ctia = (val & 0x0070) == 0x0070;5841		}5842		alc_process_coef_fw(codec, coef0298);5843		snd_hda_codec_write(codec, 0x21, 0,5844			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);5845		msleep(75);5846		snd_hda_codec_write(codec, 0x21, 0,5847			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);5848		break;5849	case 0x10ec0286:5850	case 0x10ec0288:5851		alc_process_coef_fw(codec, coef0288);5852		msleep(350);5853		val = alc_read_coef_idx(codec, 0x50);5854		is_ctia = (val & 0x0070) == 0x0070;5855		break;5856	case 0x10ec0292:5857		alc_write_coef_idx(codec, 0x6b, 0xd429);5858		msleep(300);5859		val = alc_read_coef_idx(codec, 0x6c);5860		is_ctia = (val & 0x001c) == 0x001c;5861		break;5862	case 0x10ec0293:5863		alc_process_coef_fw(codec, coef0293);5864		msleep(300);5865		val = alc_read_coef_idx(codec, 0x46);5866		is_ctia = (val & 0x0070) == 0x0070;5867		break;5868	case 0x10ec0668:5869		alc_process_coef_fw(codec, coef0688);5870		msleep(300);5871		val = alc_read_coef_idx(codec, 0xbe);5872		is_ctia = (val & 0x1c02) == 0x1c02;5873		break;5874	case 0x10ec0215:5875	case 0x10ec0225:5876	case 0x10ec0285:5877	case 0x10ec0295:5878	case 0x10ec0289:5879	case 0x10ec0299:5880		alc_process_coef_fw(codec, alc225_pre_hsmode);5881		alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);5882		val = alc_read_coef_idx(codec, 0x45);5883		if (val & (1 << 9)) {5884			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);5885			alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);5886			msleep(800);5887			val = alc_read_coef_idx(codec, 0x46);5888			is_ctia = (val & 0x00f0) == 0x00f0;5889		} else {5890			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);5891			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);5892			msleep(800);5893			val = alc_read_coef_idx(codec, 0x46);5894			is_ctia = (val & 0x00f0) == 0x00f0;5895		}5896		if (!is_ctia) {5897			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x38<<10);5898			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);5899			msleep(100);5900			val = alc_read_coef_idx(codec, 0x46);5901			if ((val & 0x00f0) == 0x00f0)5902				is_ctia = false;5903			else5904				is_ctia = true;5905		}5906		alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);5907		alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);5908		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);5909		break;5910	case 0x10ec0867:5911		is_ctia = true;5912		break;5913	}5914 5915	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",5916		    is_ctia ? "yes" : "no");5917	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;5918}5919 5920static void alc_update_headset_mode(struct hda_codec *codec)5921{5922	struct alc_spec *spec = codec->spec;5923 5924	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];5925	hda_nid_t hp_pin = alc_get_hp_pin(spec);5926 5927	int new_headset_mode;5928 5929	if (!snd_hda_jack_detect(codec, hp_pin))5930		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;5931	else if (mux_pin == spec->headset_mic_pin)5932		new_headset_mode = ALC_HEADSET_MODE_HEADSET;5933	else if (mux_pin == spec->headphone_mic_pin)5934		new_headset_mode = ALC_HEADSET_MODE_MIC;5935	else5936		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;5937 5938	if (new_headset_mode == spec->current_headset_mode) {5939		snd_hda_gen_update_outputs(codec);5940		return;5941	}5942 5943	switch (new_headset_mode) {5944	case ALC_HEADSET_MODE_UNPLUGGED:5945		alc_headset_mode_unplugged(codec);5946		spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;5947		spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;5948		spec->gen.hp_jack_present = false;5949		break;5950	case ALC_HEADSET_MODE_HEADSET:5951		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)5952			alc_determine_headset_type(codec);5953		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)5954			alc_headset_mode_ctia(codec);5955		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)5956			alc_headset_mode_omtp(codec);5957		spec->gen.hp_jack_present = true;5958		break;5959	case ALC_HEADSET_MODE_MIC:5960		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);5961		spec->gen.hp_jack_present = false;5962		break;5963	case ALC_HEADSET_MODE_HEADPHONE:5964		alc_headset_mode_default(codec);5965		spec->gen.hp_jack_present = true;5966		break;5967	}5968	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {5969		snd_hda_set_pin_ctl_cache(codec, hp_pin,5970					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);5971		if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)5972			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,5973						  PIN_VREFHIZ);5974	}5975	spec->current_headset_mode = new_headset_mode;5976 5977	snd_hda_gen_update_outputs(codec);5978}5979 5980static void alc_update_headset_mode_hook(struct hda_codec *codec,5981					 struct snd_kcontrol *kcontrol,5982					 struct snd_ctl_elem_value *ucontrol)5983{5984	alc_update_headset_mode(codec);5985}5986 5987static void alc_update_headset_jack_cb(struct hda_codec *codec,5988				       struct hda_jack_callback *jack)5989{5990	snd_hda_gen_hp_automute(codec, jack);5991	alc_update_headset_mode(codec);5992}5993 5994static void alc_probe_headset_mode(struct hda_codec *codec)5995{5996	int i;5997	struct alc_spec *spec = codec->spec;5998	struct auto_pin_cfg *cfg = &spec->gen.autocfg;5999 6000	/* Find mic pins */6001	for (i = 0; i < cfg->num_inputs; i++) {6002		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)6003			spec->headset_mic_pin = cfg->inputs[i].pin;6004		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)6005			spec->headphone_mic_pin = cfg->inputs[i].pin;6006	}6007 6008	WARN_ON(spec->gen.cap_sync_hook);6009	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;6010	spec->gen.automute_hook = alc_update_headset_mode;6011	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;6012}6013 6014static void alc_fixup_headset_mode(struct hda_codec *codec,6015				const struct hda_fixup *fix, int action)6016{6017	struct alc_spec *spec = codec->spec;6018 6019	switch (action) {6020	case HDA_FIXUP_ACT_PRE_PROBE:6021		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;6022		break;6023	case HDA_FIXUP_ACT_PROBE:6024		alc_probe_headset_mode(codec);6025		break;6026	case HDA_FIXUP_ACT_INIT:6027		if (is_s3_resume(codec) || is_s4_resume(codec)) {6028			spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;6029			spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;6030		}6031		alc_update_headset_mode(codec);6032		break;6033	}6034}6035 6036static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,6037				const struct hda_fixup *fix, int action)6038{6039	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6040		struct alc_spec *spec = codec->spec;6041		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;6042	}6043	else6044		alc_fixup_headset_mode(codec, fix, action);6045}6046 6047static void alc255_set_default_jack_type(struct hda_codec *codec)6048{6049	/* Set to iphone type */6050	static const struct coef_fw alc255fw[] = {6051		WRITE_COEF(0x1b, 0x880b),6052		WRITE_COEF(0x45, 0xd089),6053		WRITE_COEF(0x1b, 0x080b),6054		WRITE_COEF(0x46, 0x0004),6055		WRITE_COEF(0x1b, 0x0c0b),6056		{}6057	};6058	static const struct coef_fw alc256fw[] = {6059		WRITE_COEF(0x1b, 0x884b),6060		WRITE_COEF(0x45, 0xd089),6061		WRITE_COEF(0x1b, 0x084b),6062		WRITE_COEF(0x46, 0x0004),6063		WRITE_COEF(0x1b, 0x0c4b),6064		{}6065	};6066	switch (codec->core.vendor_id) {6067	case 0x10ec0255:6068		alc_process_coef_fw(codec, alc255fw);6069		break;6070	case 0x10ec0230:6071	case 0x10ec0236:6072	case 0x10ec0256:6073	case 0x19e58326:6074		alc_process_coef_fw(codec, alc256fw);6075		break;6076	}6077	msleep(30);6078}6079 6080static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,6081				const struct hda_fixup *fix, int action)6082{6083	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6084		alc255_set_default_jack_type(codec);6085	}6086	alc_fixup_headset_mode(codec, fix, action);6087}6088 6089static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,6090				const struct hda_fixup *fix, int action)6091{6092	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6093		struct alc_spec *spec = codec->spec;6094		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;6095		alc255_set_default_jack_type(codec);6096	}6097	else6098		alc_fixup_headset_mode(codec, fix, action);6099}6100 6101static void alc288_update_headset_jack_cb(struct hda_codec *codec,6102				       struct hda_jack_callback *jack)6103{6104	struct alc_spec *spec = codec->spec;6105 6106	alc_update_headset_jack_cb(codec, jack);6107	/* Headset Mic enable or disable, only for Dell Dino */6108	alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);6109}6110 6111static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,6112				const struct hda_fixup *fix, int action)6113{6114	alc_fixup_headset_mode(codec, fix, action);6115	if (action == HDA_FIXUP_ACT_PROBE) {6116		struct alc_spec *spec = codec->spec;6117		/* toggled via hp_automute_hook */6118		spec->gpio_mask |= 0x40;6119		spec->gpio_dir |= 0x40;6120		spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;6121	}6122}6123 6124static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,6125					const struct hda_fixup *fix, int action)6126{6127	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6128		struct alc_spec *spec = codec->spec;6129		spec->gen.auto_mute_via_amp = 1;6130	}6131}6132 6133static void alc_fixup_no_shutup(struct hda_codec *codec,6134				const struct hda_fixup *fix, int action)6135{6136	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6137		struct alc_spec *spec = codec->spec;6138		spec->no_shutup_pins = 1;6139	}6140}6141 6142static void alc_fixup_disable_aamix(struct hda_codec *codec,6143				    const struct hda_fixup *fix, int action)6144{6145	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6146		struct alc_spec *spec = codec->spec;6147		/* Disable AA-loopback as it causes white noise */6148		spec->gen.mixer_nid = 0;6149	}6150}6151 6152/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */6153static void alc_fixup_tpt440_dock(struct hda_codec *codec,6154				  const struct hda_fixup *fix, int action)6155{6156	static const struct hda_pintbl pincfgs[] = {6157		{ 0x16, 0x21211010 }, /* dock headphone */6158		{ 0x19, 0x21a11010 }, /* dock mic */6159		{ }6160	};6161	struct alc_spec *spec = codec->spec;6162 6163	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6164		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;6165		codec->power_save_node = 0; /* avoid click noises */6166		snd_hda_apply_pincfgs(codec, pincfgs);6167	}6168}6169 6170static void alc_fixup_tpt470_dock(struct hda_codec *codec,6171				  const struct hda_fixup *fix, int action)6172{6173	static const struct hda_pintbl pincfgs[] = {6174		{ 0x17, 0x21211010 }, /* dock headphone */6175		{ 0x19, 0x21a11010 }, /* dock mic */6176		{ }6177	};6178	struct alc_spec *spec = codec->spec;6179 6180	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6181		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;6182		snd_hda_apply_pincfgs(codec, pincfgs);6183	} else if (action == HDA_FIXUP_ACT_INIT) {6184		/* Enable DOCK device */6185		snd_hda_codec_write(codec, 0x17, 0,6186			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);6187		/* Enable DOCK device */6188		snd_hda_codec_write(codec, 0x19, 0,6189			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);6190	}6191}6192 6193static void alc_fixup_tpt470_dacs(struct hda_codec *codec,6194				  const struct hda_fixup *fix, int action)6195{6196	/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise6197	 * the speaker output becomes too low by some reason on Thinkpads with6198	 * ALC298 codec6199	 */6200	static const hda_nid_t preferred_pairs[] = {6201		0x14, 0x03, 0x17, 0x02, 0x21, 0x02,6202		06203	};6204	struct alc_spec *spec = codec->spec;6205 6206	if (action == HDA_FIXUP_ACT_PRE_PROBE)6207		spec->gen.preferred_dacs = preferred_pairs;6208}6209 6210static void alc295_fixup_asus_dacs(struct hda_codec *codec,6211				   const struct hda_fixup *fix, int action)6212{6213	static const hda_nid_t preferred_pairs[] = {6214		0x17, 0x02, 0x21, 0x03, 06215	};6216	struct alc_spec *spec = codec->spec;6217 6218	if (action == HDA_FIXUP_ACT_PRE_PROBE)6219		spec->gen.preferred_dacs = preferred_pairs;6220}6221 6222static void alc_shutup_dell_xps13(struct hda_codec *codec)6223{6224	struct alc_spec *spec = codec->spec;6225	int hp_pin = alc_get_hp_pin(spec);6226 6227	/* Prevent pop noises when headphones are plugged in */6228	snd_hda_codec_write(codec, hp_pin, 0,6229			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);6230	msleep(20);6231}6232 6233static void alc_fixup_dell_xps13(struct hda_codec *codec,6234				const struct hda_fixup *fix, int action)6235{6236	struct alc_spec *spec = codec->spec;6237	struct hda_input_mux *imux = &spec->gen.input_mux;6238	int i;6239 6240	switch (action) {6241	case HDA_FIXUP_ACT_PRE_PROBE:6242		/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise6243		 * it causes a click noise at start up6244		 */6245		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);6246		spec->shutup = alc_shutup_dell_xps13;6247		break;6248	case HDA_FIXUP_ACT_PROBE:6249		/* Make the internal mic the default input source. */6250		for (i = 0; i < imux->num_items; i++) {6251			if (spec->gen.imux_pins[i] == 0x12) {6252				spec->gen.cur_mux[0] = i;6253				break;6254			}6255		}6256		break;6257	}6258}6259 6260static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,6261				const struct hda_fixup *fix, int action)6262{6263	struct alc_spec *spec = codec->spec;6264 6265	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6266		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;6267		spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */6268 6269		/* Disable boost for mic-in permanently. (This code is only called6270		   from quirks that guarantee that the headphone is at NID 0x1b.) */6271		snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);6272		snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);6273	} else6274		alc_fixup_headset_mode(codec, fix, action);6275}6276 6277static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,6278				const struct hda_fixup *fix, int action)6279{6280	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6281		alc_write_coef_idx(codec, 0xc4, 0x8000);6282		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);6283		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);6284	}6285	alc_fixup_headset_mode(codec, fix, action);6286}6287 6288/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */6289static int find_ext_mic_pin(struct hda_codec *codec)6290{6291	struct alc_spec *spec = codec->spec;6292	struct auto_pin_cfg *cfg = &spec->gen.autocfg;6293	hda_nid_t nid;6294	unsigned int defcfg;6295	int i;6296 6297	for (i = 0; i < cfg->num_inputs; i++) {6298		if (cfg->inputs[i].type != AUTO_PIN_MIC)6299			continue;6300		nid = cfg->inputs[i].pin;6301		defcfg = snd_hda_codec_get_pincfg(codec, nid);6302		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)6303			continue;6304		return nid;6305	}6306 6307	return 0;6308}6309 6310static void alc271_hp_gate_mic_jack(struct hda_codec *codec,6311				    const struct hda_fixup *fix,6312				    int action)6313{6314	struct alc_spec *spec = codec->spec;6315 6316	if (action == HDA_FIXUP_ACT_PROBE) {6317		int mic_pin = find_ext_mic_pin(codec);6318		int hp_pin = alc_get_hp_pin(spec);6319 6320		if (snd_BUG_ON(!mic_pin || !hp_pin))6321			return;6322		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);6323	}6324}6325 6326static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,6327					     const struct hda_fixup *fix,6328					     int action)6329{6330	struct alc_spec *spec = codec->spec;6331	struct auto_pin_cfg *cfg = &spec->gen.autocfg;6332	int i;6333 6334	/* The mic boosts on level 2 and 3 are too noisy6335	   on the internal mic input.6336	   Therefore limit the boost to 0 or 1. */6337 6338	if (action != HDA_FIXUP_ACT_PROBE)6339		return;6340 6341	for (i = 0; i < cfg->num_inputs; i++) {6342		hda_nid_t nid = cfg->inputs[i].pin;6343		unsigned int defcfg;6344		if (cfg->inputs[i].type != AUTO_PIN_MIC)6345			continue;6346		defcfg = snd_hda_codec_get_pincfg(codec, nid);6347		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)6348			continue;6349 6350		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,6351					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |6352					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |6353					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |6354					  (0 << AC_AMPCAP_MUTE_SHIFT));6355	}6356}6357 6358static void alc283_hp_automute_hook(struct hda_codec *codec,6359				    struct hda_jack_callback *jack)6360{6361	struct alc_spec *spec = codec->spec;6362	int vref;6363 6364	msleep(200);6365	snd_hda_gen_hp_automute(codec, jack);6366 6367	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;6368 6369	msleep(600);6370	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,6371			    vref);6372}6373 6374static void alc283_fixup_chromebook(struct hda_codec *codec,6375				    const struct hda_fixup *fix, int action)6376{6377	struct alc_spec *spec = codec->spec;6378 6379	switch (action) {6380	case HDA_FIXUP_ACT_PRE_PROBE:6381		snd_hda_override_wcaps(codec, 0x03, 0);6382		/* Disable AA-loopback as it causes white noise */6383		spec->gen.mixer_nid = 0;6384		break;6385	case HDA_FIXUP_ACT_INIT:6386		/* MIC2-VREF control */6387		/* Set to manual mode */6388		alc_update_coef_idx(codec, 0x06, 0x000c, 0);6389		/* Enable Line1 input control by verb */6390		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);6391		break;6392	}6393}6394 6395static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,6396				    const struct hda_fixup *fix, int action)6397{6398	struct alc_spec *spec = codec->spec;6399 6400	switch (action) {6401	case HDA_FIXUP_ACT_PRE_PROBE:6402		spec->gen.hp_automute_hook = alc283_hp_automute_hook;6403		break;6404	case HDA_FIXUP_ACT_INIT:6405		/* MIC2-VREF control */6406		/* Set to manual mode */6407		alc_update_coef_idx(codec, 0x06, 0x000c, 0);6408		break;6409	}6410}6411 6412/* mute tablet speaker pin (0x14) via dock plugging in addition */6413static void asus_tx300_automute(struct hda_codec *codec)6414{6415	struct alc_spec *spec = codec->spec;6416	snd_hda_gen_update_outputs(codec);6417	if (snd_hda_jack_detect(codec, 0x1b))6418		spec->gen.mute_bits |= (1ULL << 0x14);6419}6420 6421static void alc282_fixup_asus_tx300(struct hda_codec *codec,6422				    const struct hda_fixup *fix, int action)6423{6424	struct alc_spec *spec = codec->spec;6425	static const struct hda_pintbl dock_pins[] = {6426		{ 0x1b, 0x21114000 }, /* dock speaker pin */6427		{}6428	};6429 6430	switch (action) {6431	case HDA_FIXUP_ACT_PRE_PROBE:6432		spec->init_amp = ALC_INIT_DEFAULT;6433		/* TX300 needs to set up GPIO2 for the speaker amp */6434		alc_setup_gpio(codec, 0x04);6435		snd_hda_apply_pincfgs(codec, dock_pins);6436		spec->gen.auto_mute_via_amp = 1;6437		spec->gen.automute_hook = asus_tx300_automute;6438		snd_hda_jack_detect_enable_callback(codec, 0x1b,6439						    snd_hda_gen_hp_automute);6440		break;6441	case HDA_FIXUP_ACT_PROBE:6442		spec->init_amp = ALC_INIT_DEFAULT;6443		break;6444	case HDA_FIXUP_ACT_BUILD:6445		/* this is a bit tricky; give more sane names for the main6446		 * (tablet) speaker and the dock speaker, respectively6447		 */6448		rename_ctl(codec, "Speaker Playback Switch",6449			   "Dock Speaker Playback Switch");6450		rename_ctl(codec, "Bass Speaker Playback Switch",6451			   "Speaker Playback Switch");6452		break;6453	}6454}6455 6456static void alc290_fixup_mono_speakers(struct hda_codec *codec,6457				       const struct hda_fixup *fix, int action)6458{6459	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6460		/* DAC node 0x03 is giving mono output. We therefore want to6461		   make sure 0x14 (front speaker) and 0x15 (headphones) use the6462		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */6463		static const hda_nid_t conn1[] = { 0x0c };6464		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);6465		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);6466	}6467}6468 6469static void alc298_fixup_speaker_volume(struct hda_codec *codec,6470					const struct hda_fixup *fix, int action)6471{6472	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6473		/* The speaker is routed to the Node 0x06 by a mistake, as a result6474		   we can't adjust the speaker's volume since this node does not has6475		   Amp-out capability. we change the speaker's route to:6476		   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (6477		   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust6478		   speaker's volume now. */6479 6480		static const hda_nid_t conn1[] = { 0x0c };6481		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);6482	}6483}6484 6485/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */6486static void alc295_fixup_disable_dac3(struct hda_codec *codec,6487				      const struct hda_fixup *fix, int action)6488{6489	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6490		static const hda_nid_t conn[] = { 0x02, 0x03 };6491		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);6492	}6493}6494 6495/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */6496static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,6497					  const struct hda_fixup *fix, int action)6498{6499	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6500		static const hda_nid_t conn[] = { 0x02 };6501		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);6502	}6503}6504 6505/* Hook to update amp GPIO4 for automute */6506static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,6507					  struct hda_jack_callback *jack)6508{6509	struct alc_spec *spec = codec->spec;6510 6511	snd_hda_gen_hp_automute(codec, jack);6512	/* mute_led_polarity is set to 0, so we pass inverted value here */6513	alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,6514			    !spec->gen.hp_jack_present);6515}6516 6517/* Manage GPIOs for HP EliteBook Folio 9480m.6518 *6519 * GPIO4 is the headphone amplifier power control6520 * GPIO3 is the audio output mute indicator LED6521 */6522 6523static void alc280_fixup_hp_9480m(struct hda_codec *codec,6524				  const struct hda_fixup *fix,6525				  int action)6526{6527	struct alc_spec *spec = codec->spec;6528 6529	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);6530	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6531		/* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */6532		spec->gpio_mask |= 0x10;6533		spec->gpio_dir |= 0x10;6534		spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;6535	}6536}6537 6538static void alc275_fixup_gpio4_off(struct hda_codec *codec,6539				   const struct hda_fixup *fix,6540				   int action)6541{6542	struct alc_spec *spec = codec->spec;6543 6544	if (action == HDA_FIXUP_ACT_PRE_PROBE) {6545		spec->gpio_mask |= 0x04;6546		spec->gpio_dir |= 0x04;6547		/* set data bit low */6548	}6549}6550 6551/* Quirk for Thinkpad X1 7th and 8th Gen6552 * The following fixed routing needed6553 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly6554 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC6555 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp6556 */6557static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,6558					  const struct hda_fixup *fix, int action)6559{6560	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */6561	static const hda_nid_t preferred_pairs[] = {6562		0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 06563	};6564	struct alc_spec *spec = codec->spec;6565 6566	switch (action) {6567	case HDA_FIXUP_ACT_PRE_PROBE:6568		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);6569		spec->gen.preferred_dacs = preferred_pairs;6570		break;6571	case HDA_FIXUP_ACT_BUILD:6572		/* The generic parser creates somewhat unintuitive volume ctls6573		 * with the fixed routing above, and the shared DAC2 may be6574		 * confusing for PA.6575		 * Rename those to unique names so that PA doesn't touch them6576		 * and use only Master volume.6577		 */6578		rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");6579		rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");6580		break;6581	}6582}6583 6584static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,6585					 const struct hda_fixup *fix,6586					 int action)6587{6588	alc_fixup_dual_codecs(codec, fix, action);6589	switch (action) {6590	case HDA_FIXUP_ACT_PRE_PROBE:6591		/* override card longname to provide a unique UCM profile */6592		strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");6593		break;6594	case HDA_FIXUP_ACT_BUILD:6595		/* rename Capture controls depending on the codec */6596		rename_ctl(codec, "Capture Volume",6597			   codec->addr == 0 ?6598			   "Rear-Panel Capture Volume" :6599			   "Front-Panel Capture Volume");6600		rename_ctl(codec, "Capture Switch",6601			   codec->addr == 0 ?6602			   "Rear-Panel Capture Switch" :6603			   "Front-Panel Capture Switch");6604		break;6605	}6606}6607 6608static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,6609				      const struct hda_fixup *fix, int action)6610{6611	if (action != HDA_FIXUP_ACT_PRE_PROBE)6612		return;6613 6614	codec->power_save_node = 1;6615}6616 6617/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */6618static void alc274_fixup_bind_dacs(struct hda_codec *codec,6619				    const struct hda_fixup *fix, int action)6620{6621	struct alc_spec *spec = codec->spec;6622	static const hda_nid_t preferred_pairs[] = {6623		0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,6624		06625	};6626 6627	if (action != HDA_FIXUP_ACT_PRE_PROBE)6628		return;6629 6630	spec->gen.preferred_dacs = preferred_pairs;6631	spec->gen.auto_mute_via_amp = 1;6632	codec->power_save_node = 0;6633}6634 6635/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */6636static void alc289_fixup_asus_ga401(struct hda_codec *codec,6637				    const struct hda_fixup *fix, int action)6638{6639	static const hda_nid_t preferred_pairs[] = {6640		0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 06641	};6642	struct alc_spec *spec = codec->spec;6643 6644	if (action == HDA_FIXUP_ACT_PRE_PROBE)6645		spec->gen.preferred_dacs = preferred_pairs;6646}6647 6648/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */6649static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,6650			      const struct hda_fixup *fix, int action)6651{6652	if (action != HDA_FIXUP_ACT_PRE_PROBE)6653		return;6654 6655	snd_hda_override_wcaps(codec, 0x03, 0);6656}6657 6658static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)6659{6660	switch (codec->core.vendor_id) {6661	case 0x10ec0274:6662	case 0x10ec0294:6663	case 0x10ec0225:6664	case 0x10ec0295:6665	case 0x10ec0299:6666		alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */6667		alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);6668		break;6669	case 0x10ec0230:6670	case 0x10ec0235:6671	case 0x10ec0236:6672	case 0x10ec0255:6673	case 0x10ec0256:6674	case 0x10ec0257:6675	case 0x19e58326:6676		alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */6677		alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);6678		break;6679	}6680}6681 6682static void alc295_fixup_chromebook(struct hda_codec *codec,6683				    const struct hda_fixup *fix, int action)6684{6685	struct alc_spec *spec = codec->spec;6686 6687	switch (action) {6688	case HDA_FIXUP_ACT_PRE_PROBE:6689		spec->ultra_low_power = true;6690		break;6691	case HDA_FIXUP_ACT_INIT:6692		alc_combo_jack_hp_jd_restart(codec);6693		break;6694	}6695}6696 6697static void alc256_fixup_chromebook(struct hda_codec *codec,6698				    const struct hda_fixup *fix, int action)6699{6700	struct alc_spec *spec = codec->spec;6701 6702	switch (action) {6703	case HDA_FIXUP_ACT_PRE_PROBE:6704		spec->gen.suppress_auto_mute = 1;6705		spec->gen.suppress_auto_mic = 1;6706		spec->en_3kpull_low = false;6707		break;6708	}6709}6710 6711static void alc_fixup_disable_mic_vref(struct hda_codec *codec,6712				  const struct hda_fixup *fix, int action)6713{6714	if (action == HDA_FIXUP_ACT_PRE_PROBE)6715		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);6716}6717 6718 6719static void alc294_gx502_toggle_output(struct hda_codec *codec,6720					struct hda_jack_callback *cb)6721{6722	/* The Windows driver sets the codec up in a very different way where6723	 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it6724	 */6725	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)6726		alc_write_coef_idx(codec, 0x10, 0x8a20);6727	else6728		alc_write_coef_idx(codec, 0x10, 0x0a20);6729}6730 6731static void alc294_fixup_gx502_hp(struct hda_codec *codec,6732					const struct hda_fixup *fix, int action)6733{6734	/* Pin 0x21: headphones/headset mic */6735	if (!is_jack_detectable(codec, 0x21))6736		return;6737 6738	switch (action) {6739	case HDA_FIXUP_ACT_PRE_PROBE:6740		snd_hda_jack_detect_enable_callback(codec, 0x21,6741				alc294_gx502_toggle_output);6742		break;6743	case HDA_FIXUP_ACT_INIT:6744		/* Make sure to start in a correct state, i.e. if6745		 * headphones have been plugged in before powering up the system6746		 */6747		alc294_gx502_toggle_output(codec, NULL);6748		break;6749	}6750}6751 6752static void alc294_gu502_toggle_output(struct hda_codec *codec,6753				       struct hda_jack_callback *cb)6754{6755	/* Windows sets 0x10 to 0x8420 for Node 0x20 which is6756	 * responsible from changes between speakers and headphones6757	 */6758	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)6759		alc_write_coef_idx(codec, 0x10, 0x8420);6760	else6761		alc_write_coef_idx(codec, 0x10, 0x0a20);6762}6763 6764static void alc294_fixup_gu502_hp(struct hda_codec *codec,6765				  const struct hda_fixup *fix, int action)6766{6767	if (!is_jack_detectable(codec, 0x21))6768		return;6769 6770	switch (action) {6771	case HDA_FIXUP_ACT_PRE_PROBE:6772		snd_hda_jack_detect_enable_callback(codec, 0x21,6773				alc294_gu502_toggle_output);6774		break;6775	case HDA_FIXUP_ACT_INIT:6776		alc294_gu502_toggle_output(codec, NULL);6777		break;6778	}6779}6780 6781static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,6782			      const struct hda_fixup *fix, int action)6783{6784	if (action != HDA_FIXUP_ACT_INIT)6785		return;6786 6787	msleep(100);6788	alc_write_coef_idx(codec, 0x65, 0x0);6789}6790 6791static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,6792				    const struct hda_fixup *fix, int action)6793{6794	switch (action) {6795	case HDA_FIXUP_ACT_INIT:6796		alc_combo_jack_hp_jd_restart(codec);6797		break;6798	}6799}6800 6801static void alc_fixup_no_int_mic(struct hda_codec *codec,6802				    const struct hda_fixup *fix, int action)6803{6804	struct alc_spec *spec = codec->spec;6805 6806	switch (action) {6807	case HDA_FIXUP_ACT_PRE_PROBE:6808		/* Mic RING SLEEVE swap for combo jack */6809		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);6810		spec->no_internal_mic_pin = true;6811		break;6812	case HDA_FIXUP_ACT_INIT:6813		alc_combo_jack_hp_jd_restart(codec);6814		break;6815	}6816}6817 6818/* GPIO1 = amplifier on/off6819 * GPIO3 = mic mute LED6820 */6821static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,6822					  const struct hda_fixup *fix, int action)6823{6824	static const hda_nid_t conn[] = { 0x02 };6825 6826	struct alc_spec *spec = codec->spec;6827	static const struct hda_pintbl pincfgs[] = {6828		{ 0x14, 0x90170110 },  /* front/high speakers */6829		{ 0x17, 0x90170130 },  /* back/bass speakers */6830		{ }6831	};6832 6833	//enable micmute led6834	alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);6835 6836	switch (action) {6837	case HDA_FIXUP_ACT_PRE_PROBE:6838		spec->micmute_led_polarity = 1;6839		/* needed for amp of back speakers */6840		spec->gpio_mask |= 0x01;6841		spec->gpio_dir |= 0x01;6842		snd_hda_apply_pincfgs(codec, pincfgs);6843		/* share DAC to have unified volume control */6844		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);6845		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);6846		break;6847	case HDA_FIXUP_ACT_INIT:6848		/* need to toggle GPIO to enable the amp of back speakers */6849		alc_update_gpio_data(codec, 0x01, true);6850		msleep(100);6851		alc_update_gpio_data(codec, 0x01, false);6852		break;6853	}6854}6855 6856static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,6857					  const struct hda_fixup *fix, int action)6858{6859	static const hda_nid_t conn[] = { 0x02 };6860	static const struct hda_pintbl pincfgs[] = {6861		{ 0x14, 0x90170110 },  /* rear speaker */6862		{ }6863	};6864 6865	switch (action) {6866	case HDA_FIXUP_ACT_PRE_PROBE:6867		snd_hda_apply_pincfgs(codec, pincfgs);6868		/* force front speaker to DAC1 */6869		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);6870		break;6871	}6872}6873 6874static void alc285_fixup_hp_envy_x360(struct hda_codec *codec,6875				      const struct hda_fixup *fix,6876				      int action)6877{6878	static const struct coef_fw coefs[] = {6879		WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),6880		WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),6881		WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),6882		WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),6883		WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),6884		WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),6885		WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),6886		WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),6887		WRITE_COEF(0x6e, 0x1005), { }6888	};6889 6890	static const struct hda_pintbl pincfgs[] = {6891		{ 0x12, 0xb7a60130 },  /* Internal microphone*/6892		{ 0x14, 0x90170150 },  /* B&O soundbar speakers */6893		{ 0x17, 0x90170153 },  /* Side speakers */6894		{ 0x19, 0x03a11040 },  /* Headset microphone */6895		{ }6896	};6897 6898	switch (action) {6899	case HDA_FIXUP_ACT_PRE_PROBE:6900		snd_hda_apply_pincfgs(codec, pincfgs);6901 6902		/* Fixes volume control problem for side speakers */6903		alc295_fixup_disable_dac3(codec, fix, action);6904 6905		/* Fixes no sound from headset speaker */6906		snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);6907 6908		/* Auto-enable headset mic when plugged */6909		snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);6910 6911		/* Headset mic volume enhancement */6912		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);6913		break;6914	case HDA_FIXUP_ACT_INIT:6915		alc_process_coef_fw(codec, coefs);6916		break;6917	case HDA_FIXUP_ACT_BUILD:6918		rename_ctl(codec, "Bass Speaker Playback Volume",6919			   "B&O-Tuned Playback Volume");6920		rename_ctl(codec, "Front Playback Switch",6921			   "B&O Soundbar Playback Switch");6922		rename_ctl(codec, "Bass Speaker Playback Switch",6923			   "Side Speaker Playback Switch");6924		break;6925	}6926}6927 6928/* for hda_fixup_thinkpad_acpi() */6929#include "thinkpad_helper.c"6930 6931static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,6932				    const struct hda_fixup *fix, int action)6933{6934	alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */6935	hda_fixup_thinkpad_acpi(codec, fix, action);6936}6937 6938/* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */6939static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,6940						  const struct hda_fixup *fix,6941						  int action)6942{6943	struct alc_spec *spec = codec->spec;6944 6945	switch (action) {6946	case HDA_FIXUP_ACT_PRE_PROBE:6947		spec->gen.suppress_auto_mute = 1;6948		break;6949	}6950}6951 6952static void comp_acpi_device_notify(acpi_handle handle, u32 event, void *data)6953{6954	struct hda_codec *cdc = data;6955	struct alc_spec *spec = cdc->spec;6956 6957	codec_info(cdc, "ACPI Notification %d\n", event);6958 6959	hda_component_acpi_device_notify(&spec->comps, handle, event, data);6960}6961 6962static int comp_bind(struct device *dev)6963{6964	struct hda_codec *cdc = dev_to_hda_codec(dev);6965	struct alc_spec *spec = cdc->spec;6966	int ret;6967 6968	ret = hda_component_manager_bind(cdc, &spec->comps);6969	if (ret)6970		return ret;6971 6972	return hda_component_manager_bind_acpi_notifications(cdc,6973							     &spec->comps,6974							     comp_acpi_device_notify, cdc);6975}6976 6977static void comp_unbind(struct device *dev)6978{6979	struct hda_codec *cdc = dev_to_hda_codec(dev);6980	struct alc_spec *spec = cdc->spec;6981 6982	hda_component_manager_unbind_acpi_notifications(cdc, &spec->comps, comp_acpi_device_notify);6983	hda_component_manager_unbind(cdc, &spec->comps);6984}6985 6986static const struct component_master_ops comp_master_ops = {6987	.bind = comp_bind,6988	.unbind = comp_unbind,6989};6990 6991static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,6992				       struct snd_pcm_substream *sub, int action)6993{6994	struct alc_spec *spec = cdc->spec;6995 6996	hda_component_manager_playback_hook(&spec->comps, action);6997}6998 6999static void comp_generic_fixup(struct hda_codec *cdc, int action, const char *bus,7000			       const char *hid, const char *match_str, int count)7001{7002	struct alc_spec *spec = cdc->spec;7003	int ret;7004 7005	switch (action) {7006	case HDA_FIXUP_ACT_PRE_PROBE:7007		ret = hda_component_manager_init(cdc, &spec->comps, count, bus, hid,7008						 match_str, &comp_master_ops);7009		if (ret)7010			return;7011 7012		spec->gen.pcm_playback_hook = comp_generic_playback_hook;7013		break;7014	case HDA_FIXUP_ACT_FREE:7015		hda_component_manager_free(&spec->comps, &comp_master_ops);7016		break;7017	}7018}7019 7020static void find_cirrus_companion_amps(struct hda_codec *cdc)7021{7022	struct device *dev = hda_codec_dev(cdc);7023	struct acpi_device *adev;7024	struct fwnode_handle *fwnode __free(fwnode_handle) = NULL;7025	const char *bus = NULL;7026	static const struct {7027		const char *hid;7028		const char *name;7029	} acpi_ids[] = {{ "CSC3554", "cs35l54-hda" },7030			{ "CSC3556", "cs35l56-hda" },7031			{ "CSC3557", "cs35l57-hda" }};7032	char *match;7033	int i, count = 0, count_devindex = 0;7034 7035	for (i = 0; i < ARRAY_SIZE(acpi_ids); ++i) {7036		adev = acpi_dev_get_first_match_dev(acpi_ids[i].hid, NULL, -1);7037		if (adev)7038			break;7039	}7040	if (!adev) {7041		codec_dbg(cdc, "Did not find ACPI entry for a Cirrus Amp\n");7042		return;7043	}7044 7045	count = i2c_acpi_client_count(adev);7046	if (count > 0) {7047		bus = "i2c";7048	} else {7049		count = acpi_spi_count_resources(adev);7050		if (count > 0)7051			bus = "spi";7052	}7053 7054	fwnode = fwnode_handle_get(acpi_fwnode_handle(adev));7055	acpi_dev_put(adev);7056 7057	if (!bus) {7058		codec_err(cdc, "Did not find any buses for %s\n", acpi_ids[i].hid);7059		return;7060	}7061 7062	if (!fwnode) {7063		codec_err(cdc, "Could not get fwnode for %s\n", acpi_ids[i].hid);7064		return;7065	}7066 7067	/*7068	 * When available the cirrus,dev-index property is an accurate7069	 * count of the amps in a system and is used in preference to7070	 * the count of bus devices that can contain additional address7071	 * alias entries.7072	 */7073	count_devindex = fwnode_property_count_u32(fwnode, "cirrus,dev-index");7074	if (count_devindex > 0)7075		count = count_devindex;7076 7077	match = devm_kasprintf(dev, GFP_KERNEL, "-%%s:00-%s.%%d", acpi_ids[i].name);7078	if (!match)7079		return;7080	codec_info(cdc, "Found %d %s on %s (%s)\n", count, acpi_ids[i].hid, bus, match);7081	comp_generic_fixup(cdc, HDA_FIXUP_ACT_PRE_PROBE, bus, acpi_ids[i].hid, match, count);7082}7083 7084static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)7085{7086	comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);7087}7088 7089static void cs35l41_fixup_i2c_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)7090{7091	comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);7092}7093 7094static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)7095{7096	comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);7097}7098 7099static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)7100{7101	comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);7102}7103 7104static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,7105						 int action)7106{7107	comp_generic_fixup(cdc, action, "i2c", "CLSA0100", "-%s:00-cs35l41-hda.%d", 2);7108}7109 7110static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,7111						 int action)7112{7113	comp_generic_fixup(cdc, action, "i2c", "CLSA0101", "-%s:00-cs35l41-hda.%d", 2);7114}7115 7116static void alc285_fixup_asus_ga403u(struct hda_codec *cdc, const struct hda_fixup *fix, int action)7117{7118	/*7119	 * The same SSID has been re-used in different hardware, they have7120	 * different codecs and the newer GA403U has a ALC285.7121	 */7122	if (cdc->core.vendor_id != 0x10ec0285)7123		alc_fixup_inv_dmic(cdc, fix, action);7124}7125 7126static void tas2781_fixup_i2c(struct hda_codec *cdc,7127	const struct hda_fixup *fix, int action)7128{7129	comp_generic_fixup(cdc, action, "i2c", "TIAS2781", "-%s:00", 1);7130}7131 7132static void yoga7_14arb7_fixup_i2c(struct hda_codec *cdc,7133	const struct hda_fixup *fix, int action)7134{7135	comp_generic_fixup(cdc, action, "i2c", "INT8866", "-%s:00", 1);7136}7137 7138static void alc256_fixup_acer_sfg16_micmute_led(struct hda_codec *codec,7139	const struct hda_fixup *fix, int action)7140{7141	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);7142}7143 7144 7145/* for alc295_fixup_hp_top_speakers */7146#include "hp_x360_helper.c"7147 7148/* for alc285_fixup_ideapad_s740_coef() */7149#include "ideapad_s740_helper.c"7150 7151static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {7152	WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),7153	WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),7154	WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),7155	{}7156};7157 7158static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,7159					   const struct hda_fixup *fix,7160					   int action)7161{7162	/*7163	 * A certain other OS sets these coeffs to different values. On at least7164	 * one TongFang barebone these settings might survive even a cold7165	 * reboot. So to restore a clean slate the values are explicitly reset7166	 * to default here. Without this, the external microphone is always in a7167	 * plugged-in state, while the internal microphone is always in an7168	 * unplugged state, breaking the ability to use the internal microphone.7169	 */7170	alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);7171}7172 7173static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {7174	WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),7175	WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),7176	WRITE_COEF(0x49, 0x0149),7177	{}7178};7179 7180static void alc233_fixup_no_audio_jack(struct hda_codec *codec,7181				       const struct hda_fixup *fix,7182				       int action)7183{7184	/*7185	 * The audio jack input and output is not detected on the ASRock NUC Box7186	 * 1100 series when cold booting without this fix. Warm rebooting from a7187	 * certain other OS makes the audio functional, as COEF settings are7188	 * preserved in this case. This fix sets these altered COEF values as7189	 * the default.7190	 */7191	alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);7192}7193 7194static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,7195						    const struct hda_fixup *fix,7196						    int action)7197{7198	/*7199	 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,7200	 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec7201	 * needs an additional quirk for sound working after suspend and resume.7202	 */7203	if (codec->core.vendor_id == 0x10ec0256) {7204		alc_update_coef_idx(codec, 0x10, 1<<9, 0);7205		snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);7206	} else {7207		snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);7208	}7209}7210 7211static void alc256_decrease_headphone_amp_val(struct hda_codec *codec,7212					      const struct hda_fixup *fix, int action)7213{7214	u32 caps;7215	u8 nsteps, offs;7216 7217	if (action != HDA_FIXUP_ACT_PRE_PROBE)7218		return;7219 7220	caps = query_amp_caps(codec, 0x3, HDA_OUTPUT);7221	nsteps = ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) - 10;7222	offs = ((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT) - 10;7223	caps &= ~AC_AMPCAP_NUM_STEPS & ~AC_AMPCAP_OFFSET;7224	caps |= (nsteps << AC_AMPCAP_NUM_STEPS_SHIFT) | (offs << AC_AMPCAP_OFFSET_SHIFT);7225 7226	if (snd_hda_override_amp_caps(codec, 0x3, HDA_OUTPUT, caps))7227		codec_warn(codec, "failed to override amp caps for NID 0x3\n");7228}7229 7230static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,7231						  const struct hda_fixup *fix,7232						  int action)7233{7234	struct alc_spec *spec = codec->spec;7235	struct hda_input_mux *imux = &spec->gen.input_mux;7236	int i;7237 7238	alc269_fixup_limit_int_mic_boost(codec, fix, action);7239 7240	switch (action) {7241	case HDA_FIXUP_ACT_PRE_PROBE:7242		/**7243		 * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)7244		 * to Hi-Z to avoid pop noises at startup and when plugging and7245		 * unplugging headphones.7246		 */7247		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);7248		snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);7249		break;7250	case HDA_FIXUP_ACT_PROBE:7251		/**7252		 * Make the internal mic (0x12) the default input source to7253		 * prevent pop noises on cold boot.7254		 */7255		for (i = 0; i < imux->num_items; i++) {7256			if (spec->gen.imux_pins[i] == 0x12) {7257				spec->gen.cur_mux[0] = i;7258				break;7259			}7260		}7261		break;7262	}7263}7264 7265static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,7266					  const struct hda_fixup *fix, int action)7267{7268	/*7269	 * The Pin Complex 0x17 for the bass speakers is wrongly reported as7270	 * unconnected.7271	 */7272	static const struct hda_pintbl pincfgs[] = {7273		{ 0x17, 0x90170121 },7274		{ }7275	};7276	/*7277	 * Avoid DAC 0x06 and 0x08, as they have no volume controls.7278	 * DAC 0x02 and 0x03 would be fine.7279	 */7280	static const hda_nid_t conn[] = { 0x02, 0x03 };7281	/*7282	 * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.7283	 * Headphones (0x21) are connected to DAC 0x03.7284	 */7285	static const hda_nid_t preferred_pairs[] = {7286		0x14, 0x02,7287		0x17, 0x02,7288		0x21, 0x03,7289		07290	};7291	struct alc_spec *spec = codec->spec;7292 7293	switch (action) {7294	case HDA_FIXUP_ACT_PRE_PROBE:7295		snd_hda_apply_pincfgs(codec, pincfgs);7296		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);7297		spec->gen.preferred_dacs = preferred_pairs;7298		break;7299	}7300}7301 7302static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,7303					  const struct hda_fixup *fix, int action)7304{7305	static const struct hda_pintbl pincfgs[] = {7306		{ 0x14, 0x90170151 },7307		{ 0x17, 0x90170150 },7308		{ }7309	};7310	static const hda_nid_t conn[] = { 0x02, 0x03 };7311	static const hda_nid_t preferred_pairs[] = {7312		0x14, 0x02,7313		0x17, 0x03,7314		0x21, 0x02,7315		07316	};7317	struct alc_spec *spec = codec->spec;7318 7319	alc_fixup_no_shutup(codec, fix, action);7320 7321	switch (action) {7322	case HDA_FIXUP_ACT_PRE_PROBE:7323		snd_hda_apply_pincfgs(codec, pincfgs);7324		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);7325		spec->gen.preferred_dacs = preferred_pairs;7326		break;7327	}7328}7329 7330/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */7331static void alc287_fixup_bind_dacs(struct hda_codec *codec,7332				    const struct hda_fixup *fix, int action)7333{7334	struct alc_spec *spec = codec->spec;7335	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */7336	static const hda_nid_t preferred_pairs[] = {7337		0x17, 0x02, 0x21, 0x03, 07338	};7339 7340	if (action != HDA_FIXUP_ACT_PRE_PROBE)7341		return;7342 7343	snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);7344	spec->gen.preferred_dacs = preferred_pairs;7345	spec->gen.auto_mute_via_amp = 1;7346	if (spec->gen.autocfg.speaker_pins[0] != 0x14) {7347		snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,7348					0x0); /* Make sure 0x14 was disable */7349	}7350}7351/* Fix none verb table of Headset Mic pin */7352static void alc_fixup_headset_mic(struct hda_codec *codec,7353				   const struct hda_fixup *fix, int action)7354{7355	struct alc_spec *spec = codec->spec;7356	static const struct hda_pintbl pincfgs[] = {7357		{ 0x19, 0x03a1103c },7358		{ }7359	};7360 7361	switch (action) {7362	case HDA_FIXUP_ACT_PRE_PROBE:7363		snd_hda_apply_pincfgs(codec, pincfgs);7364		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);7365		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;7366		break;7367	}7368}7369 7370static void alc245_fixup_hp_spectre_x360_eu0xxx(struct hda_codec *codec,7371					  const struct hda_fixup *fix, int action)7372{7373	/*7374	 * The Pin Complex 0x14 for the treble speakers is wrongly reported as7375	 * unconnected.7376	 * The Pin Complex 0x17 for the bass speakers has the lowest association7377	 * and sequence values so shift it up a bit to squeeze 0x14 in.7378	 */7379	static const struct hda_pintbl pincfgs[] = {7380		{ 0x14, 0x90170110 }, // top/treble7381		{ 0x17, 0x90170111 }, // bottom/bass7382		{ }7383	};7384 7385	/*7386	 * Force DAC 0x02 for the bass speakers 0x17.7387	 */7388	static const hda_nid_t conn[] = { 0x02 };7389 7390	switch (action) {7391	case HDA_FIXUP_ACT_PRE_PROBE:7392		snd_hda_apply_pincfgs(codec, pincfgs);7393		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);7394		break;7395	}7396 7397	cs35l41_fixup_i2c_two(codec, fix, action);7398	alc245_fixup_hp_mute_led_coefbit(codec, fix, action);7399	alc245_fixup_hp_gpio_led(codec, fix, action);7400}7401 7402/* some changes for Spectre x360 16, 2024 model */7403static void alc245_fixup_hp_spectre_x360_16_aa0xxx(struct hda_codec *codec,7404					  const struct hda_fixup *fix, int action)7405{7406	/*7407	 * The Pin Complex 0x14 for the treble speakers is wrongly reported as7408	 * unconnected.7409	 * The Pin Complex 0x17 for the bass speakers has the lowest association7410	 * and sequence values so shift it up a bit to squeeze 0x14 in.7411	 */7412	struct alc_spec *spec = codec->spec;7413	static const struct hda_pintbl pincfgs[] = {7414		{ 0x14, 0x90170110 }, // top/treble7415		{ 0x17, 0x90170111 }, // bottom/bass7416		{ }7417	};7418 7419	/*7420	 * Force DAC 0x02 for the bass speakers 0x17.7421	 */7422	static const hda_nid_t conn[] = { 0x02 };7423 7424	switch (action) {7425	case HDA_FIXUP_ACT_PRE_PROBE:7426		/* needed for amp of back speakers */7427		spec->gpio_mask |= 0x01;7428		spec->gpio_dir |= 0x01;7429		snd_hda_apply_pincfgs(codec, pincfgs);7430		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);7431		break;7432	case HDA_FIXUP_ACT_INIT:7433		/* need to toggle GPIO to enable the amp of back speakers */7434		alc_update_gpio_data(codec, 0x01, true);7435		msleep(100);7436		alc_update_gpio_data(codec, 0x01, false);7437		break;7438	}7439 7440	cs35l41_fixup_i2c_two(codec, fix, action);7441	alc245_fixup_hp_mute_led_coefbit(codec, fix, action);7442	alc245_fixup_hp_gpio_led(codec, fix, action);7443}7444 7445/*7446 * ALC287 PCM hooks7447 */7448static void alc287_alc1318_playback_pcm_hook(struct hda_pcm_stream *hinfo,7449				   struct hda_codec *codec,7450				   struct snd_pcm_substream *substream,7451				   int action)7452{7453	switch (action) {7454	case HDA_GEN_PCM_ACT_OPEN:7455		alc_write_coefex_idx(codec, 0x5a, 0x00, 0x954f); /* write gpio3 to high */7456		break;7457	case HDA_GEN_PCM_ACT_CLOSE:7458		alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */7459		break;7460	}7461}7462 7463static void alc287_s4_power_gpio3_default(struct hda_codec *codec)7464{7465	if (is_s4_suspend(codec)) {7466		alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */7467	}7468}7469 7470static void alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec *codec,7471			       const struct hda_fixup *fix, int action)7472{7473	struct alc_spec *spec = codec->spec;7474	static const struct coef_fw coefs[] = {7475		WRITE_COEF(0x24, 0x0013), WRITE_COEF(0x25, 0x0000), WRITE_COEF(0x26, 0xC300),7476		WRITE_COEF(0x28, 0x0001), WRITE_COEF(0x29, 0xb023),7477		WRITE_COEF(0x24, 0x0013), WRITE_COEF(0x25, 0x0000), WRITE_COEF(0x26, 0xC301),7478		WRITE_COEF(0x28, 0x0001), WRITE_COEF(0x29, 0xb023),7479	};7480 7481	if (action != HDA_FIXUP_ACT_PRE_PROBE)7482		return;7483	alc_update_coef_idx(codec, 0x10, 1<<11, 1<<11);7484	alc_process_coef_fw(codec, coefs);7485	spec->power_hook = alc287_s4_power_gpio3_default;7486	spec->gen.pcm_playback_hook = alc287_alc1318_playback_pcm_hook;7487}7488 7489 7490enum {7491	ALC269_FIXUP_GPIO2,7492	ALC269_FIXUP_SONY_VAIO,7493	ALC275_FIXUP_SONY_VAIO_GPIO2,7494	ALC269_FIXUP_DELL_M101Z,7495	ALC269_FIXUP_SKU_IGNORE,7496	ALC269_FIXUP_ASUS_G73JW,7497	ALC269_FIXUP_ASUS_N7601ZM_PINS,7498	ALC269_FIXUP_ASUS_N7601ZM,7499	ALC269_FIXUP_LENOVO_EAPD,7500	ALC275_FIXUP_SONY_HWEQ,7501	ALC275_FIXUP_SONY_DISABLE_AAMIX,7502	ALC271_FIXUP_DMIC,7503	ALC269_FIXUP_PCM_44K,7504	ALC269_FIXUP_STEREO_DMIC,7505	ALC269_FIXUP_HEADSET_MIC,7506	ALC269_FIXUP_QUANTA_MUTE,7507	ALC269_FIXUP_LIFEBOOK,7508	ALC269_FIXUP_LIFEBOOK_EXTMIC,7509	ALC269_FIXUP_LIFEBOOK_HP_PIN,7510	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,7511	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,7512	ALC269_FIXUP_AMIC,7513	ALC269_FIXUP_DMIC,7514	ALC269VB_FIXUP_AMIC,7515	ALC269VB_FIXUP_DMIC,7516	ALC269_FIXUP_HP_MUTE_LED,7517	ALC269_FIXUP_HP_MUTE_LED_MIC1,7518	ALC269_FIXUP_HP_MUTE_LED_MIC2,7519	ALC269_FIXUP_HP_MUTE_LED_MIC3,7520	ALC269_FIXUP_HP_GPIO_LED,7521	ALC269_FIXUP_HP_GPIO_MIC1_LED,7522	ALC269_FIXUP_HP_LINE1_MIC1_LED,7523	ALC269_FIXUP_INV_DMIC,7524	ALC269_FIXUP_LENOVO_DOCK,7525	ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,7526	ALC269_FIXUP_NO_SHUTUP,7527	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,7528	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,7529	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,7530	ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,7531	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,7532	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,7533	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,7534	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,7535	ALC269_FIXUP_HEADSET_MODE,7536	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,7537	ALC269_FIXUP_ASPIRE_HEADSET_MIC,7538	ALC269_FIXUP_ASUS_X101_FUNC,7539	ALC269_FIXUP_ASUS_X101_VERB,7540	ALC269_FIXUP_ASUS_X101,7541	ALC271_FIXUP_AMIC_MIC2,7542	ALC271_FIXUP_HP_GATE_MIC_JACK,7543	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,7544	ALC269_FIXUP_ACER_AC700,7545	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,7546	ALC269VB_FIXUP_ASUS_ZENBOOK,7547	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,7548	ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,7549	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,7550	ALC269VB_FIXUP_ORDISSIMO_EVE2,7551	ALC283_FIXUP_CHROME_BOOK,7552	ALC283_FIXUP_SENSE_COMBO_JACK,7553	ALC282_FIXUP_ASUS_TX300,7554	ALC283_FIXUP_INT_MIC,7555	ALC290_FIXUP_MONO_SPEAKERS,7556	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,7557	ALC290_FIXUP_SUBWOOFER,7558	ALC290_FIXUP_SUBWOOFER_HSJACK,7559	ALC269_FIXUP_THINKPAD_ACPI,7560	ALC269_FIXUP_DMIC_THINKPAD_ACPI,7561	ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13,7562	ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,7563	ALC255_FIXUP_ACER_MIC_NO_PRESENCE,7564	ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,7565	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,7566	ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,7567	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,7568	ALC255_FIXUP_HEADSET_MODE,7569	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,7570	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,7571	ALC292_FIXUP_TPT440_DOCK,7572	ALC292_FIXUP_TPT440,7573	ALC283_FIXUP_HEADSET_MIC,7574	ALC255_FIXUP_MIC_MUTE_LED,7575	ALC282_FIXUP_ASPIRE_V5_PINS,7576	ALC269VB_FIXUP_ASPIRE_E1_COEF,7577	ALC280_FIXUP_HP_GPIO4,7578	ALC286_FIXUP_HP_GPIO_LED,7579	ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,7580	ALC280_FIXUP_HP_DOCK_PINS,7581	ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,7582	ALC280_FIXUP_HP_9480M,7583	ALC245_FIXUP_HP_X360_AMP,7584	ALC285_FIXUP_HP_SPECTRE_X360_EB1,7585	ALC285_FIXUP_HP_ENVY_X360,7586	ALC288_FIXUP_DELL_HEADSET_MODE,7587	ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,7588	ALC288_FIXUP_DELL_XPS_13,7589	ALC288_FIXUP_DISABLE_AAMIX,7590	ALC292_FIXUP_DELL_E7X_AAMIX,7591	ALC292_FIXUP_DELL_E7X,7592	ALC292_FIXUP_DISABLE_AAMIX,7593	ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,7594	ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,7595	ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,7596	ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,7597	ALC275_FIXUP_DELL_XPS,7598	ALC293_FIXUP_LENOVO_SPK_NOISE,7599	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,7600	ALC255_FIXUP_DELL_SPK_NOISE,7601	ALC225_FIXUP_DISABLE_MIC_VREF,7602	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,7603	ALC295_FIXUP_DISABLE_DAC3,7604	ALC285_FIXUP_SPEAKER2_TO_DAC1,7605	ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,7606	ALC285_FIXUP_ASUS_HEADSET_MIC,7607	ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,7608	ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,7609	ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,7610	ALC280_FIXUP_HP_HEADSET_MIC,7611	ALC221_FIXUP_HP_FRONT_MIC,7612	ALC292_FIXUP_TPT460,7613	ALC298_FIXUP_SPK_VOLUME,7614	ALC298_FIXUP_LENOVO_SPK_VOLUME,7615	ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,7616	ALC269_FIXUP_ATIV_BOOK_8,7617	ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,7618	ALC221_FIXUP_HP_MIC_NO_PRESENCE,7619	ALC256_FIXUP_ASUS_HEADSET_MODE,7620	ALC256_FIXUP_ASUS_MIC,7621	ALC256_FIXUP_ASUS_AIO_GPIO2,7622	ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,7623	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,7624	ALC233_FIXUP_LENOVO_MULTI_CODECS,7625	ALC233_FIXUP_ACER_HEADSET_MIC,7626	ALC294_FIXUP_LENOVO_MIC_LOCATION,7627	ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,7628	ALC225_FIXUP_S3_POP_NOISE,7629	ALC700_FIXUP_INTEL_REFERENCE,7630	ALC274_FIXUP_DELL_BIND_DACS,7631	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,7632	ALC298_FIXUP_TPT470_DOCK_FIX,7633	ALC298_FIXUP_TPT470_DOCK,7634	ALC255_FIXUP_DUMMY_LINEOUT_VERB,7635	ALC255_FIXUP_DELL_HEADSET_MIC,7636	ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,7637	ALC298_FIXUP_HUAWEI_MBX_STEREO,7638	ALC295_FIXUP_HP_X360,7639	ALC221_FIXUP_HP_HEADSET_MIC,7640	ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,7641	ALC295_FIXUP_HP_AUTO_MUTE,7642	ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,7643	ALC294_FIXUP_ASUS_MIC,7644	ALC294_FIXUP_ASUS_HEADSET_MIC,7645	ALC294_FIXUP_ASUS_SPK,7646	ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,7647	ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,7648	ALC255_FIXUP_ACER_HEADSET_MIC,7649	ALC295_FIXUP_CHROME_BOOK,7650	ALC225_FIXUP_HEADSET_JACK,7651	ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,7652	ALC225_FIXUP_WYSE_AUTO_MUTE,7653	ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,7654	ALC286_FIXUP_ACER_AIO_HEADSET_MIC,7655	ALC256_FIXUP_ASUS_HEADSET_MIC,7656	ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,7657	ALC255_FIXUP_PREDATOR_SUBWOOFER,7658	ALC299_FIXUP_PREDATOR_SPK,7659	ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,7660	ALC289_FIXUP_DELL_SPK1,7661	ALC289_FIXUP_DELL_SPK2,7662	ALC289_FIXUP_DUAL_SPK,7663	ALC289_FIXUP_RTK_AMP_DUAL_SPK,7664	ALC294_FIXUP_SPK2_TO_DAC1,7665	ALC294_FIXUP_ASUS_DUAL_SPK,7666	ALC285_FIXUP_THINKPAD_X1_GEN7,7667	ALC285_FIXUP_THINKPAD_HEADSET_JACK,7668	ALC294_FIXUP_ASUS_ALLY,7669	ALC294_FIXUP_ASUS_ALLY_X,7670	ALC294_FIXUP_ASUS_ALLY_PINS,7671	ALC294_FIXUP_ASUS_ALLY_VERBS,7672	ALC294_FIXUP_ASUS_ALLY_SPEAKER,7673	ALC294_FIXUP_ASUS_HPE,7674	ALC294_FIXUP_ASUS_COEF_1B,7675	ALC294_FIXUP_ASUS_GX502_HP,7676	ALC294_FIXUP_ASUS_GX502_PINS,7677	ALC294_FIXUP_ASUS_GX502_VERBS,7678	ALC294_FIXUP_ASUS_GU502_HP,7679	ALC294_FIXUP_ASUS_GU502_PINS,7680	ALC294_FIXUP_ASUS_GU502_VERBS,7681	ALC294_FIXUP_ASUS_G513_PINS,7682	ALC285_FIXUP_ASUS_G533Z_PINS,7683	ALC285_FIXUP_HP_GPIO_LED,7684	ALC285_FIXUP_HP_MUTE_LED,7685	ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,7686	ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,7687	ALC236_FIXUP_HP_GPIO_LED,7688	ALC236_FIXUP_HP_MUTE_LED,7689	ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,7690	ALC236_FIXUP_LENOVO_INV_DMIC,7691	ALC298_FIXUP_SAMSUNG_AMP,7692	ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS,7693	ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS,7694	ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,7695	ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,7696	ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,7697	ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,7698	ALC269VC_FIXUP_ACER_HEADSET_MIC,7699	ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,7700	ALC289_FIXUP_ASUS_GA401,7701	ALC289_FIXUP_ASUS_GA502,7702	ALC256_FIXUP_ACER_MIC_NO_PRESENCE,7703	ALC285_FIXUP_HP_GPIO_AMP_INIT,7704	ALC269_FIXUP_CZC_B20,7705	ALC269_FIXUP_CZC_TMI,7706	ALC269_FIXUP_CZC_L101,7707	ALC269_FIXUP_LEMOTE_A1802,7708	ALC269_FIXUP_LEMOTE_A190X,7709	ALC256_FIXUP_INTEL_NUC8_RUGGED,7710	ALC233_FIXUP_INTEL_NUC8_DMIC,7711	ALC233_FIXUP_INTEL_NUC8_BOOST,7712	ALC256_FIXUP_INTEL_NUC10,7713	ALC255_FIXUP_XIAOMI_HEADSET_MIC,7714	ALC274_FIXUP_HP_MIC,7715	ALC274_FIXUP_HP_HEADSET_MIC,7716	ALC274_FIXUP_HP_ENVY_GPIO,7717	ALC256_FIXUP_ASUS_HPE,7718	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,7719	ALC287_FIXUP_HP_GPIO_LED,7720	ALC256_FIXUP_HP_HEADSET_MIC,7721	ALC245_FIXUP_HP_GPIO_LED,7722	ALC236_FIXUP_DELL_AIO_HEADSET_MIC,7723	ALC282_FIXUP_ACER_DISABLE_LINEOUT,7724	ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,7725	ALC256_FIXUP_ACER_HEADSET_MIC,7726	ALC285_FIXUP_IDEAPAD_S740_COEF,7727	ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,7728	ALC295_FIXUP_ASUS_DACS,7729	ALC295_FIXUP_HP_OMEN,7730	ALC285_FIXUP_HP_SPECTRE_X360,7731	ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,7732	ALC623_FIXUP_LENOVO_THINKSTATION_P340,7733	ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,7734	ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,7735	ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,7736	ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,7737	ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,7738	ALC298_FIXUP_LENOVO_C940_DUET7,7739	ALC287_FIXUP_LENOVO_14IRP8_DUETITL,7740	ALC287_FIXUP_LENOVO_LEGION_7,7741	ALC287_FIXUP_13S_GEN2_SPEAKERS,7742	ALC256_FIXUP_SET_COEF_DEFAULTS,7743	ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,7744	ALC233_FIXUP_NO_AUDIO_JACK,7745	ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,7746	ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,7747	ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,7748	ALC287_FIXUP_LEGION_16ACHG6,7749	ALC287_FIXUP_CS35L41_I2C_2,7750	ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,7751	ALC287_FIXUP_CS35L41_I2C_4,7752	ALC245_FIXUP_CS35L41_SPI_2,7753	ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,7754	ALC245_FIXUP_CS35L41_SPI_4,7755	ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,7756	ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,7757	ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,7758	ALC287_FIXUP_LEGION_16ITHG6,7759	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,7760	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,7761	ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN,7762	ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,7763	ALC236_FIXUP_DELL_DUAL_CODECS,7764	ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,7765	ALC287_FIXUP_TAS2781_I2C,7766	ALC287_FIXUP_YOGA7_14ARB7_I2C,7767	ALC245_FIXUP_HP_MUTE_LED_COEFBIT,7768	ALC245_FIXUP_HP_X360_MUTE_LEDS,7769	ALC287_FIXUP_THINKPAD_I2S_SPK,7770	ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,7771	ALC2XX_FIXUP_HEADSET_MIC,7772	ALC289_FIXUP_DELL_CS35L41_SPI_2,7773	ALC294_FIXUP_CS35L41_I2C_2,7774	ALC256_FIXUP_ACER_SFG16_MICMUTE_LED,7775	ALC256_FIXUP_HEADPHONE_AMP_VOL,7776	ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX,7777	ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX,7778	ALC285_FIXUP_ASUS_GA403U,7779	ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC,7780	ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1,7781	ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,7782	ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1,7783	ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318,7784	ALC256_FIXUP_CHROME_BOOK,7785	ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7,7786	ALC287_FIXUP_LENOVO_SSID_17AA3820,7787	ALC245_FIXUP_CLEVO_NOISY_MIC,7788	ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE,7789};7790 7791/* A special fixup for Lenovo C940 and Yoga Duet 7;7792 * both have the very same PCI SSID, and we need to apply different fixups7793 * depending on the codec ID7794 */7795static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,7796					   const struct hda_fixup *fix,7797					   int action)7798{7799	int id;7800 7801	if (codec->core.vendor_id == 0x10ec0298)7802		id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */7803	else7804		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */7805	__snd_hda_apply_fixup(codec, id, action, 0);7806}7807 7808/* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021;7809 * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID,7810 * so we need to apply a different fixup in this case. The only DuetITL codec7811 * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be7812 * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would7813 * have matched correctly by their codecs.7814 */7815static void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec,7816					      const struct hda_fixup *fix,7817					      int action)7818{7819	int id;7820 7821	if (codec->core.subsystem_id == 0x17aa3802)7822		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */7823	else7824		id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */7825	__snd_hda_apply_fixup(codec, id, action, 0);7826}7827 7828/* Similar to above the Lenovo Yoga Pro 7 14ARP8 PCI SSID matches the codec SSID of the7829   Legion Y9000X 2022 IAH7.*/7830static void alc287_fixup_lenovo_14arp8_legion_iah7(struct hda_codec *codec,7831					   const struct hda_fixup *fix,7832					   int action)7833{7834	int id;7835 7836	if (codec->core.subsystem_id == 0x17aa386e)7837		id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion Y9000X 2022 IAH7 */7838	else7839		id = ALC285_FIXUP_SPEAKER2_TO_DAC1; /* Yoga Pro 7 14ARP8 */7840	__snd_hda_apply_fixup(codec, id, action, 0);7841}7842 7843/* Another hilarious PCI SSID conflict with Lenovo Legion Pro 7 16ARX8H (with7844 * TAS2781 codec) and Legion 7i 16IAX7 (with CS35L41 codec);7845 * we apply a corresponding fixup depending on the codec SSID instead7846 */7847static void alc287_fixup_lenovo_legion_7(struct hda_codec *codec,7848					 const struct hda_fixup *fix,7849					 int action)7850{7851	int id;7852 7853	if (codec->core.subsystem_id == 0x17aa38a8)7854		id = ALC287_FIXUP_TAS2781_I2C; /* Legion Pro 7 16ARX8H */7855	else7856		id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion 7i 16IAX7 */7857	__snd_hda_apply_fixup(codec, id, action, 0);7858}7859 7860/* Yet more conflicting PCI SSID (17aa:3820) on two Lenovo models */7861static void alc287_fixup_lenovo_ssid_17aa3820(struct hda_codec *codec,7862					      const struct hda_fixup *fix,7863					      int action)7864{7865	int id;7866 7867	if (codec->core.subsystem_id == 0x17aa3820)7868		id = ALC269_FIXUP_ASPIRE_HEADSET_MIC; /* IdeaPad 330-17IKB 81DM */7869	else /* 0x17aa3802 */7870		id =  ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* "Yoga Duet 7 13ITL6 */7871	__snd_hda_apply_fixup(codec, id, action, 0);7872}7873 7874static const struct hda_fixup alc269_fixups[] = {7875	[ALC269_FIXUP_GPIO2] = {7876		.type = HDA_FIXUP_FUNC,7877		.v.func = alc_fixup_gpio2,7878	},7879	[ALC269_FIXUP_SONY_VAIO] = {7880		.type = HDA_FIXUP_PINCTLS,7881		.v.pins = (const struct hda_pintbl[]) {7882			{0x19, PIN_VREFGRD},7883			{}7884		}7885	},7886	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {7887		.type = HDA_FIXUP_FUNC,7888		.v.func = alc275_fixup_gpio4_off,7889		.chained = true,7890		.chain_id = ALC269_FIXUP_SONY_VAIO7891	},7892	[ALC269_FIXUP_DELL_M101Z] = {7893		.type = HDA_FIXUP_VERBS,7894		.v.verbs = (const struct hda_verb[]) {7895			/* Enables internal speaker */7896			{0x20, AC_VERB_SET_COEF_INDEX, 13},7897			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},7898			{}7899		}7900	},7901	[ALC269_FIXUP_SKU_IGNORE] = {7902		.type = HDA_FIXUP_FUNC,7903		.v.func = alc_fixup_sku_ignore,7904	},7905	[ALC269_FIXUP_ASUS_G73JW] = {7906		.type = HDA_FIXUP_PINS,7907		.v.pins = (const struct hda_pintbl[]) {7908			{ 0x17, 0x99130111 }, /* subwoofer */7909			{ }7910		}7911	},7912	[ALC269_FIXUP_ASUS_N7601ZM_PINS] = {7913		.type = HDA_FIXUP_PINS,7914		.v.pins = (const struct hda_pintbl[]) {7915			{ 0x19, 0x03A11050 },7916			{ 0x1a, 0x03A11C30 },7917			{ 0x21, 0x03211420 },7918			{ }7919		}7920	},7921	[ALC269_FIXUP_ASUS_N7601ZM] = {7922		.type = HDA_FIXUP_VERBS,7923		.v.verbs = (const struct hda_verb[]) {7924			{0x20, AC_VERB_SET_COEF_INDEX, 0x62},7925			{0x20, AC_VERB_SET_PROC_COEF, 0xa007},7926			{0x20, AC_VERB_SET_COEF_INDEX, 0x10},7927			{0x20, AC_VERB_SET_PROC_COEF, 0x8420},7928			{0x20, AC_VERB_SET_COEF_INDEX, 0x0f},7929			{0x20, AC_VERB_SET_PROC_COEF, 0x7774},7930			{ }7931		},7932		.chained = true,7933		.chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,7934	},7935	[ALC269_FIXUP_LENOVO_EAPD] = {7936		.type = HDA_FIXUP_VERBS,7937		.v.verbs = (const struct hda_verb[]) {7938			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},7939			{}7940		}7941	},7942	[ALC275_FIXUP_SONY_HWEQ] = {7943		.type = HDA_FIXUP_FUNC,7944		.v.func = alc269_fixup_hweq,7945		.chained = true,7946		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO27947	},7948	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {7949		.type = HDA_FIXUP_FUNC,7950		.v.func = alc_fixup_disable_aamix,7951		.chained = true,7952		.chain_id = ALC269_FIXUP_SONY_VAIO7953	},7954	[ALC271_FIXUP_DMIC] = {7955		.type = HDA_FIXUP_FUNC,7956		.v.func = alc271_fixup_dmic,7957	},7958	[ALC269_FIXUP_PCM_44K] = {7959		.type = HDA_FIXUP_FUNC,7960		.v.func = alc269_fixup_pcm_44k,7961		.chained = true,7962		.chain_id = ALC269_FIXUP_QUANTA_MUTE7963	},7964	[ALC269_FIXUP_STEREO_DMIC] = {7965		.type = HDA_FIXUP_FUNC,7966		.v.func = alc269_fixup_stereo_dmic,7967	},7968	[ALC269_FIXUP_HEADSET_MIC] = {7969		.type = HDA_FIXUP_FUNC,7970		.v.func = alc269_fixup_headset_mic,7971	},7972	[ALC269_FIXUP_QUANTA_MUTE] = {7973		.type = HDA_FIXUP_FUNC,7974		.v.func = alc269_fixup_quanta_mute,7975	},7976	[ALC269_FIXUP_LIFEBOOK] = {7977		.type = HDA_FIXUP_PINS,7978		.v.pins = (const struct hda_pintbl[]) {7979			{ 0x1a, 0x2101103f }, /* dock line-out */7980			{ 0x1b, 0x23a11040 }, /* dock mic-in */7981			{ }7982		},7983		.chained = true,7984		.chain_id = ALC269_FIXUP_QUANTA_MUTE7985	},7986	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {7987		.type = HDA_FIXUP_PINS,7988		.v.pins = (const struct hda_pintbl[]) {7989			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */7990			{ }7991		},7992	},7993	[ALC269_FIXUP_LIFEBOOK_HP_PIN] = {7994		.type = HDA_FIXUP_PINS,7995		.v.pins = (const struct hda_pintbl[]) {7996			{ 0x21, 0x0221102f }, /* HP out */7997			{ }7998		},7999	},8000	[ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {8001		.type = HDA_FIXUP_FUNC,8002		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,8003	},8004	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {8005		.type = HDA_FIXUP_FUNC,8006		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,8007	},8008	[ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13] = {8009		.type = HDA_FIXUP_PINS,8010		.v.pins = (const struct hda_pintbl[]) {8011			{ 0x14, 0x90170151 }, /* use as internal speaker (LFE) */8012			{ 0x1b, 0x90170152 }, /* use as internal speaker (back) */8013			{ }8014		},8015		.chained = true,8016		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST8017	},8018	[ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {8019		.type = HDA_FIXUP_PINS,8020		.v.pins = (const struct hda_pintbl[]) {8021			{ 0x18, 0x03a19020 }, /* headset mic */8022			{ 0x1b, 0x90170150 }, /* speaker */8023			{ }8024		},8025	},8026	[ALC269_FIXUP_AMIC] = {8027		.type = HDA_FIXUP_PINS,8028		.v.pins = (const struct hda_pintbl[]) {8029			{ 0x14, 0x99130110 }, /* speaker */8030			{ 0x15, 0x0121401f }, /* HP out */8031			{ 0x18, 0x01a19c20 }, /* mic */8032			{ 0x19, 0x99a3092f }, /* int-mic */8033			{ }8034		},8035	},8036	[ALC269_FIXUP_DMIC] = {8037		.type = HDA_FIXUP_PINS,8038		.v.pins = (const struct hda_pintbl[]) {8039			{ 0x12, 0x99a3092f }, /* int-mic */8040			{ 0x14, 0x99130110 }, /* speaker */8041			{ 0x15, 0x0121401f }, /* HP out */8042			{ 0x18, 0x01a19c20 }, /* mic */8043			{ }8044		},8045	},8046	[ALC269VB_FIXUP_AMIC] = {8047		.type = HDA_FIXUP_PINS,8048		.v.pins = (const struct hda_pintbl[]) {8049			{ 0x14, 0x99130110 }, /* speaker */8050			{ 0x18, 0x01a19c20 }, /* mic */8051			{ 0x19, 0x99a3092f }, /* int-mic */8052			{ 0x21, 0x0121401f }, /* HP out */8053			{ }8054		},8055	},8056	[ALC269VB_FIXUP_DMIC] = {8057		.type = HDA_FIXUP_PINS,8058		.v.pins = (const struct hda_pintbl[]) {8059			{ 0x12, 0x99a3092f }, /* int-mic */8060			{ 0x14, 0x99130110 }, /* speaker */8061			{ 0x18, 0x01a19c20 }, /* mic */8062			{ 0x21, 0x0121401f }, /* HP out */8063			{ }8064		},8065	},8066	[ALC269_FIXUP_HP_MUTE_LED] = {8067		.type = HDA_FIXUP_FUNC,8068		.v.func = alc269_fixup_hp_mute_led,8069	},8070	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {8071		.type = HDA_FIXUP_FUNC,8072		.v.func = alc269_fixup_hp_mute_led_mic1,8073	},8074	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {8075		.type = HDA_FIXUP_FUNC,8076		.v.func = alc269_fixup_hp_mute_led_mic2,8077	},8078	[ALC269_FIXUP_HP_MUTE_LED_MIC3] = {8079		.type = HDA_FIXUP_FUNC,8080		.v.func = alc269_fixup_hp_mute_led_mic3,8081		.chained = true,8082		.chain_id = ALC295_FIXUP_HP_AUTO_MUTE8083	},8084	[ALC269_FIXUP_HP_GPIO_LED] = {8085		.type = HDA_FIXUP_FUNC,8086		.v.func = alc269_fixup_hp_gpio_led,8087	},8088	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {8089		.type = HDA_FIXUP_FUNC,8090		.v.func = alc269_fixup_hp_gpio_mic1_led,8091	},8092	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {8093		.type = HDA_FIXUP_FUNC,8094		.v.func = alc269_fixup_hp_line1_mic1_led,8095	},8096	[ALC269_FIXUP_INV_DMIC] = {8097		.type = HDA_FIXUP_FUNC,8098		.v.func = alc_fixup_inv_dmic,8099	},8100	[ALC269_FIXUP_NO_SHUTUP] = {8101		.type = HDA_FIXUP_FUNC,8102		.v.func = alc_fixup_no_shutup,8103	},8104	[ALC269_FIXUP_LENOVO_DOCK] = {8105		.type = HDA_FIXUP_PINS,8106		.v.pins = (const struct hda_pintbl[]) {8107			{ 0x19, 0x23a11040 }, /* dock mic */8108			{ 0x1b, 0x2121103f }, /* dock headphone */8109			{ }8110		},8111		.chained = true,8112		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT8113	},8114	[ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {8115		.type = HDA_FIXUP_FUNC,8116		.v.func = alc269_fixup_limit_int_mic_boost,8117		.chained = true,8118		.chain_id = ALC269_FIXUP_LENOVO_DOCK,8119	},8120	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {8121		.type = HDA_FIXUP_FUNC,8122		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,8123		.chained = true,8124		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,8125	},8126	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {8127		.type = HDA_FIXUP_PINS,8128		.v.pins = (const struct hda_pintbl[]) {8129			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8130			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8131			{ }8132		},8133		.chained = true,8134		.chain_id = ALC269_FIXUP_HEADSET_MODE8135	},8136	[ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {8137		.type = HDA_FIXUP_FUNC,8138		.v.func = alc269_fixup_limit_int_mic_boost,8139		.chained = true,8140		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE8141	},8142	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {8143		.type = HDA_FIXUP_PINS,8144		.v.pins = (const struct hda_pintbl[]) {8145			{ 0x16, 0x21014020 }, /* dock line out */8146			{ 0x19, 0x21a19030 }, /* dock mic */8147			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */8148			{ }8149		},8150		.chained = true,8151		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC8152	},8153	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {8154		.type = HDA_FIXUP_PINS,8155		.v.pins = (const struct hda_pintbl[]) {8156			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */8157			{ }8158		},8159		.chained = true,8160		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC8161	},8162	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {8163		.type = HDA_FIXUP_PINS,8164		.v.pins = (const struct hda_pintbl[]) {8165			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8166			{ 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8167			{ }8168		},8169		.chained = true,8170		.chain_id = ALC269_FIXUP_HEADSET_MODE8171	},8172	[ALC269_FIXUP_HEADSET_MODE] = {8173		.type = HDA_FIXUP_FUNC,8174		.v.func = alc_fixup_headset_mode,8175		.chained = true,8176		.chain_id = ALC255_FIXUP_MIC_MUTE_LED8177	},8178	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {8179		.type = HDA_FIXUP_FUNC,8180		.v.func = alc_fixup_headset_mode_no_hp_mic,8181	},8182	[ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {8183		.type = HDA_FIXUP_PINS,8184		.v.pins = (const struct hda_pintbl[]) {8185			{ 0x19, 0x01a1913c }, /* headset mic w/o jack detect */8186			{ }8187		},8188		.chained = true,8189		.chain_id = ALC269_FIXUP_HEADSET_MODE,8190	},8191	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {8192		.type = HDA_FIXUP_PINS,8193		.v.pins = (const struct hda_pintbl[]) {8194			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */8195			{ }8196		},8197		.chained = true,8198		.chain_id = ALC269_FIXUP_HEADSET_MIC8199	},8200	[ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {8201		.type = HDA_FIXUP_PINS,8202		.v.pins = (const struct hda_pintbl[]) {8203			{0x12, 0x90a60130},8204			{0x13, 0x40000000},8205			{0x14, 0x90170110},8206			{0x18, 0x411111f0},8207			{0x19, 0x04a11040},8208			{0x1a, 0x411111f0},8209			{0x1b, 0x90170112},8210			{0x1d, 0x40759a05},8211			{0x1e, 0x411111f0},8212			{0x21, 0x04211020},8213			{ }8214		},8215		.chained = true,8216		.chain_id = ALC255_FIXUP_MIC_MUTE_LED8217	},8218	[ALC298_FIXUP_HUAWEI_MBX_STEREO] = {8219		.type = HDA_FIXUP_FUNC,8220		.v.func = alc298_fixup_huawei_mbx_stereo,8221		.chained = true,8222		.chain_id = ALC255_FIXUP_MIC_MUTE_LED8223	},8224	[ALC269_FIXUP_ASUS_X101_FUNC] = {8225		.type = HDA_FIXUP_FUNC,8226		.v.func = alc269_fixup_x101_headset_mic,8227	},8228	[ALC269_FIXUP_ASUS_X101_VERB] = {8229		.type = HDA_FIXUP_VERBS,8230		.v.verbs = (const struct hda_verb[]) {8231			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},8232			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},8233			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},8234			{ }8235		},8236		.chained = true,8237		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC8238	},8239	[ALC269_FIXUP_ASUS_X101] = {8240		.type = HDA_FIXUP_PINS,8241		.v.pins = (const struct hda_pintbl[]) {8242			{ 0x18, 0x04a1182c }, /* Headset mic */8243			{ }8244		},8245		.chained = true,8246		.chain_id = ALC269_FIXUP_ASUS_X101_VERB8247	},8248	[ALC271_FIXUP_AMIC_MIC2] = {8249		.type = HDA_FIXUP_PINS,8250		.v.pins = (const struct hda_pintbl[]) {8251			{ 0x14, 0x99130110 }, /* speaker */8252			{ 0x19, 0x01a19c20 }, /* mic */8253			{ 0x1b, 0x99a7012f }, /* int-mic */8254			{ 0x21, 0x0121401f }, /* HP out */8255			{ }8256		},8257	},8258	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {8259		.type = HDA_FIXUP_FUNC,8260		.v.func = alc271_hp_gate_mic_jack,8261		.chained = true,8262		.chain_id = ALC271_FIXUP_AMIC_MIC2,8263	},8264	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {8265		.type = HDA_FIXUP_FUNC,8266		.v.func = alc269_fixup_limit_int_mic_boost,8267		.chained = true,8268		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,8269	},8270	[ALC269_FIXUP_ACER_AC700] = {8271		.type = HDA_FIXUP_PINS,8272		.v.pins = (const struct hda_pintbl[]) {8273			{ 0x12, 0x99a3092f }, /* int-mic */8274			{ 0x14, 0x99130110 }, /* speaker */8275			{ 0x18, 0x03a11c20 }, /* mic */8276			{ 0x1e, 0x0346101e }, /* SPDIF1 */8277			{ 0x21, 0x0321101f }, /* HP out */8278			{ }8279		},8280		.chained = true,8281		.chain_id = ALC271_FIXUP_DMIC,8282	},8283	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {8284		.type = HDA_FIXUP_FUNC,8285		.v.func = alc269_fixup_limit_int_mic_boost,8286		.chained = true,8287		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,8288	},8289	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {8290		.type = HDA_FIXUP_FUNC,8291		.v.func = alc269_fixup_limit_int_mic_boost,8292		.chained = true,8293		.chain_id = ALC269VB_FIXUP_DMIC,8294	},8295	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {8296		.type = HDA_FIXUP_VERBS,8297		.v.verbs = (const struct hda_verb[]) {8298			/* class-D output amp +5dB */8299			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },8300			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },8301			{}8302		},8303		.chained = true,8304		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,8305	},8306	[ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {8307		.type = HDA_FIXUP_PINS,8308		.v.pins = (const struct hda_pintbl[]) {8309			{ 0x18, 0x01a110f0 },  /* use as headset mic */8310			{ }8311		},8312		.chained = true,8313		.chain_id = ALC269_FIXUP_HEADSET_MIC8314	},8315	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {8316		.type = HDA_FIXUP_FUNC,8317		.v.func = alc269_fixup_limit_int_mic_boost,8318		.chained = true,8319		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,8320	},8321	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {8322		.type = HDA_FIXUP_PINS,8323		.v.pins = (const struct hda_pintbl[]) {8324			{ 0x12, 0x99a3092f }, /* int-mic */8325			{ 0x18, 0x03a11d20 }, /* mic */8326			{ 0x19, 0x411111f0 }, /* Unused bogus pin */8327			{ }8328		},8329	},8330	[ALC283_FIXUP_CHROME_BOOK] = {8331		.type = HDA_FIXUP_FUNC,8332		.v.func = alc283_fixup_chromebook,8333	},8334	[ALC283_FIXUP_SENSE_COMBO_JACK] = {8335		.type = HDA_FIXUP_FUNC,8336		.v.func = alc283_fixup_sense_combo_jack,8337		.chained = true,8338		.chain_id = ALC283_FIXUP_CHROME_BOOK,8339	},8340	[ALC282_FIXUP_ASUS_TX300] = {8341		.type = HDA_FIXUP_FUNC,8342		.v.func = alc282_fixup_asus_tx300,8343	},8344	[ALC283_FIXUP_INT_MIC] = {8345		.type = HDA_FIXUP_VERBS,8346		.v.verbs = (const struct hda_verb[]) {8347			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},8348			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},8349			{ }8350		},8351		.chained = true,8352		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST8353	},8354	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {8355		.type = HDA_FIXUP_PINS,8356		.v.pins = (const struct hda_pintbl[]) {8357			{ 0x17, 0x90170112 }, /* subwoofer */8358			{ }8359		},8360		.chained = true,8361		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,8362	},8363	[ALC290_FIXUP_SUBWOOFER] = {8364		.type = HDA_FIXUP_PINS,8365		.v.pins = (const struct hda_pintbl[]) {8366			{ 0x17, 0x90170112 }, /* subwoofer */8367			{ }8368		},8369		.chained = true,8370		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,8371	},8372	[ALC290_FIXUP_MONO_SPEAKERS] = {8373		.type = HDA_FIXUP_FUNC,8374		.v.func = alc290_fixup_mono_speakers,8375	},8376	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {8377		.type = HDA_FIXUP_FUNC,8378		.v.func = alc290_fixup_mono_speakers,8379		.chained = true,8380		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,8381	},8382	[ALC269_FIXUP_THINKPAD_ACPI] = {8383		.type = HDA_FIXUP_FUNC,8384		.v.func = alc_fixup_thinkpad_acpi,8385		.chained = true,8386		.chain_id = ALC269_FIXUP_SKU_IGNORE,8387	},8388	[ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {8389		.type = HDA_FIXUP_FUNC,8390		.v.func = alc_fixup_inv_dmic,8391		.chained = true,8392		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,8393	},8394	[ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {8395		.type = HDA_FIXUP_PINS,8396		.v.pins = (const struct hda_pintbl[]) {8397			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8398			{ }8399		},8400		.chained = true,8401		.chain_id = ALC255_FIXUP_HEADSET_MODE8402	},8403	[ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {8404		.type = HDA_FIXUP_PINS,8405		.v.pins = (const struct hda_pintbl[]) {8406			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8407			{ }8408		},8409		.chained = true,8410		.chain_id = ALC255_FIXUP_HEADSET_MODE8411	},8412	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {8413		.type = HDA_FIXUP_PINS,8414		.v.pins = (const struct hda_pintbl[]) {8415			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8416			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8417			{ }8418		},8419		.chained = true,8420		.chain_id = ALC255_FIXUP_HEADSET_MODE8421	},8422	[ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {8423		.type = HDA_FIXUP_FUNC,8424		.v.func = alc269_fixup_limit_int_mic_boost,8425		.chained = true,8426		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE8427	},8428	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {8429		.type = HDA_FIXUP_PINS,8430		.v.pins = (const struct hda_pintbl[]) {8431			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8432			{ }8433		},8434		.chained = true,8435		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC8436	},8437	[ALC255_FIXUP_HEADSET_MODE] = {8438		.type = HDA_FIXUP_FUNC,8439		.v.func = alc_fixup_headset_mode_alc255,8440		.chained = true,8441		.chain_id = ALC255_FIXUP_MIC_MUTE_LED8442	},8443	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {8444		.type = HDA_FIXUP_FUNC,8445		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,8446	},8447	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {8448		.type = HDA_FIXUP_PINS,8449		.v.pins = (const struct hda_pintbl[]) {8450			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8451			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */8452			{ }8453		},8454		.chained = true,8455		.chain_id = ALC269_FIXUP_HEADSET_MODE8456	},8457	[ALC292_FIXUP_TPT440_DOCK] = {8458		.type = HDA_FIXUP_FUNC,8459		.v.func = alc_fixup_tpt440_dock,8460		.chained = true,8461		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST8462	},8463	[ALC292_FIXUP_TPT440] = {8464		.type = HDA_FIXUP_FUNC,8465		.v.func = alc_fixup_disable_aamix,8466		.chained = true,8467		.chain_id = ALC292_FIXUP_TPT440_DOCK,8468	},8469	[ALC283_FIXUP_HEADSET_MIC] = {8470		.type = HDA_FIXUP_PINS,8471		.v.pins = (const struct hda_pintbl[]) {8472			{ 0x19, 0x04a110f0 },8473			{ },8474		},8475	},8476	[ALC255_FIXUP_MIC_MUTE_LED] = {8477		.type = HDA_FIXUP_FUNC,8478		.v.func = alc_fixup_micmute_led,8479	},8480	[ALC282_FIXUP_ASPIRE_V5_PINS] = {8481		.type = HDA_FIXUP_PINS,8482		.v.pins = (const struct hda_pintbl[]) {8483			{ 0x12, 0x90a60130 },8484			{ 0x14, 0x90170110 },8485			{ 0x17, 0x40000008 },8486			{ 0x18, 0x411111f0 },8487			{ 0x19, 0x01a1913c },8488			{ 0x1a, 0x411111f0 },8489			{ 0x1b, 0x411111f0 },8490			{ 0x1d, 0x40f89b2d },8491			{ 0x1e, 0x411111f0 },8492			{ 0x21, 0x0321101f },8493			{ },8494		},8495	},8496	[ALC269VB_FIXUP_ASPIRE_E1_COEF] = {8497		.type = HDA_FIXUP_FUNC,8498		.v.func = alc269vb_fixup_aspire_e1_coef,8499	},8500	[ALC280_FIXUP_HP_GPIO4] = {8501		.type = HDA_FIXUP_FUNC,8502		.v.func = alc280_fixup_hp_gpio4,8503	},8504	[ALC286_FIXUP_HP_GPIO_LED] = {8505		.type = HDA_FIXUP_FUNC,8506		.v.func = alc286_fixup_hp_gpio_led,8507	},8508	[ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {8509		.type = HDA_FIXUP_FUNC,8510		.v.func = alc280_fixup_hp_gpio2_mic_hotkey,8511	},8512	[ALC280_FIXUP_HP_DOCK_PINS] = {8513		.type = HDA_FIXUP_PINS,8514		.v.pins = (const struct hda_pintbl[]) {8515			{ 0x1b, 0x21011020 }, /* line-out */8516			{ 0x1a, 0x01a1903c }, /* headset mic */8517			{ 0x18, 0x2181103f }, /* line-in */8518			{ },8519		},8520		.chained = true,8521		.chain_id = ALC280_FIXUP_HP_GPIO48522	},8523	[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {8524		.type = HDA_FIXUP_PINS,8525		.v.pins = (const struct hda_pintbl[]) {8526			{ 0x1b, 0x21011020 }, /* line-out */8527			{ 0x18, 0x2181103f }, /* line-in */8528			{ },8529		},8530		.chained = true,8531		.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED8532	},8533	[ALC280_FIXUP_HP_9480M] = {8534		.type = HDA_FIXUP_FUNC,8535		.v.func = alc280_fixup_hp_9480m,8536	},8537	[ALC245_FIXUP_HP_X360_AMP] = {8538		.type = HDA_FIXUP_FUNC,8539		.v.func = alc245_fixup_hp_x360_amp,8540		.chained = true,8541		.chain_id = ALC245_FIXUP_HP_GPIO_LED8542	},8543	[ALC288_FIXUP_DELL_HEADSET_MODE] = {8544		.type = HDA_FIXUP_FUNC,8545		.v.func = alc_fixup_headset_mode_dell_alc288,8546		.chained = true,8547		.chain_id = ALC255_FIXUP_MIC_MUTE_LED8548	},8549	[ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {8550		.type = HDA_FIXUP_PINS,8551		.v.pins = (const struct hda_pintbl[]) {8552			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */8553			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8554			{ }8555		},8556		.chained = true,8557		.chain_id = ALC288_FIXUP_DELL_HEADSET_MODE8558	},8559	[ALC288_FIXUP_DISABLE_AAMIX] = {8560		.type = HDA_FIXUP_FUNC,8561		.v.func = alc_fixup_disable_aamix,8562		.chained = true,8563		.chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE8564	},8565	[ALC288_FIXUP_DELL_XPS_13] = {8566		.type = HDA_FIXUP_FUNC,8567		.v.func = alc_fixup_dell_xps13,8568		.chained = true,8569		.chain_id = ALC288_FIXUP_DISABLE_AAMIX8570	},8571	[ALC292_FIXUP_DISABLE_AAMIX] = {8572		.type = HDA_FIXUP_FUNC,8573		.v.func = alc_fixup_disable_aamix,8574		.chained = true,8575		.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE8576	},8577	[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {8578		.type = HDA_FIXUP_FUNC,8579		.v.func = alc_fixup_disable_aamix,8580		.chained = true,8581		.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE8582	},8583	[ALC292_FIXUP_DELL_E7X_AAMIX] = {8584		.type = HDA_FIXUP_FUNC,8585		.v.func = alc_fixup_dell_xps13,8586		.chained = true,8587		.chain_id = ALC292_FIXUP_DISABLE_AAMIX8588	},8589	[ALC292_FIXUP_DELL_E7X] = {8590		.type = HDA_FIXUP_FUNC,8591		.v.func = alc_fixup_micmute_led,8592		/* micmute fixup must be applied at last */8593		.chained_before = true,8594		.chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,8595	},8596	[ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {8597		.type = HDA_FIXUP_PINS,8598		.v.pins = (const struct hda_pintbl[]) {8599			{ 0x18, 0x01a1913c }, /* headset mic w/o jack detect */8600			{ }8601		},8602		.chained_before = true,8603		.chain_id = ALC269_FIXUP_HEADSET_MODE,8604	},8605	[ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {8606		.type = HDA_FIXUP_PINS,8607		.v.pins = (const struct hda_pintbl[]) {8608			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */8609			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8610			{ }8611		},8612		.chained = true,8613		.chain_id = ALC269_FIXUP_HEADSET_MODE8614	},8615	[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {8616		.type = HDA_FIXUP_PINS,8617		.v.pins = (const struct hda_pintbl[]) {8618			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */8619			{ }8620		},8621		.chained = true,8622		.chain_id = ALC269_FIXUP_HEADSET_MODE8623	},8624	[ALC275_FIXUP_DELL_XPS] = {8625		.type = HDA_FIXUP_VERBS,8626		.v.verbs = (const struct hda_verb[]) {8627			/* Enables internal speaker */8628			{0x20, AC_VERB_SET_COEF_INDEX, 0x1f},8629			{0x20, AC_VERB_SET_PROC_COEF, 0x00c0},8630			{0x20, AC_VERB_SET_COEF_INDEX, 0x30},8631			{0x20, AC_VERB_SET_PROC_COEF, 0x00b1},8632			{}8633		}8634	},8635	[ALC293_FIXUP_LENOVO_SPK_NOISE] = {8636		.type = HDA_FIXUP_FUNC,8637		.v.func = alc_fixup_disable_aamix,8638		.chained = true,8639		.chain_id = ALC269_FIXUP_THINKPAD_ACPI8640	},8641	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {8642		.type = HDA_FIXUP_FUNC,8643		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,8644	},8645	[ALC233_FIXUP_INTEL_NUC8_DMIC] = {8646		.type = HDA_FIXUP_FUNC,8647		.v.func = alc_fixup_inv_dmic,8648		.chained = true,8649		.chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,8650	},8651	[ALC233_FIXUP_INTEL_NUC8_BOOST] = {8652		.type = HDA_FIXUP_FUNC,8653		.v.func = alc269_fixup_limit_int_mic_boost8654	},8655	[ALC255_FIXUP_DELL_SPK_NOISE] = {8656		.type = HDA_FIXUP_FUNC,8657		.v.func = alc_fixup_disable_aamix,8658		.chained = true,8659		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE8660	},8661	[ALC225_FIXUP_DISABLE_MIC_VREF] = {8662		.type = HDA_FIXUP_FUNC,8663		.v.func = alc_fixup_disable_mic_vref,8664		.chained = true,8665		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE8666	},8667	[ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {8668		.type = HDA_FIXUP_VERBS,8669		.v.verbs = (const struct hda_verb[]) {8670			/* Disable pass-through path for FRONT 14h */8671			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },8672			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },8673			{}8674		},8675		.chained = true,8676		.chain_id = ALC225_FIXUP_DISABLE_MIC_VREF8677	},8678	[ALC280_FIXUP_HP_HEADSET_MIC] = {8679		.type = HDA_FIXUP_FUNC,8680		.v.func = alc_fixup_disable_aamix,8681		.chained = true,8682		.chain_id = ALC269_FIXUP_HEADSET_MIC,8683	},8684	[ALC221_FIXUP_HP_FRONT_MIC] = {8685		.type = HDA_FIXUP_PINS,8686		.v.pins = (const struct hda_pintbl[]) {8687			{ 0x19, 0x02a19020 }, /* Front Mic */8688			{ }8689		},8690	},8691	[ALC292_FIXUP_TPT460] = {8692		.type = HDA_FIXUP_FUNC,8693		.v.func = alc_fixup_tpt440_dock,8694		.chained = true,8695		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,8696	},8697	[ALC298_FIXUP_SPK_VOLUME] = {8698		.type = HDA_FIXUP_FUNC,8699		.v.func = alc298_fixup_speaker_volume,8700		.chained = true,8701		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,8702	},8703	[ALC298_FIXUP_LENOVO_SPK_VOLUME] = {8704		.type = HDA_FIXUP_FUNC,8705		.v.func = alc298_fixup_speaker_volume,8706	},8707	[ALC295_FIXUP_DISABLE_DAC3] = {8708		.type = HDA_FIXUP_FUNC,8709		.v.func = alc295_fixup_disable_dac3,8710	},8711	[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {8712		.type = HDA_FIXUP_FUNC,8713		.v.func = alc285_fixup_speaker2_to_dac1,8714		.chained = true,8715		.chain_id = ALC269_FIXUP_THINKPAD_ACPI8716	},8717	[ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {8718		.type = HDA_FIXUP_FUNC,8719		.v.func = alc285_fixup_speaker2_to_dac1,8720		.chained = true,8721		.chain_id = ALC245_FIXUP_CS35L41_SPI_28722	},8723	[ALC285_FIXUP_ASUS_HEADSET_MIC] = {8724		.type = HDA_FIXUP_PINS,8725		.v.pins = (const struct hda_pintbl[]) {8726			{ 0x19, 0x03a11050 },8727			{ 0x1b, 0x03a11c30 },8728			{ }8729		},8730		.chained = true,8731		.chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC18732	},8733	[ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {8734		.type = HDA_FIXUP_PINS,8735		.v.pins = (const struct hda_pintbl[]) {8736			{ 0x14, 0x90170120 },8737			{ }8738		},8739		.chained = true,8740		.chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC8741	},8742	[ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {8743		.type = HDA_FIXUP_FUNC,8744		.v.func = alc285_fixup_speaker2_to_dac1,8745		.chained = true,8746		.chain_id = ALC287_FIXUP_CS35L41_I2C_28747	},8748	[ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {8749		.type = HDA_FIXUP_PINS,8750		.v.pins = (const struct hda_pintbl[]) {8751			{ 0x19, 0x03a11050 },8752			{ 0x1b, 0x03a11c30 },8753			{ }8754		},8755		.chained = true,8756		.chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC18757	},8758	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {8759		.type = HDA_FIXUP_PINS,8760		.v.pins = (const struct hda_pintbl[]) {8761			{ 0x1b, 0x90170151 },8762			{ }8763		},8764		.chained = true,8765		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE8766	},8767	[ALC269_FIXUP_ATIV_BOOK_8] = {8768		.type = HDA_FIXUP_FUNC,8769		.v.func = alc_fixup_auto_mute_via_amp,8770		.chained = true,8771		.chain_id = ALC269_FIXUP_NO_SHUTUP8772	},8773	[ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {8774		.type = HDA_FIXUP_PINS,8775		.v.pins = (const struct hda_pintbl[]) {8776			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8777			{ 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */8778			{ }8779		},8780		.chained = true,8781		.chain_id = ALC269_FIXUP_HEADSET_MODE8782	},8783	[ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {8784		.type = HDA_FIXUP_PINS,8785		.v.pins = (const struct hda_pintbl[]) {8786			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */8787			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */8788			{ }8789		},8790		.chained = true,8791		.chain_id = ALC269_FIXUP_HEADSET_MODE8792	},8793	[ALC256_FIXUP_ASUS_HEADSET_MODE] = {8794		.type = HDA_FIXUP_FUNC,8795		.v.func = alc_fixup_headset_mode,8796	},8797	[ALC256_FIXUP_ASUS_MIC] = {8798		.type = HDA_FIXUP_PINS,8799		.v.pins = (const struct hda_pintbl[]) {8800			{ 0x13, 0x90a60160 }, /* use as internal mic */8801			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */8802			{ }8803		},8804		.chained = true,8805		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE8806	},8807	[ALC256_FIXUP_ASUS_AIO_GPIO2] = {8808		.type = HDA_FIXUP_FUNC,8809		/* Set up GPIO2 for the speaker amp */8810		.v.func = alc_fixup_gpio4,8811	},8812	[ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {8813		.type = HDA_FIXUP_PINS,8814		.v.pins = (const struct hda_pintbl[]) {8815			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8816			{ }8817		},8818		.chained = true,8819		.chain_id = ALC269_FIXUP_HEADSET_MIC8820	},8821	[ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {8822		.type = HDA_FIXUP_VERBS,8823		.v.verbs = (const struct hda_verb[]) {8824			/* Enables internal speaker */8825			{0x20, AC_VERB_SET_COEF_INDEX, 0x40},8826			{0x20, AC_VERB_SET_PROC_COEF, 0x8800},8827			{}8828		},8829		.chained = true,8830		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE8831	},8832	[ALC233_FIXUP_LENOVO_MULTI_CODECS] = {8833		.type = HDA_FIXUP_FUNC,8834		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,8835		.chained = true,8836		.chain_id = ALC269_FIXUP_GPIO28837	},8838	[ALC233_FIXUP_ACER_HEADSET_MIC] = {8839		.type = HDA_FIXUP_VERBS,8840		.v.verbs = (const struct hda_verb[]) {8841			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },8842			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },8843			{ }8844		},8845		.chained = true,8846		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE8847	},8848	[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {8849		.type = HDA_FIXUP_PINS,8850		.v.pins = (const struct hda_pintbl[]) {8851			/* Change the mic location from front to right, otherwise there are8852			   two front mics with the same name, pulseaudio can't handle them.8853			   This is just a temporary workaround, after applying this fixup,8854			   there will be one "Front Mic" and one "Mic" in this machine.8855			 */8856			{ 0x1a, 0x04a19040 },8857			{ }8858		},8859	},8860	[ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {8861		.type = HDA_FIXUP_PINS,8862		.v.pins = (const struct hda_pintbl[]) {8863			{ 0x16, 0x0101102f }, /* Rear Headset HP */8864			{ 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */8865			{ 0x1a, 0x01a19030 }, /* Rear Headset MIC */8866			{ 0x1b, 0x02011020 },8867			{ }8868		},8869		.chained = true,8870		.chain_id = ALC225_FIXUP_S3_POP_NOISE8871	},8872	[ALC225_FIXUP_S3_POP_NOISE] = {8873		.type = HDA_FIXUP_FUNC,8874		.v.func = alc225_fixup_s3_pop_noise,8875		.chained = true,8876		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC8877	},8878	[ALC700_FIXUP_INTEL_REFERENCE] = {8879		.type = HDA_FIXUP_VERBS,8880		.v.verbs = (const struct hda_verb[]) {8881			/* Enables internal speaker */8882			{0x20, AC_VERB_SET_COEF_INDEX, 0x45},8883			{0x20, AC_VERB_SET_PROC_COEF, 0x5289},8884			{0x20, AC_VERB_SET_COEF_INDEX, 0x4A},8885			{0x20, AC_VERB_SET_PROC_COEF, 0x001b},8886			{0x58, AC_VERB_SET_COEF_INDEX, 0x00},8887			{0x58, AC_VERB_SET_PROC_COEF, 0x3888},8888			{0x20, AC_VERB_SET_COEF_INDEX, 0x6f},8889			{0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},8890			{}8891		}8892	},8893	[ALC274_FIXUP_DELL_BIND_DACS] = {8894		.type = HDA_FIXUP_FUNC,8895		.v.func = alc274_fixup_bind_dacs,8896		.chained = true,8897		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE8898	},8899	[ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {8900		.type = HDA_FIXUP_PINS,8901		.v.pins = (const struct hda_pintbl[]) {8902			{ 0x1b, 0x0401102f },8903			{ }8904		},8905		.chained = true,8906		.chain_id = ALC274_FIXUP_DELL_BIND_DACS8907	},8908	[ALC298_FIXUP_TPT470_DOCK_FIX] = {8909		.type = HDA_FIXUP_FUNC,8910		.v.func = alc_fixup_tpt470_dock,8911		.chained = true,8912		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE8913	},8914	[ALC298_FIXUP_TPT470_DOCK] = {8915		.type = HDA_FIXUP_FUNC,8916		.v.func = alc_fixup_tpt470_dacs,8917		.chained = true,8918		.chain_id = ALC298_FIXUP_TPT470_DOCK_FIX8919	},8920	[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {8921		.type = HDA_FIXUP_PINS,8922		.v.pins = (const struct hda_pintbl[]) {8923			{ 0x14, 0x0201101f },8924			{ }8925		},8926		.chained = true,8927		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE8928	},8929	[ALC255_FIXUP_DELL_HEADSET_MIC] = {8930		.type = HDA_FIXUP_PINS,8931		.v.pins = (const struct hda_pintbl[]) {8932			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */8933			{ }8934		},8935		.chained = true,8936		.chain_id = ALC269_FIXUP_HEADSET_MIC8937	},8938	[ALC295_FIXUP_HP_X360] = {8939		.type = HDA_FIXUP_FUNC,8940		.v.func = alc295_fixup_hp_top_speakers,8941		.chained = true,8942		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC38943	},8944	[ALC221_FIXUP_HP_HEADSET_MIC] = {8945		.type = HDA_FIXUP_PINS,8946		.v.pins = (const struct hda_pintbl[]) {8947			{ 0x19, 0x0181313f},8948			{ }8949		},8950		.chained = true,8951		.chain_id = ALC269_FIXUP_HEADSET_MIC8952	},8953	[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {8954		.type = HDA_FIXUP_FUNC,8955		.v.func = alc285_fixup_invalidate_dacs,8956		.chained = true,8957		.chain_id = ALC269_FIXUP_THINKPAD_ACPI8958	},8959	[ALC295_FIXUP_HP_AUTO_MUTE] = {8960		.type = HDA_FIXUP_FUNC,8961		.v.func = alc_fixup_auto_mute_via_amp,8962	},8963	[ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {8964		.type = HDA_FIXUP_PINS,8965		.v.pins = (const struct hda_pintbl[]) {8966			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */8967			{ }8968		},8969		.chained = true,8970		.chain_id = ALC269_FIXUP_HEADSET_MIC8971	},8972	[ALC294_FIXUP_ASUS_MIC] = {8973		.type = HDA_FIXUP_PINS,8974		.v.pins = (const struct hda_pintbl[]) {8975			{ 0x13, 0x90a60160 }, /* use as internal mic */8976			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */8977			{ }8978		},8979		.chained = true,8980		.chain_id = ALC269_FIXUP_HEADSET_MIC8981	},8982	[ALC294_FIXUP_ASUS_HEADSET_MIC] = {8983		.type = HDA_FIXUP_PINS,8984		.v.pins = (const struct hda_pintbl[]) {8985			{ 0x19, 0x01a1103c }, /* use as headset mic */8986			{ }8987		},8988		.chained = true,8989		.chain_id = ALC269_FIXUP_HEADSET_MIC8990	},8991	[ALC294_FIXUP_ASUS_SPK] = {8992		.type = HDA_FIXUP_VERBS,8993		.v.verbs = (const struct hda_verb[]) {8994			/* Set EAPD high */8995			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },8996			{ 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },8997			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },8998			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },8999			{ }9000		},9001		.chained = true,9002		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC9003	},9004	[ALC295_FIXUP_CHROME_BOOK] = {9005		.type = HDA_FIXUP_FUNC,9006		.v.func = alc295_fixup_chromebook,9007		.chained = true,9008		.chain_id = ALC225_FIXUP_HEADSET_JACK9009	},9010	[ALC225_FIXUP_HEADSET_JACK] = {9011		.type = HDA_FIXUP_FUNC,9012		.v.func = alc_fixup_headset_jack,9013	},9014	[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {9015		.type = HDA_FIXUP_PINS,9016		.v.pins = (const struct hda_pintbl[]) {9017			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */9018			{ }9019		},9020		.chained = true,9021		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC9022	},9023	[ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {9024		.type = HDA_FIXUP_VERBS,9025		.v.verbs = (const struct hda_verb[]) {9026			/* Disable PCBEEP-IN passthrough */9027			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },9028			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },9029			{ }9030		},9031		.chained = true,9032		.chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE9033	},9034	[ALC255_FIXUP_ACER_HEADSET_MIC] = {9035		.type = HDA_FIXUP_PINS,9036		.v.pins = (const struct hda_pintbl[]) {9037			{ 0x19, 0x03a11130 },9038			{ 0x1a, 0x90a60140 }, /* use as internal mic */9039			{ }9040		},9041		.chained = true,9042		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC9043	},9044	[ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {9045		.type = HDA_FIXUP_PINS,9046		.v.pins = (const struct hda_pintbl[]) {9047			{ 0x16, 0x01011020 }, /* Rear Line out */9048			{ 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */9049			{ }9050		},9051		.chained = true,9052		.chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE9053	},9054	[ALC225_FIXUP_WYSE_AUTO_MUTE] = {9055		.type = HDA_FIXUP_FUNC,9056		.v.func = alc_fixup_auto_mute_via_amp,9057		.chained = true,9058		.chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF9059	},9060	[ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {9061		.type = HDA_FIXUP_FUNC,9062		.v.func = alc_fixup_disable_mic_vref,9063		.chained = true,9064		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC9065	},9066	[ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {9067		.type = HDA_FIXUP_VERBS,9068		.v.verbs = (const struct hda_verb[]) {9069			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },9070			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },9071			{ }9072		},9073		.chained = true,9074		.chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE9075	},9076	[ALC256_FIXUP_ASUS_HEADSET_MIC] = {9077		.type = HDA_FIXUP_PINS,9078		.v.pins = (const struct hda_pintbl[]) {9079			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */9080			{ }9081		},9082		.chained = true,9083		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE9084	},9085	[ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {9086		.type = HDA_FIXUP_PINS,9087		.v.pins = (const struct hda_pintbl[]) {9088			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */9089			{ }9090		},9091		.chained = true,9092		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE9093	},9094	[ALC255_FIXUP_PREDATOR_SUBWOOFER] = {9095		.type = HDA_FIXUP_PINS,9096		.v.pins = (const struct hda_pintbl[]) {9097			{ 0x17, 0x90170151 }, /* use as internal speaker (LFE) */9098			{ 0x1b, 0x90170152 } /* use as internal speaker (back) */9099		}9100	},9101	[ALC299_FIXUP_PREDATOR_SPK] = {9102		.type = HDA_FIXUP_PINS,9103		.v.pins = (const struct hda_pintbl[]) {9104			{ 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */9105			{ }9106		}9107	},9108	[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {9109		.type = HDA_FIXUP_PINS,9110		.v.pins = (const struct hda_pintbl[]) {9111			{ 0x19, 0x04a11040 },9112			{ 0x21, 0x04211020 },9113			{ }9114		},9115		.chained = true,9116		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE9117	},9118	[ALC289_FIXUP_DELL_SPK1] = {9119		.type = HDA_FIXUP_PINS,9120		.v.pins = (const struct hda_pintbl[]) {9121			{ 0x14, 0x90170140 },9122			{ }9123		},9124		.chained = true,9125		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE9126	},9127	[ALC289_FIXUP_DELL_SPK2] = {9128		.type = HDA_FIXUP_PINS,9129		.v.pins = (const struct hda_pintbl[]) {9130			{ 0x17, 0x90170130 }, /* bass spk */9131			{ }9132		},9133		.chained = true,9134		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE9135	},9136	[ALC289_FIXUP_DUAL_SPK] = {9137		.type = HDA_FIXUP_FUNC,9138		.v.func = alc285_fixup_speaker2_to_dac1,9139		.chained = true,9140		.chain_id = ALC289_FIXUP_DELL_SPK29141	},9142	[ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {9143		.type = HDA_FIXUP_FUNC,9144		.v.func = alc285_fixup_speaker2_to_dac1,9145		.chained = true,9146		.chain_id = ALC289_FIXUP_DELL_SPK19147	},9148	[ALC294_FIXUP_SPK2_TO_DAC1] = {9149		.type = HDA_FIXUP_FUNC,9150		.v.func = alc285_fixup_speaker2_to_dac1,9151		.chained = true,9152		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC9153	},9154	[ALC294_FIXUP_ASUS_DUAL_SPK] = {9155		.type = HDA_FIXUP_FUNC,9156		/* The GPIO must be pulled to initialize the AMP */9157		.v.func = alc_fixup_gpio4,9158		.chained = true,9159		.chain_id = ALC294_FIXUP_SPK2_TO_DAC19160	},9161	[ALC294_FIXUP_ASUS_ALLY] = {9162		.type = HDA_FIXUP_FUNC,9163		.v.func = cs35l41_fixup_i2c_two,9164		.chained = true,9165		.chain_id = ALC294_FIXUP_ASUS_ALLY_PINS9166	},9167	[ALC294_FIXUP_ASUS_ALLY_X] = {9168		.type = HDA_FIXUP_FUNC,9169		.v.func = tas2781_fixup_i2c,9170		.chained = true,9171		.chain_id = ALC294_FIXUP_ASUS_ALLY_PINS9172	},9173	[ALC294_FIXUP_ASUS_ALLY_PINS] = {9174		.type = HDA_FIXUP_PINS,9175		.v.pins = (const struct hda_pintbl[]) {9176			{ 0x19, 0x03a11050 },9177			{ 0x1a, 0x03a11c30 },9178			{ 0x21, 0x03211420 },9179			{ }9180		},9181		.chained = true,9182		.chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS9183	},9184	[ALC294_FIXUP_ASUS_ALLY_VERBS] = {9185		.type = HDA_FIXUP_VERBS,9186		.v.verbs = (const struct hda_verb[]) {9187			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },9188			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },9189			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },9190			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },9191			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },9192			{ 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },9193			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },9194			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0049},9195			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },9196			{ 0x20, AC_VERB_SET_PROC_COEF, 0x201b },9197			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },9198			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4278},9199			{ }9200		},9201		.chained = true,9202		.chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER9203	},9204	[ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {9205		.type = HDA_FIXUP_FUNC,9206		.v.func = alc285_fixup_speaker2_to_dac1,9207	},9208	[ALC285_FIXUP_THINKPAD_X1_GEN7] = {9209		.type = HDA_FIXUP_FUNC,9210		.v.func = alc285_fixup_thinkpad_x1_gen7,9211		.chained = true,9212		.chain_id = ALC269_FIXUP_THINKPAD_ACPI9213	},9214	[ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {9215		.type = HDA_FIXUP_FUNC,9216		.v.func = alc_fixup_headset_jack,9217		.chained = true,9218		.chain_id = ALC285_FIXUP_THINKPAD_X1_GEN79219	},9220	[ALC294_FIXUP_ASUS_HPE] = {9221		.type = HDA_FIXUP_VERBS,9222		.v.verbs = (const struct hda_verb[]) {9223			/* Set EAPD high */9224			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },9225			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },9226			{ }9227		},9228		.chained = true,9229		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC9230	},9231	[ALC294_FIXUP_ASUS_GX502_PINS] = {9232		.type = HDA_FIXUP_PINS,9233		.v.pins = (const struct hda_pintbl[]) {9234			{ 0x19, 0x03a11050 }, /* front HP mic */9235			{ 0x1a, 0x01a11830 }, /* rear external mic */9236			{ 0x21, 0x03211020 }, /* front HP out */9237			{ }9238		},9239		.chained = true,9240		.chain_id = ALC294_FIXUP_ASUS_GX502_VERBS9241	},9242	[ALC294_FIXUP_ASUS_GX502_VERBS] = {9243		.type = HDA_FIXUP_VERBS,9244		.v.verbs = (const struct hda_verb[]) {9245			/* set 0x15 to HP-OUT ctrl */9246			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },9247			/* unmute the 0x15 amp */9248			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },9249			{ }9250		},9251		.chained = true,9252		.chain_id = ALC294_FIXUP_ASUS_GX502_HP9253	},9254	[ALC294_FIXUP_ASUS_GX502_HP] = {9255		.type = HDA_FIXUP_FUNC,9256		.v.func = alc294_fixup_gx502_hp,9257	},9258	[ALC294_FIXUP_ASUS_GU502_PINS] = {9259		.type = HDA_FIXUP_PINS,9260		.v.pins = (const struct hda_pintbl[]) {9261			{ 0x19, 0x01a11050 }, /* rear HP mic */9262			{ 0x1a, 0x01a11830 }, /* rear external mic */9263			{ 0x21, 0x012110f0 }, /* rear HP out */9264			{ }9265		},9266		.chained = true,9267		.chain_id = ALC294_FIXUP_ASUS_GU502_VERBS9268	},9269	[ALC294_FIXUP_ASUS_GU502_VERBS] = {9270		.type = HDA_FIXUP_VERBS,9271		.v.verbs = (const struct hda_verb[]) {9272			/* set 0x15 to HP-OUT ctrl */9273			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },9274			/* unmute the 0x15 amp */9275			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },9276			/* set 0x1b to HP-OUT */9277			{ 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },9278			{ }9279		},9280		.chained = true,9281		.chain_id = ALC294_FIXUP_ASUS_GU502_HP9282	},9283	[ALC294_FIXUP_ASUS_GU502_HP] = {9284		.type = HDA_FIXUP_FUNC,9285		.v.func = alc294_fixup_gu502_hp,9286	},9287	 [ALC294_FIXUP_ASUS_G513_PINS] = {9288		.type = HDA_FIXUP_PINS,9289		.v.pins = (const struct hda_pintbl[]) {9290				{ 0x19, 0x03a11050 }, /* front HP mic */9291				{ 0x1a, 0x03a11c30 }, /* rear external mic */9292				{ 0x21, 0x03211420 }, /* front HP out */9293				{ }9294		},9295	},9296	[ALC285_FIXUP_ASUS_G533Z_PINS] = {9297		.type = HDA_FIXUP_PINS,9298		.v.pins = (const struct hda_pintbl[]) {9299			{ 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */9300			{ 0x19, 0x03a19020 }, /* Mic Boost Volume */9301			{ 0x1a, 0x03a11c30 }, /* Mic Boost Volume */9302			{ 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */9303			{ 0x21, 0x03211420 },9304			{ }9305		},9306	},9307	[ALC294_FIXUP_ASUS_COEF_1B] = {9308		.type = HDA_FIXUP_VERBS,9309		.v.verbs = (const struct hda_verb[]) {9310			/* Set bit 10 to correct noisy output after reboot from9311			 * Windows 10 (due to pop noise reduction?)9312			 */9313			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },9314			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },9315			{ }9316		},9317		.chained = true,9318		.chain_id = ALC289_FIXUP_ASUS_GA401,9319	},9320	[ALC285_FIXUP_HP_GPIO_LED] = {9321		.type = HDA_FIXUP_FUNC,9322		.v.func = alc285_fixup_hp_gpio_led,9323	},9324	[ALC285_FIXUP_HP_MUTE_LED] = {9325		.type = HDA_FIXUP_FUNC,9326		.v.func = alc285_fixup_hp_mute_led,9327	},9328	[ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {9329		.type = HDA_FIXUP_FUNC,9330		.v.func = alc285_fixup_hp_spectre_x360_mute_led,9331	},9332	[ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {9333	    .type = HDA_FIXUP_FUNC,9334	    .v.func = alc236_fixup_hp_mute_led_coefbit2,9335	},9336	[ALC236_FIXUP_HP_GPIO_LED] = {9337		.type = HDA_FIXUP_FUNC,9338		.v.func = alc236_fixup_hp_gpio_led,9339	},9340	[ALC236_FIXUP_HP_MUTE_LED] = {9341		.type = HDA_FIXUP_FUNC,9342		.v.func = alc236_fixup_hp_mute_led,9343	},9344	[ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {9345		.type = HDA_FIXUP_FUNC,9346		.v.func = alc236_fixup_hp_mute_led_micmute_vref,9347	},9348	[ALC236_FIXUP_LENOVO_INV_DMIC] = {9349		.type = HDA_FIXUP_FUNC,9350		.v.func = alc_fixup_inv_dmic,9351		.chained = true,9352		.chain_id = ALC283_FIXUP_INT_MIC,9353	},9354	[ALC298_FIXUP_SAMSUNG_AMP] = {9355		.type = HDA_FIXUP_FUNC,9356		.v.func = alc298_fixup_samsung_amp,9357		.chained = true,9358		.chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET9359	},9360	[ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS] = {9361		.type = HDA_FIXUP_FUNC,9362		.v.func = alc298_fixup_samsung_amp_v2_2_amps9363	},9364	[ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS] = {9365		.type = HDA_FIXUP_FUNC,9366		.v.func = alc298_fixup_samsung_amp_v2_4_amps9367	},9368	[ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {9369		.type = HDA_FIXUP_VERBS,9370		.v.verbs = (const struct hda_verb[]) {9371			{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },9372			{ }9373		},9374	},9375	[ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {9376		.type = HDA_FIXUP_VERBS,9377		.v.verbs = (const struct hda_verb[]) {9378			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08},9379			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},9380			{ }9381		},9382	},9383	[ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {9384		.type = HDA_FIXUP_PINS,9385		.v.pins = (const struct hda_pintbl[]) {9386			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */9387			{ }9388		},9389		.chained = true,9390		.chain_id = ALC269_FIXUP_HEADSET_MODE9391	},9392	[ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {9393		.type = HDA_FIXUP_PINS,9394		.v.pins = (const struct hda_pintbl[]) {9395			{ 0x14, 0x90100120 }, /* use as internal speaker */9396			{ 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */9397			{ 0x1a, 0x01011020 }, /* use as line out */9398			{ },9399		},9400		.chained = true,9401		.chain_id = ALC269_FIXUP_HEADSET_MIC9402	},9403	[ALC269VC_FIXUP_ACER_HEADSET_MIC] = {9404		.type = HDA_FIXUP_PINS,9405		.v.pins = (const struct hda_pintbl[]) {9406			{ 0x18, 0x02a11030 }, /* use as headset mic */9407			{ }9408		},9409		.chained = true,9410		.chain_id = ALC269_FIXUP_HEADSET_MIC9411	},9412	[ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {9413		.type = HDA_FIXUP_PINS,9414		.v.pins = (const struct hda_pintbl[]) {9415			{ 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */9416			{ }9417		},9418		.chained = true,9419		.chain_id = ALC269_FIXUP_HEADSET_MIC9420	},9421	[ALC289_FIXUP_ASUS_GA401] = {9422		.type = HDA_FIXUP_FUNC,9423		.v.func = alc289_fixup_asus_ga401,9424		.chained = true,9425		.chain_id = ALC289_FIXUP_ASUS_GA502,9426	},9427	[ALC289_FIXUP_ASUS_GA502] = {9428		.type = HDA_FIXUP_PINS,9429		.v.pins = (const struct hda_pintbl[]) {9430			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */9431			{ }9432		},9433	},9434	[ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {9435		.type = HDA_FIXUP_PINS,9436		.v.pins = (const struct hda_pintbl[]) {9437			{ 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */9438			{ }9439		},9440		.chained = true,9441		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE9442	},9443	[ALC285_FIXUP_HP_GPIO_AMP_INIT] = {9444		.type = HDA_FIXUP_FUNC,9445		.v.func = alc285_fixup_hp_gpio_amp_init,9446		.chained = true,9447		.chain_id = ALC285_FIXUP_HP_GPIO_LED9448	},9449	[ALC269_FIXUP_CZC_B20] = {9450		.type = HDA_FIXUP_PINS,9451		.v.pins = (const struct hda_pintbl[]) {9452			{ 0x12, 0x411111f0 },9453			{ 0x14, 0x90170110 }, /* speaker */9454			{ 0x15, 0x032f1020 }, /* HP out */9455			{ 0x17, 0x411111f0 },9456			{ 0x18, 0x03ab1040 }, /* mic */9457			{ 0x19, 0xb7a7013f },9458			{ 0x1a, 0x0181305f },9459			{ 0x1b, 0x411111f0 },9460			{ 0x1d, 0x411111f0 },9461			{ 0x1e, 0x411111f0 },9462			{ }9463		},9464		.chain_id = ALC269_FIXUP_DMIC,9465	},9466	[ALC269_FIXUP_CZC_TMI] = {9467		.type = HDA_FIXUP_PINS,9468		.v.pins = (const struct hda_pintbl[]) {9469			{ 0x12, 0x4000c000 },9470			{ 0x14, 0x90170110 }, /* speaker */9471			{ 0x15, 0x0421401f }, /* HP out */9472			{ 0x17, 0x411111f0 },9473			{ 0x18, 0x04a19020 }, /* mic */9474			{ 0x19, 0x411111f0 },9475			{ 0x1a, 0x411111f0 },9476			{ 0x1b, 0x411111f0 },9477			{ 0x1d, 0x40448505 },9478			{ 0x1e, 0x411111f0 },9479			{ 0x20, 0x8000ffff },9480			{ }9481		},9482		.chain_id = ALC269_FIXUP_DMIC,9483	},9484	[ALC269_FIXUP_CZC_L101] = {9485		.type = HDA_FIXUP_PINS,9486		.v.pins = (const struct hda_pintbl[]) {9487			{ 0x12, 0x40000000 },9488			{ 0x14, 0x01014010 }, /* speaker */9489			{ 0x15, 0x411111f0 }, /* HP out */9490			{ 0x16, 0x411111f0 },9491			{ 0x18, 0x01a19020 }, /* mic */9492			{ 0x19, 0x02a19021 },9493			{ 0x1a, 0x0181302f },9494			{ 0x1b, 0x0221401f },9495			{ 0x1c, 0x411111f0 },9496			{ 0x1d, 0x4044c601 },9497			{ 0x1e, 0x411111f0 },9498			{ }9499		},9500		.chain_id = ALC269_FIXUP_DMIC,9501	},9502	[ALC269_FIXUP_LEMOTE_A1802] = {9503		.type = HDA_FIXUP_PINS,9504		.v.pins = (const struct hda_pintbl[]) {9505			{ 0x12, 0x40000000 },9506			{ 0x14, 0x90170110 }, /* speaker */9507			{ 0x17, 0x411111f0 },9508			{ 0x18, 0x03a19040 }, /* mic1 */9509			{ 0x19, 0x90a70130 }, /* mic2 */9510			{ 0x1a, 0x411111f0 },9511			{ 0x1b, 0x411111f0 },9512			{ 0x1d, 0x40489d2d },9513			{ 0x1e, 0x411111f0 },9514			{ 0x20, 0x0003ffff },9515			{ 0x21, 0x03214020 },9516			{ }9517		},9518		.chain_id = ALC269_FIXUP_DMIC,9519	},9520	[ALC269_FIXUP_LEMOTE_A190X] = {9521		.type = HDA_FIXUP_PINS,9522		.v.pins = (const struct hda_pintbl[]) {9523			{ 0x14, 0x99130110 }, /* speaker */9524			{ 0x15, 0x0121401f }, /* HP out */9525			{ 0x18, 0x01a19c20 }, /* rear  mic */9526			{ 0x19, 0x99a3092f }, /* front mic */9527			{ 0x1b, 0x0201401f }, /* front lineout */9528			{ }9529		},9530		.chain_id = ALC269_FIXUP_DMIC,9531	},9532	[ALC256_FIXUP_INTEL_NUC8_RUGGED] = {9533		.type = HDA_FIXUP_PINS,9534		.v.pins = (const struct hda_pintbl[]) {9535			{ 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */9536			{ }9537		},9538		.chained = true,9539		.chain_id = ALC269_FIXUP_HEADSET_MODE9540	},9541	[ALC256_FIXUP_INTEL_NUC10] = {9542		.type = HDA_FIXUP_PINS,9543		.v.pins = (const struct hda_pintbl[]) {9544			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */9545			{ }9546		},9547		.chained = true,9548		.chain_id = ALC269_FIXUP_HEADSET_MODE9549	},9550	[ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {9551		.type = HDA_FIXUP_VERBS,9552		.v.verbs = (const struct hda_verb[]) {9553			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },9554			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },9555			{ }9556		},9557		.chained = true,9558		.chain_id = ALC289_FIXUP_ASUS_GA5029559	},9560	[ALC274_FIXUP_HP_MIC] = {9561		.type = HDA_FIXUP_VERBS,9562		.v.verbs = (const struct hda_verb[]) {9563			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },9564			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },9565			{ }9566		},9567	},9568	[ALC274_FIXUP_HP_HEADSET_MIC] = {9569		.type = HDA_FIXUP_FUNC,9570		.v.func = alc274_fixup_hp_headset_mic,9571		.chained = true,9572		.chain_id = ALC274_FIXUP_HP_MIC9573	},9574	[ALC274_FIXUP_HP_ENVY_GPIO] = {9575		.type = HDA_FIXUP_FUNC,9576		.v.func = alc274_fixup_hp_envy_gpio,9577	},9578	[ALC256_FIXUP_ASUS_HPE] = {9579		.type = HDA_FIXUP_VERBS,9580		.v.verbs = (const struct hda_verb[]) {9581			/* Set EAPD high */9582			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },9583			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },9584			{ }9585		},9586		.chained = true,9587		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC9588	},9589	[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {9590		.type = HDA_FIXUP_FUNC,9591		.v.func = alc_fixup_headset_jack,9592		.chained = true,9593		.chain_id = ALC269_FIXUP_THINKPAD_ACPI9594	},9595	[ALC287_FIXUP_HP_GPIO_LED] = {9596		.type = HDA_FIXUP_FUNC,9597		.v.func = alc287_fixup_hp_gpio_led,9598	},9599	[ALC256_FIXUP_HP_HEADSET_MIC] = {9600		.type = HDA_FIXUP_FUNC,9601		.v.func = alc274_fixup_hp_headset_mic,9602	},9603	[ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {9604		.type = HDA_FIXUP_FUNC,9605		.v.func = alc_fixup_no_int_mic,9606		.chained = true,9607		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE9608	},9609	[ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {9610		.type = HDA_FIXUP_PINS,9611		.v.pins = (const struct hda_pintbl[]) {9612			{ 0x1b, 0x411111f0 },9613			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */9614			{ },9615		},9616		.chained = true,9617		.chain_id = ALC269_FIXUP_HEADSET_MODE9618	},9619	[ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {9620		.type = HDA_FIXUP_FUNC,9621		.v.func = alc269_fixup_limit_int_mic_boost,9622		.chained = true,9623		.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,9624	},9625	[ALC256_FIXUP_ACER_HEADSET_MIC] = {9626		.type = HDA_FIXUP_PINS,9627		.v.pins = (const struct hda_pintbl[]) {9628			{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */9629			{ 0x1a, 0x90a1092f }, /* use as internal mic */9630			{ }9631		},9632		.chained = true,9633		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC9634	},9635	[ALC285_FIXUP_IDEAPAD_S740_COEF] = {9636		.type = HDA_FIXUP_FUNC,9637		.v.func = alc285_fixup_ideapad_s740_coef,9638		.chained = true,9639		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,9640	},9641	[ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {9642		.type = HDA_FIXUP_FUNC,9643		.v.func = alc269_fixup_limit_int_mic_boost,9644		.chained = true,9645		.chain_id = ALC285_FIXUP_HP_MUTE_LED,9646	},9647	[ALC295_FIXUP_ASUS_DACS] = {9648		.type = HDA_FIXUP_FUNC,9649		.v.func = alc295_fixup_asus_dacs,9650	},9651	[ALC295_FIXUP_HP_OMEN] = {9652		.type = HDA_FIXUP_PINS,9653		.v.pins = (const struct hda_pintbl[]) {9654			{ 0x12, 0xb7a60130 },9655			{ 0x13, 0x40000000 },9656			{ 0x14, 0x411111f0 },9657			{ 0x16, 0x411111f0 },9658			{ 0x17, 0x90170110 },9659			{ 0x18, 0x411111f0 },9660			{ 0x19, 0x02a11030 },9661			{ 0x1a, 0x411111f0 },9662			{ 0x1b, 0x04a19030 },9663			{ 0x1d, 0x40600001 },9664			{ 0x1e, 0x411111f0 },9665			{ 0x21, 0x03211020 },9666			{}9667		},9668		.chained = true,9669		.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,9670	},9671	[ALC285_FIXUP_HP_SPECTRE_X360] = {9672		.type = HDA_FIXUP_FUNC,9673		.v.func = alc285_fixup_hp_spectre_x360,9674	},9675	[ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {9676		.type = HDA_FIXUP_FUNC,9677		.v.func = alc285_fixup_hp_spectre_x360_eb19678	},9679	[ALC285_FIXUP_HP_ENVY_X360] = {9680		.type = HDA_FIXUP_FUNC,9681		.v.func = alc285_fixup_hp_envy_x360,9682		.chained = true,9683		.chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,9684	},9685	[ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {9686		.type = HDA_FIXUP_FUNC,9687		.v.func = alc285_fixup_ideapad_s740_coef,9688		.chained = true,9689		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,9690	},9691	[ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {9692		.type = HDA_FIXUP_FUNC,9693		.v.func = alc_fixup_no_shutup,9694		.chained = true,9695		.chain_id = ALC283_FIXUP_HEADSET_MIC,9696	},9697	[ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {9698		.type = HDA_FIXUP_PINS,9699		.v.pins = (const struct hda_pintbl[]) {9700			{ 0x21, 0x03211030 }, /* Change the Headphone location to Left */9701			{ }9702		},9703		.chained = true,9704		.chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC9705	},9706	[ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {9707		.type = HDA_FIXUP_FUNC,9708		.v.func = alc269_fixup_limit_int_mic_boost,9709		.chained = true,9710		.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,9711	},9712	[ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {9713		.type = HDA_FIXUP_FUNC,9714		.v.func = alc285_fixup_ideapad_s740_coef,9715		.chained = true,9716		.chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,9717	},9718	[ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {9719		.type = HDA_FIXUP_FUNC,9720		.v.func = alc287_fixup_legion_15imhg05_speakers,9721		.chained = true,9722		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,9723	},9724	[ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {9725		.type = HDA_FIXUP_VERBS,9726		//.v.verbs = legion_15imhg05_coefs,9727		.v.verbs = (const struct hda_verb[]) {9728			 // set left speaker Legion 7i.9729			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9730			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },9731 9732			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9733			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },9734			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9735			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },9736			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9737 9738			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9739			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9740			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9741			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9742			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9743 9744			 // set right speaker Legion 7i.9745			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9746			 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },9747 9748			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9749			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },9750			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9751			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },9752			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9753 9754			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9755			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9756			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9757			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9758			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9759			 {}9760		},9761		.chained = true,9762		.chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,9763	},9764	[ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {9765		.type = HDA_FIXUP_FUNC,9766		.v.func = alc287_fixup_legion_15imhg05_speakers,9767		.chained = true,9768		.chain_id = ALC269_FIXUP_HEADSET_MODE,9769	},9770	[ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {9771		.type = HDA_FIXUP_VERBS,9772		.v.verbs = (const struct hda_verb[]) {9773			 // set left speaker Yoga 7i.9774			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9775			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },9776 9777			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9778			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },9779			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9780			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },9781			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9782 9783			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9784			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9785			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9786			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9787			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9788 9789			 // set right speaker Yoga 7i.9790			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9791			 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },9792 9793			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9794			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },9795			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9796			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },9797			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9798 9799			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9800			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9801			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9802			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9803			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9804			 {}9805		},9806		.chained = true,9807		.chain_id = ALC269_FIXUP_HEADSET_MODE,9808	},9809	[ALC298_FIXUP_LENOVO_C940_DUET7] = {9810		.type = HDA_FIXUP_FUNC,9811		.v.func = alc298_fixup_lenovo_c940_duet7,9812	},9813	[ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = {9814		.type = HDA_FIXUP_FUNC,9815		.v.func = alc287_fixup_lenovo_14irp8_duetitl,9816	},9817	[ALC287_FIXUP_LENOVO_LEGION_7] = {9818		.type = HDA_FIXUP_FUNC,9819		.v.func = alc287_fixup_lenovo_legion_7,9820	},9821	[ALC287_FIXUP_13S_GEN2_SPEAKERS] = {9822		.type = HDA_FIXUP_VERBS,9823		.v.verbs = (const struct hda_verb[]) {9824			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9825			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },9826			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9827			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9828			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9829			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9830			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9831			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9832			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },9833			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9834			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9835			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9836			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9837			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9838			{}9839		},9840		.chained = true,9841		.chain_id = ALC269_FIXUP_HEADSET_MODE,9842	},9843	[ALC256_FIXUP_SET_COEF_DEFAULTS] = {9844		.type = HDA_FIXUP_FUNC,9845		.v.func = alc256_fixup_set_coef_defaults,9846	},9847	[ALC245_FIXUP_HP_GPIO_LED] = {9848		.type = HDA_FIXUP_FUNC,9849		.v.func = alc245_fixup_hp_gpio_led,9850	},9851	[ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {9852		.type = HDA_FIXUP_PINS,9853		.v.pins = (const struct hda_pintbl[]) {9854			{ 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */9855			{ }9856		},9857		.chained = true,9858		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,9859	},9860	[ALC233_FIXUP_NO_AUDIO_JACK] = {9861		.type = HDA_FIXUP_FUNC,9862		.v.func = alc233_fixup_no_audio_jack,9863	},9864	[ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {9865		.type = HDA_FIXUP_FUNC,9866		.v.func = alc256_fixup_mic_no_presence_and_resume,9867		.chained = true,9868		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC9869	},9870	[ALC287_FIXUP_LEGION_16ACHG6] = {9871		.type = HDA_FIXUP_FUNC,9872		.v.func = alc287_fixup_legion_16achg6_speakers,9873	},9874	[ALC287_FIXUP_CS35L41_I2C_2] = {9875		.type = HDA_FIXUP_FUNC,9876		.v.func = cs35l41_fixup_i2c_two,9877	},9878	[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {9879		.type = HDA_FIXUP_FUNC,9880		.v.func = cs35l41_fixup_i2c_two,9881		.chained = true,9882		.chain_id = ALC285_FIXUP_HP_MUTE_LED,9883	},9884	[ALC287_FIXUP_CS35L41_I2C_4] = {9885		.type = HDA_FIXUP_FUNC,9886		.v.func = cs35l41_fixup_i2c_four,9887	},9888	[ALC245_FIXUP_CS35L41_SPI_2] = {9889		.type = HDA_FIXUP_FUNC,9890		.v.func = cs35l41_fixup_spi_two,9891	},9892	[ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {9893		.type = HDA_FIXUP_FUNC,9894		.v.func = cs35l41_fixup_spi_two,9895		.chained = true,9896		.chain_id = ALC285_FIXUP_HP_GPIO_LED,9897	},9898	[ALC245_FIXUP_CS35L41_SPI_4] = {9899		.type = HDA_FIXUP_FUNC,9900		.v.func = cs35l41_fixup_spi_four,9901	},9902	[ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {9903		.type = HDA_FIXUP_FUNC,9904		.v.func = cs35l41_fixup_spi_four,9905		.chained = true,9906		.chain_id = ALC285_FIXUP_HP_GPIO_LED,9907	},9908	[ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {9909		.type = HDA_FIXUP_VERBS,9910		.v.verbs = (const struct hda_verb[]) {9911			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },9912			 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },9913			 { }9914		},9915		.chained = true,9916		.chain_id = ALC285_FIXUP_HP_MUTE_LED,9917	},9918	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {9919		.type = HDA_FIXUP_FUNC,9920		.v.func = alc_fixup_dell4_mic_no_presence_quiet,9921		.chained = true,9922		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,9923	},9924	[ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {9925		.type = HDA_FIXUP_PINS,9926		.v.pins = (const struct hda_pintbl[]) {9927			{ 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */9928			{ }9929		},9930		.chained = true,9931		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC9932	},9933	[ALC287_FIXUP_LEGION_16ITHG6] = {9934		.type = HDA_FIXUP_FUNC,9935		.v.func = alc287_fixup_legion_16ithg6_speakers,9936	},9937	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {9938		.type = HDA_FIXUP_VERBS,9939		.v.verbs = (const struct hda_verb[]) {9940			// enable left speaker9941			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9942			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },9943 9944			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9945			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },9946			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9947			{ 0x20, AC_VERB_SET_PROC_COEF, 0x1a },9948			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9949 9950			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9951			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },9952			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9953			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },9954			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9955 9956			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9957			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },9958			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9959			{ 0x20, AC_VERB_SET_PROC_COEF, 0x40 },9960			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9961 9962			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9963			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9964			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9965			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9966			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9967 9968			// enable right speaker9969			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },9970			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },9971 9972			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9973			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },9974			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9975			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2a },9976			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9977 9978			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9979			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },9980			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9981			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },9982			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9983 9984			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9985			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },9986			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9987			{ 0x20, AC_VERB_SET_PROC_COEF, 0x44 },9988			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9989 9990			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },9991			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },9992			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9993			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },9994			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },9995 9996			{ },9997		},9998	},9999	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {10000		.type = HDA_FIXUP_FUNC,10001		.v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,10002		.chained = true,10003		.chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,10004	},10005	[ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7] = {10006		.type = HDA_FIXUP_FUNC,10007		.v.func = alc287_fixup_lenovo_14arp8_legion_iah7,10008	},10009	[ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN] = {10010		.type = HDA_FIXUP_FUNC,10011		.v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,10012		.chained = true,10013		.chain_id = ALC287_FIXUP_CS35L41_I2C_2,10014	},10015	[ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {10016		.type = HDA_FIXUP_FUNC,10017		.v.func = alc295_fixup_dell_inspiron_top_speakers,10018		.chained = true,10019		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,10020	},10021	[ALC236_FIXUP_DELL_DUAL_CODECS] = {10022		.type = HDA_FIXUP_PINS,10023		.v.func = alc1220_fixup_gb_dual_codecs,10024		.chained = true,10025		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,10026	},10027	[ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {10028		.type = HDA_FIXUP_FUNC,10029		.v.func = cs35l41_fixup_i2c_two,10030		.chained = true,10031		.chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,10032	},10033	[ALC287_FIXUP_TAS2781_I2C] = {10034		.type = HDA_FIXUP_FUNC,10035		.v.func = tas2781_fixup_i2c,10036		.chained = true,10037		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,10038	},10039	[ALC287_FIXUP_YOGA7_14ARB7_I2C] = {10040		.type = HDA_FIXUP_FUNC,10041		.v.func = yoga7_14arb7_fixup_i2c,10042		.chained = true,10043		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,10044	},10045	[ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {10046		.type = HDA_FIXUP_FUNC,10047		.v.func = alc245_fixup_hp_mute_led_coefbit,10048	},10049	[ALC245_FIXUP_HP_X360_MUTE_LEDS] = {10050		.type = HDA_FIXUP_FUNC,10051		.v.func = alc245_fixup_hp_mute_led_coefbit,10052		.chained = true,10053		.chain_id = ALC245_FIXUP_HP_GPIO_LED10054	},10055	[ALC287_FIXUP_THINKPAD_I2S_SPK] = {10056		.type = HDA_FIXUP_FUNC,10057		.v.func = alc287_fixup_bind_dacs,10058		.chained = true,10059		.chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,10060	},10061	[ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {10062		.type = HDA_FIXUP_FUNC,10063		.v.func = alc287_fixup_bind_dacs,10064		.chained = true,10065		.chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,10066	},10067	[ALC2XX_FIXUP_HEADSET_MIC] = {10068		.type = HDA_FIXUP_FUNC,10069		.v.func = alc_fixup_headset_mic,10070	},10071	[ALC289_FIXUP_DELL_CS35L41_SPI_2] = {10072		.type = HDA_FIXUP_FUNC,10073		.v.func = cs35l41_fixup_spi_two,10074		.chained = true,10075		.chain_id = ALC289_FIXUP_DUAL_SPK10076	},10077	[ALC294_FIXUP_CS35L41_I2C_2] = {10078		.type = HDA_FIXUP_FUNC,10079		.v.func = cs35l41_fixup_i2c_two,10080	},10081	[ALC256_FIXUP_ACER_SFG16_MICMUTE_LED] = {10082		.type = HDA_FIXUP_FUNC,10083		.v.func = alc256_fixup_acer_sfg16_micmute_led,10084	},10085	[ALC256_FIXUP_HEADPHONE_AMP_VOL] = {10086		.type = HDA_FIXUP_FUNC,10087		.v.func = alc256_decrease_headphone_amp_val,10088	},10089	[ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX] = {10090		.type = HDA_FIXUP_FUNC,10091		.v.func = alc245_fixup_hp_spectre_x360_eu0xxx,10092	},10093	[ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX] = {10094		.type = HDA_FIXUP_FUNC,10095		.v.func = alc245_fixup_hp_spectre_x360_16_aa0xxx,10096	},10097	[ALC285_FIXUP_ASUS_GA403U] = {10098		.type = HDA_FIXUP_FUNC,10099		.v.func = alc285_fixup_asus_ga403u,10100	},10101	[ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC] = {10102		.type = HDA_FIXUP_PINS,10103		.v.pins = (const struct hda_pintbl[]) {10104			{ 0x19, 0x03a11050 },10105			{ 0x1b, 0x03a11c30 },10106			{ }10107		},10108		.chained = true,10109		.chain_id = ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC110110	},10111	[ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1] = {10112		.type = HDA_FIXUP_FUNC,10113		.v.func = alc285_fixup_speaker2_to_dac1,10114		.chained = true,10115		.chain_id = ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,10116	},10117	[ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC] = {10118		.type = HDA_FIXUP_PINS,10119		.v.pins = (const struct hda_pintbl[]) {10120			{ 0x19, 0x03a11050 },10121			{ 0x1b, 0x03a11c30 },10122			{ }10123		},10124	},10125	[ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1] = {10126		.type = HDA_FIXUP_FUNC,10127		.v.func = alc285_fixup_speaker2_to_dac1,10128		.chained = true,10129		.chain_id = ALC285_FIXUP_ASUS_GA403U,10130	},10131	[ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318] = {10132		.type = HDA_FIXUP_FUNC,10133		.v.func = alc287_fixup_lenovo_thinkpad_with_alc1318,10134		.chained = true,10135		.chain_id = ALC269_FIXUP_THINKPAD_ACPI10136	},10137	[ALC256_FIXUP_CHROME_BOOK] = {10138		.type = HDA_FIXUP_FUNC,10139		.v.func = alc256_fixup_chromebook,10140		.chained = true,10141		.chain_id = ALC225_FIXUP_HEADSET_JACK10142	},10143	[ALC287_FIXUP_LENOVO_SSID_17AA3820] = {10144		.type = HDA_FIXUP_FUNC,10145		.v.func = alc287_fixup_lenovo_ssid_17aa3820,10146	},10147	[ALC245_FIXUP_CLEVO_NOISY_MIC] = {10148		.type = HDA_FIXUP_FUNC,10149		.v.func = alc269_fixup_limit_int_mic_boost,10150		.chained = true,10151		.chain_id = ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,10152	},10153	[ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE] = {10154		.type = HDA_FIXUP_PINS,10155		.v.pins = (const struct hda_pintbl[]) {10156			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */10157			{ 0x1b, 0x20a11040 }, /* dock mic */10158			{ }10159		},10160		.chained = true,10161		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST10162	},10163};10164 10165static const struct snd_pci_quirk alc269_fixup_tbl[] = {10166	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),10167	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),10168	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),10169	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),10170	SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),10171	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),10172	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),10173	SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),10174	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),10175	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),10176	SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),10177	SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),10178	SND_PCI_QUIRK(0x1025, 0x100c, "Acer Aspire E5-574G", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),10179	SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),10180	SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),10181	SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),10182	SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),10183	SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),10184	SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),10185	SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),10186	SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),10187	SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),10188	SND_PCI_QUIRK(0x1025, 0x1177, "Acer Predator G9-593", ALC255_FIXUP_PREDATOR_SUBWOOFER),10189	SND_PCI_QUIRK(0x1025, 0x1178, "Acer Predator G9-593", ALC255_FIXUP_PREDATOR_SUBWOOFER),10190	SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),10191	SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),10192	SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),10193	SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),10194	SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),10195	SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),10196	SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),10197	SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),10198	SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),10199	SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),10200	SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),10201	SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),10202	SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),10203	SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),10204	SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),10205	SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),10206	SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),10207	SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),10208	SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),10209	SND_PCI_QUIRK(0x1025, 0x169a, "Acer Swift SFG16", ALC256_FIXUP_ACER_SFG16_MICMUTE_LED),10210	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),10211	SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),10212	SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),10213	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),10214	SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),10215	SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),10216	SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),10217	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),10218	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),10219	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),10220	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),10221	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),10222	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),10223	SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),10224	SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),10225	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),10226	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),10227	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),10228	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),10229	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),10230	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),10231	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),10232	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),10233	SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),10234	SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),10235	SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),10236	SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),10237	SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),10238	SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),10239	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),10240	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),10241	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),10242	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),10243	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),10244	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),10245	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),10246	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),10247	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),10248	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),10249	SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),10250	SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),10251	SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),10252	SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),10253	SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),10254	SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),10255	SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),10256	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),10257	SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),10258	SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),10259	SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),10260	SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),10261	SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),10262	SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),10263	SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),10264	SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),10265	SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),10266	SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),10267	SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),10268	SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),10269	SND_PCI_QUIRK(0x1028, 0x0b27, "Dell", ALC245_FIXUP_CS35L41_SPI_2),10270	SND_PCI_QUIRK(0x1028, 0x0b28, "Dell", ALC245_FIXUP_CS35L41_SPI_2),10271	SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),10272	SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),10273	SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),10274	SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),10275	SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK),10276	SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK),10277	SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK),10278	SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),10279	SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),10280	SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),10281	SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),10282	SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),10283	SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),10284	SND_PCI_QUIRK(0x1028, 0x0c28, "Dell Inspiron 16 Plus 7630", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),10285	SND_PCI_QUIRK(0x1028, 0x0c4d, "Dell", ALC287_FIXUP_CS35L41_I2C_4),10286	SND_PCI_QUIRK(0x1028, 0x0c94, "Dell Polaris 3 metal", ALC287_FIXUP_TAS2781_I2C),10287	SND_PCI_QUIRK(0x1028, 0x0c96, "Dell Polaris 2in1", ALC287_FIXUP_TAS2781_I2C),10288	SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),10289	SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),10290	SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),10291	SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),10292	SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),10293	SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),10294	SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),10295	SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),10296	SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),10297	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),10298	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),10299	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),10300	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),10301	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),10302	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10303	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10304	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10305	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10306	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),10307	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10308	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10309	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),10310	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),10311	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),10312	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),10313	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),10314	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10315	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10316	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10317	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10318	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10319	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10320	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),10321	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),10322	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10323	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10324	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10325	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10326	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10327	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10328	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10329	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10330	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),10331	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10332	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),10333	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10334	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),10335	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10336	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10337	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10338	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10339	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10340	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10341	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10342	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10343	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10344	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10345	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10346	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10347	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10348	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10349	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),10350	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10351	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),10352	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10353	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10354	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10355	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),10356	SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),10357	SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),10358	SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),10359	SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),10360	SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),10361	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),10362	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),10363	SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),10364	SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),10365	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),10366	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),10367	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),10368	SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),10369	SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),10370	SND_PCI_QUIRK(0x103c, 0x84a6, "HP 250 G7 Notebook PC", ALC269_FIXUP_HP_LINE1_MIC1_LED),10371	SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10372	SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),10373	SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),10374	SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),10375	SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10376	SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),10377	SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),10378	SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),10379	SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),10380	SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10381	SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),10382	SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),10383	SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),10384	SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),10385	SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),10386	SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),10387	SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),10388	SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),10389	SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),10390	SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10391	SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10392	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),10393	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),10394	SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),10395	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),10396	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),10397	SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",10398		      ALC285_FIXUP_HP_GPIO_AMP_INIT),10399	SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",10400		      ALC285_FIXUP_HP_GPIO_AMP_INIT),10401	SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),10402	SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),10403	SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),10404	SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10405	SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),10406	SND_PCI_QUIRK(0x103c, 0x87d3, "HP Laptop 15-gw0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10407	SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),10408	SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),10409	SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),10410	SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),10411	SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),10412	SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),10413	SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),10414	SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),10415	SND_PCI_QUIRK(0x103c, 0x87fd, "HP Laptop 14-dq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10416	SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10417	SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),10418	SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),10419	SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),10420	SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),10421	SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10422	SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),10423	SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),10424	SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),10425	SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),10426	SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),10427	SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),10428	SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),10429	SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),10430	SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),10431	SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10432	SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),10433	SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),10434	SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),10435	SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),10436	SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),10437	SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),10438	SND_PCI_QUIRK(0x103c, 0x88dd, "HP Pavilion 15z-ec200", ALC285_FIXUP_HP_MUTE_LED),10439	SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),10440	SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10441	SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),10442	SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10443	SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10444	SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10445	SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10446	SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10447	SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10448	SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10449	SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED),10450	SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),10451	SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),10452	SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),10453	SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10454	SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),10455	SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10456	SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),10457	SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),10458	SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),10459	SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),10460	SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),10461	SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),10462	SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10463	SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),10464	SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10465	SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10466	SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10467	SND_PCI_QUIRK(0x103c, 0x89e7, "HP Elite x2 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10468	SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),10469	SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10470	SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),10471	SND_PCI_QUIRK(0x103c, 0x8a28, "HP Envy 13", ALC287_FIXUP_CS35L41_I2C_2),10472	SND_PCI_QUIRK(0x103c, 0x8a29, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10473	SND_PCI_QUIRK(0x103c, 0x8a2a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10474	SND_PCI_QUIRK(0x103c, 0x8a2b, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10475	SND_PCI_QUIRK(0x103c, 0x8a2c, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10476	SND_PCI_QUIRK(0x103c, 0x8a2d, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10477	SND_PCI_QUIRK(0x103c, 0x8a2e, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10478	SND_PCI_QUIRK(0x103c, 0x8a30, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10479	SND_PCI_QUIRK(0x103c, 0x8a31, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10480	SND_PCI_QUIRK(0x103c, 0x8a6e, "HP EDNA 360", ALC287_FIXUP_CS35L41_I2C_4),10481	SND_PCI_QUIRK(0x103c, 0x8a74, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),10482	SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),10483	SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),10484	SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),10485	SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),10486	SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),10487	SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED),10488	SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10489	SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10490	SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10491	SND_PCI_QUIRK(0x103c, 0x8ad8, "HP 800 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10492	SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10493	SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),10494	SND_PCI_QUIRK(0x103c, 0x8b3a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10495	SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED),10496	SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10497	SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10498	SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10499	SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10500	SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10501	SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10502	SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10503	SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10504	SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10505	SND_PCI_QUIRK(0x103c, 0x8b5f, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10506	SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),10507	SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10508	SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10509	SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10510	SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10511	SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10512	SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),10513	SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),10514	SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),10515	SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),10516	SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),10517	SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),10518	SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),10519	SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),10520	SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10521	SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10522	SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10523	SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),10524	SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),10525	SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10526	SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10527	SND_PCI_QUIRK(0x103c, 0x8bdf, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10528	SND_PCI_QUIRK(0x103c, 0x8be0, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10529	SND_PCI_QUIRK(0x103c, 0x8be1, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10530	SND_PCI_QUIRK(0x103c, 0x8be2, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10531	SND_PCI_QUIRK(0x103c, 0x8be3, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10532	SND_PCI_QUIRK(0x103c, 0x8be5, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10533	SND_PCI_QUIRK(0x103c, 0x8be6, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10534	SND_PCI_QUIRK(0x103c, 0x8be7, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10535	SND_PCI_QUIRK(0x103c, 0x8be8, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10536	SND_PCI_QUIRK(0x103c, 0x8be9, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10537	SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),10538	SND_PCI_QUIRK(0x103c, 0x8c15, "HP Spectre x360 2-in-1 Laptop 14-eu0xxx", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),10539	SND_PCI_QUIRK(0x103c, 0x8c16, "HP Spectre x360 2-in-1 Laptop 16-aa0xxx", ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX),10540	SND_PCI_QUIRK(0x103c, 0x8c17, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2),10541	SND_PCI_QUIRK(0x103c, 0x8c21, "HP Pavilion Plus Laptop 14-ey0XXX", ALC245_FIXUP_HP_X360_MUTE_LEDS),10542	SND_PCI_QUIRK(0x103c, 0x8c30, "HP Victus 15-fb1xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),10543	SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10544	SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10545	SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10546	SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10547	SND_PCI_QUIRK(0x103c, 0x8c4d, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),10548	SND_PCI_QUIRK(0x103c, 0x8c4e, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),10549	SND_PCI_QUIRK(0x103c, 0x8c4f, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),10550	SND_PCI_QUIRK(0x103c, 0x8c50, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10551	SND_PCI_QUIRK(0x103c, 0x8c51, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10552	SND_PCI_QUIRK(0x103c, 0x8c52, "HP EliteBook 1040 G11", ALC285_FIXUP_HP_GPIO_LED),10553	SND_PCI_QUIRK(0x103c, 0x8c53, "HP Elite x360 1040 2-in-1 G11", ALC285_FIXUP_HP_GPIO_LED),10554	SND_PCI_QUIRK(0x103c, 0x8c66, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10555	SND_PCI_QUIRK(0x103c, 0x8c67, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10556	SND_PCI_QUIRK(0x103c, 0x8c68, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),10557	SND_PCI_QUIRK(0x103c, 0x8c6a, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),10558	SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10559	SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10560	SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10561	SND_PCI_QUIRK(0x103c, 0x8c7b, "HP ProBook 445 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10562	SND_PCI_QUIRK(0x103c, 0x8c7c, "HP ProBook 445 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10563	SND_PCI_QUIRK(0x103c, 0x8c7d, "HP ProBook 465 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10564	SND_PCI_QUIRK(0x103c, 0x8c7e, "HP ProBook 465 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10565	SND_PCI_QUIRK(0x103c, 0x8c7f, "HP EliteBook 645 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10566	SND_PCI_QUIRK(0x103c, 0x8c80, "HP EliteBook 645 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10567	SND_PCI_QUIRK(0x103c, 0x8c81, "HP EliteBook 665 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10568	SND_PCI_QUIRK(0x103c, 0x8c89, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED),10569	SND_PCI_QUIRK(0x103c, 0x8c8a, "HP EliteBook 630", ALC236_FIXUP_HP_GPIO_LED),10570	SND_PCI_QUIRK(0x103c, 0x8c8c, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),10571	SND_PCI_QUIRK(0x103c, 0x8c8d, "HP ProBook 440 G11", ALC236_FIXUP_HP_GPIO_LED),10572	SND_PCI_QUIRK(0x103c, 0x8c8e, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED),10573	SND_PCI_QUIRK(0x103c, 0x8c90, "HP EliteBook 640", ALC236_FIXUP_HP_GPIO_LED),10574	SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),10575	SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10576	SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10577	SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),10578	SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),10579	SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10580	SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),10581	SND_PCI_QUIRK(0x103c, 0x8caf, "HP Elite mt645 G8 Mobile Thin Client", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),10582	SND_PCI_QUIRK(0x103c, 0x8cbd, "HP Pavilion Aero Laptop 13-bg0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),10583	SND_PCI_QUIRK(0x103c, 0x8cdd, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),10584	SND_PCI_QUIRK(0x103c, 0x8cde, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),10585	SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10586	SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),10587	SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),10588	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),10589	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),10590	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10591	SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),10592	SND_PCI_QUIRK(0x1043, 0x10a4, "ASUS TP3407SA", ALC287_FIXUP_TAS2781_I2C),10593	SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),10594	SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),10595	SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),10596	SND_PCI_QUIRK(0x1043, 0x1154, "ASUS TP3607SH", ALC287_FIXUP_TAS2781_I2C),10597	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10598	SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),10599	SND_PCI_QUIRK(0x1043, 0x1204, "ASUS Strix G615JHR_JMR_JPR", ALC287_FIXUP_TAS2781_I2C),10600	SND_PCI_QUIRK(0x1043, 0x1214, "ASUS Strix G615LH_LM_LP", ALC287_FIXUP_TAS2781_I2C),10601	SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),10602	SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),10603	SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),10604	SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),10605	SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),10606	SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),10607	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),10608	SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),10609	SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),10610	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),10611	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),10612	SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),10613	SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),10614	SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),10615	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603VQ/VU/VV/VJ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),10616	SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601VV/VU/VJ/VQ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),10617	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G614JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),10618	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS G513PI/PU/PV", ALC287_FIXUP_CS35L41_I2C_2),10619	SND_PCI_QUIRK(0x1043, 0x1503, "ASUS G733PY/PZ/PZV/PYV", ALC287_FIXUP_CS35L41_I2C_2),10620	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),10621	SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA/XJ/XQ/XU/XV/XI", ALC287_FIXUP_CS35L41_I2C_2),10622	SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301VV/VQ/VU/VJ/VA/VC/VE/VVC/VQC/VUC/VJC/VEC/VCC", ALC285_FIXUP_ASUS_HEADSET_MIC),10623	SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),10624	SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZI/ZJ/ZQ/ZU/ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),10625	SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),10626	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),10627	SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),10628	SND_PCI_QUIRK(0x1043, 0x16d3, "ASUS UX5304VA", ALC245_FIXUP_CS35L41_SPI_2),10629	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),10630	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS UX7602VI/BZ", ALC245_FIXUP_CS35L41_SPI_2),10631	SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),10632	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),10633	SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally NR2301L/X", ALC294_FIXUP_ASUS_ALLY),10634	SND_PCI_QUIRK(0x1043, 0x1eb3, "ROG Ally X RC72LA", ALC294_FIXUP_ASUS_ALLY_X),10635	SND_PCI_QUIRK(0x1043, 0x1863, "ASUS UX6404VI/VV", ALC245_FIXUP_CS35L41_SPI_2),10636	SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),10637	SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),10638	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),10639	SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),10640	SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),10641	SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),10642	SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),10643	SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),10644	SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),10645	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),10646	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),10647	SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),10648	SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),10649	SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),10650	SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),10651	SND_PCI_QUIRK(0x1043, 0x1b13, "ASUS U41SV/GA403U", ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC),10652	SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),10653	SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),10654	SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2),10655	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10656	SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),10657	SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),10658	SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),10659	SND_PCI_QUIRK(0x1043, 0x1c63, "ASUS GU605M", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),10660	SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),10661	SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),10662	SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),10663	SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),10664	SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JU/JV/JI", ALC245_FIXUP_CS35L41_SPI_2),10665	SND_PCI_QUIRK(0x1043, 0x1cdf, "ASUS G814JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),10666	SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),10667	SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS G713PI/PU/PV/PVN", ALC287_FIXUP_CS35L41_I2C_2),10668	SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),10669	SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),10670	SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),10671	SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),10672	SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),10673	SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),10674	SND_PCI_QUIRK(0x1043, 0x1e1f, "ASUS Vivobook 15 X1504VAP", ALC2XX_FIXUP_HEADSET_MIC),10675	SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),10676	SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),10677	SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),10678	SND_PCI_QUIRK(0x1043, 0x1eb3, "ASUS Ally RCLA72", ALC287_FIXUP_TAS2781_I2C),10679	SND_PCI_QUIRK(0x1043, 0x1ed3, "ASUS HN7306W", ALC287_FIXUP_CS35L41_I2C_2),10680	SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),10681	SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),10682	SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),10683	SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),10684	SND_PCI_QUIRK(0x1043, 0x1f1f, "ASUS H7604JI/JV/J3D", ALC245_FIXUP_CS35L41_SPI_2),10685	SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),10686	SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),10687	SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),10688	SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),10689	SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),10690	SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),10691	SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),10692	SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),10693	SND_PCI_QUIRK(0x1043, 0x3e30, "ASUS TP3607SA", ALC287_FIXUP_TAS2781_I2C),10694	SND_PCI_QUIRK(0x1043, 0x3ee0, "ASUS Strix G815_JHR_JMR_JPR", ALC287_FIXUP_TAS2781_I2C),10695	SND_PCI_QUIRK(0x1043, 0x3ef0, "ASUS Strix G635LR_LW_LX", ALC287_FIXUP_TAS2781_I2C),10696	SND_PCI_QUIRK(0x1043, 0x3f00, "ASUS Strix G815LH_LM_LP", ALC287_FIXUP_TAS2781_I2C),10697	SND_PCI_QUIRK(0x1043, 0x3f10, "ASUS Strix G835LR_LW_LX", ALC287_FIXUP_TAS2781_I2C),10698	SND_PCI_QUIRK(0x1043, 0x3f20, "ASUS Strix G615LR_LW", ALC287_FIXUP_TAS2781_I2C),10699	SND_PCI_QUIRK(0x1043, 0x3f30, "ASUS Strix G815LR_LW", ALC287_FIXUP_TAS2781_I2C),10700	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),10701	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),10702	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),10703	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),10704	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),10705	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),10706	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),10707	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),10708	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),10709	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),10710	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),10711	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),10712	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),10713	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),10714	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),10715	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),10716	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),10717	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),10718	SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),10719	SND_PCI_QUIRK(0x10ec, 0x119e, "Positivo SU C1400", ALC269_FIXUP_ASPIRE_HEADSET_MIC),10720	SND_PCI_QUIRK(0x10ec, 0x11bc, "VAIO VJFE-IL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10721	SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),10722	SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),10723	SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),10724	SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),10725	SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),10726	SND_PCI_QUIRK(0x10ec, 0x12f6, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),10727	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_ASPIRE_HEADSET_MIC),10728	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),10729	SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),10730	SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),10731	SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),10732	SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),10733	SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),10734	SND_PCI_QUIRK(0x144d, 0xc1a4, "Samsung Galaxy Book Pro 360 (NT935QBD)", ALC298_FIXUP_SAMSUNG_AMP),10735	SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),10736	SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),10737	SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),10738	SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),10739	SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),10740	SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),10741	SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),10742	SND_PCI_QUIRK(0x144d, 0xc870, "Samsung Galaxy Book2 Pro (NP950XED)", ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS),10743	SND_PCI_QUIRK(0x144d, 0xc872, "Samsung Galaxy Book2 Pro (NP950XEE)", ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS),10744	SND_PCI_QUIRK(0x144d, 0xc886, "Samsung Galaxy Book3 Pro (NP964XFG)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),10745	SND_PCI_QUIRK(0x144d, 0xc1ca, "Samsung Galaxy Book3 Pro 360 (NP960QFG)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),10746	SND_PCI_QUIRK(0x144d, 0xc1cc, "Samsung Galaxy Book3 Ultra (NT960XFH)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),10747	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),10748	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),10749	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),10750	SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),10751	SND_PCI_QUIRK(0x152d, 0x1262, "Huawei NBLB-WAX9N", ALC2XX_FIXUP_HEADSET_MIC),10752	SND_PCI_QUIRK(0x1558, 0x0353, "Clevo V35[05]SN[CDE]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10753	SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10754	SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10755	SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10756	SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10757	SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10758	SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10759	SND_PCI_QUIRK(0x1558, 0x2624, "Clevo L240TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10760	SND_PCI_QUIRK(0x1558, 0x28c1, "Clevo V370VND", ALC2XX_FIXUP_HEADSET_MIC),10761	SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10762	SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10763	SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10764	SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10765	SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10766	SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10767	SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10768	SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10769	SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10770	SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10771	SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10772	SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10773	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10774	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10775	SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10776	SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10777	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10778	SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10779	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10780	SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10781	SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10782	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10783	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10784	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10785	SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10786	SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10787	SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10788	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10789	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10790	SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10791	SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10792	SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10793	SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10794	SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10795	SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10796	SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10797	SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10798	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10799	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10800	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10801	SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10802	SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10803	SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10804	SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10805	SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),10806	SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),10807	SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),10808	SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10809	SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10810	SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10811	SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10812	SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10813	SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),10814	SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10815	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10816	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10817	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10818	SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10819	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10820	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10821	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10822	SND_PCI_QUIRK(0x1558, 0xa554, "VAIO VJFH52", ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE),10823	SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10824	SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10825	SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10826	SND_PCI_QUIRK(0x1558, 0xa741, "Clevo V54x_6x_TNE", ALC245_FIXUP_CLEVO_NOISY_MIC),10827	SND_PCI_QUIRK(0x1558, 0xa763, "Clevo V54x_6x_TU", ALC245_FIXUP_CLEVO_NOISY_MIC),10828	SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10829	SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10830	SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10831	SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10832	SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10833	SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),10834	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),10835	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),10836	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),10837	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),10838	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),10839	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),10840	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),10841	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),10842	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),10843	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),10844	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),10845	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),10846	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),10847	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),10848	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),10849	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),10850	SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),10851	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),10852	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),10853	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10854	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),10855	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),10856	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),10857	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10858	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10859	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),10860	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),10861	SND_PCI_QUIRK(0x17aa, 0x2234, "Thinkpad ICE-1", ALC287_FIXUP_TAS2781_I2C),10862	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),10863	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10864	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10865	SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),10866	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10867	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10868	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10869	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10870	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),10871	SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),10872	SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),10873	SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),10874	SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10875	SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10876	SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10877	SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10878	SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10879	SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10880	SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10881	SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10882	SND_PCI_QUIRK(0x17aa, 0x231e, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),10883	SND_PCI_QUIRK(0x17aa, 0x231f, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),10884	SND_PCI_QUIRK(0x17aa, 0x2326, "Hera2", ALC287_FIXUP_TAS2781_I2C),10885	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),10886	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),10887	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),10888	SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),10889	SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),10890	SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),10891	SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),10892	SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),10893	SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),10894	SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),10895	SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),10896	SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),10897	SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),10898	SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL),10899	SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),10900	SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),10901	SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),10902	SND_PCI_QUIRK(0x17aa, 0x3820, "IdeaPad 330 / Yoga Duet 7", ALC287_FIXUP_LENOVO_SSID_17AA3820),10903	SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),10904	SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),10905	SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),10906	SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),10907	SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),10908	SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),10909	SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),10910	SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),10911	SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),10912	SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),10913	SND_PCI_QUIRK(0x17aa, 0x3865, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),10914	SND_PCI_QUIRK(0x17aa, 0x3866, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),10915	SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),10916	SND_PCI_QUIRK(0x17aa, 0x386e, "Legion Y9000X 2022 IAH7 / Yoga Pro 7 14ARP8",  ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7),10917	SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7/7i", ALC287_FIXUP_LENOVO_LEGION_7),10918	SND_PCI_QUIRK(0x17aa, 0x3870, "Lenovo Yoga 7 14ARB7", ALC287_FIXUP_YOGA7_14ARB7_I2C),10919	SND_PCI_QUIRK(0x17aa, 0x3877, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),10920	SND_PCI_QUIRK(0x17aa, 0x3878, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),10921	SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),10922	SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),10923	SND_PCI_QUIRK(0x17aa, 0x387f, "Yoga S780-16 pro dual LX", ALC287_FIXUP_TAS2781_I2C),10924	SND_PCI_QUIRK(0x17aa, 0x3880, "Yoga S780-16 pro dual YC", ALC287_FIXUP_TAS2781_I2C),10925	SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),10926	SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),10927	SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),10928	SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),10929	SND_PCI_QUIRK(0x17aa, 0x3891, "Lenovo Yoga Pro 7 14AHP9", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),10930	SND_PCI_QUIRK(0x17aa, 0x38a5, "Y580P AMD dual", ALC287_FIXUP_TAS2781_I2C),10931	SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),10932	SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),10933	SND_PCI_QUIRK(0x17aa, 0x38a9, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10934	SND_PCI_QUIRK(0x17aa, 0x38ab, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),10935	SND_PCI_QUIRK(0x17aa, 0x38b4, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),10936	SND_PCI_QUIRK(0x17aa, 0x38b5, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),10937	SND_PCI_QUIRK(0x17aa, 0x38b6, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),10938	SND_PCI_QUIRK(0x17aa, 0x38b7, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),10939	SND_PCI_QUIRK(0x17aa, 0x38b8, "Yoga S780-14.5 proX AMD YC Dual", ALC287_FIXUP_TAS2781_I2C),10940	SND_PCI_QUIRK(0x17aa, 0x38b9, "Yoga S780-14.5 proX AMD LX Dual", ALC287_FIXUP_TAS2781_I2C),10941	SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),10942	SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),10943	SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),10944	SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),10945	SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),10946	SND_PCI_QUIRK(0x17aa, 0x38c7, "Thinkbook 13x Gen 4", ALC287_FIXUP_CS35L41_I2C_4),10947	SND_PCI_QUIRK(0x17aa, 0x38c8, "Thinkbook 13x Gen 4", ALC287_FIXUP_CS35L41_I2C_4),10948	SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),10949	SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),10950	SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),10951	SND_PCI_QUIRK(0x17aa, 0x38d3, "Yoga S990-16 Pro IMH YC Dual", ALC287_FIXUP_TAS2781_I2C),10952	SND_PCI_QUIRK(0x17aa, 0x38d4, "Yoga S990-16 Pro IMH VECO Dual", ALC287_FIXUP_TAS2781_I2C),10953	SND_PCI_QUIRK(0x17aa, 0x38d5, "Yoga S990-16 Pro IMH YC Quad", ALC287_FIXUP_TAS2781_I2C),10954	SND_PCI_QUIRK(0x17aa, 0x38d6, "Yoga S990-16 Pro IMH VECO Quad", ALC287_FIXUP_TAS2781_I2C),10955	SND_PCI_QUIRK(0x17aa, 0x38d7, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),10956	SND_PCI_QUIRK(0x17aa, 0x38df, "Yoga Y990 Intel YC Dual", ALC287_FIXUP_TAS2781_I2C),10957	SND_PCI_QUIRK(0x17aa, 0x38e0, "Yoga Y990 Intel VECO Dual", ALC287_FIXUP_TAS2781_I2C),10958	SND_PCI_QUIRK(0x17aa, 0x38f8, "Yoga Book 9i", ALC287_FIXUP_TAS2781_I2C),10959	SND_PCI_QUIRK(0x17aa, 0x38df, "Y990 YG DUAL", ALC287_FIXUP_TAS2781_I2C),10960	SND_PCI_QUIRK(0x17aa, 0x38f9, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2),10961	SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2),10962	SND_PCI_QUIRK(0x17aa, 0x38fd, "ThinkBook plus Gen5 Hybrid", ALC287_FIXUP_TAS2781_I2C),10963	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),10964	SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC),10965	SND_PCI_QUIRK(0x17aa, 0x391f, "Yoga S990-16 pro Quad YC Quad", ALC287_FIXUP_TAS2781_I2C),10966	SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TAS2781_I2C),10967	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),10968	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),10969	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),10970	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10971	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),10972	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),10973	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10974	SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),10975	SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),10976	SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),10977	SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),10978	SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),10979	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),10980	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),10981	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),10982	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10983	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10984	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10985	SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),10986	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),10987	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10988	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),10989	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),10990	SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),10991	SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),10992	SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),10993	SND_PCI_QUIRK(0x1854, 0x0440, "LG CQ6", ALC256_FIXUP_HEADPHONE_AMP_VOL),10994	SND_PCI_QUIRK(0x1854, 0x0441, "LG CQ6 AIO", ALC256_FIXUP_HEADPHONE_AMP_VOL),10995	SND_PCI_QUIRK(0x1854, 0x0488, "LG gram 16 (16Z90R)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),10996	SND_PCI_QUIRK(0x1854, 0x048a, "LG gram 17 (17ZD90R)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),10997	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),10998	SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),10999	SND_PCI_QUIRK(0x19e5, 0x3212, "Huawei KLV-WX9 ", ALC256_FIXUP_ACER_HEADSET_MIC),11000	SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),11001	SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),11002	SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),11003	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */11004	SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),11005	SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),11006	SND_PCI_QUIRK(0x1c6c, 0x122a, "Positivo N14AP7", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),11007	SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),11008	SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),11009	SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),11010	SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),11011	SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),11012	SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),11013	SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),11014	SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),11015	SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),11016	SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),11017	SND_PCI_QUIRK(0x1d05, 0x1387, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),11018	SND_PCI_QUIRK(0x1d05, 0x1409, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),11019	SND_PCI_QUIRK(0x1d17, 0x3288, "Haier Boyue G42", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),11020	SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),11021	SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),11022	SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),11023	SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),11024	SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),11025	SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),11026	SND_PCI_QUIRK(0x2782, 0x0228, "Infinix ZERO BOOK 13", ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13),11027	SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),11028	SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),11029	SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),11030	SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),11031	SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),11032	SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),11033	SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),11034	SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),11035	SND_PCI_QUIRK(0xf111, 0x0009, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),11036 11037#if 011038	/* Below is a quirk table taken from the old code.11039	 * Basically the device should work as is without the fixup table.11040	 * If BIOS doesn't give a proper info, enable the corresponding11041	 * fixup entry.11042	 */11043	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",11044		      ALC269_FIXUP_AMIC),11045	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),11046	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),11047	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),11048	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),11049	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),11050	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),11051	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),11052	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),11053	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),11054	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),11055	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),11056	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),11057	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),11058	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),11059	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),11060	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),11061	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),11062	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),11063	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),11064	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),11065	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),11066	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),11067	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),11068	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),11069	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),11070	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),11071	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),11072	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),11073	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),11074	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),11075	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),11076	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),11077	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),11078	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),11079	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),11080	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),11081	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),11082	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),11083	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),11084#endif11085	{}11086};11087 11088static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {11089	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),11090	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),11091	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),11092	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),11093	SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),11094	{}11095};11096 11097static const struct hda_model_fixup alc269_fixup_models[] = {11098	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},11099	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},11100	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},11101	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},11102	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},11103	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},11104	{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},11105	{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},11106	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},11107	{.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},11108	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},11109	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},11110	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},11111	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},11112	{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},11113	{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},11114	{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET, .name = "dell-headset4-quiet"},11115	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},11116	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},11117	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},11118	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},11119	{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},11120	{.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},11121	{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},11122	{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},11123	{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},11124	{.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},11125	{.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},11126	{.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},11127	{.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},11128	{.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},11129	{.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},11130	{.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},11131	{.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},11132	{.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},11133	{.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},11134	{.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},11135	{.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},11136	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},11137	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},11138	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},11139	{.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},11140	{.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},11141	{.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},11142	{.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},11143	{.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},11144	{.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},11145	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},11146	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},11147	{.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},11148	{.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},11149	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},11150	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},11151	{.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},11152	{.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},11153	{.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},11154	{.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},11155	{.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},11156	{.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},11157	{.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},11158	{.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},11159	{.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},11160	{.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},11161	{.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},11162	{.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},11163	{.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},11164	{.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},11165	{.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},11166	{.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},11167	{.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},11168	{.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},11169	{.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},11170	{.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},11171	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},11172	{.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},11173	{.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},11174	{.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},11175	{.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},11176	{.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},11177	{.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},11178	{.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},11179	{.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},11180	{.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},11181	{.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},11182	{.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},11183	{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},11184	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},11185	{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},11186	{.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},11187	{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},11188	{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},11189	{.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},11190	{.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},11191	{.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},11192	{.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},11193	{.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},11194	{.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},11195	{.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},11196	{.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},11197	{.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},11198	{.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},11199	{.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},11200	{.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},11201	{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},11202	{.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},11203	{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},11204	{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},11205	{.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},11206	{.id = ALC256_FIXUP_CHROME_BOOK, .name = "alc-2024y-chromebook"},11207	{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},11208	{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},11209	{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},11210	{.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},11211	{.id = ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS, .name = "alc298-samsung-amp-v2-2-amps"},11212	{.id = ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS, .name = "alc298-samsung-amp-v2-4-amps"},11213	{.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},11214	{.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},11215	{.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},11216	{.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},11217	{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},11218	{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},11219	{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},11220	{.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},11221	{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},11222	{.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},11223	{.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},11224	{.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},11225	{.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},11226	{.id = ALC236_FIXUP_LENOVO_INV_DMIC, .name = "alc236-fixup-lenovo-inv-mic"},11227	{}11228};11229#define ALC225_STANDARD_PINS \11230	{0x21, 0x04211020}11231 11232#define ALC256_STANDARD_PINS \11233	{0x12, 0x90a60140}, \11234	{0x14, 0x90170110}, \11235	{0x21, 0x02211020}11236 11237#define ALC282_STANDARD_PINS \11238	{0x14, 0x90170110}11239 11240#define ALC290_STANDARD_PINS \11241	{0x12, 0x99a30130}11242 11243#define ALC292_STANDARD_PINS \11244	{0x14, 0x90170110}, \11245	{0x15, 0x0221401f}11246 11247#define ALC295_STANDARD_PINS \11248	{0x12, 0xb7a60130}, \11249	{0x14, 0x90170110}, \11250	{0x21, 0x04211020}11251 11252#define ALC298_STANDARD_PINS \11253	{0x12, 0x90a60130}, \11254	{0x21, 0x03211020}11255 11256static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {11257	SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,11258		{0x14, 0x01014020},11259		{0x17, 0x90170110},11260		{0x18, 0x02a11030},11261		{0x19, 0x0181303F},11262		{0x21, 0x0221102f}),11263	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,11264		{0x12, 0x90a601c0},11265		{0x14, 0x90171120},11266		{0x21, 0x02211030}),11267	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,11268		{0x14, 0x90170110},11269		{0x1b, 0x90a70130},11270		{0x21, 0x03211020}),11271	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,11272		{0x1a, 0x90a70130},11273		{0x1b, 0x90170110},11274		{0x21, 0x03211020}),11275	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,11276		ALC225_STANDARD_PINS,11277		{0x12, 0xb7a60130},11278		{0x14, 0x901701a0}),11279	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,11280		ALC225_STANDARD_PINS,11281		{0x12, 0xb7a60130},11282		{0x14, 0x901701b0}),11283	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,11284		ALC225_STANDARD_PINS,11285		{0x12, 0xb7a60150},11286		{0x14, 0x901701a0}),11287	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,11288		ALC225_STANDARD_PINS,11289		{0x12, 0xb7a60150},11290		{0x14, 0x901701b0}),11291	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,11292		ALC225_STANDARD_PINS,11293		{0x12, 0xb7a60130},11294		{0x1b, 0x90170110}),11295	SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,11296		{0x1b, 0x01111010},11297		{0x1e, 0x01451130},11298		{0x21, 0x02211020}),11299	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,11300		{0x12, 0x90a60140},11301		{0x14, 0x90170110},11302		{0x19, 0x02a11030},11303		{0x21, 0x02211020}),11304	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,11305		{0x14, 0x90170110},11306		{0x19, 0x02a11030},11307		{0x1a, 0x02a11040},11308		{0x1b, 0x01014020},11309		{0x21, 0x0221101f}),11310	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,11311		{0x14, 0x90170110},11312		{0x19, 0x02a11030},11313		{0x1a, 0x02a11040},11314		{0x1b, 0x01011020},11315		{0x21, 0x0221101f}),11316	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,11317		{0x14, 0x90170110},11318		{0x19, 0x02a11020},11319		{0x1a, 0x02a11030},11320		{0x21, 0x0221101f}),11321	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,11322		{0x21, 0x02211010}),11323	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,11324		{0x14, 0x90170110},11325		{0x19, 0x02a11020},11326		{0x21, 0x02211030}),11327	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,11328		{0x14, 0x90170110},11329		{0x21, 0x02211020}),11330	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11331		{0x14, 0x90170130},11332		{0x21, 0x02211040}),11333	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11334		{0x12, 0x90a60140},11335		{0x14, 0x90170110},11336		{0x21, 0x02211020}),11337	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11338		{0x12, 0x90a60160},11339		{0x14, 0x90170120},11340		{0x21, 0x02211030}),11341	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11342		{0x14, 0x90170110},11343		{0x1b, 0x02011020},11344		{0x21, 0x0221101f}),11345	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11346		{0x14, 0x90170110},11347		{0x1b, 0x01011020},11348		{0x21, 0x0221101f}),11349	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11350		{0x14, 0x90170130},11351		{0x1b, 0x01014020},11352		{0x21, 0x0221103f}),11353	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11354		{0x14, 0x90170130},11355		{0x1b, 0x01011020},11356		{0x21, 0x0221103f}),11357	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11358		{0x14, 0x90170130},11359		{0x1b, 0x02011020},11360		{0x21, 0x0221103f}),11361	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11362		{0x14, 0x90170150},11363		{0x1b, 0x02011020},11364		{0x21, 0x0221105f}),11365	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11366		{0x14, 0x90170110},11367		{0x1b, 0x01014020},11368		{0x21, 0x0221101f}),11369	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11370		{0x12, 0x90a60160},11371		{0x14, 0x90170120},11372		{0x17, 0x90170140},11373		{0x21, 0x0321102f}),11374	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11375		{0x12, 0x90a60160},11376		{0x14, 0x90170130},11377		{0x21, 0x02211040}),11378	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11379		{0x12, 0x90a60160},11380		{0x14, 0x90170140},11381		{0x21, 0x02211050}),11382	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11383		{0x12, 0x90a60170},11384		{0x14, 0x90170120},11385		{0x21, 0x02211030}),11386	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11387		{0x12, 0x90a60170},11388		{0x14, 0x90170130},11389		{0x21, 0x02211040}),11390	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11391		{0x12, 0x90a60170},11392		{0x14, 0x90171130},11393		{0x21, 0x02211040}),11394	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11395		{0x12, 0x90a60170},11396		{0x14, 0x90170140},11397		{0x21, 0x02211050}),11398	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11399		{0x12, 0x90a60180},11400		{0x14, 0x90170130},11401		{0x21, 0x02211040}),11402	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11403		{0x12, 0x90a60180},11404		{0x14, 0x90170120},11405		{0x21, 0x02211030}),11406	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11407		{0x1b, 0x01011020},11408		{0x21, 0x02211010}),11409	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,11410		{0x14, 0x90170110},11411		{0x1b, 0x90a70130},11412		{0x21, 0x04211020}),11413	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,11414		{0x14, 0x90170110},11415		{0x1b, 0x90a70130},11416		{0x21, 0x03211020}),11417	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,11418		{0x12, 0x90a60130},11419		{0x14, 0x90170110},11420		{0x21, 0x03211020}),11421	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,11422		{0x12, 0x90a60130},11423		{0x14, 0x90170110},11424		{0x21, 0x04211020}),11425	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,11426		{0x1a, 0x90a70130},11427		{0x1b, 0x90170110},11428		{0x21, 0x03211020}),11429       SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,11430		{0x14, 0x90170110},11431		{0x19, 0x02a11020},11432		{0x21, 0x0221101f}),11433       SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,11434		{0x17, 0x90170110},11435		{0x19, 0x03a11030},11436		{0x21, 0x03211020}),11437	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,11438		{0x12, 0x90a60130},11439		{0x14, 0x90170110},11440		{0x15, 0x0421101f},11441		{0x1a, 0x04a11020}),11442	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,11443		{0x12, 0x90a60140},11444		{0x14, 0x90170110},11445		{0x15, 0x0421101f},11446		{0x18, 0x02811030},11447		{0x1a, 0x04a1103f},11448		{0x1b, 0x02011020}),11449	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,11450		ALC282_STANDARD_PINS,11451		{0x12, 0x99a30130},11452		{0x19, 0x03a11020},11453		{0x21, 0x0321101f}),11454	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11455		ALC282_STANDARD_PINS,11456		{0x12, 0x99a30130},11457		{0x19, 0x03a11020},11458		{0x21, 0x03211040}),11459	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11460		ALC282_STANDARD_PINS,11461		{0x12, 0x99a30130},11462		{0x19, 0x03a11030},11463		{0x21, 0x03211020}),11464	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11465		ALC282_STANDARD_PINS,11466		{0x12, 0x99a30130},11467		{0x19, 0x04a11020},11468		{0x21, 0x0421101f}),11469	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,11470		ALC282_STANDARD_PINS,11471		{0x12, 0x90a60140},11472		{0x19, 0x04a11030},11473		{0x21, 0x04211020}),11474	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,11475		ALC282_STANDARD_PINS,11476		{0x12, 0x90a609c0},11477		{0x18, 0x03a11830},11478		{0x19, 0x04a19831},11479		{0x1a, 0x0481303f},11480		{0x1b, 0x04211020},11481		{0x21, 0x0321101f}),11482	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,11483		ALC282_STANDARD_PINS,11484		{0x12, 0x90a60940},11485		{0x18, 0x03a11830},11486		{0x19, 0x04a19831},11487		{0x1a, 0x0481303f},11488		{0x1b, 0x04211020},11489		{0x21, 0x0321101f}),11490	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,11491		ALC282_STANDARD_PINS,11492		{0x12, 0x90a60130},11493		{0x21, 0x0321101f}),11494	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,11495		{0x12, 0x90a60160},11496		{0x14, 0x90170120},11497		{0x21, 0x02211030}),11498	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,11499		ALC282_STANDARD_PINS,11500		{0x12, 0x90a60130},11501		{0x19, 0x03a11020},11502		{0x21, 0x0321101f}),11503	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,11504		{0x12, 0x90a60130},11505		{0x14, 0x90170110},11506		{0x19, 0x04a11040},11507		{0x21, 0x04211020}),11508	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,11509		{0x14, 0x90170110},11510		{0x19, 0x04a11040},11511		{0x1d, 0x40600001},11512		{0x21, 0x04211020}),11513	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,11514		{0x14, 0x90170110},11515		{0x19, 0x04a11040},11516		{0x21, 0x04211020}),11517	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,11518		{0x14, 0x90170110},11519		{0x17, 0x90170111},11520		{0x19, 0x03a11030},11521		{0x21, 0x03211020}),11522	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,11523		{0x17, 0x90170110},11524		{0x19, 0x03a11030},11525		{0x21, 0x03211020}),11526	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,11527		{0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */11528		{0x19, 0x04a11040},11529		{0x21, 0x04211020}),11530	SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,11531		{0x12, 0x90a60130},11532		{0x17, 0x90170110},11533		{0x21, 0x02211020}),11534	SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,11535		{0x12, 0x90a60120},11536		{0x14, 0x90170110},11537		{0x21, 0x0321101f}),11538	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11539		ALC290_STANDARD_PINS,11540		{0x15, 0x04211040},11541		{0x18, 0x90170112},11542		{0x1a, 0x04a11020}),11543	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11544		ALC290_STANDARD_PINS,11545		{0x15, 0x04211040},11546		{0x18, 0x90170110},11547		{0x1a, 0x04a11020}),11548	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11549		ALC290_STANDARD_PINS,11550		{0x15, 0x0421101f},11551		{0x1a, 0x04a11020}),11552	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11553		ALC290_STANDARD_PINS,11554		{0x15, 0x04211020},11555		{0x1a, 0x04a11040}),11556	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11557		ALC290_STANDARD_PINS,11558		{0x14, 0x90170110},11559		{0x15, 0x04211020},11560		{0x1a, 0x04a11040}),11561	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11562		ALC290_STANDARD_PINS,11563		{0x14, 0x90170110},11564		{0x15, 0x04211020},11565		{0x1a, 0x04a11020}),11566	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,11567		ALC290_STANDARD_PINS,11568		{0x14, 0x90170110},11569		{0x15, 0x0421101f},11570		{0x1a, 0x04a11020}),11571	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,11572		ALC292_STANDARD_PINS,11573		{0x12, 0x90a60140},11574		{0x16, 0x01014020},11575		{0x19, 0x01a19030}),11576	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,11577		ALC292_STANDARD_PINS,11578		{0x12, 0x90a60140},11579		{0x16, 0x01014020},11580		{0x18, 0x02a19031},11581		{0x19, 0x01a1903e}),11582	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,11583		ALC292_STANDARD_PINS,11584		{0x12, 0x90a60140}),11585	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,11586		ALC292_STANDARD_PINS,11587		{0x13, 0x90a60140},11588		{0x16, 0x21014020},11589		{0x19, 0x21a19030}),11590	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,11591		ALC292_STANDARD_PINS,11592		{0x13, 0x90a60140}),11593	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,11594		{0x17, 0x90170110},11595		{0x21, 0x04211020}),11596	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,11597		{0x14, 0x90170110},11598		{0x1b, 0x90a70130},11599		{0x21, 0x04211020}),11600	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,11601		{0x12, 0x90a60130},11602		{0x17, 0x90170110},11603		{0x21, 0x03211020}),11604	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,11605		{0x12, 0x90a60130},11606		{0x17, 0x90170110},11607		{0x21, 0x04211020}),11608	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,11609		{0x12, 0x90a60130},11610		{0x17, 0x90170110},11611		{0x21, 0x03211020}),11612	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,11613		{0x12, 0x90a60120},11614		{0x17, 0x90170110},11615		{0x21, 0x04211030}),11616	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,11617		{0x12, 0x90a60130},11618		{0x17, 0x90170110},11619		{0x21, 0x03211020}),11620	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,11621		{0x12, 0x90a60130},11622		{0x17, 0x90170110},11623		{0x21, 0x03211020}),11624	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,11625		ALC298_STANDARD_PINS,11626		{0x17, 0x90170110}),11627	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,11628		ALC298_STANDARD_PINS,11629		{0x17, 0x90170140}),11630	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,11631		ALC298_STANDARD_PINS,11632		{0x17, 0x90170150}),11633	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,11634		{0x12, 0xb7a60140},11635		{0x13, 0xb7a60150},11636		{0x17, 0x90170110},11637		{0x1a, 0x03011020},11638		{0x21, 0x03211030}),11639	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,11640		{0x12, 0xb7a60140},11641		{0x17, 0x90170110},11642		{0x1a, 0x03a11030},11643		{0x21, 0x03211020}),11644	SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,11645		ALC225_STANDARD_PINS,11646		{0x12, 0xb7a60130},11647		{0x17, 0x90170110}),11648	SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,11649		{0x14, 0x01014010},11650		{0x17, 0x90170120},11651		{0x18, 0x02a11030},11652		{0x19, 0x02a1103f},11653		{0x21, 0x0221101f}),11654	{}11655};11656 11657/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match11658 * more machines, don't need to match all valid pins, just need to match11659 * all the pins defined in the tbl. Just because of this reason, it is possible11660 * that a single machine matches multiple tbls, so there is one limitation:11661 *   at most one tbl is allowed to define for the same vendor and same codec11662 */11663static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {11664	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1025, "Acer", ALC2XX_FIXUP_HEADSET_MIC,11665		{0x19, 0x40000000}),11666	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,11667		{0x19, 0x40000000},11668		{0x1b, 0x40000000}),11669	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,11670		{0x19, 0x40000000},11671		{0x1b, 0x40000000}),11672	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,11673		{0x19, 0x40000000},11674		{0x1a, 0x40000000}),11675	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,11676		{0x19, 0x40000000},11677		{0x1a, 0x40000000}),11678	SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,11679		{0x19, 0x40000000},11680		{0x1a, 0x40000000}),11681	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,11682		{0x19, 0x40000000}),11683	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1558, "Clevo", ALC2XX_FIXUP_HEADSET_MIC,11684		{0x19, 0x40000000}),11685	{}11686};11687 11688static void alc269_fill_coef(struct hda_codec *codec)11689{11690	struct alc_spec *spec = codec->spec;11691	int val;11692 11693	if (spec->codec_variant != ALC269_TYPE_ALC269VB)11694		return;11695 11696	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {11697		alc_write_coef_idx(codec, 0xf, 0x960b);11698		alc_write_coef_idx(codec, 0xe, 0x8817);11699	}11700 11701	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {11702		alc_write_coef_idx(codec, 0xf, 0x960b);11703		alc_write_coef_idx(codec, 0xe, 0x8814);11704	}11705 11706	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {11707		/* Power up output pin */11708		alc_update_coef_idx(codec, 0x04, 0, 1<<11);11709	}11710 11711	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {11712		val = alc_read_coef_idx(codec, 0xd);11713		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {11714			/* Capless ramp up clock control */11715			alc_write_coef_idx(codec, 0xd, val | (1<<10));11716		}11717		val = alc_read_coef_idx(codec, 0x17);11718		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {11719			/* Class D power on reset */11720			alc_write_coef_idx(codec, 0x17, val | (1<<7));11721		}11722	}11723 11724	/* HP */11725	alc_update_coef_idx(codec, 0x4, 0, 1<<11);11726}11727 11728/*11729 */11730static int patch_alc269(struct hda_codec *codec)11731{11732	struct alc_spec *spec;11733	int err;11734 11735	err = alc_alloc_spec(codec, 0x0b);11736	if (err < 0)11737		return err;11738 11739	spec = codec->spec;11740	spec->gen.shared_mic_vref_pin = 0x18;11741	codec->power_save_node = 0;11742	spec->en_3kpull_low = true;11743 11744	codec->patch_ops.suspend = alc269_suspend;11745	codec->patch_ops.resume = alc269_resume;11746	spec->shutup = alc_default_shutup;11747	spec->init_hook = alc_default_init;11748 11749	switch (codec->core.vendor_id) {11750	case 0x10ec0269:11751		spec->codec_variant = ALC269_TYPE_ALC269VA;11752		switch (alc_get_coef0(codec) & 0x00f0) {11753		case 0x0010:11754			if (codec->bus->pci &&11755			    codec->bus->pci->subsystem_vendor == 0x1025 &&11756			    spec->cdefine.platform_type == 1)11757				err = alc_codec_rename(codec, "ALC271X");11758			spec->codec_variant = ALC269_TYPE_ALC269VB;11759			break;11760		case 0x0020:11761			if (codec->bus->pci &&11762			    codec->bus->pci->subsystem_vendor == 0x17aa &&11763			    codec->bus->pci->subsystem_device == 0x21f3)11764				err = alc_codec_rename(codec, "ALC3202");11765			spec->codec_variant = ALC269_TYPE_ALC269VC;11766			break;11767		case 0x0030:11768			spec->codec_variant = ALC269_TYPE_ALC269VD;11769			break;11770		default:11771			alc_fix_pll_init(codec, 0x20, 0x04, 15);11772		}11773		if (err < 0)11774			goto error;11775		spec->shutup = alc269_shutup;11776		spec->init_hook = alc269_fill_coef;11777		alc269_fill_coef(codec);11778		break;11779 11780	case 0x10ec0280:11781	case 0x10ec0290:11782		spec->codec_variant = ALC269_TYPE_ALC280;11783		break;11784	case 0x10ec0282:11785		spec->codec_variant = ALC269_TYPE_ALC282;11786		spec->shutup = alc282_shutup;11787		spec->init_hook = alc282_init;11788		break;11789	case 0x10ec0233:11790	case 0x10ec0283:11791		spec->codec_variant = ALC269_TYPE_ALC283;11792		spec->shutup = alc283_shutup;11793		spec->init_hook = alc283_init;11794		break;11795	case 0x10ec0284:11796	case 0x10ec0292:11797		spec->codec_variant = ALC269_TYPE_ALC284;11798		break;11799	case 0x10ec0293:11800		spec->codec_variant = ALC269_TYPE_ALC293;11801		break;11802	case 0x10ec0286:11803	case 0x10ec0288:11804		spec->codec_variant = ALC269_TYPE_ALC286;11805		break;11806	case 0x10ec0298:11807		spec->codec_variant = ALC269_TYPE_ALC298;11808		break;11809	case 0x10ec0235:11810	case 0x10ec0255:11811		spec->codec_variant = ALC269_TYPE_ALC255;11812		spec->shutup = alc256_shutup;11813		spec->init_hook = alc256_init;11814		break;11815	case 0x10ec0230:11816	case 0x10ec0236:11817	case 0x10ec0256:11818	case 0x19e58326:11819		spec->codec_variant = ALC269_TYPE_ALC256;11820		spec->shutup = alc256_shutup;11821		spec->init_hook = alc256_init;11822		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */11823		if (codec->core.vendor_id == 0x10ec0236 &&11824		    codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)11825			spec->en_3kpull_low = false;11826		break;11827	case 0x10ec0257:11828		spec->codec_variant = ALC269_TYPE_ALC257;11829		spec->shutup = alc256_shutup;11830		spec->init_hook = alc256_init;11831		spec->gen.mixer_nid = 0;11832		spec->en_3kpull_low = false;11833		break;11834	case 0x10ec0215:11835	case 0x10ec0245:11836	case 0x10ec0285:11837	case 0x10ec0289:11838		if (alc_get_coef0(codec) & 0x0010)11839			spec->codec_variant = ALC269_TYPE_ALC245;11840		else11841			spec->codec_variant = ALC269_TYPE_ALC215;11842		spec->shutup = alc225_shutup;11843		spec->init_hook = alc225_init;11844		spec->gen.mixer_nid = 0;11845		break;11846	case 0x10ec0225:11847	case 0x10ec0295:11848	case 0x10ec0299:11849		spec->codec_variant = ALC269_TYPE_ALC225;11850		spec->shutup = alc225_shutup;11851		spec->init_hook = alc225_init;11852		spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */11853		break;11854	case 0x10ec0287:11855		spec->codec_variant = ALC269_TYPE_ALC287;11856		spec->shutup = alc225_shutup;11857		spec->init_hook = alc225_init;11858		spec->gen.mixer_nid = 0; /* no loopback on ALC287 */11859		break;11860	case 0x10ec0234:11861	case 0x10ec0274:11862	case 0x10ec0294:11863		spec->codec_variant = ALC269_TYPE_ALC294;11864		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */11865		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */11866		spec->init_hook = alc294_init;11867		break;11868	case 0x10ec0300:11869		spec->codec_variant = ALC269_TYPE_ALC300;11870		spec->gen.mixer_nid = 0; /* no loopback on ALC300 */11871		break;11872	case 0x10ec0623:11873		spec->codec_variant = ALC269_TYPE_ALC623;11874		break;11875	case 0x10ec0700:11876	case 0x10ec0701:11877	case 0x10ec0703:11878	case 0x10ec0711:11879		spec->codec_variant = ALC269_TYPE_ALC700;11880		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */11881		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */11882		spec->init_hook = alc294_init;11883		break;11884 11885	}11886 11887	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {11888		spec->has_alc5505_dsp = 1;11889		spec->init_hook = alc5505_dsp_init;11890	}11891 11892	alc_pre_init(codec);11893 11894	snd_hda_pick_fixup(codec, alc269_fixup_models,11895		       alc269_fixup_tbl, alc269_fixups);11896	/* FIXME: both TX300 and ROG Strix G17 have the same SSID, and11897	 * the quirk breaks the latter (bko#214101).11898	 * Clear the wrong entry.11899	 */11900	if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&11901	    codec->core.vendor_id == 0x10ec0294) {11902		codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");11903		codec->fixup_id = HDA_FIXUP_ID_NOT_SET;11904	}11905 11906	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);11907	snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);11908	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,11909			   alc269_fixups);11910 11911	/*11912	 * Check whether ACPI describes companion amplifiers that require11913	 * component binding11914	 */11915	find_cirrus_companion_amps(codec);11916 11917	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);11918 11919	alc_auto_parse_customize_define(codec);11920 11921	if (has_cdefine_beep(codec))11922		spec->gen.beep_nid = 0x01;11923 11924	/* automatic parse from the BIOS config */11925	err = alc269_parse_auto_config(codec);11926	if (err < 0)11927		goto error;11928 11929	if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {11930		err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);11931		if (err < 0)11932			goto error;11933	}11934 11935	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);11936 11937	return 0;11938 11939 error:11940	alc_free(codec);11941	return err;11942}11943 11944/*11945 * ALC86111946 */11947 11948static int alc861_parse_auto_config(struct hda_codec *codec)11949{11950	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };11951	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };11952	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);11953}11954 11955/* Pin config fixes */11956enum {11957	ALC861_FIXUP_FSC_AMILO_PI1505,11958	ALC861_FIXUP_AMP_VREF_0F,11959	ALC861_FIXUP_NO_JACK_DETECT,11960	ALC861_FIXUP_ASUS_A6RP,11961	ALC660_FIXUP_ASUS_W7J,11962};11963 11964/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */11965static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,11966			const struct hda_fixup *fix, int action)11967{11968	struct alc_spec *spec = codec->spec;11969	unsigned int val;11970 11971	if (action != HDA_FIXUP_ACT_INIT)11972		return;11973	val = snd_hda_codec_get_pin_target(codec, 0x0f);11974	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))11975		val |= AC_PINCTL_IN_EN;11976	val |= AC_PINCTL_VREF_50;11977	snd_hda_set_pin_ctl(codec, 0x0f, val);11978	spec->gen.keep_vref_in_automute = 1;11979}11980 11981/* suppress the jack-detection */11982static void alc_fixup_no_jack_detect(struct hda_codec *codec,11983				     const struct hda_fixup *fix, int action)11984{11985	if (action == HDA_FIXUP_ACT_PRE_PROBE)11986		codec->no_jack_detect = 1;11987}11988 11989static const struct hda_fixup alc861_fixups[] = {11990	[ALC861_FIXUP_FSC_AMILO_PI1505] = {11991		.type = HDA_FIXUP_PINS,11992		.v.pins = (const struct hda_pintbl[]) {11993			{ 0x0b, 0x0221101f }, /* HP */11994			{ 0x0f, 0x90170310 }, /* speaker */11995			{ }11996		}11997	},11998	[ALC861_FIXUP_AMP_VREF_0F] = {11999		.type = HDA_FIXUP_FUNC,12000		.v.func = alc861_fixup_asus_amp_vref_0f,12001	},12002	[ALC861_FIXUP_NO_JACK_DETECT] = {12003		.type = HDA_FIXUP_FUNC,12004		.v.func = alc_fixup_no_jack_detect,12005	},12006	[ALC861_FIXUP_ASUS_A6RP] = {12007		.type = HDA_FIXUP_FUNC,12008		.v.func = alc861_fixup_asus_amp_vref_0f,12009		.chained = true,12010		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,12011	},12012	[ALC660_FIXUP_ASUS_W7J] = {12013		.type = HDA_FIXUP_VERBS,12014		.v.verbs = (const struct hda_verb[]) {12015			/* ASUS W7J needs a magic pin setup on unused NID 0x1012016			 * for enabling outputs12017			 */12018			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},12019			{ }12020		},12021	}12022};12023 12024static const struct snd_pci_quirk alc861_fixup_tbl[] = {12025	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),12026	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),12027	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),12028	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),12029	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),12030	SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),12031	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),12032	{}12033};12034 12035/*12036 */12037static int patch_alc861(struct hda_codec *codec)12038{12039	struct alc_spec *spec;12040	int err;12041 12042	err = alc_alloc_spec(codec, 0x15);12043	if (err < 0)12044		return err;12045 12046	spec = codec->spec;12047	if (has_cdefine_beep(codec))12048		spec->gen.beep_nid = 0x23;12049 12050	spec->power_hook = alc_power_eapd;12051 12052	alc_pre_init(codec);12053 12054	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);12055	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);12056 12057	/* automatic parse from the BIOS config */12058	err = alc861_parse_auto_config(codec);12059	if (err < 0)12060		goto error;12061 12062	if (!spec->gen.no_analog) {12063		err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);12064		if (err < 0)12065			goto error;12066	}12067 12068	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);12069 12070	return 0;12071 12072 error:12073	alc_free(codec);12074	return err;12075}12076 12077/*12078 * ALC861-VD support12079 *12080 * Based on ALC88212081 *12082 * In addition, an independent DAC12083 */12084static int alc861vd_parse_auto_config(struct hda_codec *codec)12085{12086	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };12087	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };12088	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);12089}12090 12091enum {12092	ALC660VD_FIX_ASUS_GPIO1,12093	ALC861VD_FIX_DALLAS,12094};12095 12096/* exclude VREF80 */12097static void alc861vd_fixup_dallas(struct hda_codec *codec,12098				  const struct hda_fixup *fix, int action)12099{12100	if (action == HDA_FIXUP_ACT_PRE_PROBE) {12101		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);12102		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);12103	}12104}12105 12106/* reset GPIO1 */12107static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,12108				      const struct hda_fixup *fix, int action)12109{12110	struct alc_spec *spec = codec->spec;12111 12112	if (action == HDA_FIXUP_ACT_PRE_PROBE)12113		spec->gpio_mask |= 0x02;12114	alc_fixup_gpio(codec, action, 0x01);12115}12116 12117static const struct hda_fixup alc861vd_fixups[] = {12118	[ALC660VD_FIX_ASUS_GPIO1] = {12119		.type = HDA_FIXUP_FUNC,12120		.v.func = alc660vd_fixup_asus_gpio1,12121	},12122	[ALC861VD_FIX_DALLAS] = {12123		.type = HDA_FIXUP_FUNC,12124		.v.func = alc861vd_fixup_dallas,12125	},12126};12127 12128static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {12129	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),12130	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),12131	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),12132	{}12133};12134 12135/*12136 */12137static int patch_alc861vd(struct hda_codec *codec)12138{12139	struct alc_spec *spec;12140	int err;12141 12142	err = alc_alloc_spec(codec, 0x0b);12143	if (err < 0)12144		return err;12145 12146	spec = codec->spec;12147	if (has_cdefine_beep(codec))12148		spec->gen.beep_nid = 0x23;12149 12150	spec->shutup = alc_eapd_shutup;12151 12152	alc_pre_init(codec);12153 12154	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);12155	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);12156 12157	/* automatic parse from the BIOS config */12158	err = alc861vd_parse_auto_config(codec);12159	if (err < 0)12160		goto error;12161 12162	if (!spec->gen.no_analog) {12163		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);12164		if (err < 0)12165			goto error;12166	}12167 12168	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);12169 12170	return 0;12171 12172 error:12173	alc_free(codec);12174	return err;12175}12176 12177/*12178 * ALC662 support12179 *12180 * ALC662 is almost identical with ALC880 but has cleaner and more flexible12181 * configuration.  Each pin widget can choose any input DACs and a mixer.12182 * Each ADC is connected from a mixer of all inputs.  This makes possible12183 * 6-channel independent captures.12184 *12185 * In addition, an independent DAC for the multi-playback (not used in this12186 * driver yet).12187 */12188 12189/*12190 * BIOS auto configuration12191 */12192 12193static int alc662_parse_auto_config(struct hda_codec *codec)12194{12195	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };12196	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };12197	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };12198	const hda_nid_t *ssids;12199 12200	if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||12201	    codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||12202	    codec->core.vendor_id == 0x10ec0671)12203		ssids = alc663_ssids;12204	else12205		ssids = alc662_ssids;12206	return alc_parse_auto_config(codec, alc662_ignore, ssids);12207}12208 12209static void alc272_fixup_mario(struct hda_codec *codec,12210			       const struct hda_fixup *fix, int action)12211{12212	if (action != HDA_FIXUP_ACT_PRE_PROBE)12213		return;12214	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,12215				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |12216				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |12217				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |12218				      (0 << AC_AMPCAP_MUTE_SHIFT)))12219		codec_warn(codec, "failed to override amp caps for NID 0x2\n");12220}12221 12222static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {12223	{ .channels = 2,12224	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },12225	{ .channels = 4,12226	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,12227		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */12228	{ }12229};12230 12231/* override the 2.1 chmap */12232static void alc_fixup_bass_chmap(struct hda_codec *codec,12233				    const struct hda_fixup *fix, int action)12234{12235	if (action == HDA_FIXUP_ACT_BUILD) {12236		struct alc_spec *spec = codec->spec;12237		spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;12238	}12239}12240 12241/* avoid D3 for keeping GPIO up */12242static unsigned int gpio_led_power_filter(struct hda_codec *codec,12243					  hda_nid_t nid,12244					  unsigned int power_state)12245{12246	struct alc_spec *spec = codec->spec;12247	if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)12248		return AC_PWRST_D0;12249	return power_state;12250}12251 12252static void alc662_fixup_led_gpio1(struct hda_codec *codec,12253				   const struct hda_fixup *fix, int action)12254{12255	struct alc_spec *spec = codec->spec;12256 12257	alc_fixup_hp_gpio_led(codec, action, 0x01, 0);12258	if (action == HDA_FIXUP_ACT_PRE_PROBE) {12259		spec->mute_led_polarity = 1;12260		codec->power_filter = gpio_led_power_filter;12261	}12262}12263 12264static void alc662_usi_automute_hook(struct hda_codec *codec,12265					 struct hda_jack_callback *jack)12266{12267	struct alc_spec *spec = codec->spec;12268	int vref;12269	msleep(200);12270	snd_hda_gen_hp_automute(codec, jack);12271 12272	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;12273	msleep(100);12274	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,12275			    vref);12276}12277 12278static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,12279				     const struct hda_fixup *fix, int action)12280{12281	struct alc_spec *spec = codec->spec;12282	if (action == HDA_FIXUP_ACT_PRE_PROBE) {12283		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;12284		spec->gen.hp_automute_hook = alc662_usi_automute_hook;12285	}12286}12287 12288static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,12289					struct hda_jack_callback *cb)12290{12291	/* surround speakers at 0x1b already get muted automatically when12292	 * headphones are plugged in, but we have to mute/unmute the remaining12293	 * channels manually:12294	 * 0x15 - front left/front right12295	 * 0x18 - front center/ LFE12296	 */12297	if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {12298		snd_hda_set_pin_ctl_cache(codec, 0x15, 0);12299		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);12300	} else {12301		snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);12302		snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);12303	}12304}12305 12306static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,12307					const struct hda_fixup *fix, int action)12308{12309    /* Pin 0x1b: shared headphones jack and surround speakers */12310	if (!is_jack_detectable(codec, 0x1b))12311		return;12312 12313	switch (action) {12314	case HDA_FIXUP_ACT_PRE_PROBE:12315		snd_hda_jack_detect_enable_callback(codec, 0x1b,12316				alc662_aspire_ethos_mute_speakers);12317		/* subwoofer needs an extra GPIO setting to become audible */12318		alc_setup_gpio(codec, 0x02);12319		break;12320	case HDA_FIXUP_ACT_INIT:12321		/* Make sure to start in a correct state, i.e. if12322		 * headphones have been plugged in before powering up the system12323		 */12324		alc662_aspire_ethos_mute_speakers(codec, NULL);12325		break;12326	}12327}12328 12329static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,12330					     const struct hda_fixup *fix, int action)12331{12332	struct alc_spec *spec = codec->spec;12333 12334	static const struct hda_pintbl pincfgs[] = {12335		{ 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */12336		{ 0x1b, 0x0181304f },12337		{ }12338	};12339 12340	switch (action) {12341	case HDA_FIXUP_ACT_PRE_PROBE:12342		spec->gen.mixer_nid = 0;12343		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;12344		snd_hda_apply_pincfgs(codec, pincfgs);12345		break;12346	case HDA_FIXUP_ACT_INIT:12347		alc_write_coef_idx(codec, 0x19, 0xa054);12348		break;12349	}12350}12351 12352static void alc897_hp_automute_hook(struct hda_codec *codec,12353					 struct hda_jack_callback *jack)12354{12355	struct alc_spec *spec = codec->spec;12356	int vref;12357 12358	snd_hda_gen_hp_automute(codec, jack);12359	vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;12360	snd_hda_set_pin_ctl(codec, 0x1b, vref);12361}12362 12363static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,12364				     const struct hda_fixup *fix, int action)12365{12366	struct alc_spec *spec = codec->spec;12367	if (action == HDA_FIXUP_ACT_PRE_PROBE) {12368		spec->gen.hp_automute_hook = alc897_hp_automute_hook;12369		spec->no_shutup_pins = 1;12370	}12371	if (action == HDA_FIXUP_ACT_PROBE) {12372		snd_hda_set_pin_ctl_cache(codec, 0x1a, PIN_IN | AC_PINCTL_VREF_100);12373	}12374}12375 12376static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,12377				     const struct hda_fixup *fix, int action)12378{12379	struct alc_spec *spec = codec->spec;12380 12381	if (action == HDA_FIXUP_ACT_PRE_PROBE) {12382		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;12383		spec->gen.hp_automute_hook = alc897_hp_automute_hook;12384	}12385}12386 12387static const struct coef_fw alc668_coefs[] = {12388	WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),12389	WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),12390	WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),12391	WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),12392	WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),12393	WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),12394	WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),12395	WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),12396	WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),12397	WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),12398	WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),12399	WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),12400	WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),12401	WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),12402	WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),12403	WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),12404	WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),12405	WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),12406	WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),12407	WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),12408	{}12409};12410 12411static void alc668_restore_default_value(struct hda_codec *codec)12412{12413	alc_process_coef_fw(codec, alc668_coefs);12414}12415 12416enum {12417	ALC662_FIXUP_ASPIRE,12418	ALC662_FIXUP_LED_GPIO1,12419	ALC662_FIXUP_IDEAPAD,12420	ALC272_FIXUP_MARIO,12421	ALC662_FIXUP_CZC_ET26,12422	ALC662_FIXUP_CZC_P10T,12423	ALC662_FIXUP_SKU_IGNORE,12424	ALC662_FIXUP_HP_RP5800,12425	ALC662_FIXUP_ASUS_MODE1,12426	ALC662_FIXUP_ASUS_MODE2,12427	ALC662_FIXUP_ASUS_MODE3,12428	ALC662_FIXUP_ASUS_MODE4,12429	ALC662_FIXUP_ASUS_MODE5,12430	ALC662_FIXUP_ASUS_MODE6,12431	ALC662_FIXUP_ASUS_MODE7,12432	ALC662_FIXUP_ASUS_MODE8,12433	ALC662_FIXUP_NO_JACK_DETECT,12434	ALC662_FIXUP_ZOTAC_Z68,12435	ALC662_FIXUP_INV_DMIC,12436	ALC662_FIXUP_DELL_MIC_NO_PRESENCE,12437	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,12438	ALC662_FIXUP_HEADSET_MODE,12439	ALC668_FIXUP_HEADSET_MODE,12440	ALC662_FIXUP_BASS_MODE4_CHMAP,12441	ALC662_FIXUP_BASS_16,12442	ALC662_FIXUP_BASS_1A,12443	ALC662_FIXUP_BASS_CHMAP,12444	ALC668_FIXUP_AUTO_MUTE,12445	ALC668_FIXUP_DELL_DISABLE_AAMIX,12446	ALC668_FIXUP_DELL_XPS13,12447	ALC662_FIXUP_ASUS_Nx50,12448	ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,12449	ALC668_FIXUP_ASUS_Nx51,12450	ALC668_FIXUP_MIC_COEF,12451	ALC668_FIXUP_ASUS_G751,12452	ALC891_FIXUP_HEADSET_MODE,12453	ALC891_FIXUP_DELL_MIC_NO_PRESENCE,12454	ALC662_FIXUP_ACER_VERITON,12455	ALC892_FIXUP_ASROCK_MOBO,12456	ALC662_FIXUP_USI_FUNC,12457	ALC662_FIXUP_USI_HEADSET_MODE,12458	ALC662_FIXUP_LENOVO_MULTI_CODECS,12459	ALC669_FIXUP_ACER_ASPIRE_ETHOS,12460	ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,12461	ALC671_FIXUP_HP_HEADSET_MIC2,12462	ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,12463	ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,12464	ALC668_FIXUP_ASUS_NO_HEADSET_MIC,12465	ALC668_FIXUP_HEADSET_MIC,12466	ALC668_FIXUP_MIC_DET_COEF,12467	ALC897_FIXUP_LENOVO_HEADSET_MIC,12468	ALC897_FIXUP_HEADSET_MIC_PIN,12469	ALC897_FIXUP_HP_HSMIC_VERB,12470	ALC897_FIXUP_LENOVO_HEADSET_MODE,12471	ALC897_FIXUP_HEADSET_MIC_PIN2,12472	ALC897_FIXUP_UNIS_H3C_X500S,12473	ALC897_FIXUP_HEADSET_MIC_PIN3,12474};12475 12476static const struct hda_fixup alc662_fixups[] = {12477	[ALC662_FIXUP_ASPIRE] = {12478		.type = HDA_FIXUP_PINS,12479		.v.pins = (const struct hda_pintbl[]) {12480			{ 0x15, 0x99130112 }, /* subwoofer */12481			{ }12482		}12483	},12484	[ALC662_FIXUP_LED_GPIO1] = {12485		.type = HDA_FIXUP_FUNC,12486		.v.func = alc662_fixup_led_gpio1,12487	},12488	[ALC662_FIXUP_IDEAPAD] = {12489		.type = HDA_FIXUP_PINS,12490		.v.pins = (const struct hda_pintbl[]) {12491			{ 0x17, 0x99130112 }, /* subwoofer */12492			{ }12493		},12494		.chained = true,12495		.chain_id = ALC662_FIXUP_LED_GPIO1,12496	},12497	[ALC272_FIXUP_MARIO] = {12498		.type = HDA_FIXUP_FUNC,12499		.v.func = alc272_fixup_mario,12500	},12501	[ALC662_FIXUP_CZC_ET26] = {12502		.type = HDA_FIXUP_PINS,12503		.v.pins = (const struct hda_pintbl[]) {12504			{0x12, 0x403cc000},12505			{0x14, 0x90170110}, /* speaker */12506			{0x15, 0x411111f0},12507			{0x16, 0x411111f0},12508			{0x18, 0x01a19030}, /* mic */12509			{0x19, 0x90a7013f}, /* int-mic */12510			{0x1a, 0x01014020},12511			{0x1b, 0x0121401f},12512			{0x1c, 0x411111f0},12513			{0x1d, 0x411111f0},12514			{0x1e, 0x40478e35},12515			{}12516		},12517		.chained = true,12518		.chain_id = ALC662_FIXUP_SKU_IGNORE12519	},12520	[ALC662_FIXUP_CZC_P10T] = {12521		.type = HDA_FIXUP_VERBS,12522		.v.verbs = (const struct hda_verb[]) {12523			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},12524			{}12525		}12526	},12527	[ALC662_FIXUP_SKU_IGNORE] = {12528		.type = HDA_FIXUP_FUNC,12529		.v.func = alc_fixup_sku_ignore,12530	},12531	[ALC662_FIXUP_HP_RP5800] = {12532		.type = HDA_FIXUP_PINS,12533		.v.pins = (const struct hda_pintbl[]) {12534			{ 0x14, 0x0221201f }, /* HP out */12535			{ }12536		},12537		.chained = true,12538		.chain_id = ALC662_FIXUP_SKU_IGNORE12539	},12540	[ALC662_FIXUP_ASUS_MODE1] = {12541		.type = HDA_FIXUP_PINS,12542		.v.pins = (const struct hda_pintbl[]) {12543			{ 0x14, 0x99130110 }, /* speaker */12544			{ 0x18, 0x01a19c20 }, /* mic */12545			{ 0x19, 0x99a3092f }, /* int-mic */12546			{ 0x21, 0x0121401f }, /* HP out */12547			{ }12548		},12549		.chained = true,12550		.chain_id = ALC662_FIXUP_SKU_IGNORE12551	},12552	[ALC662_FIXUP_ASUS_MODE2] = {12553		.type = HDA_FIXUP_PINS,12554		.v.pins = (const struct hda_pintbl[]) {12555			{ 0x14, 0x99130110 }, /* speaker */12556			{ 0x18, 0x01a19820 }, /* mic */12557			{ 0x19, 0x99a3092f }, /* int-mic */12558			{ 0x1b, 0x0121401f }, /* HP out */12559			{ }12560		},12561		.chained = true,12562		.chain_id = ALC662_FIXUP_SKU_IGNORE12563	},12564	[ALC662_FIXUP_ASUS_MODE3] = {12565		.type = HDA_FIXUP_PINS,12566		.v.pins = (const struct hda_pintbl[]) {12567			{ 0x14, 0x99130110 }, /* speaker */12568			{ 0x15, 0x0121441f }, /* HP */12569			{ 0x18, 0x01a19840 }, /* mic */12570			{ 0x19, 0x99a3094f }, /* int-mic */12571			{ 0x21, 0x01211420 }, /* HP2 */12572			{ }12573		},12574		.chained = true,12575		.chain_id = ALC662_FIXUP_SKU_IGNORE12576	},12577	[ALC662_FIXUP_ASUS_MODE4] = {12578		.type = HDA_FIXUP_PINS,12579		.v.pins = (const struct hda_pintbl[]) {12580			{ 0x14, 0x99130110 }, /* speaker */12581			{ 0x16, 0x99130111 }, /* speaker */12582			{ 0x18, 0x01a19840 }, /* mic */12583			{ 0x19, 0x99a3094f }, /* int-mic */12584			{ 0x21, 0x0121441f }, /* HP */12585			{ }12586		},12587		.chained = true,12588		.chain_id = ALC662_FIXUP_SKU_IGNORE12589	},12590	[ALC662_FIXUP_ASUS_MODE5] = {12591		.type = HDA_FIXUP_PINS,12592		.v.pins = (const struct hda_pintbl[]) {12593			{ 0x14, 0x99130110 }, /* speaker */12594			{ 0x15, 0x0121441f }, /* HP */12595			{ 0x16, 0x99130111 }, /* speaker */12596			{ 0x18, 0x01a19840 }, /* mic */12597			{ 0x19, 0x99a3094f }, /* int-mic */12598			{ }12599		},12600		.chained = true,12601		.chain_id = ALC662_FIXUP_SKU_IGNORE12602	},12603	[ALC662_FIXUP_ASUS_MODE6] = {12604		.type = HDA_FIXUP_PINS,12605		.v.pins = (const struct hda_pintbl[]) {12606			{ 0x14, 0x99130110 }, /* speaker */12607			{ 0x15, 0x01211420 }, /* HP2 */12608			{ 0x18, 0x01a19840 }, /* mic */12609			{ 0x19, 0x99a3094f }, /* int-mic */12610			{ 0x1b, 0x0121441f }, /* HP */12611			{ }12612		},12613		.chained = true,12614		.chain_id = ALC662_FIXUP_SKU_IGNORE12615	},12616	[ALC662_FIXUP_ASUS_MODE7] = {12617		.type = HDA_FIXUP_PINS,12618		.v.pins = (const struct hda_pintbl[]) {12619			{ 0x14, 0x99130110 }, /* speaker */12620			{ 0x17, 0x99130111 }, /* speaker */12621			{ 0x18, 0x01a19840 }, /* mic */12622			{ 0x19, 0x99a3094f }, /* int-mic */12623			{ 0x1b, 0x01214020 }, /* HP */12624			{ 0x21, 0x0121401f }, /* HP */12625			{ }12626		},12627		.chained = true,12628		.chain_id = ALC662_FIXUP_SKU_IGNORE12629	},12630	[ALC662_FIXUP_ASUS_MODE8] = {12631		.type = HDA_FIXUP_PINS,12632		.v.pins = (const struct hda_pintbl[]) {12633			{ 0x14, 0x99130110 }, /* speaker */12634			{ 0x12, 0x99a30970 }, /* int-mic */12635			{ 0x15, 0x01214020 }, /* HP */12636			{ 0x17, 0x99130111 }, /* speaker */12637			{ 0x18, 0x01a19840 }, /* mic */12638			{ 0x21, 0x0121401f }, /* HP */12639			{ }12640		},12641		.chained = true,12642		.chain_id = ALC662_FIXUP_SKU_IGNORE12643	},12644	[ALC662_FIXUP_NO_JACK_DETECT] = {12645		.type = HDA_FIXUP_FUNC,12646		.v.func = alc_fixup_no_jack_detect,12647	},12648	[ALC662_FIXUP_ZOTAC_Z68] = {12649		.type = HDA_FIXUP_PINS,12650		.v.pins = (const struct hda_pintbl[]) {12651			{ 0x1b, 0x02214020 }, /* Front HP */12652			{ }12653		}12654	},12655	[ALC662_FIXUP_INV_DMIC] = {12656		.type = HDA_FIXUP_FUNC,12657		.v.func = alc_fixup_inv_dmic,12658	},12659	[ALC668_FIXUP_DELL_XPS13] = {12660		.type = HDA_FIXUP_FUNC,12661		.v.func = alc_fixup_dell_xps13,12662		.chained = true,12663		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX12664	},12665	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {12666		.type = HDA_FIXUP_FUNC,12667		.v.func = alc_fixup_disable_aamix,12668		.chained = true,12669		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE12670	},12671	[ALC668_FIXUP_AUTO_MUTE] = {12672		.type = HDA_FIXUP_FUNC,12673		.v.func = alc_fixup_auto_mute_via_amp,12674		.chained = true,12675		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE12676	},12677	[ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {12678		.type = HDA_FIXUP_PINS,12679		.v.pins = (const struct hda_pintbl[]) {12680			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */12681			/* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */12682			{ }12683		},12684		.chained = true,12685		.chain_id = ALC662_FIXUP_HEADSET_MODE12686	},12687	[ALC662_FIXUP_HEADSET_MODE] = {12688		.type = HDA_FIXUP_FUNC,12689		.v.func = alc_fixup_headset_mode_alc662,12690	},12691	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {12692		.type = HDA_FIXUP_PINS,12693		.v.pins = (const struct hda_pintbl[]) {12694			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */12695			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */12696			{ }12697		},12698		.chained = true,12699		.chain_id = ALC668_FIXUP_HEADSET_MODE12700	},12701	[ALC668_FIXUP_HEADSET_MODE] = {12702		.type = HDA_FIXUP_FUNC,12703		.v.func = alc_fixup_headset_mode_alc668,12704	},12705	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {12706		.type = HDA_FIXUP_FUNC,12707		.v.func = alc_fixup_bass_chmap,12708		.chained = true,12709		.chain_id = ALC662_FIXUP_ASUS_MODE412710	},12711	[ALC662_FIXUP_BASS_16] = {12712		.type = HDA_FIXUP_PINS,12713		.v.pins = (const struct hda_pintbl[]) {12714			{0x16, 0x80106111}, /* bass speaker */12715			{}12716		},12717		.chained = true,12718		.chain_id = ALC662_FIXUP_BASS_CHMAP,12719	},12720	[ALC662_FIXUP_BASS_1A] = {12721		.type = HDA_FIXUP_PINS,12722		.v.pins = (const struct hda_pintbl[]) {12723			{0x1a, 0x80106111}, /* bass speaker */12724			{}12725		},12726		.chained = true,12727		.chain_id = ALC662_FIXUP_BASS_CHMAP,12728	},12729	[ALC662_FIXUP_BASS_CHMAP] = {12730		.type = HDA_FIXUP_FUNC,12731		.v.func = alc_fixup_bass_chmap,12732	},12733	[ALC662_FIXUP_ASUS_Nx50] = {12734		.type = HDA_FIXUP_FUNC,12735		.v.func = alc_fixup_auto_mute_via_amp,12736		.chained = true,12737		.chain_id = ALC662_FIXUP_BASS_1A12738	},12739	[ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {12740		.type = HDA_FIXUP_FUNC,12741		.v.func = alc_fixup_headset_mode_alc668,12742		.chain_id = ALC662_FIXUP_BASS_CHMAP12743	},12744	[ALC668_FIXUP_ASUS_Nx51] = {12745		.type = HDA_FIXUP_PINS,12746		.v.pins = (const struct hda_pintbl[]) {12747			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */12748			{ 0x1a, 0x90170151 }, /* bass speaker */12749			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */12750			{}12751		},12752		.chained = true,12753		.chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,12754	},12755	[ALC668_FIXUP_MIC_COEF] = {12756		.type = HDA_FIXUP_VERBS,12757		.v.verbs = (const struct hda_verb[]) {12758			{ 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },12759			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },12760			{}12761		},12762	},12763	[ALC668_FIXUP_ASUS_G751] = {12764		.type = HDA_FIXUP_PINS,12765		.v.pins = (const struct hda_pintbl[]) {12766			{ 0x16, 0x0421101f }, /* HP */12767			{}12768		},12769		.chained = true,12770		.chain_id = ALC668_FIXUP_MIC_COEF12771	},12772	[ALC891_FIXUP_HEADSET_MODE] = {12773		.type = HDA_FIXUP_FUNC,12774		.v.func = alc_fixup_headset_mode,12775	},12776	[ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {12777		.type = HDA_FIXUP_PINS,12778		.v.pins = (const struct hda_pintbl[]) {12779			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */12780			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */12781			{ }12782		},12783		.chained = true,12784		.chain_id = ALC891_FIXUP_HEADSET_MODE12785	},12786	[ALC662_FIXUP_ACER_VERITON] = {12787		.type = HDA_FIXUP_PINS,12788		.v.pins = (const struct hda_pintbl[]) {12789			{ 0x15, 0x50170120 }, /* no internal speaker */12790			{ }12791		}12792	},12793	[ALC892_FIXUP_ASROCK_MOBO] = {12794		.type = HDA_FIXUP_PINS,12795		.v.pins = (const struct hda_pintbl[]) {12796			{ 0x15, 0x40f000f0 }, /* disabled */12797			{ 0x16, 0x40f000f0 }, /* disabled */12798			{ }12799		}12800	},12801	[ALC662_FIXUP_USI_FUNC] = {12802		.type = HDA_FIXUP_FUNC,12803		.v.func = alc662_fixup_usi_headset_mic,12804	},12805	[ALC662_FIXUP_USI_HEADSET_MODE] = {12806		.type = HDA_FIXUP_PINS,12807		.v.pins = (const struct hda_pintbl[]) {12808			{ 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */12809			{ 0x18, 0x01a1903d },12810			{ }12811		},12812		.chained = true,12813		.chain_id = ALC662_FIXUP_USI_FUNC12814	},12815	[ALC662_FIXUP_LENOVO_MULTI_CODECS] = {12816		.type = HDA_FIXUP_FUNC,12817		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,12818	},12819	[ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {12820		.type = HDA_FIXUP_FUNC,12821		.v.func = alc662_fixup_aspire_ethos_hp,12822	},12823	[ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {12824		.type = HDA_FIXUP_PINS,12825		.v.pins = (const struct hda_pintbl[]) {12826			{ 0x15, 0x92130110 }, /* front speakers */12827			{ 0x18, 0x99130111 }, /* center/subwoofer */12828			{ 0x1b, 0x11130012 }, /* surround plus jack for HP */12829			{ }12830		},12831		.chained = true,12832		.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET12833	},12834	[ALC671_FIXUP_HP_HEADSET_MIC2] = {12835		.type = HDA_FIXUP_FUNC,12836		.v.func = alc671_fixup_hp_headset_mic2,12837	},12838	[ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {12839		.type = HDA_FIXUP_PINS,12840		.v.pins = (const struct hda_pintbl[]) {12841			{ 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */12842			{ }12843		},12844		.chained = true,12845		.chain_id = ALC662_FIXUP_USI_FUNC12846	},12847	[ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {12848		.type = HDA_FIXUP_PINS,12849		.v.pins = (const struct hda_pintbl[]) {12850			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */12851			{ 0x1b, 0x0221144f },12852			{ }12853		},12854		.chained = true,12855		.chain_id = ALC662_FIXUP_USI_FUNC12856	},12857	[ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {12858		.type = HDA_FIXUP_PINS,12859		.v.pins = (const struct hda_pintbl[]) {12860			{ 0x1b, 0x04a1112c },12861			{ }12862		},12863		.chained = true,12864		.chain_id = ALC668_FIXUP_HEADSET_MIC12865	},12866	[ALC668_FIXUP_HEADSET_MIC] = {12867		.type = HDA_FIXUP_FUNC,12868		.v.func = alc269_fixup_headset_mic,12869		.chained = true,12870		.chain_id = ALC668_FIXUP_MIC_DET_COEF12871	},12872	[ALC668_FIXUP_MIC_DET_COEF] = {12873		.type = HDA_FIXUP_VERBS,12874		.v.verbs = (const struct hda_verb[]) {12875			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },12876			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },12877			{}12878		},12879	},12880	[ALC897_FIXUP_LENOVO_HEADSET_MIC] = {12881		.type = HDA_FIXUP_FUNC,12882		.v.func = alc897_fixup_lenovo_headset_mic,12883	},12884	[ALC897_FIXUP_HEADSET_MIC_PIN] = {12885		.type = HDA_FIXUP_PINS,12886		.v.pins = (const struct hda_pintbl[]) {12887			{ 0x1a, 0x03a11050 },12888			{ }12889		},12890		.chained = true,12891		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC12892	},12893	[ALC897_FIXUP_HP_HSMIC_VERB] = {12894		.type = HDA_FIXUP_PINS,12895		.v.pins = (const struct hda_pintbl[]) {12896			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */12897			{ }12898		},12899	},12900	[ALC897_FIXUP_LENOVO_HEADSET_MODE] = {12901		.type = HDA_FIXUP_FUNC,12902		.v.func = alc897_fixup_lenovo_headset_mode,12903	},12904	[ALC897_FIXUP_HEADSET_MIC_PIN2] = {12905		.type = HDA_FIXUP_PINS,12906		.v.pins = (const struct hda_pintbl[]) {12907			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */12908			{ }12909		},12910		.chained = true,12911		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE12912	},12913	[ALC897_FIXUP_UNIS_H3C_X500S] = {12914		.type = HDA_FIXUP_VERBS,12915		.v.verbs = (const struct hda_verb[]) {12916			{ 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },12917			{}12918		},12919	},12920	[ALC897_FIXUP_HEADSET_MIC_PIN3] = {12921		.type = HDA_FIXUP_PINS,12922		.v.pins = (const struct hda_pintbl[]) {12923			{ 0x19, 0x03a11050 }, /* use as headset mic */12924			{ }12925		},12926	},12927};12928 12929static const struct snd_pci_quirk alc662_fixup_tbl[] = {12930	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),12931	SND_PCI_QUIRK(0x1019, 0x9859, "JP-IK LEAP W502", ALC897_FIXUP_HEADSET_MIC_PIN3),12932	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),12933	SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),12934	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),12935	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),12936	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),12937	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),12938	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),12939	SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),12940	SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),12941	SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),12942	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12943	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12944	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),12945	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),12946	SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),12947	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12948	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12949	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12950	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12951	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),12952	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),12953	SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),12954	SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),12955	SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),12956	SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),12957	SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),12958	SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),12959	SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),12960	SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),12961	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),12962	SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),12963	SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),12964	SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),12965	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),12966	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),12967	SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),12968	SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),12969	SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),12970	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),12971	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),12972	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),12973	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),12974	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),12975	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),12976	SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),12977	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),12978	SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),12979	SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),12980	SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),12981	SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),12982	SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),12983	SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),12984	SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),12985	SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),12986	SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),12987	SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),12988	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),12989	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),12990	SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),12991	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),12992	SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),12993	SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),12994	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),12995	SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),12996 12997#if 012998	/* Below is a quirk table taken from the old code.12999	 * Basically the device should work as is without the fixup table.13000	 * If BIOS doesn't give a proper info, enable the corresponding13001	 * fixup entry.13002	 */13003	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),13004	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),13005	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),13006	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),13007	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),13008	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13009	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),13010	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),13011	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),13012	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13013	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),13014	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),13015	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),13016	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),13017	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),13018	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13019	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),13020	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),13021	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13022	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),13023	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),13024	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13025	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),13026	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),13027	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),13028	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13029	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),13030	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),13031	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13032	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),13033	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13034	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13035	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),13036	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),13037	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),13038	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),13039	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),13040	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),13041	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),13042	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),13043	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),13044	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),13045	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),13046	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),13047	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),13048	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),13049	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),13050	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),13051	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),13052	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),13053#endif13054	{}13055};13056 13057static const struct hda_model_fixup alc662_fixup_models[] = {13058	{.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},13059	{.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},13060	{.id = ALC272_FIXUP_MARIO, .name = "mario"},13061	{.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},13062	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},13063	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},13064	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},13065	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},13066	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},13067	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},13068	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},13069	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},13070	{.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},13071	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},13072	{.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},13073	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},13074	{.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},13075	{.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},13076	{.id = ALC662_FIXUP_BASS_16, .name = "bass16"},13077	{.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},13078	{.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},13079	{.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},13080	{.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},13081	{.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},13082	{.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},13083	{.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},13084	{.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},13085	{.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},13086	{.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},13087	{.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},13088	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},13089	{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},13090	{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},13091	{}13092};13093 13094static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {13095	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,13096		{0x17, 0x02211010},13097		{0x18, 0x01a19030},13098		{0x1a, 0x01813040},13099		{0x21, 0x01014020}),13100	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,13101		{0x16, 0x01813030},13102		{0x17, 0x02211010},13103		{0x18, 0x01a19040},13104		{0x21, 0x01014020}),13105	SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,13106		{0x14, 0x01014010},13107		{0x18, 0x01a19020},13108		{0x1a, 0x0181302f},13109		{0x1b, 0x0221401f}),13110	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,13111		{0x12, 0x99a30130},13112		{0x14, 0x90170110},13113		{0x15, 0x0321101f},13114		{0x16, 0x03011020}),13115	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,13116		{0x12, 0x99a30140},13117		{0x14, 0x90170110},13118		{0x15, 0x0321101f},13119		{0x16, 0x03011020}),13120	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,13121		{0x12, 0x99a30150},13122		{0x14, 0x90170110},13123		{0x15, 0x0321101f},13124		{0x16, 0x03011020}),13125	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,13126		{0x14, 0x90170110},13127		{0x15, 0x0321101f},13128		{0x16, 0x03011020}),13129	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,13130		{0x12, 0x90a60130},13131		{0x14, 0x90170110},13132		{0x15, 0x0321101f}),13133	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,13134		{0x14, 0x01014010},13135		{0x17, 0x90170150},13136		{0x19, 0x02a11060},13137		{0x1b, 0x01813030},13138		{0x21, 0x02211020}),13139	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,13140		{0x14, 0x01014010},13141		{0x18, 0x01a19040},13142		{0x1b, 0x01813030},13143		{0x21, 0x02211020}),13144	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,13145		{0x14, 0x01014020},13146		{0x17, 0x90170110},13147		{0x18, 0x01a19050},13148		{0x1b, 0x01813040},13149		{0x21, 0x02211030}),13150	{}13151};13152 13153/*13154 */13155static int patch_alc662(struct hda_codec *codec)13156{13157	struct alc_spec *spec;13158	int err;13159 13160	err = alc_alloc_spec(codec, 0x0b);13161	if (err < 0)13162		return err;13163 13164	spec = codec->spec;13165 13166	spec->shutup = alc_eapd_shutup;13167 13168	/* handle multiple HPs as is */13169	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;13170 13171	alc_fix_pll_init(codec, 0x20, 0x04, 15);13172 13173	switch (codec->core.vendor_id) {13174	case 0x10ec0668:13175		spec->init_hook = alc668_restore_default_value;13176		break;13177	}13178 13179	alc_pre_init(codec);13180 13181	snd_hda_pick_fixup(codec, alc662_fixup_models,13182		       alc662_fixup_tbl, alc662_fixups);13183	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);13184	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);13185 13186	alc_auto_parse_customize_define(codec);13187 13188	if (has_cdefine_beep(codec))13189		spec->gen.beep_nid = 0x01;13190 13191	if ((alc_get_coef0(codec) & (1 << 14)) &&13192	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&13193	    spec->cdefine.platform_type == 1) {13194		err = alc_codec_rename(codec, "ALC272X");13195		if (err < 0)13196			goto error;13197	}13198 13199	/* automatic parse from the BIOS config */13200	err = alc662_parse_auto_config(codec);13201	if (err < 0)13202		goto error;13203 13204	if (!spec->gen.no_analog && spec->gen.beep_nid) {13205		switch (codec->core.vendor_id) {13206		case 0x10ec0662:13207			err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);13208			break;13209		case 0x10ec0272:13210		case 0x10ec0663:13211		case 0x10ec0665:13212		case 0x10ec0668:13213			err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);13214			break;13215		case 0x10ec0273:13216			err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);13217			break;13218		}13219		if (err < 0)13220			goto error;13221	}13222 13223	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);13224 13225	return 0;13226 13227 error:13228	alc_free(codec);13229	return err;13230}13231 13232/*13233 * ALC680 support13234 */13235 13236static int alc680_parse_auto_config(struct hda_codec *codec)13237{13238	return alc_parse_auto_config(codec, NULL, NULL);13239}13240 13241/*13242 */13243static int patch_alc680(struct hda_codec *codec)13244{13245	int err;13246 13247	/* ALC680 has no aa-loopback mixer */13248	err = alc_alloc_spec(codec, 0);13249	if (err < 0)13250		return err;13251 13252	/* automatic parse from the BIOS config */13253	err = alc680_parse_auto_config(codec);13254	if (err < 0) {13255		alc_free(codec);13256		return err;13257	}13258 13259	return 0;13260}13261 13262/*13263 * patch entries13264 */13265static const struct hda_device_id snd_hda_id_realtek[] = {13266	HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),13267	HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),13268	HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),13269	HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),13270	HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),13271	HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),13272	HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),13273	HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),13274	HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),13275	HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),13276	HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),13277	HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),13278	HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),13279	HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),13280	HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),13281	HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),13282	HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),13283	HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),13284	HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),13285	HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),13286	HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),13287	HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),13288	HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),13289	HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),13290	HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),13291	HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),13292	HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),13293	HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),13294	HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),13295	HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),13296	HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),13297	HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),13298	HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),13299	HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),13300	HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),13301	HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),13302	HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),13303	HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),13304	HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),13305	HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),13306	HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),13307	HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),13308	HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),13309	HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),13310	HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),13311	HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),13312	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),13313	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),13314	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),13315	HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),13316	HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),13317	HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),13318	HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),13319	HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),13320	HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),13321	HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),13322	HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),13323	HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),13324	HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),13325	HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),13326	HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),13327	HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),13328	HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),13329	HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),13330	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),13331	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),13332	HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),13333	HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),13334	HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),13335	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),13336	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),13337	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),13338	HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),13339	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),13340	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),13341	HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),13342	HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),13343	HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),13344	HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),13345	{} /* terminator */13346};13347MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);13348 13349MODULE_LICENSE("GPL");13350MODULE_DESCRIPTION("Realtek HD-audio codec");13351MODULE_IMPORT_NS(SND_HDA_SCODEC_COMPONENT);13352 13353static struct hda_codec_driver realtek_driver = {13354	.id = snd_hda_id_realtek,13355};13356 13357module_hda_codec_driver(realtek_driver);13358