162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Universal Interface for Intel High Definition Audio Codec 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * HD audio interface patch for Realtek ALC codecs 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw> 862306a36Sopenharmony_ci * PeiSen Hou <pshou@realtek.com.tw> 962306a36Sopenharmony_ci * Takashi Iwai <tiwai@suse.de> 1062306a36Sopenharmony_ci * Jonathan Woithe <jwoithe@just42.net> 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/delay.h> 1562306a36Sopenharmony_ci#include <linux/slab.h> 1662306a36Sopenharmony_ci#include <linux/pci.h> 1762306a36Sopenharmony_ci#include <linux/dmi.h> 1862306a36Sopenharmony_ci#include <linux/module.h> 1962306a36Sopenharmony_ci#include <linux/input.h> 2062306a36Sopenharmony_ci#include <linux/leds.h> 2162306a36Sopenharmony_ci#include <linux/ctype.h> 2262306a36Sopenharmony_ci#include <sound/core.h> 2362306a36Sopenharmony_ci#include <sound/jack.h> 2462306a36Sopenharmony_ci#include <sound/hda_codec.h> 2562306a36Sopenharmony_ci#include "hda_local.h" 2662306a36Sopenharmony_ci#include "hda_auto_parser.h" 2762306a36Sopenharmony_ci#include "hda_jack.h" 2862306a36Sopenharmony_ci#include "hda_generic.h" 2962306a36Sopenharmony_ci#include "hda_component.h" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* keep halting ALC5505 DSP, for power saving */ 3262306a36Sopenharmony_ci#define HALT_REALTEK_ALC5505 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* extra amp-initialization sequence types */ 3562306a36Sopenharmony_cienum { 3662306a36Sopenharmony_ci ALC_INIT_UNDEFINED, 3762306a36Sopenharmony_ci ALC_INIT_NONE, 3862306a36Sopenharmony_ci ALC_INIT_DEFAULT, 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cienum { 4262306a36Sopenharmony_ci ALC_HEADSET_MODE_UNKNOWN, 4362306a36Sopenharmony_ci ALC_HEADSET_MODE_UNPLUGGED, 4462306a36Sopenharmony_ci ALC_HEADSET_MODE_HEADSET, 4562306a36Sopenharmony_ci ALC_HEADSET_MODE_MIC, 4662306a36Sopenharmony_ci ALC_HEADSET_MODE_HEADPHONE, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum { 5062306a36Sopenharmony_ci ALC_HEADSET_TYPE_UNKNOWN, 5162306a36Sopenharmony_ci ALC_HEADSET_TYPE_CTIA, 5262306a36Sopenharmony_ci ALC_HEADSET_TYPE_OMTP, 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cienum { 5662306a36Sopenharmony_ci ALC_KEY_MICMUTE_INDEX, 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistruct alc_customize_define { 6062306a36Sopenharmony_ci unsigned int sku_cfg; 6162306a36Sopenharmony_ci unsigned char port_connectivity; 6262306a36Sopenharmony_ci unsigned char check_sum; 6362306a36Sopenharmony_ci unsigned char customization; 6462306a36Sopenharmony_ci unsigned char external_amp; 6562306a36Sopenharmony_ci unsigned int enable_pcbeep:1; 6662306a36Sopenharmony_ci unsigned int platform_type:1; 6762306a36Sopenharmony_ci unsigned int swap:1; 6862306a36Sopenharmony_ci unsigned int override:1; 6962306a36Sopenharmony_ci unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */ 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistruct alc_coef_led { 7362306a36Sopenharmony_ci unsigned int idx; 7462306a36Sopenharmony_ci unsigned int mask; 7562306a36Sopenharmony_ci unsigned int on; 7662306a36Sopenharmony_ci unsigned int off; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistruct alc_spec { 8062306a36Sopenharmony_ci struct hda_gen_spec gen; /* must be at head */ 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci /* codec parameterization */ 8362306a36Sopenharmony_ci struct alc_customize_define cdefine; 8462306a36Sopenharmony_ci unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */ 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci /* GPIO bits */ 8762306a36Sopenharmony_ci unsigned int gpio_mask; 8862306a36Sopenharmony_ci unsigned int gpio_dir; 8962306a36Sopenharmony_ci unsigned int gpio_data; 9062306a36Sopenharmony_ci bool gpio_write_delay; /* add a delay before writing gpio_data */ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* mute LED for HP laptops, see vref_mute_led_set() */ 9362306a36Sopenharmony_ci int mute_led_polarity; 9462306a36Sopenharmony_ci int micmute_led_polarity; 9562306a36Sopenharmony_ci hda_nid_t mute_led_nid; 9662306a36Sopenharmony_ci hda_nid_t cap_mute_led_nid; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci unsigned int gpio_mute_led_mask; 9962306a36Sopenharmony_ci unsigned int gpio_mic_led_mask; 10062306a36Sopenharmony_ci struct alc_coef_led mute_led_coef; 10162306a36Sopenharmony_ci struct alc_coef_led mic_led_coef; 10262306a36Sopenharmony_ci struct mutex coef_mutex; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci hda_nid_t headset_mic_pin; 10562306a36Sopenharmony_ci hda_nid_t headphone_mic_pin; 10662306a36Sopenharmony_ci int current_headset_mode; 10762306a36Sopenharmony_ci int current_headset_type; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci /* hooks */ 11062306a36Sopenharmony_ci void (*init_hook)(struct hda_codec *codec); 11162306a36Sopenharmony_ci#ifdef CONFIG_PM 11262306a36Sopenharmony_ci void (*power_hook)(struct hda_codec *codec); 11362306a36Sopenharmony_ci#endif 11462306a36Sopenharmony_ci void (*shutup)(struct hda_codec *codec); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci int init_amp; 11762306a36Sopenharmony_ci int codec_variant; /* flag for other variants */ 11862306a36Sopenharmony_ci unsigned int has_alc5505_dsp:1; 11962306a36Sopenharmony_ci unsigned int no_depop_delay:1; 12062306a36Sopenharmony_ci unsigned int done_hp_init:1; 12162306a36Sopenharmony_ci unsigned int no_shutup_pins:1; 12262306a36Sopenharmony_ci unsigned int ultra_low_power:1; 12362306a36Sopenharmony_ci unsigned int has_hs_key:1; 12462306a36Sopenharmony_ci unsigned int no_internal_mic_pin:1; 12562306a36Sopenharmony_ci unsigned int en_3kpull_low:1; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci /* for PLL fix */ 12862306a36Sopenharmony_ci hda_nid_t pll_nid; 12962306a36Sopenharmony_ci unsigned int pll_coef_idx, pll_coef_bit; 13062306a36Sopenharmony_ci unsigned int coef0; 13162306a36Sopenharmony_ci struct input_dev *kb_dev; 13262306a36Sopenharmony_ci u8 alc_mute_keycode_map[1]; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* component binding */ 13562306a36Sopenharmony_ci struct component_match *match; 13662306a36Sopenharmony_ci struct hda_component comps[HDA_MAX_COMPONENTS]; 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/* 14062306a36Sopenharmony_ci * COEF access helper functions 14162306a36Sopenharmony_ci */ 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic void coef_mutex_lock(struct hda_codec *codec) 14462306a36Sopenharmony_ci{ 14562306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci snd_hda_power_up_pm(codec); 14862306a36Sopenharmony_ci mutex_lock(&spec->coef_mutex); 14962306a36Sopenharmony_ci} 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic void coef_mutex_unlock(struct hda_codec *codec) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci mutex_unlock(&spec->coef_mutex); 15662306a36Sopenharmony_ci snd_hda_power_down_pm(codec); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 16062306a36Sopenharmony_ci unsigned int coef_idx) 16162306a36Sopenharmony_ci{ 16262306a36Sopenharmony_ci unsigned int val; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx); 16562306a36Sopenharmony_ci val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0); 16662306a36Sopenharmony_ci return val; 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 17062306a36Sopenharmony_ci unsigned int coef_idx) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci unsigned int val; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci coef_mutex_lock(codec); 17562306a36Sopenharmony_ci val = __alc_read_coefex_idx(codec, nid, coef_idx); 17662306a36Sopenharmony_ci coef_mutex_unlock(codec); 17762306a36Sopenharmony_ci return val; 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci#define alc_read_coef_idx(codec, coef_idx) \ 18162306a36Sopenharmony_ci alc_read_coefex_idx(codec, 0x20, coef_idx) 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 18462306a36Sopenharmony_ci unsigned int coef_idx, unsigned int coef_val) 18562306a36Sopenharmony_ci{ 18662306a36Sopenharmony_ci snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx); 18762306a36Sopenharmony_ci snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val); 18862306a36Sopenharmony_ci} 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 19162306a36Sopenharmony_ci unsigned int coef_idx, unsigned int coef_val) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci coef_mutex_lock(codec); 19462306a36Sopenharmony_ci __alc_write_coefex_idx(codec, nid, coef_idx, coef_val); 19562306a36Sopenharmony_ci coef_mutex_unlock(codec); 19662306a36Sopenharmony_ci} 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#define alc_write_coef_idx(codec, coef_idx, coef_val) \ 19962306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val) 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistatic void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 20262306a36Sopenharmony_ci unsigned int coef_idx, unsigned int mask, 20362306a36Sopenharmony_ci unsigned int bits_set) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci if (val != -1) 20862306a36Sopenharmony_ci __alc_write_coefex_idx(codec, nid, coef_idx, 20962306a36Sopenharmony_ci (val & ~mask) | bits_set); 21062306a36Sopenharmony_ci} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistatic void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 21362306a36Sopenharmony_ci unsigned int coef_idx, unsigned int mask, 21462306a36Sopenharmony_ci unsigned int bits_set) 21562306a36Sopenharmony_ci{ 21662306a36Sopenharmony_ci coef_mutex_lock(codec); 21762306a36Sopenharmony_ci __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set); 21862306a36Sopenharmony_ci coef_mutex_unlock(codec); 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci#define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \ 22262306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set) 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci/* a special bypass for COEF 0; read the cached value at the second time */ 22562306a36Sopenharmony_cistatic unsigned int alc_get_coef0(struct hda_codec *codec) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci if (!spec->coef0) 23062306a36Sopenharmony_ci spec->coef0 = alc_read_coef_idx(codec, 0); 23162306a36Sopenharmony_ci return spec->coef0; 23262306a36Sopenharmony_ci} 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/* coef writes/updates batch */ 23562306a36Sopenharmony_cistruct coef_fw { 23662306a36Sopenharmony_ci unsigned char nid; 23762306a36Sopenharmony_ci unsigned char idx; 23862306a36Sopenharmony_ci unsigned short mask; 23962306a36Sopenharmony_ci unsigned short val; 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \ 24362306a36Sopenharmony_ci { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) } 24462306a36Sopenharmony_ci#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val) 24562306a36Sopenharmony_ci#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val) 24662306a36Sopenharmony_ci#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val) 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic void alc_process_coef_fw(struct hda_codec *codec, 24962306a36Sopenharmony_ci const struct coef_fw *fw) 25062306a36Sopenharmony_ci{ 25162306a36Sopenharmony_ci coef_mutex_lock(codec); 25262306a36Sopenharmony_ci for (; fw->nid; fw++) { 25362306a36Sopenharmony_ci if (fw->mask == (unsigned short)-1) 25462306a36Sopenharmony_ci __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val); 25562306a36Sopenharmony_ci else 25662306a36Sopenharmony_ci __alc_update_coefex_idx(codec, fw->nid, fw->idx, 25762306a36Sopenharmony_ci fw->mask, fw->val); 25862306a36Sopenharmony_ci } 25962306a36Sopenharmony_ci coef_mutex_unlock(codec); 26062306a36Sopenharmony_ci} 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci/* 26362306a36Sopenharmony_ci * GPIO setup tables, used in initialization 26462306a36Sopenharmony_ci */ 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci/* Enable GPIO mask and set output */ 26762306a36Sopenharmony_cistatic void alc_setup_gpio(struct hda_codec *codec, unsigned int mask) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci spec->gpio_mask |= mask; 27262306a36Sopenharmony_ci spec->gpio_dir |= mask; 27362306a36Sopenharmony_ci spec->gpio_data |= mask; 27462306a36Sopenharmony_ci} 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistatic void alc_write_gpio_data(struct hda_codec *codec) 27762306a36Sopenharmony_ci{ 27862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 28162306a36Sopenharmony_ci spec->gpio_data); 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask, 28562306a36Sopenharmony_ci bool on) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 28862306a36Sopenharmony_ci unsigned int oldval = spec->gpio_data; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci if (on) 29162306a36Sopenharmony_ci spec->gpio_data |= mask; 29262306a36Sopenharmony_ci else 29362306a36Sopenharmony_ci spec->gpio_data &= ~mask; 29462306a36Sopenharmony_ci if (oldval != spec->gpio_data) 29562306a36Sopenharmony_ci alc_write_gpio_data(codec); 29662306a36Sopenharmony_ci} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic void alc_write_gpio(struct hda_codec *codec) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci if (!spec->gpio_mask) 30362306a36Sopenharmony_ci return; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 30662306a36Sopenharmony_ci AC_VERB_SET_GPIO_MASK, spec->gpio_mask); 30762306a36Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 30862306a36Sopenharmony_ci AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir); 30962306a36Sopenharmony_ci if (spec->gpio_write_delay) 31062306a36Sopenharmony_ci msleep(1); 31162306a36Sopenharmony_ci alc_write_gpio_data(codec); 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic void alc_fixup_gpio(struct hda_codec *codec, int action, 31562306a36Sopenharmony_ci unsigned int mask) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 31862306a36Sopenharmony_ci alc_setup_gpio(codec, mask); 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic void alc_fixup_gpio1(struct hda_codec *codec, 32262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci alc_fixup_gpio(codec, action, 0x01); 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cistatic void alc_fixup_gpio2(struct hda_codec *codec, 32862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci alc_fixup_gpio(codec, action, 0x02); 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistatic void alc_fixup_gpio3(struct hda_codec *codec, 33462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci alc_fixup_gpio(codec, action, 0x03); 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic void alc_fixup_gpio4(struct hda_codec *codec, 34062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci alc_fixup_gpio(codec, action, 0x04); 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistatic void alc_fixup_micmute_led(struct hda_codec *codec, 34662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 34962306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, NULL); 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci/* 35362306a36Sopenharmony_ci * Fix hardware PLL issue 35462306a36Sopenharmony_ci * On some codecs, the analog PLL gating control must be off while 35562306a36Sopenharmony_ci * the default value is 1. 35662306a36Sopenharmony_ci */ 35762306a36Sopenharmony_cistatic void alc_fix_pll(struct hda_codec *codec) 35862306a36Sopenharmony_ci{ 35962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci if (spec->pll_nid) 36262306a36Sopenharmony_ci alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx, 36362306a36Sopenharmony_ci 1 << spec->pll_coef_bit, 0); 36462306a36Sopenharmony_ci} 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid, 36762306a36Sopenharmony_ci unsigned int coef_idx, unsigned int coef_bit) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 37062306a36Sopenharmony_ci spec->pll_nid = nid; 37162306a36Sopenharmony_ci spec->pll_coef_idx = coef_idx; 37262306a36Sopenharmony_ci spec->pll_coef_bit = coef_bit; 37362306a36Sopenharmony_ci alc_fix_pll(codec); 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci/* update the master volume per volume-knob's unsol event */ 37762306a36Sopenharmony_cistatic void alc_update_knob_master(struct hda_codec *codec, 37862306a36Sopenharmony_ci struct hda_jack_callback *jack) 37962306a36Sopenharmony_ci{ 38062306a36Sopenharmony_ci unsigned int val; 38162306a36Sopenharmony_ci struct snd_kcontrol *kctl; 38262306a36Sopenharmony_ci struct snd_ctl_elem_value *uctl; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume"); 38562306a36Sopenharmony_ci if (!kctl) 38662306a36Sopenharmony_ci return; 38762306a36Sopenharmony_ci uctl = kzalloc(sizeof(*uctl), GFP_KERNEL); 38862306a36Sopenharmony_ci if (!uctl) 38962306a36Sopenharmony_ci return; 39062306a36Sopenharmony_ci val = snd_hda_codec_read(codec, jack->nid, 0, 39162306a36Sopenharmony_ci AC_VERB_GET_VOLUME_KNOB_CONTROL, 0); 39262306a36Sopenharmony_ci val &= HDA_AMP_VOLMASK; 39362306a36Sopenharmony_ci uctl->value.integer.value[0] = val; 39462306a36Sopenharmony_ci uctl->value.integer.value[1] = val; 39562306a36Sopenharmony_ci kctl->put(kctl, uctl); 39662306a36Sopenharmony_ci kfree(uctl); 39762306a36Sopenharmony_ci} 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic void alc880_unsol_event(struct hda_codec *codec, unsigned int res) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci /* For some reason, the res given from ALC880 is broken. 40262306a36Sopenharmony_ci Here we adjust it properly. */ 40362306a36Sopenharmony_ci snd_hda_jack_unsol_event(codec, res >> 2); 40462306a36Sopenharmony_ci} 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci/* Change EAPD to verb control */ 40762306a36Sopenharmony_cistatic void alc_fill_eapd_coef(struct hda_codec *codec) 40862306a36Sopenharmony_ci{ 40962306a36Sopenharmony_ci int coef; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci coef = alc_get_coef0(codec); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci switch (codec->core.vendor_id) { 41462306a36Sopenharmony_ci case 0x10ec0262: 41562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 0, 1<<5); 41662306a36Sopenharmony_ci break; 41762306a36Sopenharmony_ci case 0x10ec0267: 41862306a36Sopenharmony_ci case 0x10ec0268: 41962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 0, 1<<13); 42062306a36Sopenharmony_ci break; 42162306a36Sopenharmony_ci case 0x10ec0269: 42262306a36Sopenharmony_ci if ((coef & 0x00f0) == 0x0010) 42362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0xd, 0, 1<<14); 42462306a36Sopenharmony_ci if ((coef & 0x00f0) == 0x0020) 42562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4, 1<<15, 0); 42662306a36Sopenharmony_ci if ((coef & 0x00f0) == 0x0030) 42762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x10, 1<<9, 0); 42862306a36Sopenharmony_ci break; 42962306a36Sopenharmony_ci case 0x10ec0280: 43062306a36Sopenharmony_ci case 0x10ec0284: 43162306a36Sopenharmony_ci case 0x10ec0290: 43262306a36Sopenharmony_ci case 0x10ec0292: 43362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4, 1<<15, 0); 43462306a36Sopenharmony_ci break; 43562306a36Sopenharmony_ci case 0x10ec0225: 43662306a36Sopenharmony_ci case 0x10ec0295: 43762306a36Sopenharmony_ci case 0x10ec0299: 43862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000); 43962306a36Sopenharmony_ci fallthrough; 44062306a36Sopenharmony_ci case 0x10ec0215: 44162306a36Sopenharmony_ci case 0x10ec0285: 44262306a36Sopenharmony_ci case 0x10ec0289: 44362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x36, 1<<13, 0); 44462306a36Sopenharmony_ci fallthrough; 44562306a36Sopenharmony_ci case 0x10ec0230: 44662306a36Sopenharmony_ci case 0x10ec0233: 44762306a36Sopenharmony_ci case 0x10ec0235: 44862306a36Sopenharmony_ci case 0x10ec0236: 44962306a36Sopenharmony_ci case 0x10ec0245: 45062306a36Sopenharmony_ci case 0x10ec0255: 45162306a36Sopenharmony_ci case 0x10ec0256: 45262306a36Sopenharmony_ci case 0x19e58326: 45362306a36Sopenharmony_ci case 0x10ec0257: 45462306a36Sopenharmony_ci case 0x10ec0282: 45562306a36Sopenharmony_ci case 0x10ec0283: 45662306a36Sopenharmony_ci case 0x10ec0286: 45762306a36Sopenharmony_ci case 0x10ec0288: 45862306a36Sopenharmony_ci case 0x10ec0298: 45962306a36Sopenharmony_ci case 0x10ec0300: 46062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x10, 1<<9, 0); 46162306a36Sopenharmony_ci break; 46262306a36Sopenharmony_ci case 0x10ec0275: 46362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0xe, 0, 1<<0); 46462306a36Sopenharmony_ci break; 46562306a36Sopenharmony_ci case 0x10ec0287: 46662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x10, 1<<9, 0); 46762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x8, 0x4ab7); 46862306a36Sopenharmony_ci break; 46962306a36Sopenharmony_ci case 0x10ec0293: 47062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0xa, 1<<13, 0); 47162306a36Sopenharmony_ci break; 47262306a36Sopenharmony_ci case 0x10ec0234: 47362306a36Sopenharmony_ci case 0x10ec0274: 47462306a36Sopenharmony_ci case 0x10ec0294: 47562306a36Sopenharmony_ci case 0x10ec0700: 47662306a36Sopenharmony_ci case 0x10ec0701: 47762306a36Sopenharmony_ci case 0x10ec0703: 47862306a36Sopenharmony_ci case 0x10ec0711: 47962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x10, 1<<15, 0); 48062306a36Sopenharmony_ci break; 48162306a36Sopenharmony_ci case 0x10ec0662: 48262306a36Sopenharmony_ci if ((coef & 0x00f0) == 0x0030) 48362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */ 48462306a36Sopenharmony_ci break; 48562306a36Sopenharmony_ci case 0x10ec0272: 48662306a36Sopenharmony_ci case 0x10ec0273: 48762306a36Sopenharmony_ci case 0x10ec0663: 48862306a36Sopenharmony_ci case 0x10ec0665: 48962306a36Sopenharmony_ci case 0x10ec0670: 49062306a36Sopenharmony_ci case 0x10ec0671: 49162306a36Sopenharmony_ci case 0x10ec0672: 49262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ 49362306a36Sopenharmony_ci break; 49462306a36Sopenharmony_ci case 0x10ec0222: 49562306a36Sopenharmony_ci case 0x10ec0623: 49662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x19, 1<<13, 0); 49762306a36Sopenharmony_ci break; 49862306a36Sopenharmony_ci case 0x10ec0668: 49962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 3<<13, 0); 50062306a36Sopenharmony_ci break; 50162306a36Sopenharmony_ci case 0x10ec0867: 50262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4, 1<<10, 0); 50362306a36Sopenharmony_ci break; 50462306a36Sopenharmony_ci case 0x10ec0888: 50562306a36Sopenharmony_ci if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030) 50662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 1<<5, 0); 50762306a36Sopenharmony_ci break; 50862306a36Sopenharmony_ci case 0x10ec0892: 50962306a36Sopenharmony_ci case 0x10ec0897: 51062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 1<<5, 0); 51162306a36Sopenharmony_ci break; 51262306a36Sopenharmony_ci case 0x10ec0899: 51362306a36Sopenharmony_ci case 0x10ec0900: 51462306a36Sopenharmony_ci case 0x10ec0b00: 51562306a36Sopenharmony_ci case 0x10ec1168: 51662306a36Sopenharmony_ci case 0x10ec1220: 51762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 1<<1, 0); 51862306a36Sopenharmony_ci break; 51962306a36Sopenharmony_ci } 52062306a36Sopenharmony_ci} 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci/* additional initialization for ALC888 variants */ 52362306a36Sopenharmony_cistatic void alc888_coef_init(struct hda_codec *codec) 52462306a36Sopenharmony_ci{ 52562306a36Sopenharmony_ci switch (alc_get_coef0(codec) & 0x00f0) { 52662306a36Sopenharmony_ci /* alc888-VA */ 52762306a36Sopenharmony_ci case 0x00: 52862306a36Sopenharmony_ci /* alc888-VB */ 52962306a36Sopenharmony_ci case 0x10: 53062306a36Sopenharmony_ci alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */ 53162306a36Sopenharmony_ci break; 53262306a36Sopenharmony_ci } 53362306a36Sopenharmony_ci} 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci/* turn on/off EAPD control (only if available) */ 53662306a36Sopenharmony_cistatic void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on) 53762306a36Sopenharmony_ci{ 53862306a36Sopenharmony_ci if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) 53962306a36Sopenharmony_ci return; 54062306a36Sopenharmony_ci if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD) 54162306a36Sopenharmony_ci snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE, 54262306a36Sopenharmony_ci on ? 2 : 0); 54362306a36Sopenharmony_ci} 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci/* turn on/off EAPD controls of the codec */ 54662306a36Sopenharmony_cistatic void alc_auto_setup_eapd(struct hda_codec *codec, bool on) 54762306a36Sopenharmony_ci{ 54862306a36Sopenharmony_ci /* We currently only handle front, HP */ 54962306a36Sopenharmony_ci static const hda_nid_t pins[] = { 55062306a36Sopenharmony_ci 0x0f, 0x10, 0x14, 0x15, 0x17, 0 55162306a36Sopenharmony_ci }; 55262306a36Sopenharmony_ci const hda_nid_t *p; 55362306a36Sopenharmony_ci for (p = pins; *p; p++) 55462306a36Sopenharmony_ci set_eapd(codec, *p, on); 55562306a36Sopenharmony_ci} 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_cistatic int find_ext_mic_pin(struct hda_codec *codec); 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistatic void alc_headset_mic_no_shutup(struct hda_codec *codec) 56062306a36Sopenharmony_ci{ 56162306a36Sopenharmony_ci const struct hda_pincfg *pin; 56262306a36Sopenharmony_ci int mic_pin = find_ext_mic_pin(codec); 56362306a36Sopenharmony_ci int i; 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci /* don't shut up pins when unloading the driver; otherwise it breaks 56662306a36Sopenharmony_ci * the default pin setup at the next load of the driver 56762306a36Sopenharmony_ci */ 56862306a36Sopenharmony_ci if (codec->bus->shutdown) 56962306a36Sopenharmony_ci return; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci snd_array_for_each(&codec->init_pins, i, pin) { 57262306a36Sopenharmony_ci /* use read here for syncing after issuing each verb */ 57362306a36Sopenharmony_ci if (pin->nid != mic_pin) 57462306a36Sopenharmony_ci snd_hda_codec_read(codec, pin->nid, 0, 57562306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 57662306a36Sopenharmony_ci } 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci codec->pins_shutup = 1; 57962306a36Sopenharmony_ci} 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_cistatic void alc_shutup_pins(struct hda_codec *codec) 58262306a36Sopenharmony_ci{ 58362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci switch (codec->core.vendor_id) { 58662306a36Sopenharmony_ci case 0x10ec0236: 58762306a36Sopenharmony_ci case 0x10ec0256: 58862306a36Sopenharmony_ci case 0x19e58326: 58962306a36Sopenharmony_ci case 0x10ec0283: 59062306a36Sopenharmony_ci case 0x10ec0286: 59162306a36Sopenharmony_ci case 0x10ec0288: 59262306a36Sopenharmony_ci case 0x10ec0298: 59362306a36Sopenharmony_ci alc_headset_mic_no_shutup(codec); 59462306a36Sopenharmony_ci break; 59562306a36Sopenharmony_ci default: 59662306a36Sopenharmony_ci if (!spec->no_shutup_pins) 59762306a36Sopenharmony_ci snd_hda_shutup_pins(codec); 59862306a36Sopenharmony_ci break; 59962306a36Sopenharmony_ci } 60062306a36Sopenharmony_ci} 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci/* generic shutup callback; 60362306a36Sopenharmony_ci * just turning off EAPD and a little pause for avoiding pop-noise 60462306a36Sopenharmony_ci */ 60562306a36Sopenharmony_cistatic void alc_eapd_shutup(struct hda_codec *codec) 60662306a36Sopenharmony_ci{ 60762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 61062306a36Sopenharmony_ci if (!spec->no_depop_delay) 61162306a36Sopenharmony_ci msleep(200); 61262306a36Sopenharmony_ci alc_shutup_pins(codec); 61362306a36Sopenharmony_ci} 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci/* generic EAPD initialization */ 61662306a36Sopenharmony_cistatic void alc_auto_init_amp(struct hda_codec *codec, int type) 61762306a36Sopenharmony_ci{ 61862306a36Sopenharmony_ci alc_auto_setup_eapd(codec, true); 61962306a36Sopenharmony_ci alc_write_gpio(codec); 62062306a36Sopenharmony_ci switch (type) { 62162306a36Sopenharmony_ci case ALC_INIT_DEFAULT: 62262306a36Sopenharmony_ci switch (codec->core.vendor_id) { 62362306a36Sopenharmony_ci case 0x10ec0260: 62462306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010); 62562306a36Sopenharmony_ci break; 62662306a36Sopenharmony_ci case 0x10ec0880: 62762306a36Sopenharmony_ci case 0x10ec0882: 62862306a36Sopenharmony_ci case 0x10ec0883: 62962306a36Sopenharmony_ci case 0x10ec0885: 63062306a36Sopenharmony_ci alc_update_coef_idx(codec, 7, 0, 0x2030); 63162306a36Sopenharmony_ci break; 63262306a36Sopenharmony_ci case 0x10ec0888: 63362306a36Sopenharmony_ci alc888_coef_init(codec); 63462306a36Sopenharmony_ci break; 63562306a36Sopenharmony_ci } 63662306a36Sopenharmony_ci break; 63762306a36Sopenharmony_ci } 63862306a36Sopenharmony_ci} 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci/* get a primary headphone pin if available */ 64162306a36Sopenharmony_cistatic hda_nid_t alc_get_hp_pin(struct alc_spec *spec) 64262306a36Sopenharmony_ci{ 64362306a36Sopenharmony_ci if (spec->gen.autocfg.hp_pins[0]) 64462306a36Sopenharmony_ci return spec->gen.autocfg.hp_pins[0]; 64562306a36Sopenharmony_ci if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT) 64662306a36Sopenharmony_ci return spec->gen.autocfg.line_out_pins[0]; 64762306a36Sopenharmony_ci return 0; 64862306a36Sopenharmony_ci} 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci/* 65162306a36Sopenharmony_ci * Realtek SSID verification 65262306a36Sopenharmony_ci */ 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci/* Could be any non-zero and even value. When used as fixup, tells 65562306a36Sopenharmony_ci * the driver to ignore any present sku defines. 65662306a36Sopenharmony_ci */ 65762306a36Sopenharmony_ci#define ALC_FIXUP_SKU_IGNORE (2) 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_cistatic void alc_fixup_sku_ignore(struct hda_codec *codec, 66062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 66162306a36Sopenharmony_ci{ 66262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 66362306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 66462306a36Sopenharmony_ci spec->cdefine.fixup = 1; 66562306a36Sopenharmony_ci spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE; 66662306a36Sopenharmony_ci } 66762306a36Sopenharmony_ci} 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_cistatic void alc_fixup_no_depop_delay(struct hda_codec *codec, 67062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 67162306a36Sopenharmony_ci{ 67262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PROBE) { 67562306a36Sopenharmony_ci spec->no_depop_delay = 1; 67662306a36Sopenharmony_ci codec->depop_delay = 0; 67762306a36Sopenharmony_ci } 67862306a36Sopenharmony_ci} 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_cistatic int alc_auto_parse_customize_define(struct hda_codec *codec) 68162306a36Sopenharmony_ci{ 68262306a36Sopenharmony_ci unsigned int ass, tmp, i; 68362306a36Sopenharmony_ci unsigned nid = 0; 68462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci spec->cdefine.enable_pcbeep = 1; /* assume always enabled */ 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci if (spec->cdefine.fixup) { 68962306a36Sopenharmony_ci ass = spec->cdefine.sku_cfg; 69062306a36Sopenharmony_ci if (ass == ALC_FIXUP_SKU_IGNORE) 69162306a36Sopenharmony_ci return -1; 69262306a36Sopenharmony_ci goto do_sku; 69362306a36Sopenharmony_ci } 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci if (!codec->bus->pci) 69662306a36Sopenharmony_ci return -1; 69762306a36Sopenharmony_ci ass = codec->core.subsystem_id & 0xffff; 69862306a36Sopenharmony_ci if (ass != codec->bus->pci->subsystem_device && (ass & 1)) 69962306a36Sopenharmony_ci goto do_sku; 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci nid = 0x1d; 70262306a36Sopenharmony_ci if (codec->core.vendor_id == 0x10ec0260) 70362306a36Sopenharmony_ci nid = 0x17; 70462306a36Sopenharmony_ci ass = snd_hda_codec_get_pincfg(codec, nid); 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci if (!(ass & 1)) { 70762306a36Sopenharmony_ci codec_info(codec, "%s: SKU not ready 0x%08x\n", 70862306a36Sopenharmony_ci codec->core.chip_name, ass); 70962306a36Sopenharmony_ci return -1; 71062306a36Sopenharmony_ci } 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci /* check sum */ 71362306a36Sopenharmony_ci tmp = 0; 71462306a36Sopenharmony_ci for (i = 1; i < 16; i++) { 71562306a36Sopenharmony_ci if ((ass >> i) & 1) 71662306a36Sopenharmony_ci tmp++; 71762306a36Sopenharmony_ci } 71862306a36Sopenharmony_ci if (((ass >> 16) & 0xf) != tmp) 71962306a36Sopenharmony_ci return -1; 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_ci spec->cdefine.port_connectivity = ass >> 30; 72262306a36Sopenharmony_ci spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20; 72362306a36Sopenharmony_ci spec->cdefine.check_sum = (ass >> 16) & 0xf; 72462306a36Sopenharmony_ci spec->cdefine.customization = ass >> 8; 72562306a36Sopenharmony_cido_sku: 72662306a36Sopenharmony_ci spec->cdefine.sku_cfg = ass; 72762306a36Sopenharmony_ci spec->cdefine.external_amp = (ass & 0x38) >> 3; 72862306a36Sopenharmony_ci spec->cdefine.platform_type = (ass & 0x4) >> 2; 72962306a36Sopenharmony_ci spec->cdefine.swap = (ass & 0x2) >> 1; 73062306a36Sopenharmony_ci spec->cdefine.override = ass & 0x1; 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n", 73362306a36Sopenharmony_ci nid, spec->cdefine.sku_cfg); 73462306a36Sopenharmony_ci codec_dbg(codec, "SKU: port_connectivity=0x%x\n", 73562306a36Sopenharmony_ci spec->cdefine.port_connectivity); 73662306a36Sopenharmony_ci codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep); 73762306a36Sopenharmony_ci codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum); 73862306a36Sopenharmony_ci codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization); 73962306a36Sopenharmony_ci codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp); 74062306a36Sopenharmony_ci codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type); 74162306a36Sopenharmony_ci codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap); 74262306a36Sopenharmony_ci codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override); 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci return 0; 74562306a36Sopenharmony_ci} 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci/* return the position of NID in the list, or -1 if not found */ 74862306a36Sopenharmony_cistatic int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums) 74962306a36Sopenharmony_ci{ 75062306a36Sopenharmony_ci int i; 75162306a36Sopenharmony_ci for (i = 0; i < nums; i++) 75262306a36Sopenharmony_ci if (list[i] == nid) 75362306a36Sopenharmony_ci return i; 75462306a36Sopenharmony_ci return -1; 75562306a36Sopenharmony_ci} 75662306a36Sopenharmony_ci/* return true if the given NID is found in the list */ 75762306a36Sopenharmony_cistatic bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums) 75862306a36Sopenharmony_ci{ 75962306a36Sopenharmony_ci return find_idx_in_nid_list(nid, list, nums) >= 0; 76062306a36Sopenharmony_ci} 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci/* check subsystem ID and set up device-specific initialization; 76362306a36Sopenharmony_ci * return 1 if initialized, 0 if invalid SSID 76462306a36Sopenharmony_ci */ 76562306a36Sopenharmony_ci/* 32-bit subsystem ID for BIOS loading in HD Audio codec. 76662306a36Sopenharmony_ci * 31 ~ 16 : Manufacture ID 76762306a36Sopenharmony_ci * 15 ~ 8 : SKU ID 76862306a36Sopenharmony_ci * 7 ~ 0 : Assembly ID 76962306a36Sopenharmony_ci * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 77062306a36Sopenharmony_ci */ 77162306a36Sopenharmony_cistatic int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) 77262306a36Sopenharmony_ci{ 77362306a36Sopenharmony_ci unsigned int ass, tmp, i; 77462306a36Sopenharmony_ci unsigned nid; 77562306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci if (spec->cdefine.fixup) { 77862306a36Sopenharmony_ci ass = spec->cdefine.sku_cfg; 77962306a36Sopenharmony_ci if (ass == ALC_FIXUP_SKU_IGNORE) 78062306a36Sopenharmony_ci return 0; 78162306a36Sopenharmony_ci goto do_sku; 78262306a36Sopenharmony_ci } 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci ass = codec->core.subsystem_id & 0xffff; 78562306a36Sopenharmony_ci if (codec->bus->pci && 78662306a36Sopenharmony_ci ass != codec->bus->pci->subsystem_device && (ass & 1)) 78762306a36Sopenharmony_ci goto do_sku; 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci /* invalid SSID, check the special NID pin defcfg instead */ 79062306a36Sopenharmony_ci /* 79162306a36Sopenharmony_ci * 31~30 : port connectivity 79262306a36Sopenharmony_ci * 29~21 : reserve 79362306a36Sopenharmony_ci * 20 : PCBEEP input 79462306a36Sopenharmony_ci * 19~16 : Check sum (15:1) 79562306a36Sopenharmony_ci * 15~1 : Custom 79662306a36Sopenharmony_ci * 0 : override 79762306a36Sopenharmony_ci */ 79862306a36Sopenharmony_ci nid = 0x1d; 79962306a36Sopenharmony_ci if (codec->core.vendor_id == 0x10ec0260) 80062306a36Sopenharmony_ci nid = 0x17; 80162306a36Sopenharmony_ci ass = snd_hda_codec_get_pincfg(codec, nid); 80262306a36Sopenharmony_ci codec_dbg(codec, 80362306a36Sopenharmony_ci "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n", 80462306a36Sopenharmony_ci ass, nid); 80562306a36Sopenharmony_ci if (!(ass & 1)) 80662306a36Sopenharmony_ci return 0; 80762306a36Sopenharmony_ci if ((ass >> 30) != 1) /* no physical connection */ 80862306a36Sopenharmony_ci return 0; 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci /* check sum */ 81162306a36Sopenharmony_ci tmp = 0; 81262306a36Sopenharmony_ci for (i = 1; i < 16; i++) { 81362306a36Sopenharmony_ci if ((ass >> i) & 1) 81462306a36Sopenharmony_ci tmp++; 81562306a36Sopenharmony_ci } 81662306a36Sopenharmony_ci if (((ass >> 16) & 0xf) != tmp) 81762306a36Sopenharmony_ci return 0; 81862306a36Sopenharmony_cido_sku: 81962306a36Sopenharmony_ci codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n", 82062306a36Sopenharmony_ci ass & 0xffff, codec->core.vendor_id); 82162306a36Sopenharmony_ci /* 82262306a36Sopenharmony_ci * 0 : override 82362306a36Sopenharmony_ci * 1 : Swap Jack 82462306a36Sopenharmony_ci * 2 : 0 --> Desktop, 1 --> Laptop 82562306a36Sopenharmony_ci * 3~5 : External Amplifier control 82662306a36Sopenharmony_ci * 7~6 : Reserved 82762306a36Sopenharmony_ci */ 82862306a36Sopenharmony_ci tmp = (ass & 0x38) >> 3; /* external Amp control */ 82962306a36Sopenharmony_ci if (spec->init_amp == ALC_INIT_UNDEFINED) { 83062306a36Sopenharmony_ci switch (tmp) { 83162306a36Sopenharmony_ci case 1: 83262306a36Sopenharmony_ci alc_setup_gpio(codec, 0x01); 83362306a36Sopenharmony_ci break; 83462306a36Sopenharmony_ci case 3: 83562306a36Sopenharmony_ci alc_setup_gpio(codec, 0x02); 83662306a36Sopenharmony_ci break; 83762306a36Sopenharmony_ci case 7: 83862306a36Sopenharmony_ci alc_setup_gpio(codec, 0x04); 83962306a36Sopenharmony_ci break; 84062306a36Sopenharmony_ci case 5: 84162306a36Sopenharmony_ci default: 84262306a36Sopenharmony_ci spec->init_amp = ALC_INIT_DEFAULT; 84362306a36Sopenharmony_ci break; 84462306a36Sopenharmony_ci } 84562306a36Sopenharmony_ci } 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_ci /* is laptop or Desktop and enable the function "Mute internal speaker 84862306a36Sopenharmony_ci * when the external headphone out jack is plugged" 84962306a36Sopenharmony_ci */ 85062306a36Sopenharmony_ci if (!(ass & 0x8000)) 85162306a36Sopenharmony_ci return 1; 85262306a36Sopenharmony_ci /* 85362306a36Sopenharmony_ci * 10~8 : Jack location 85462306a36Sopenharmony_ci * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered 85562306a36Sopenharmony_ci * 14~13: Resvered 85662306a36Sopenharmony_ci * 15 : 1 --> enable the function "Mute internal speaker 85762306a36Sopenharmony_ci * when the external headphone out jack is plugged" 85862306a36Sopenharmony_ci */ 85962306a36Sopenharmony_ci if (!alc_get_hp_pin(spec)) { 86062306a36Sopenharmony_ci hda_nid_t nid; 86162306a36Sopenharmony_ci tmp = (ass >> 11) & 0x3; /* HP to chassis */ 86262306a36Sopenharmony_ci nid = ports[tmp]; 86362306a36Sopenharmony_ci if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins, 86462306a36Sopenharmony_ci spec->gen.autocfg.line_outs)) 86562306a36Sopenharmony_ci return 1; 86662306a36Sopenharmony_ci spec->gen.autocfg.hp_pins[0] = nid; 86762306a36Sopenharmony_ci } 86862306a36Sopenharmony_ci return 1; 86962306a36Sopenharmony_ci} 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_ci/* Check the validity of ALC subsystem-id 87262306a36Sopenharmony_ci * ports contains an array of 4 pin NIDs for port-A, E, D and I */ 87362306a36Sopenharmony_cistatic void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports) 87462306a36Sopenharmony_ci{ 87562306a36Sopenharmony_ci if (!alc_subsystem_id(codec, ports)) { 87662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 87762306a36Sopenharmony_ci if (spec->init_amp == ALC_INIT_UNDEFINED) { 87862306a36Sopenharmony_ci codec_dbg(codec, 87962306a36Sopenharmony_ci "realtek: Enable default setup for auto mode as fallback\n"); 88062306a36Sopenharmony_ci spec->init_amp = ALC_INIT_DEFAULT; 88162306a36Sopenharmony_ci } 88262306a36Sopenharmony_ci } 88362306a36Sopenharmony_ci} 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci/* 88662306a36Sopenharmony_ci */ 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_cistatic void alc_fixup_inv_dmic(struct hda_codec *codec, 88962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 89062306a36Sopenharmony_ci{ 89162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci spec->gen.inv_dmic_split = 1; 89462306a36Sopenharmony_ci} 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_cistatic int alc_build_controls(struct hda_codec *codec) 89862306a36Sopenharmony_ci{ 89962306a36Sopenharmony_ci int err; 90062306a36Sopenharmony_ci 90162306a36Sopenharmony_ci err = snd_hda_gen_build_controls(codec); 90262306a36Sopenharmony_ci if (err < 0) 90362306a36Sopenharmony_ci return err; 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD); 90662306a36Sopenharmony_ci return 0; 90762306a36Sopenharmony_ci} 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_ci/* 91162306a36Sopenharmony_ci * Common callbacks 91262306a36Sopenharmony_ci */ 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_cistatic void alc_pre_init(struct hda_codec *codec) 91562306a36Sopenharmony_ci{ 91662306a36Sopenharmony_ci alc_fill_eapd_coef(codec); 91762306a36Sopenharmony_ci} 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci#define is_s3_resume(codec) \ 92062306a36Sopenharmony_ci ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME) 92162306a36Sopenharmony_ci#define is_s4_resume(codec) \ 92262306a36Sopenharmony_ci ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE) 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_cistatic int alc_init(struct hda_codec *codec) 92562306a36Sopenharmony_ci{ 92662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci /* hibernation resume needs the full chip initialization */ 92962306a36Sopenharmony_ci if (is_s4_resume(codec)) 93062306a36Sopenharmony_ci alc_pre_init(codec); 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci if (spec->init_hook) 93362306a36Sopenharmony_ci spec->init_hook(codec); 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_ci spec->gen.skip_verbs = 1; /* applied in below */ 93662306a36Sopenharmony_ci snd_hda_gen_init(codec); 93762306a36Sopenharmony_ci alc_fix_pll(codec); 93862306a36Sopenharmony_ci alc_auto_init_amp(codec, spec->init_amp); 93962306a36Sopenharmony_ci snd_hda_apply_verbs(codec); /* apply verbs here after own init */ 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci return 0; 94462306a36Sopenharmony_ci} 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci#define alc_free snd_hda_gen_free 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci#ifdef CONFIG_PM 94962306a36Sopenharmony_cistatic inline void alc_shutup(struct hda_codec *codec) 95062306a36Sopenharmony_ci{ 95162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci if (!snd_hda_get_bool_hint(codec, "shutup")) 95462306a36Sopenharmony_ci return; /* disabled explicitly by hints */ 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci if (spec && spec->shutup) 95762306a36Sopenharmony_ci spec->shutup(codec); 95862306a36Sopenharmony_ci else 95962306a36Sopenharmony_ci alc_shutup_pins(codec); 96062306a36Sopenharmony_ci} 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_cistatic void alc_power_eapd(struct hda_codec *codec) 96362306a36Sopenharmony_ci{ 96462306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 96562306a36Sopenharmony_ci} 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_cistatic int alc_suspend(struct hda_codec *codec) 96862306a36Sopenharmony_ci{ 96962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 97062306a36Sopenharmony_ci alc_shutup(codec); 97162306a36Sopenharmony_ci if (spec && spec->power_hook) 97262306a36Sopenharmony_ci spec->power_hook(codec); 97362306a36Sopenharmony_ci return 0; 97462306a36Sopenharmony_ci} 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_cistatic int alc_resume(struct hda_codec *codec) 97762306a36Sopenharmony_ci{ 97862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_ci if (!spec->no_depop_delay) 98162306a36Sopenharmony_ci msleep(150); /* to avoid pop noise */ 98262306a36Sopenharmony_ci codec->patch_ops.init(codec); 98362306a36Sopenharmony_ci snd_hda_regmap_sync(codec); 98462306a36Sopenharmony_ci hda_call_check_power_status(codec, 0x01); 98562306a36Sopenharmony_ci return 0; 98662306a36Sopenharmony_ci} 98762306a36Sopenharmony_ci#endif 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci/* 99062306a36Sopenharmony_ci */ 99162306a36Sopenharmony_cistatic const struct hda_codec_ops alc_patch_ops = { 99262306a36Sopenharmony_ci .build_controls = alc_build_controls, 99362306a36Sopenharmony_ci .build_pcms = snd_hda_gen_build_pcms, 99462306a36Sopenharmony_ci .init = alc_init, 99562306a36Sopenharmony_ci .free = alc_free, 99662306a36Sopenharmony_ci .unsol_event = snd_hda_jack_unsol_event, 99762306a36Sopenharmony_ci#ifdef CONFIG_PM 99862306a36Sopenharmony_ci .resume = alc_resume, 99962306a36Sopenharmony_ci .suspend = alc_suspend, 100062306a36Sopenharmony_ci .check_power_status = snd_hda_gen_check_power_status, 100162306a36Sopenharmony_ci#endif 100262306a36Sopenharmony_ci}; 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name) 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_ci/* 100862306a36Sopenharmony_ci * Rename codecs appropriately from COEF value or subvendor id 100962306a36Sopenharmony_ci */ 101062306a36Sopenharmony_cistruct alc_codec_rename_table { 101162306a36Sopenharmony_ci unsigned int vendor_id; 101262306a36Sopenharmony_ci unsigned short coef_mask; 101362306a36Sopenharmony_ci unsigned short coef_bits; 101462306a36Sopenharmony_ci const char *name; 101562306a36Sopenharmony_ci}; 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_cistruct alc_codec_rename_pci_table { 101862306a36Sopenharmony_ci unsigned int codec_vendor_id; 101962306a36Sopenharmony_ci unsigned short pci_subvendor; 102062306a36Sopenharmony_ci unsigned short pci_subdevice; 102162306a36Sopenharmony_ci const char *name; 102262306a36Sopenharmony_ci}; 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_cistatic const struct alc_codec_rename_table rename_tbl[] = { 102562306a36Sopenharmony_ci { 0x10ec0221, 0xf00f, 0x1003, "ALC231" }, 102662306a36Sopenharmony_ci { 0x10ec0269, 0xfff0, 0x3010, "ALC277" }, 102762306a36Sopenharmony_ci { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" }, 102862306a36Sopenharmony_ci { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" }, 102962306a36Sopenharmony_ci { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" }, 103062306a36Sopenharmony_ci { 0x10ec0269, 0xffff, 0xa023, "ALC259" }, 103162306a36Sopenharmony_ci { 0x10ec0269, 0xffff, 0x6023, "ALC281X" }, 103262306a36Sopenharmony_ci { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" }, 103362306a36Sopenharmony_ci { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" }, 103462306a36Sopenharmony_ci { 0x10ec0662, 0xffff, 0x4020, "ALC656" }, 103562306a36Sopenharmony_ci { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" }, 103662306a36Sopenharmony_ci { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" }, 103762306a36Sopenharmony_ci { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" }, 103862306a36Sopenharmony_ci { 0x10ec0899, 0x2000, 0x2000, "ALC899" }, 103962306a36Sopenharmony_ci { 0x10ec0892, 0xffff, 0x8020, "ALC661" }, 104062306a36Sopenharmony_ci { 0x10ec0892, 0xffff, 0x8011, "ALC661" }, 104162306a36Sopenharmony_ci { 0x10ec0892, 0xffff, 0x4011, "ALC656" }, 104262306a36Sopenharmony_ci { } /* terminator */ 104362306a36Sopenharmony_ci}; 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_cistatic const struct alc_codec_rename_pci_table rename_pci_tbl[] = { 104662306a36Sopenharmony_ci { 0x10ec0280, 0x1028, 0, "ALC3220" }, 104762306a36Sopenharmony_ci { 0x10ec0282, 0x1028, 0, "ALC3221" }, 104862306a36Sopenharmony_ci { 0x10ec0283, 0x1028, 0, "ALC3223" }, 104962306a36Sopenharmony_ci { 0x10ec0288, 0x1028, 0, "ALC3263" }, 105062306a36Sopenharmony_ci { 0x10ec0292, 0x1028, 0, "ALC3226" }, 105162306a36Sopenharmony_ci { 0x10ec0293, 0x1028, 0, "ALC3235" }, 105262306a36Sopenharmony_ci { 0x10ec0255, 0x1028, 0, "ALC3234" }, 105362306a36Sopenharmony_ci { 0x10ec0668, 0x1028, 0, "ALC3661" }, 105462306a36Sopenharmony_ci { 0x10ec0275, 0x1028, 0, "ALC3260" }, 105562306a36Sopenharmony_ci { 0x10ec0899, 0x1028, 0, "ALC3861" }, 105662306a36Sopenharmony_ci { 0x10ec0298, 0x1028, 0, "ALC3266" }, 105762306a36Sopenharmony_ci { 0x10ec0236, 0x1028, 0, "ALC3204" }, 105862306a36Sopenharmony_ci { 0x10ec0256, 0x1028, 0, "ALC3246" }, 105962306a36Sopenharmony_ci { 0x10ec0225, 0x1028, 0, "ALC3253" }, 106062306a36Sopenharmony_ci { 0x10ec0295, 0x1028, 0, "ALC3254" }, 106162306a36Sopenharmony_ci { 0x10ec0299, 0x1028, 0, "ALC3271" }, 106262306a36Sopenharmony_ci { 0x10ec0670, 0x1025, 0, "ALC669X" }, 106362306a36Sopenharmony_ci { 0x10ec0676, 0x1025, 0, "ALC679X" }, 106462306a36Sopenharmony_ci { 0x10ec0282, 0x1043, 0, "ALC3229" }, 106562306a36Sopenharmony_ci { 0x10ec0233, 0x1043, 0, "ALC3236" }, 106662306a36Sopenharmony_ci { 0x10ec0280, 0x103c, 0, "ALC3228" }, 106762306a36Sopenharmony_ci { 0x10ec0282, 0x103c, 0, "ALC3227" }, 106862306a36Sopenharmony_ci { 0x10ec0286, 0x103c, 0, "ALC3242" }, 106962306a36Sopenharmony_ci { 0x10ec0290, 0x103c, 0, "ALC3241" }, 107062306a36Sopenharmony_ci { 0x10ec0668, 0x103c, 0, "ALC3662" }, 107162306a36Sopenharmony_ci { 0x10ec0283, 0x17aa, 0, "ALC3239" }, 107262306a36Sopenharmony_ci { 0x10ec0292, 0x17aa, 0, "ALC3232" }, 107362306a36Sopenharmony_ci { } /* terminator */ 107462306a36Sopenharmony_ci}; 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_cistatic int alc_codec_rename_from_preset(struct hda_codec *codec) 107762306a36Sopenharmony_ci{ 107862306a36Sopenharmony_ci const struct alc_codec_rename_table *p; 107962306a36Sopenharmony_ci const struct alc_codec_rename_pci_table *q; 108062306a36Sopenharmony_ci 108162306a36Sopenharmony_ci for (p = rename_tbl; p->vendor_id; p++) { 108262306a36Sopenharmony_ci if (p->vendor_id != codec->core.vendor_id) 108362306a36Sopenharmony_ci continue; 108462306a36Sopenharmony_ci if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits) 108562306a36Sopenharmony_ci return alc_codec_rename(codec, p->name); 108662306a36Sopenharmony_ci } 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_ci if (!codec->bus->pci) 108962306a36Sopenharmony_ci return 0; 109062306a36Sopenharmony_ci for (q = rename_pci_tbl; q->codec_vendor_id; q++) { 109162306a36Sopenharmony_ci if (q->codec_vendor_id != codec->core.vendor_id) 109262306a36Sopenharmony_ci continue; 109362306a36Sopenharmony_ci if (q->pci_subvendor != codec->bus->pci->subsystem_vendor) 109462306a36Sopenharmony_ci continue; 109562306a36Sopenharmony_ci if (!q->pci_subdevice || 109662306a36Sopenharmony_ci q->pci_subdevice == codec->bus->pci->subsystem_device) 109762306a36Sopenharmony_ci return alc_codec_rename(codec, q->name); 109862306a36Sopenharmony_ci } 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_ci return 0; 110162306a36Sopenharmony_ci} 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_ci 110462306a36Sopenharmony_ci/* 110562306a36Sopenharmony_ci * Digital-beep handlers 110662306a36Sopenharmony_ci */ 110762306a36Sopenharmony_ci#ifdef CONFIG_SND_HDA_INPUT_BEEP 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci/* additional beep mixers; private_value will be overwritten */ 111062306a36Sopenharmony_cistatic const struct snd_kcontrol_new alc_beep_mixer[] = { 111162306a36Sopenharmony_ci HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT), 111262306a36Sopenharmony_ci HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT), 111362306a36Sopenharmony_ci}; 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci/* set up and create beep controls */ 111662306a36Sopenharmony_cistatic int set_beep_amp(struct alc_spec *spec, hda_nid_t nid, 111762306a36Sopenharmony_ci int idx, int dir) 111862306a36Sopenharmony_ci{ 111962306a36Sopenharmony_ci struct snd_kcontrol_new *knew; 112062306a36Sopenharmony_ci unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir); 112162306a36Sopenharmony_ci int i; 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) { 112462306a36Sopenharmony_ci knew = snd_hda_gen_add_kctl(&spec->gen, NULL, 112562306a36Sopenharmony_ci &alc_beep_mixer[i]); 112662306a36Sopenharmony_ci if (!knew) 112762306a36Sopenharmony_ci return -ENOMEM; 112862306a36Sopenharmony_ci knew->private_value = beep_amp; 112962306a36Sopenharmony_ci } 113062306a36Sopenharmony_ci return 0; 113162306a36Sopenharmony_ci} 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_cistatic const struct snd_pci_quirk beep_allow_list[] = { 113462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1), 113562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1), 113662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), 113762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1), 113862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), 113962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1), 114062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1), 114162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1), 114262306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), 114362306a36Sopenharmony_ci /* denylist -- no beep available */ 114462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0), 114562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0), 114662306a36Sopenharmony_ci {} 114762306a36Sopenharmony_ci}; 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_cistatic inline int has_cdefine_beep(struct hda_codec *codec) 115062306a36Sopenharmony_ci{ 115162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 115262306a36Sopenharmony_ci const struct snd_pci_quirk *q; 115362306a36Sopenharmony_ci q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list); 115462306a36Sopenharmony_ci if (q) 115562306a36Sopenharmony_ci return q->value; 115662306a36Sopenharmony_ci return spec->cdefine.enable_pcbeep; 115762306a36Sopenharmony_ci} 115862306a36Sopenharmony_ci#else 115962306a36Sopenharmony_ci#define set_beep_amp(spec, nid, idx, dir) 0 116062306a36Sopenharmony_ci#define has_cdefine_beep(codec) 0 116162306a36Sopenharmony_ci#endif 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci/* parse the BIOS configuration and set up the alc_spec */ 116462306a36Sopenharmony_ci/* return 1 if successful, 0 if the proper config is not found, 116562306a36Sopenharmony_ci * or a negative error code 116662306a36Sopenharmony_ci */ 116762306a36Sopenharmony_cistatic int alc_parse_auto_config(struct hda_codec *codec, 116862306a36Sopenharmony_ci const hda_nid_t *ignore_nids, 116962306a36Sopenharmony_ci const hda_nid_t *ssid_nids) 117062306a36Sopenharmony_ci{ 117162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 117262306a36Sopenharmony_ci struct auto_pin_cfg *cfg = &spec->gen.autocfg; 117362306a36Sopenharmony_ci int err; 117462306a36Sopenharmony_ci 117562306a36Sopenharmony_ci err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids, 117662306a36Sopenharmony_ci spec->parse_flags); 117762306a36Sopenharmony_ci if (err < 0) 117862306a36Sopenharmony_ci return err; 117962306a36Sopenharmony_ci 118062306a36Sopenharmony_ci if (ssid_nids) 118162306a36Sopenharmony_ci alc_ssid_check(codec, ssid_nids); 118262306a36Sopenharmony_ci 118362306a36Sopenharmony_ci err = snd_hda_gen_parse_auto_config(codec, cfg); 118462306a36Sopenharmony_ci if (err < 0) 118562306a36Sopenharmony_ci return err; 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci return 1; 118862306a36Sopenharmony_ci} 118962306a36Sopenharmony_ci 119062306a36Sopenharmony_ci/* common preparation job for alc_spec */ 119162306a36Sopenharmony_cistatic int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid) 119262306a36Sopenharmony_ci{ 119362306a36Sopenharmony_ci struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL); 119462306a36Sopenharmony_ci int err; 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci if (!spec) 119762306a36Sopenharmony_ci return -ENOMEM; 119862306a36Sopenharmony_ci codec->spec = spec; 119962306a36Sopenharmony_ci snd_hda_gen_spec_init(&spec->gen); 120062306a36Sopenharmony_ci spec->gen.mixer_nid = mixer_nid; 120162306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 120262306a36Sopenharmony_ci codec->single_adc_amp = 1; 120362306a36Sopenharmony_ci /* FIXME: do we need this for all Realtek codec models? */ 120462306a36Sopenharmony_ci codec->spdif_status_reset = 1; 120562306a36Sopenharmony_ci codec->forced_resume = 1; 120662306a36Sopenharmony_ci codec->patch_ops = alc_patch_ops; 120762306a36Sopenharmony_ci mutex_init(&spec->coef_mutex); 120862306a36Sopenharmony_ci 120962306a36Sopenharmony_ci err = alc_codec_rename_from_preset(codec); 121062306a36Sopenharmony_ci if (err < 0) { 121162306a36Sopenharmony_ci kfree(spec); 121262306a36Sopenharmony_ci return err; 121362306a36Sopenharmony_ci } 121462306a36Sopenharmony_ci return 0; 121562306a36Sopenharmony_ci} 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_cistatic int alc880_parse_auto_config(struct hda_codec *codec) 121862306a36Sopenharmony_ci{ 121962306a36Sopenharmony_ci static const hda_nid_t alc880_ignore[] = { 0x1d, 0 }; 122062306a36Sopenharmony_ci static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 122162306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids); 122262306a36Sopenharmony_ci} 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci/* 122562306a36Sopenharmony_ci * ALC880 fix-ups 122662306a36Sopenharmony_ci */ 122762306a36Sopenharmony_cienum { 122862306a36Sopenharmony_ci ALC880_FIXUP_GPIO1, 122962306a36Sopenharmony_ci ALC880_FIXUP_GPIO2, 123062306a36Sopenharmony_ci ALC880_FIXUP_MEDION_RIM, 123162306a36Sopenharmony_ci ALC880_FIXUP_LG, 123262306a36Sopenharmony_ci ALC880_FIXUP_LG_LW25, 123362306a36Sopenharmony_ci ALC880_FIXUP_W810, 123462306a36Sopenharmony_ci ALC880_FIXUP_EAPD_COEF, 123562306a36Sopenharmony_ci ALC880_FIXUP_TCL_S700, 123662306a36Sopenharmony_ci ALC880_FIXUP_VOL_KNOB, 123762306a36Sopenharmony_ci ALC880_FIXUP_FUJITSU, 123862306a36Sopenharmony_ci ALC880_FIXUP_F1734, 123962306a36Sopenharmony_ci ALC880_FIXUP_UNIWILL, 124062306a36Sopenharmony_ci ALC880_FIXUP_UNIWILL_DIG, 124162306a36Sopenharmony_ci ALC880_FIXUP_Z71V, 124262306a36Sopenharmony_ci ALC880_FIXUP_ASUS_W5A, 124362306a36Sopenharmony_ci ALC880_FIXUP_3ST_BASE, 124462306a36Sopenharmony_ci ALC880_FIXUP_3ST, 124562306a36Sopenharmony_ci ALC880_FIXUP_3ST_DIG, 124662306a36Sopenharmony_ci ALC880_FIXUP_5ST_BASE, 124762306a36Sopenharmony_ci ALC880_FIXUP_5ST, 124862306a36Sopenharmony_ci ALC880_FIXUP_5ST_DIG, 124962306a36Sopenharmony_ci ALC880_FIXUP_6ST_BASE, 125062306a36Sopenharmony_ci ALC880_FIXUP_6ST, 125162306a36Sopenharmony_ci ALC880_FIXUP_6ST_DIG, 125262306a36Sopenharmony_ci ALC880_FIXUP_6ST_AUTOMUTE, 125362306a36Sopenharmony_ci}; 125462306a36Sopenharmony_ci 125562306a36Sopenharmony_ci/* enable the volume-knob widget support on NID 0x21 */ 125662306a36Sopenharmony_cistatic void alc880_fixup_vol_knob(struct hda_codec *codec, 125762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 125862306a36Sopenharmony_ci{ 125962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PROBE) 126062306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x21, 126162306a36Sopenharmony_ci alc_update_knob_master); 126262306a36Sopenharmony_ci} 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_cistatic const struct hda_fixup alc880_fixups[] = { 126562306a36Sopenharmony_ci [ALC880_FIXUP_GPIO1] = { 126662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 126762306a36Sopenharmony_ci .v.func = alc_fixup_gpio1, 126862306a36Sopenharmony_ci }, 126962306a36Sopenharmony_ci [ALC880_FIXUP_GPIO2] = { 127062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 127162306a36Sopenharmony_ci .v.func = alc_fixup_gpio2, 127262306a36Sopenharmony_ci }, 127362306a36Sopenharmony_ci [ALC880_FIXUP_MEDION_RIM] = { 127462306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 127562306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 127662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 127762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 }, 127862306a36Sopenharmony_ci { } 127962306a36Sopenharmony_ci }, 128062306a36Sopenharmony_ci .chained = true, 128162306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_GPIO2, 128262306a36Sopenharmony_ci }, 128362306a36Sopenharmony_ci [ALC880_FIXUP_LG] = { 128462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 128562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 128662306a36Sopenharmony_ci /* disable bogus unused pins */ 128762306a36Sopenharmony_ci { 0x16, 0x411111f0 }, 128862306a36Sopenharmony_ci { 0x18, 0x411111f0 }, 128962306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, 129062306a36Sopenharmony_ci { } 129162306a36Sopenharmony_ci } 129262306a36Sopenharmony_ci }, 129362306a36Sopenharmony_ci [ALC880_FIXUP_LG_LW25] = { 129462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 129562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 129662306a36Sopenharmony_ci { 0x1a, 0x0181344f }, /* line-in */ 129762306a36Sopenharmony_ci { 0x1b, 0x0321403f }, /* headphone */ 129862306a36Sopenharmony_ci { } 129962306a36Sopenharmony_ci } 130062306a36Sopenharmony_ci }, 130162306a36Sopenharmony_ci [ALC880_FIXUP_W810] = { 130262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 130362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 130462306a36Sopenharmony_ci /* disable bogus unused pins */ 130562306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 130662306a36Sopenharmony_ci { } 130762306a36Sopenharmony_ci }, 130862306a36Sopenharmony_ci .chained = true, 130962306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_GPIO2, 131062306a36Sopenharmony_ci }, 131162306a36Sopenharmony_ci [ALC880_FIXUP_EAPD_COEF] = { 131262306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 131362306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 131462306a36Sopenharmony_ci /* change to EAPD mode */ 131562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 131662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 }, 131762306a36Sopenharmony_ci {} 131862306a36Sopenharmony_ci }, 131962306a36Sopenharmony_ci }, 132062306a36Sopenharmony_ci [ALC880_FIXUP_TCL_S700] = { 132162306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 132262306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 132362306a36Sopenharmony_ci /* change to EAPD mode */ 132462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 132562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 }, 132662306a36Sopenharmony_ci {} 132762306a36Sopenharmony_ci }, 132862306a36Sopenharmony_ci .chained = true, 132962306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_GPIO2, 133062306a36Sopenharmony_ci }, 133162306a36Sopenharmony_ci [ALC880_FIXUP_VOL_KNOB] = { 133262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 133362306a36Sopenharmony_ci .v.func = alc880_fixup_vol_knob, 133462306a36Sopenharmony_ci }, 133562306a36Sopenharmony_ci [ALC880_FIXUP_FUJITSU] = { 133662306a36Sopenharmony_ci /* override all pins as BIOS on old Amilo is broken */ 133762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 133862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 133962306a36Sopenharmony_ci { 0x14, 0x0121401f }, /* HP */ 134062306a36Sopenharmony_ci { 0x15, 0x99030120 }, /* speaker */ 134162306a36Sopenharmony_ci { 0x16, 0x99030130 }, /* bass speaker */ 134262306a36Sopenharmony_ci { 0x17, 0x411111f0 }, /* N/A */ 134362306a36Sopenharmony_ci { 0x18, 0x411111f0 }, /* N/A */ 134462306a36Sopenharmony_ci { 0x19, 0x01a19950 }, /* mic-in */ 134562306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, /* N/A */ 134662306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, /* N/A */ 134762306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 134862306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 134962306a36Sopenharmony_ci { 0x1e, 0x01454140 }, /* SPDIF out */ 135062306a36Sopenharmony_ci { } 135162306a36Sopenharmony_ci }, 135262306a36Sopenharmony_ci .chained = true, 135362306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_VOL_KNOB, 135462306a36Sopenharmony_ci }, 135562306a36Sopenharmony_ci [ALC880_FIXUP_F1734] = { 135662306a36Sopenharmony_ci /* almost compatible with FUJITSU, but no bass and SPDIF */ 135762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 135862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 135962306a36Sopenharmony_ci { 0x14, 0x0121401f }, /* HP */ 136062306a36Sopenharmony_ci { 0x15, 0x99030120 }, /* speaker */ 136162306a36Sopenharmony_ci { 0x16, 0x411111f0 }, /* N/A */ 136262306a36Sopenharmony_ci { 0x17, 0x411111f0 }, /* N/A */ 136362306a36Sopenharmony_ci { 0x18, 0x411111f0 }, /* N/A */ 136462306a36Sopenharmony_ci { 0x19, 0x01a19950 }, /* mic-in */ 136562306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, /* N/A */ 136662306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, /* N/A */ 136762306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 136862306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 136962306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, /* N/A */ 137062306a36Sopenharmony_ci { } 137162306a36Sopenharmony_ci }, 137262306a36Sopenharmony_ci .chained = true, 137362306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_VOL_KNOB, 137462306a36Sopenharmony_ci }, 137562306a36Sopenharmony_ci [ALC880_FIXUP_UNIWILL] = { 137662306a36Sopenharmony_ci /* need to fix HP and speaker pins to be parsed correctly */ 137762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 137862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 137962306a36Sopenharmony_ci { 0x14, 0x0121411f }, /* HP */ 138062306a36Sopenharmony_ci { 0x15, 0x99030120 }, /* speaker */ 138162306a36Sopenharmony_ci { 0x16, 0x99030130 }, /* bass speaker */ 138262306a36Sopenharmony_ci { } 138362306a36Sopenharmony_ci }, 138462306a36Sopenharmony_ci }, 138562306a36Sopenharmony_ci [ALC880_FIXUP_UNIWILL_DIG] = { 138662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 138762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 138862306a36Sopenharmony_ci /* disable bogus unused pins */ 138962306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 139062306a36Sopenharmony_ci { 0x19, 0x411111f0 }, 139162306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, 139262306a36Sopenharmony_ci { 0x1f, 0x411111f0 }, 139362306a36Sopenharmony_ci { } 139462306a36Sopenharmony_ci } 139562306a36Sopenharmony_ci }, 139662306a36Sopenharmony_ci [ALC880_FIXUP_Z71V] = { 139762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 139862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 139962306a36Sopenharmony_ci /* set up the whole pins as BIOS is utterly broken */ 140062306a36Sopenharmony_ci { 0x14, 0x99030120 }, /* speaker */ 140162306a36Sopenharmony_ci { 0x15, 0x0121411f }, /* HP */ 140262306a36Sopenharmony_ci { 0x16, 0x411111f0 }, /* N/A */ 140362306a36Sopenharmony_ci { 0x17, 0x411111f0 }, /* N/A */ 140462306a36Sopenharmony_ci { 0x18, 0x01a19950 }, /* mic-in */ 140562306a36Sopenharmony_ci { 0x19, 0x411111f0 }, /* N/A */ 140662306a36Sopenharmony_ci { 0x1a, 0x01813031 }, /* line-in */ 140762306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, /* N/A */ 140862306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 140962306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 141062306a36Sopenharmony_ci { 0x1e, 0x0144111e }, /* SPDIF */ 141162306a36Sopenharmony_ci { } 141262306a36Sopenharmony_ci } 141362306a36Sopenharmony_ci }, 141462306a36Sopenharmony_ci [ALC880_FIXUP_ASUS_W5A] = { 141562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 141662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 141762306a36Sopenharmony_ci /* set up the whole pins as BIOS is utterly broken */ 141862306a36Sopenharmony_ci { 0x14, 0x0121411f }, /* HP */ 141962306a36Sopenharmony_ci { 0x15, 0x411111f0 }, /* N/A */ 142062306a36Sopenharmony_ci { 0x16, 0x411111f0 }, /* N/A */ 142162306a36Sopenharmony_ci { 0x17, 0x411111f0 }, /* N/A */ 142262306a36Sopenharmony_ci { 0x18, 0x90a60160 }, /* mic */ 142362306a36Sopenharmony_ci { 0x19, 0x411111f0 }, /* N/A */ 142462306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, /* N/A */ 142562306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, /* N/A */ 142662306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 142762306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 142862306a36Sopenharmony_ci { 0x1e, 0xb743111e }, /* SPDIF out */ 142962306a36Sopenharmony_ci { } 143062306a36Sopenharmony_ci }, 143162306a36Sopenharmony_ci .chained = true, 143262306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_GPIO1, 143362306a36Sopenharmony_ci }, 143462306a36Sopenharmony_ci [ALC880_FIXUP_3ST_BASE] = { 143562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 143662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 143762306a36Sopenharmony_ci { 0x14, 0x01014010 }, /* line-out */ 143862306a36Sopenharmony_ci { 0x15, 0x411111f0 }, /* N/A */ 143962306a36Sopenharmony_ci { 0x16, 0x411111f0 }, /* N/A */ 144062306a36Sopenharmony_ci { 0x17, 0x411111f0 }, /* N/A */ 144162306a36Sopenharmony_ci { 0x18, 0x01a19c30 }, /* mic-in */ 144262306a36Sopenharmony_ci { 0x19, 0x0121411f }, /* HP */ 144362306a36Sopenharmony_ci { 0x1a, 0x01813031 }, /* line-in */ 144462306a36Sopenharmony_ci { 0x1b, 0x02a19c40 }, /* front-mic */ 144562306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 144662306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 144762306a36Sopenharmony_ci /* 0x1e is filled in below */ 144862306a36Sopenharmony_ci { 0x1f, 0x411111f0 }, /* N/A */ 144962306a36Sopenharmony_ci { } 145062306a36Sopenharmony_ci } 145162306a36Sopenharmony_ci }, 145262306a36Sopenharmony_ci [ALC880_FIXUP_3ST] = { 145362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 145462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 145562306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, /* N/A */ 145662306a36Sopenharmony_ci { } 145762306a36Sopenharmony_ci }, 145862306a36Sopenharmony_ci .chained = true, 145962306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_3ST_BASE, 146062306a36Sopenharmony_ci }, 146162306a36Sopenharmony_ci [ALC880_FIXUP_3ST_DIG] = { 146262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 146362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 146462306a36Sopenharmony_ci { 0x1e, 0x0144111e }, /* SPDIF */ 146562306a36Sopenharmony_ci { } 146662306a36Sopenharmony_ci }, 146762306a36Sopenharmony_ci .chained = true, 146862306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_3ST_BASE, 146962306a36Sopenharmony_ci }, 147062306a36Sopenharmony_ci [ALC880_FIXUP_5ST_BASE] = { 147162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 147262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 147362306a36Sopenharmony_ci { 0x14, 0x01014010 }, /* front */ 147462306a36Sopenharmony_ci { 0x15, 0x411111f0 }, /* N/A */ 147562306a36Sopenharmony_ci { 0x16, 0x01011411 }, /* CLFE */ 147662306a36Sopenharmony_ci { 0x17, 0x01016412 }, /* surr */ 147762306a36Sopenharmony_ci { 0x18, 0x01a19c30 }, /* mic-in */ 147862306a36Sopenharmony_ci { 0x19, 0x0121411f }, /* HP */ 147962306a36Sopenharmony_ci { 0x1a, 0x01813031 }, /* line-in */ 148062306a36Sopenharmony_ci { 0x1b, 0x02a19c40 }, /* front-mic */ 148162306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 148262306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 148362306a36Sopenharmony_ci /* 0x1e is filled in below */ 148462306a36Sopenharmony_ci { 0x1f, 0x411111f0 }, /* N/A */ 148562306a36Sopenharmony_ci { } 148662306a36Sopenharmony_ci } 148762306a36Sopenharmony_ci }, 148862306a36Sopenharmony_ci [ALC880_FIXUP_5ST] = { 148962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 149062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 149162306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, /* N/A */ 149262306a36Sopenharmony_ci { } 149362306a36Sopenharmony_ci }, 149462306a36Sopenharmony_ci .chained = true, 149562306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_5ST_BASE, 149662306a36Sopenharmony_ci }, 149762306a36Sopenharmony_ci [ALC880_FIXUP_5ST_DIG] = { 149862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 149962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 150062306a36Sopenharmony_ci { 0x1e, 0x0144111e }, /* SPDIF */ 150162306a36Sopenharmony_ci { } 150262306a36Sopenharmony_ci }, 150362306a36Sopenharmony_ci .chained = true, 150462306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_5ST_BASE, 150562306a36Sopenharmony_ci }, 150662306a36Sopenharmony_ci [ALC880_FIXUP_6ST_BASE] = { 150762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 150862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 150962306a36Sopenharmony_ci { 0x14, 0x01014010 }, /* front */ 151062306a36Sopenharmony_ci { 0x15, 0x01016412 }, /* surr */ 151162306a36Sopenharmony_ci { 0x16, 0x01011411 }, /* CLFE */ 151262306a36Sopenharmony_ci { 0x17, 0x01012414 }, /* side */ 151362306a36Sopenharmony_ci { 0x18, 0x01a19c30 }, /* mic-in */ 151462306a36Sopenharmony_ci { 0x19, 0x02a19c40 }, /* front-mic */ 151562306a36Sopenharmony_ci { 0x1a, 0x01813031 }, /* line-in */ 151662306a36Sopenharmony_ci { 0x1b, 0x0121411f }, /* HP */ 151762306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, /* N/A */ 151862306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, /* N/A */ 151962306a36Sopenharmony_ci /* 0x1e is filled in below */ 152062306a36Sopenharmony_ci { 0x1f, 0x411111f0 }, /* N/A */ 152162306a36Sopenharmony_ci { } 152262306a36Sopenharmony_ci } 152362306a36Sopenharmony_ci }, 152462306a36Sopenharmony_ci [ALC880_FIXUP_6ST] = { 152562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 152662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 152762306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, /* N/A */ 152862306a36Sopenharmony_ci { } 152962306a36Sopenharmony_ci }, 153062306a36Sopenharmony_ci .chained = true, 153162306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_6ST_BASE, 153262306a36Sopenharmony_ci }, 153362306a36Sopenharmony_ci [ALC880_FIXUP_6ST_DIG] = { 153462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 153562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 153662306a36Sopenharmony_ci { 0x1e, 0x0144111e }, /* SPDIF */ 153762306a36Sopenharmony_ci { } 153862306a36Sopenharmony_ci }, 153962306a36Sopenharmony_ci .chained = true, 154062306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_6ST_BASE, 154162306a36Sopenharmony_ci }, 154262306a36Sopenharmony_ci [ALC880_FIXUP_6ST_AUTOMUTE] = { 154362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 154462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 154562306a36Sopenharmony_ci { 0x1b, 0x0121401f }, /* HP with jack detect */ 154662306a36Sopenharmony_ci { } 154762306a36Sopenharmony_ci }, 154862306a36Sopenharmony_ci .chained_before = true, 154962306a36Sopenharmony_ci .chain_id = ALC880_FIXUP_6ST_BASE, 155062306a36Sopenharmony_ci }, 155162306a36Sopenharmony_ci}; 155262306a36Sopenharmony_ci 155362306a36Sopenharmony_cistatic const struct snd_pci_quirk alc880_fixup_tbl[] = { 155462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810), 155562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A), 155662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V), 155762306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1), 155862306a36Sopenharmony_ci SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE), 155962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2), 156062306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF), 156162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG), 156262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734), 156362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL), 156462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB), 156562306a36Sopenharmony_ci SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810), 156662306a36Sopenharmony_ci SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM), 156762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE), 156862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU), 156962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU), 157062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734), 157162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU), 157262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG), 157362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG), 157462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG), 157562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25), 157662306a36Sopenharmony_ci SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700), 157762306a36Sopenharmony_ci 157862306a36Sopenharmony_ci /* Below is the copied entries from alc880_quirks.c. 157962306a36Sopenharmony_ci * It's not quite sure whether BIOS sets the correct pin-config table 158062306a36Sopenharmony_ci * on these machines, thus they are kept to be compatible with 158162306a36Sopenharmony_ci * the old static quirks. Once when it's confirmed to work without 158262306a36Sopenharmony_ci * these overrides, it'd be better to remove. 158362306a36Sopenharmony_ci */ 158462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG), 158562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST), 158662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG), 158762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG), 158862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG), 158962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG), 159062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG), 159162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST), 159262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG), 159362306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST), 159462306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST), 159562306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST), 159662306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST), 159762306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST), 159862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG), 159962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG), 160062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG), 160162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG), 160262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG), 160362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG), 160462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG), 160562306a36Sopenharmony_ci SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */ 160662306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG), 160762306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG), 160862306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG), 160962306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG), 161062306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG), 161162306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG), 161262306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG), 161362306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG), 161462306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG), 161562306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG), 161662306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG), 161762306a36Sopenharmony_ci /* default Intel */ 161862306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST), 161962306a36Sopenharmony_ci SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG), 162062306a36Sopenharmony_ci SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG), 162162306a36Sopenharmony_ci {} 162262306a36Sopenharmony_ci}; 162362306a36Sopenharmony_ci 162462306a36Sopenharmony_cistatic const struct hda_model_fixup alc880_fixup_models[] = { 162562306a36Sopenharmony_ci {.id = ALC880_FIXUP_3ST, .name = "3stack"}, 162662306a36Sopenharmony_ci {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"}, 162762306a36Sopenharmony_ci {.id = ALC880_FIXUP_5ST, .name = "5stack"}, 162862306a36Sopenharmony_ci {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"}, 162962306a36Sopenharmony_ci {.id = ALC880_FIXUP_6ST, .name = "6stack"}, 163062306a36Sopenharmony_ci {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"}, 163162306a36Sopenharmony_ci {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"}, 163262306a36Sopenharmony_ci {} 163362306a36Sopenharmony_ci}; 163462306a36Sopenharmony_ci 163562306a36Sopenharmony_ci 163662306a36Sopenharmony_ci/* 163762306a36Sopenharmony_ci * OK, here we have finally the patch for ALC880 163862306a36Sopenharmony_ci */ 163962306a36Sopenharmony_cistatic int patch_alc880(struct hda_codec *codec) 164062306a36Sopenharmony_ci{ 164162306a36Sopenharmony_ci struct alc_spec *spec; 164262306a36Sopenharmony_ci int err; 164362306a36Sopenharmony_ci 164462306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x0b); 164562306a36Sopenharmony_ci if (err < 0) 164662306a36Sopenharmony_ci return err; 164762306a36Sopenharmony_ci 164862306a36Sopenharmony_ci spec = codec->spec; 164962306a36Sopenharmony_ci spec->gen.need_dac_fix = 1; 165062306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 165162306a36Sopenharmony_ci 165262306a36Sopenharmony_ci codec->patch_ops.unsol_event = alc880_unsol_event; 165362306a36Sopenharmony_ci 165462306a36Sopenharmony_ci alc_pre_init(codec); 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl, 165762306a36Sopenharmony_ci alc880_fixups); 165862306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 165962306a36Sopenharmony_ci 166062306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 166162306a36Sopenharmony_ci err = alc880_parse_auto_config(codec); 166262306a36Sopenharmony_ci if (err < 0) 166362306a36Sopenharmony_ci goto error; 166462306a36Sopenharmony_ci 166562306a36Sopenharmony_ci if (!spec->gen.no_analog) { 166662306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 166762306a36Sopenharmony_ci if (err < 0) 166862306a36Sopenharmony_ci goto error; 166962306a36Sopenharmony_ci } 167062306a36Sopenharmony_ci 167162306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 167262306a36Sopenharmony_ci 167362306a36Sopenharmony_ci return 0; 167462306a36Sopenharmony_ci 167562306a36Sopenharmony_ci error: 167662306a36Sopenharmony_ci alc_free(codec); 167762306a36Sopenharmony_ci return err; 167862306a36Sopenharmony_ci} 167962306a36Sopenharmony_ci 168062306a36Sopenharmony_ci 168162306a36Sopenharmony_ci/* 168262306a36Sopenharmony_ci * ALC260 support 168362306a36Sopenharmony_ci */ 168462306a36Sopenharmony_cistatic int alc260_parse_auto_config(struct hda_codec *codec) 168562306a36Sopenharmony_ci{ 168662306a36Sopenharmony_ci static const hda_nid_t alc260_ignore[] = { 0x17, 0 }; 168762306a36Sopenharmony_ci static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 }; 168862306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids); 168962306a36Sopenharmony_ci} 169062306a36Sopenharmony_ci 169162306a36Sopenharmony_ci/* 169262306a36Sopenharmony_ci * Pin config fixes 169362306a36Sopenharmony_ci */ 169462306a36Sopenharmony_cienum { 169562306a36Sopenharmony_ci ALC260_FIXUP_HP_DC5750, 169662306a36Sopenharmony_ci ALC260_FIXUP_HP_PIN_0F, 169762306a36Sopenharmony_ci ALC260_FIXUP_COEF, 169862306a36Sopenharmony_ci ALC260_FIXUP_GPIO1, 169962306a36Sopenharmony_ci ALC260_FIXUP_GPIO1_TOGGLE, 170062306a36Sopenharmony_ci ALC260_FIXUP_REPLACER, 170162306a36Sopenharmony_ci ALC260_FIXUP_HP_B1900, 170262306a36Sopenharmony_ci ALC260_FIXUP_KN1, 170362306a36Sopenharmony_ci ALC260_FIXUP_FSC_S7020, 170462306a36Sopenharmony_ci ALC260_FIXUP_FSC_S7020_JWSE, 170562306a36Sopenharmony_ci ALC260_FIXUP_VAIO_PINS, 170662306a36Sopenharmony_ci}; 170762306a36Sopenharmony_ci 170862306a36Sopenharmony_cistatic void alc260_gpio1_automute(struct hda_codec *codec) 170962306a36Sopenharmony_ci{ 171062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 171162306a36Sopenharmony_ci 171262306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present); 171362306a36Sopenharmony_ci} 171462306a36Sopenharmony_ci 171562306a36Sopenharmony_cistatic void alc260_fixup_gpio1_toggle(struct hda_codec *codec, 171662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 171762306a36Sopenharmony_ci{ 171862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 171962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PROBE) { 172062306a36Sopenharmony_ci /* although the machine has only one output pin, we need to 172162306a36Sopenharmony_ci * toggle GPIO1 according to the jack state 172262306a36Sopenharmony_ci */ 172362306a36Sopenharmony_ci spec->gen.automute_hook = alc260_gpio1_automute; 172462306a36Sopenharmony_ci spec->gen.detect_hp = 1; 172562306a36Sopenharmony_ci spec->gen.automute_speaker = 1; 172662306a36Sopenharmony_ci spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */ 172762306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x0f, 172862306a36Sopenharmony_ci snd_hda_gen_hp_automute); 172962306a36Sopenharmony_ci alc_setup_gpio(codec, 0x01); 173062306a36Sopenharmony_ci } 173162306a36Sopenharmony_ci} 173262306a36Sopenharmony_ci 173362306a36Sopenharmony_cistatic void alc260_fixup_kn1(struct hda_codec *codec, 173462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 173562306a36Sopenharmony_ci{ 173662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 173762306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 173862306a36Sopenharmony_ci { 0x0f, 0x02214000 }, /* HP/speaker */ 173962306a36Sopenharmony_ci { 0x12, 0x90a60160 }, /* int mic */ 174062306a36Sopenharmony_ci { 0x13, 0x02a19000 }, /* ext mic */ 174162306a36Sopenharmony_ci { 0x18, 0x01446000 }, /* SPDIF out */ 174262306a36Sopenharmony_ci /* disable bogus I/O pins */ 174362306a36Sopenharmony_ci { 0x10, 0x411111f0 }, 174462306a36Sopenharmony_ci { 0x11, 0x411111f0 }, 174562306a36Sopenharmony_ci { 0x14, 0x411111f0 }, 174662306a36Sopenharmony_ci { 0x15, 0x411111f0 }, 174762306a36Sopenharmony_ci { 0x16, 0x411111f0 }, 174862306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 174962306a36Sopenharmony_ci { 0x19, 0x411111f0 }, 175062306a36Sopenharmony_ci { } 175162306a36Sopenharmony_ci }; 175262306a36Sopenharmony_ci 175362306a36Sopenharmony_ci switch (action) { 175462306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 175562306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 175662306a36Sopenharmony_ci spec->init_amp = ALC_INIT_NONE; 175762306a36Sopenharmony_ci break; 175862306a36Sopenharmony_ci } 175962306a36Sopenharmony_ci} 176062306a36Sopenharmony_ci 176162306a36Sopenharmony_cistatic void alc260_fixup_fsc_s7020(struct hda_codec *codec, 176262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 176362306a36Sopenharmony_ci{ 176462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 176562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 176662306a36Sopenharmony_ci spec->init_amp = ALC_INIT_NONE; 176762306a36Sopenharmony_ci} 176862306a36Sopenharmony_ci 176962306a36Sopenharmony_cistatic void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec, 177062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 177162306a36Sopenharmony_ci{ 177262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 177362306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 177462306a36Sopenharmony_ci spec->gen.add_jack_modes = 1; 177562306a36Sopenharmony_ci spec->gen.hp_mic = 1; 177662306a36Sopenharmony_ci } 177762306a36Sopenharmony_ci} 177862306a36Sopenharmony_ci 177962306a36Sopenharmony_cistatic const struct hda_fixup alc260_fixups[] = { 178062306a36Sopenharmony_ci [ALC260_FIXUP_HP_DC5750] = { 178162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 178262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 178362306a36Sopenharmony_ci { 0x11, 0x90130110 }, /* speaker */ 178462306a36Sopenharmony_ci { } 178562306a36Sopenharmony_ci } 178662306a36Sopenharmony_ci }, 178762306a36Sopenharmony_ci [ALC260_FIXUP_HP_PIN_0F] = { 178862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 178962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 179062306a36Sopenharmony_ci { 0x0f, 0x01214000 }, /* HP */ 179162306a36Sopenharmony_ci { } 179262306a36Sopenharmony_ci } 179362306a36Sopenharmony_ci }, 179462306a36Sopenharmony_ci [ALC260_FIXUP_COEF] = { 179562306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 179662306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 179762306a36Sopenharmony_ci { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 }, 179862306a36Sopenharmony_ci { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 }, 179962306a36Sopenharmony_ci { } 180062306a36Sopenharmony_ci }, 180162306a36Sopenharmony_ci }, 180262306a36Sopenharmony_ci [ALC260_FIXUP_GPIO1] = { 180362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 180462306a36Sopenharmony_ci .v.func = alc_fixup_gpio1, 180562306a36Sopenharmony_ci }, 180662306a36Sopenharmony_ci [ALC260_FIXUP_GPIO1_TOGGLE] = { 180762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 180862306a36Sopenharmony_ci .v.func = alc260_fixup_gpio1_toggle, 180962306a36Sopenharmony_ci .chained = true, 181062306a36Sopenharmony_ci .chain_id = ALC260_FIXUP_HP_PIN_0F, 181162306a36Sopenharmony_ci }, 181262306a36Sopenharmony_ci [ALC260_FIXUP_REPLACER] = { 181362306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 181462306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 181562306a36Sopenharmony_ci { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 }, 181662306a36Sopenharmony_ci { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 }, 181762306a36Sopenharmony_ci { } 181862306a36Sopenharmony_ci }, 181962306a36Sopenharmony_ci .chained = true, 182062306a36Sopenharmony_ci .chain_id = ALC260_FIXUP_GPIO1_TOGGLE, 182162306a36Sopenharmony_ci }, 182262306a36Sopenharmony_ci [ALC260_FIXUP_HP_B1900] = { 182362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 182462306a36Sopenharmony_ci .v.func = alc260_fixup_gpio1_toggle, 182562306a36Sopenharmony_ci .chained = true, 182662306a36Sopenharmony_ci .chain_id = ALC260_FIXUP_COEF, 182762306a36Sopenharmony_ci }, 182862306a36Sopenharmony_ci [ALC260_FIXUP_KN1] = { 182962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 183062306a36Sopenharmony_ci .v.func = alc260_fixup_kn1, 183162306a36Sopenharmony_ci }, 183262306a36Sopenharmony_ci [ALC260_FIXUP_FSC_S7020] = { 183362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 183462306a36Sopenharmony_ci .v.func = alc260_fixup_fsc_s7020, 183562306a36Sopenharmony_ci }, 183662306a36Sopenharmony_ci [ALC260_FIXUP_FSC_S7020_JWSE] = { 183762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 183862306a36Sopenharmony_ci .v.func = alc260_fixup_fsc_s7020_jwse, 183962306a36Sopenharmony_ci .chained = true, 184062306a36Sopenharmony_ci .chain_id = ALC260_FIXUP_FSC_S7020, 184162306a36Sopenharmony_ci }, 184262306a36Sopenharmony_ci [ALC260_FIXUP_VAIO_PINS] = { 184362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 184462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 184562306a36Sopenharmony_ci /* Pin configs are missing completely on some VAIOs */ 184662306a36Sopenharmony_ci { 0x0f, 0x01211020 }, 184762306a36Sopenharmony_ci { 0x10, 0x0001003f }, 184862306a36Sopenharmony_ci { 0x11, 0x411111f0 }, 184962306a36Sopenharmony_ci { 0x12, 0x01a15930 }, 185062306a36Sopenharmony_ci { 0x13, 0x411111f0 }, 185162306a36Sopenharmony_ci { 0x14, 0x411111f0 }, 185262306a36Sopenharmony_ci { 0x15, 0x411111f0 }, 185362306a36Sopenharmony_ci { 0x16, 0x411111f0 }, 185462306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 185562306a36Sopenharmony_ci { 0x18, 0x411111f0 }, 185662306a36Sopenharmony_ci { 0x19, 0x411111f0 }, 185762306a36Sopenharmony_ci { } 185862306a36Sopenharmony_ci } 185962306a36Sopenharmony_ci }, 186062306a36Sopenharmony_ci}; 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_cistatic const struct snd_pci_quirk alc260_fixup_tbl[] = { 186362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1), 186462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF), 186562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1), 186662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750), 186762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), 186862306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS), 186962306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F), 187062306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020), 187162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), 187262306a36Sopenharmony_ci SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1), 187362306a36Sopenharmony_ci SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER), 187462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF), 187562306a36Sopenharmony_ci {} 187662306a36Sopenharmony_ci}; 187762306a36Sopenharmony_ci 187862306a36Sopenharmony_cistatic const struct hda_model_fixup alc260_fixup_models[] = { 187962306a36Sopenharmony_ci {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"}, 188062306a36Sopenharmony_ci {.id = ALC260_FIXUP_COEF, .name = "coef"}, 188162306a36Sopenharmony_ci {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"}, 188262306a36Sopenharmony_ci {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"}, 188362306a36Sopenharmony_ci {} 188462306a36Sopenharmony_ci}; 188562306a36Sopenharmony_ci 188662306a36Sopenharmony_ci/* 188762306a36Sopenharmony_ci */ 188862306a36Sopenharmony_cistatic int patch_alc260(struct hda_codec *codec) 188962306a36Sopenharmony_ci{ 189062306a36Sopenharmony_ci struct alc_spec *spec; 189162306a36Sopenharmony_ci int err; 189262306a36Sopenharmony_ci 189362306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x07); 189462306a36Sopenharmony_ci if (err < 0) 189562306a36Sopenharmony_ci return err; 189662306a36Sopenharmony_ci 189762306a36Sopenharmony_ci spec = codec->spec; 189862306a36Sopenharmony_ci /* as quite a few machines require HP amp for speaker outputs, 189962306a36Sopenharmony_ci * it's easier to enable it unconditionally; even if it's unneeded, 190062306a36Sopenharmony_ci * it's almost harmless. 190162306a36Sopenharmony_ci */ 190262306a36Sopenharmony_ci spec->gen.prefer_hp_amp = 1; 190362306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 190462306a36Sopenharmony_ci 190562306a36Sopenharmony_ci spec->shutup = alc_eapd_shutup; 190662306a36Sopenharmony_ci 190762306a36Sopenharmony_ci alc_pre_init(codec); 190862306a36Sopenharmony_ci 190962306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl, 191062306a36Sopenharmony_ci alc260_fixups); 191162306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 191262306a36Sopenharmony_ci 191362306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 191462306a36Sopenharmony_ci err = alc260_parse_auto_config(codec); 191562306a36Sopenharmony_ci if (err < 0) 191662306a36Sopenharmony_ci goto error; 191762306a36Sopenharmony_ci 191862306a36Sopenharmony_ci if (!spec->gen.no_analog) { 191962306a36Sopenharmony_ci err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); 192062306a36Sopenharmony_ci if (err < 0) 192162306a36Sopenharmony_ci goto error; 192262306a36Sopenharmony_ci } 192362306a36Sopenharmony_ci 192462306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 192562306a36Sopenharmony_ci 192662306a36Sopenharmony_ci return 0; 192762306a36Sopenharmony_ci 192862306a36Sopenharmony_ci error: 192962306a36Sopenharmony_ci alc_free(codec); 193062306a36Sopenharmony_ci return err; 193162306a36Sopenharmony_ci} 193262306a36Sopenharmony_ci 193362306a36Sopenharmony_ci 193462306a36Sopenharmony_ci/* 193562306a36Sopenharmony_ci * ALC882/883/885/888/889 support 193662306a36Sopenharmony_ci * 193762306a36Sopenharmony_ci * ALC882 is almost identical with ALC880 but has cleaner and more flexible 193862306a36Sopenharmony_ci * configuration. Each pin widget can choose any input DACs and a mixer. 193962306a36Sopenharmony_ci * Each ADC is connected from a mixer of all inputs. This makes possible 194062306a36Sopenharmony_ci * 6-channel independent captures. 194162306a36Sopenharmony_ci * 194262306a36Sopenharmony_ci * In addition, an independent DAC for the multi-playback (not used in this 194362306a36Sopenharmony_ci * driver yet). 194462306a36Sopenharmony_ci */ 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_ci/* 194762306a36Sopenharmony_ci * Pin config fixes 194862306a36Sopenharmony_ci */ 194962306a36Sopenharmony_cienum { 195062306a36Sopenharmony_ci ALC882_FIXUP_ABIT_AW9D_MAX, 195162306a36Sopenharmony_ci ALC882_FIXUP_LENOVO_Y530, 195262306a36Sopenharmony_ci ALC882_FIXUP_PB_M5210, 195362306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_7736, 195462306a36Sopenharmony_ci ALC882_FIXUP_ASUS_W90V, 195562306a36Sopenharmony_ci ALC889_FIXUP_CD, 195662306a36Sopenharmony_ci ALC889_FIXUP_FRONT_HP_NO_PRESENCE, 195762306a36Sopenharmony_ci ALC889_FIXUP_VAIO_TT, 195862306a36Sopenharmony_ci ALC888_FIXUP_EEE1601, 195962306a36Sopenharmony_ci ALC886_FIXUP_EAPD, 196062306a36Sopenharmony_ci ALC882_FIXUP_EAPD, 196162306a36Sopenharmony_ci ALC883_FIXUP_EAPD, 196262306a36Sopenharmony_ci ALC883_FIXUP_ACER_EAPD, 196362306a36Sopenharmony_ci ALC882_FIXUP_GPIO1, 196462306a36Sopenharmony_ci ALC882_FIXUP_GPIO2, 196562306a36Sopenharmony_ci ALC882_FIXUP_GPIO3, 196662306a36Sopenharmony_ci ALC889_FIXUP_COEF, 196762306a36Sopenharmony_ci ALC882_FIXUP_ASUS_W2JC, 196862306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G, 196962306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_8930G, 197062306a36Sopenharmony_ci ALC882_FIXUP_ASPIRE_8930G_VERBS, 197162306a36Sopenharmony_ci ALC885_FIXUP_MACPRO_GPIO, 197262306a36Sopenharmony_ci ALC889_FIXUP_DAC_ROUTE, 197362306a36Sopenharmony_ci ALC889_FIXUP_MBP_VREF, 197462306a36Sopenharmony_ci ALC889_FIXUP_IMAC91_VREF, 197562306a36Sopenharmony_ci ALC889_FIXUP_MBA11_VREF, 197662306a36Sopenharmony_ci ALC889_FIXUP_MBA21_VREF, 197762306a36Sopenharmony_ci ALC889_FIXUP_MP11_VREF, 197862306a36Sopenharmony_ci ALC889_FIXUP_MP41_VREF, 197962306a36Sopenharmony_ci ALC882_FIXUP_INV_DMIC, 198062306a36Sopenharmony_ci ALC882_FIXUP_NO_PRIMARY_HP, 198162306a36Sopenharmony_ci ALC887_FIXUP_ASUS_BASS, 198262306a36Sopenharmony_ci ALC887_FIXUP_BASS_CHMAP, 198362306a36Sopenharmony_ci ALC1220_FIXUP_GB_DUAL_CODECS, 198462306a36Sopenharmony_ci ALC1220_FIXUP_GB_X570, 198562306a36Sopenharmony_ci ALC1220_FIXUP_CLEVO_P950, 198662306a36Sopenharmony_ci ALC1220_FIXUP_CLEVO_PB51ED, 198762306a36Sopenharmony_ci ALC1220_FIXUP_CLEVO_PB51ED_PINS, 198862306a36Sopenharmony_ci ALC887_FIXUP_ASUS_AUDIO, 198962306a36Sopenharmony_ci ALC887_FIXUP_ASUS_HMIC, 199062306a36Sopenharmony_ci ALCS1200A_FIXUP_MIC_VREF, 199162306a36Sopenharmony_ci ALC888VD_FIXUP_MIC_100VREF, 199262306a36Sopenharmony_ci}; 199362306a36Sopenharmony_ci 199462306a36Sopenharmony_cistatic void alc889_fixup_coef(struct hda_codec *codec, 199562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 199662306a36Sopenharmony_ci{ 199762306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_INIT) 199862306a36Sopenharmony_ci return; 199962306a36Sopenharmony_ci alc_update_coef_idx(codec, 7, 0, 0x2030); 200062306a36Sopenharmony_ci} 200162306a36Sopenharmony_ci 200262306a36Sopenharmony_ci/* set up GPIO at initialization */ 200362306a36Sopenharmony_cistatic void alc885_fixup_macpro_gpio(struct hda_codec *codec, 200462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 200562306a36Sopenharmony_ci{ 200662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 200762306a36Sopenharmony_ci 200862306a36Sopenharmony_ci spec->gpio_write_delay = true; 200962306a36Sopenharmony_ci alc_fixup_gpio3(codec, fix, action); 201062306a36Sopenharmony_ci} 201162306a36Sopenharmony_ci 201262306a36Sopenharmony_ci/* Fix the connection of some pins for ALC889: 201362306a36Sopenharmony_ci * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't 201462306a36Sopenharmony_ci * work correctly (bko#42740) 201562306a36Sopenharmony_ci */ 201662306a36Sopenharmony_cistatic void alc889_fixup_dac_route(struct hda_codec *codec, 201762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 201862306a36Sopenharmony_ci{ 201962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 202062306a36Sopenharmony_ci /* fake the connections during parsing the tree */ 202162306a36Sopenharmony_ci static const hda_nid_t conn1[] = { 0x0c, 0x0d }; 202262306a36Sopenharmony_ci static const hda_nid_t conn2[] = { 0x0e, 0x0f }; 202362306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1); 202462306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1); 202562306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2); 202662306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2); 202762306a36Sopenharmony_ci } else if (action == HDA_FIXUP_ACT_PROBE) { 202862306a36Sopenharmony_ci /* restore the connections */ 202962306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 }; 203062306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn); 203162306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn); 203262306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn); 203362306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn); 203462306a36Sopenharmony_ci } 203562306a36Sopenharmony_ci} 203662306a36Sopenharmony_ci 203762306a36Sopenharmony_ci/* Set VREF on HP pin */ 203862306a36Sopenharmony_cistatic void alc889_fixup_mbp_vref(struct hda_codec *codec, 203962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 204062306a36Sopenharmony_ci{ 204162306a36Sopenharmony_ci static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 }; 204262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 204362306a36Sopenharmony_ci int i; 204462306a36Sopenharmony_ci 204562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_INIT) 204662306a36Sopenharmony_ci return; 204762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(nids); i++) { 204862306a36Sopenharmony_ci unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]); 204962306a36Sopenharmony_ci if (get_defcfg_device(val) != AC_JACK_HP_OUT) 205062306a36Sopenharmony_ci continue; 205162306a36Sopenharmony_ci val = snd_hda_codec_get_pin_target(codec, nids[i]); 205262306a36Sopenharmony_ci val |= AC_PINCTL_VREF_80; 205362306a36Sopenharmony_ci snd_hda_set_pin_ctl(codec, nids[i], val); 205462306a36Sopenharmony_ci spec->gen.keep_vref_in_automute = 1; 205562306a36Sopenharmony_ci break; 205662306a36Sopenharmony_ci } 205762306a36Sopenharmony_ci} 205862306a36Sopenharmony_ci 205962306a36Sopenharmony_cistatic void alc889_fixup_mac_pins(struct hda_codec *codec, 206062306a36Sopenharmony_ci const hda_nid_t *nids, int num_nids) 206162306a36Sopenharmony_ci{ 206262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 206362306a36Sopenharmony_ci int i; 206462306a36Sopenharmony_ci 206562306a36Sopenharmony_ci for (i = 0; i < num_nids; i++) { 206662306a36Sopenharmony_ci unsigned int val; 206762306a36Sopenharmony_ci val = snd_hda_codec_get_pin_target(codec, nids[i]); 206862306a36Sopenharmony_ci val |= AC_PINCTL_VREF_50; 206962306a36Sopenharmony_ci snd_hda_set_pin_ctl(codec, nids[i], val); 207062306a36Sopenharmony_ci } 207162306a36Sopenharmony_ci spec->gen.keep_vref_in_automute = 1; 207262306a36Sopenharmony_ci} 207362306a36Sopenharmony_ci 207462306a36Sopenharmony_ci/* Set VREF on speaker pins on imac91 */ 207562306a36Sopenharmony_cistatic void alc889_fixup_imac91_vref(struct hda_codec *codec, 207662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 207762306a36Sopenharmony_ci{ 207862306a36Sopenharmony_ci static const hda_nid_t nids[] = { 0x18, 0x1a }; 207962306a36Sopenharmony_ci 208062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_INIT) 208162306a36Sopenharmony_ci alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); 208262306a36Sopenharmony_ci} 208362306a36Sopenharmony_ci 208462306a36Sopenharmony_ci/* Set VREF on speaker pins on mba11 */ 208562306a36Sopenharmony_cistatic void alc889_fixup_mba11_vref(struct hda_codec *codec, 208662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 208762306a36Sopenharmony_ci{ 208862306a36Sopenharmony_ci static const hda_nid_t nids[] = { 0x18 }; 208962306a36Sopenharmony_ci 209062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_INIT) 209162306a36Sopenharmony_ci alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); 209262306a36Sopenharmony_ci} 209362306a36Sopenharmony_ci 209462306a36Sopenharmony_ci/* Set VREF on speaker pins on mba21 */ 209562306a36Sopenharmony_cistatic void alc889_fixup_mba21_vref(struct hda_codec *codec, 209662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 209762306a36Sopenharmony_ci{ 209862306a36Sopenharmony_ci static const hda_nid_t nids[] = { 0x18, 0x19 }; 209962306a36Sopenharmony_ci 210062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_INIT) 210162306a36Sopenharmony_ci alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); 210262306a36Sopenharmony_ci} 210362306a36Sopenharmony_ci 210462306a36Sopenharmony_ci/* Don't take HP output as primary 210562306a36Sopenharmony_ci * Strangely, the speaker output doesn't work on Vaio Z and some Vaio 210662306a36Sopenharmony_ci * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05 210762306a36Sopenharmony_ci */ 210862306a36Sopenharmony_cistatic void alc882_fixup_no_primary_hp(struct hda_codec *codec, 210962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 211062306a36Sopenharmony_ci{ 211162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 211262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 211362306a36Sopenharmony_ci spec->gen.no_primary_hp = 1; 211462306a36Sopenharmony_ci spec->gen.no_multi_io = 1; 211562306a36Sopenharmony_ci } 211662306a36Sopenharmony_ci} 211762306a36Sopenharmony_ci 211862306a36Sopenharmony_cistatic void alc_fixup_bass_chmap(struct hda_codec *codec, 211962306a36Sopenharmony_ci const struct hda_fixup *fix, int action); 212062306a36Sopenharmony_ci 212162306a36Sopenharmony_ci/* For dual-codec configuration, we need to disable some features to avoid 212262306a36Sopenharmony_ci * conflicts of kctls and PCM streams 212362306a36Sopenharmony_ci */ 212462306a36Sopenharmony_cistatic void alc_fixup_dual_codecs(struct hda_codec *codec, 212562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 212662306a36Sopenharmony_ci{ 212762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 212862306a36Sopenharmony_ci 212962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 213062306a36Sopenharmony_ci return; 213162306a36Sopenharmony_ci /* disable vmaster */ 213262306a36Sopenharmony_ci spec->gen.suppress_vmaster = 1; 213362306a36Sopenharmony_ci /* auto-mute and auto-mic switch don't work with multiple codecs */ 213462306a36Sopenharmony_ci spec->gen.suppress_auto_mute = 1; 213562306a36Sopenharmony_ci spec->gen.suppress_auto_mic = 1; 213662306a36Sopenharmony_ci /* disable aamix as well */ 213762306a36Sopenharmony_ci spec->gen.mixer_nid = 0; 213862306a36Sopenharmony_ci /* add location prefix to avoid conflicts */ 213962306a36Sopenharmony_ci codec->force_pin_prefix = 1; 214062306a36Sopenharmony_ci} 214162306a36Sopenharmony_ci 214262306a36Sopenharmony_cistatic void rename_ctl(struct hda_codec *codec, const char *oldname, 214362306a36Sopenharmony_ci const char *newname) 214462306a36Sopenharmony_ci{ 214562306a36Sopenharmony_ci struct snd_kcontrol *kctl; 214662306a36Sopenharmony_ci 214762306a36Sopenharmony_ci kctl = snd_hda_find_mixer_ctl(codec, oldname); 214862306a36Sopenharmony_ci if (kctl) 214962306a36Sopenharmony_ci snd_ctl_rename(codec->card, kctl, newname); 215062306a36Sopenharmony_ci} 215162306a36Sopenharmony_ci 215262306a36Sopenharmony_cistatic void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec, 215362306a36Sopenharmony_ci const struct hda_fixup *fix, 215462306a36Sopenharmony_ci int action) 215562306a36Sopenharmony_ci{ 215662306a36Sopenharmony_ci alc_fixup_dual_codecs(codec, fix, action); 215762306a36Sopenharmony_ci switch (action) { 215862306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 215962306a36Sopenharmony_ci /* override card longname to provide a unique UCM profile */ 216062306a36Sopenharmony_ci strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs"); 216162306a36Sopenharmony_ci break; 216262306a36Sopenharmony_ci case HDA_FIXUP_ACT_BUILD: 216362306a36Sopenharmony_ci /* rename Capture controls depending on the codec */ 216462306a36Sopenharmony_ci rename_ctl(codec, "Capture Volume", 216562306a36Sopenharmony_ci codec->addr == 0 ? 216662306a36Sopenharmony_ci "Rear-Panel Capture Volume" : 216762306a36Sopenharmony_ci "Front-Panel Capture Volume"); 216862306a36Sopenharmony_ci rename_ctl(codec, "Capture Switch", 216962306a36Sopenharmony_ci codec->addr == 0 ? 217062306a36Sopenharmony_ci "Rear-Panel Capture Switch" : 217162306a36Sopenharmony_ci "Front-Panel Capture Switch"); 217262306a36Sopenharmony_ci break; 217362306a36Sopenharmony_ci } 217462306a36Sopenharmony_ci} 217562306a36Sopenharmony_ci 217662306a36Sopenharmony_cistatic void alc1220_fixup_gb_x570(struct hda_codec *codec, 217762306a36Sopenharmony_ci const struct hda_fixup *fix, 217862306a36Sopenharmony_ci int action) 217962306a36Sopenharmony_ci{ 218062306a36Sopenharmony_ci static const hda_nid_t conn1[] = { 0x0c }; 218162306a36Sopenharmony_ci static const struct coef_fw gb_x570_coefs[] = { 218262306a36Sopenharmony_ci WRITE_COEF(0x07, 0x03c0), 218362306a36Sopenharmony_ci WRITE_COEF(0x1a, 0x01c1), 218462306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0202), 218562306a36Sopenharmony_ci WRITE_COEF(0x43, 0x3005), 218662306a36Sopenharmony_ci {} 218762306a36Sopenharmony_ci }; 218862306a36Sopenharmony_ci 218962306a36Sopenharmony_ci switch (action) { 219062306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 219162306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1); 219262306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1); 219362306a36Sopenharmony_ci break; 219462306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 219562306a36Sopenharmony_ci alc_process_coef_fw(codec, gb_x570_coefs); 219662306a36Sopenharmony_ci break; 219762306a36Sopenharmony_ci } 219862306a36Sopenharmony_ci} 219962306a36Sopenharmony_ci 220062306a36Sopenharmony_cistatic void alc1220_fixup_clevo_p950(struct hda_codec *codec, 220162306a36Sopenharmony_ci const struct hda_fixup *fix, 220262306a36Sopenharmony_ci int action) 220362306a36Sopenharmony_ci{ 220462306a36Sopenharmony_ci static const hda_nid_t conn1[] = { 0x0c }; 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 220762306a36Sopenharmony_ci return; 220862306a36Sopenharmony_ci 220962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x7, 0, 0x3c3); 221062306a36Sopenharmony_ci /* We therefore want to make sure 0x14 (front headphone) and 221162306a36Sopenharmony_ci * 0x1b (speakers) use the stereo DAC 0x02 221262306a36Sopenharmony_ci */ 221362306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1); 221462306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1); 221562306a36Sopenharmony_ci} 221662306a36Sopenharmony_ci 221762306a36Sopenharmony_cistatic void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec, 221862306a36Sopenharmony_ci const struct hda_fixup *fix, int action); 221962306a36Sopenharmony_ci 222062306a36Sopenharmony_cistatic void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec, 222162306a36Sopenharmony_ci const struct hda_fixup *fix, 222262306a36Sopenharmony_ci int action) 222362306a36Sopenharmony_ci{ 222462306a36Sopenharmony_ci alc1220_fixup_clevo_p950(codec, fix, action); 222562306a36Sopenharmony_ci alc_fixup_headset_mode_no_hp_mic(codec, fix, action); 222662306a36Sopenharmony_ci} 222762306a36Sopenharmony_ci 222862306a36Sopenharmony_cistatic void alc887_asus_hp_automute_hook(struct hda_codec *codec, 222962306a36Sopenharmony_ci struct hda_jack_callback *jack) 223062306a36Sopenharmony_ci{ 223162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 223262306a36Sopenharmony_ci unsigned int vref; 223362306a36Sopenharmony_ci 223462306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 223562306a36Sopenharmony_ci 223662306a36Sopenharmony_ci if (spec->gen.hp_jack_present) 223762306a36Sopenharmony_ci vref = AC_PINCTL_VREF_80; 223862306a36Sopenharmony_ci else 223962306a36Sopenharmony_ci vref = AC_PINCTL_VREF_HIZ; 224062306a36Sopenharmony_ci snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref); 224162306a36Sopenharmony_ci} 224262306a36Sopenharmony_ci 224362306a36Sopenharmony_cistatic void alc887_fixup_asus_jack(struct hda_codec *codec, 224462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 224562306a36Sopenharmony_ci{ 224662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 224762306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PROBE) 224862306a36Sopenharmony_ci return; 224962306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP); 225062306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook; 225162306a36Sopenharmony_ci} 225262306a36Sopenharmony_ci 225362306a36Sopenharmony_cistatic const struct hda_fixup alc882_fixups[] = { 225462306a36Sopenharmony_ci [ALC882_FIXUP_ABIT_AW9D_MAX] = { 225562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 225662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 225762306a36Sopenharmony_ci { 0x15, 0x01080104 }, /* side */ 225862306a36Sopenharmony_ci { 0x16, 0x01011012 }, /* rear */ 225962306a36Sopenharmony_ci { 0x17, 0x01016011 }, /* clfe */ 226062306a36Sopenharmony_ci { } 226162306a36Sopenharmony_ci } 226262306a36Sopenharmony_ci }, 226362306a36Sopenharmony_ci [ALC882_FIXUP_LENOVO_Y530] = { 226462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 226562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 226662306a36Sopenharmony_ci { 0x15, 0x99130112 }, /* rear int speakers */ 226762306a36Sopenharmony_ci { 0x16, 0x99130111 }, /* subwoofer */ 226862306a36Sopenharmony_ci { } 226962306a36Sopenharmony_ci } 227062306a36Sopenharmony_ci }, 227162306a36Sopenharmony_ci [ALC882_FIXUP_PB_M5210] = { 227262306a36Sopenharmony_ci .type = HDA_FIXUP_PINCTLS, 227362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 227462306a36Sopenharmony_ci { 0x19, PIN_VREF50 }, 227562306a36Sopenharmony_ci {} 227662306a36Sopenharmony_ci } 227762306a36Sopenharmony_ci }, 227862306a36Sopenharmony_ci [ALC882_FIXUP_ACER_ASPIRE_7736] = { 227962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 228062306a36Sopenharmony_ci .v.func = alc_fixup_sku_ignore, 228162306a36Sopenharmony_ci }, 228262306a36Sopenharmony_ci [ALC882_FIXUP_ASUS_W90V] = { 228362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 228462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 228562306a36Sopenharmony_ci { 0x16, 0x99130110 }, /* fix sequence for CLFE */ 228662306a36Sopenharmony_ci { } 228762306a36Sopenharmony_ci } 228862306a36Sopenharmony_ci }, 228962306a36Sopenharmony_ci [ALC889_FIXUP_CD] = { 229062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 229162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 229262306a36Sopenharmony_ci { 0x1c, 0x993301f0 }, /* CD */ 229362306a36Sopenharmony_ci { } 229462306a36Sopenharmony_ci } 229562306a36Sopenharmony_ci }, 229662306a36Sopenharmony_ci [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = { 229762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 229862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 229962306a36Sopenharmony_ci { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */ 230062306a36Sopenharmony_ci { } 230162306a36Sopenharmony_ci }, 230262306a36Sopenharmony_ci .chained = true, 230362306a36Sopenharmony_ci .chain_id = ALC889_FIXUP_CD, 230462306a36Sopenharmony_ci }, 230562306a36Sopenharmony_ci [ALC889_FIXUP_VAIO_TT] = { 230662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 230762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 230862306a36Sopenharmony_ci { 0x17, 0x90170111 }, /* hidden surround speaker */ 230962306a36Sopenharmony_ci { } 231062306a36Sopenharmony_ci } 231162306a36Sopenharmony_ci }, 231262306a36Sopenharmony_ci [ALC888_FIXUP_EEE1601] = { 231362306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 231462306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 231562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b }, 231662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 }, 231762306a36Sopenharmony_ci { } 231862306a36Sopenharmony_ci } 231962306a36Sopenharmony_ci }, 232062306a36Sopenharmony_ci [ALC886_FIXUP_EAPD] = { 232162306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 232262306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 232362306a36Sopenharmony_ci /* change to EAPD mode */ 232462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 232562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 }, 232662306a36Sopenharmony_ci { } 232762306a36Sopenharmony_ci } 232862306a36Sopenharmony_ci }, 232962306a36Sopenharmony_ci [ALC882_FIXUP_EAPD] = { 233062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 233162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 233262306a36Sopenharmony_ci /* change to EAPD mode */ 233362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 233462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 }, 233562306a36Sopenharmony_ci { } 233662306a36Sopenharmony_ci } 233762306a36Sopenharmony_ci }, 233862306a36Sopenharmony_ci [ALC883_FIXUP_EAPD] = { 233962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 234062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 234162306a36Sopenharmony_ci /* change to EAPD mode */ 234262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 234362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 }, 234462306a36Sopenharmony_ci { } 234562306a36Sopenharmony_ci } 234662306a36Sopenharmony_ci }, 234762306a36Sopenharmony_ci [ALC883_FIXUP_ACER_EAPD] = { 234862306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 234962306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 235062306a36Sopenharmony_ci /* eanable EAPD on Acer laptops */ 235162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 235262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, 235362306a36Sopenharmony_ci { } 235462306a36Sopenharmony_ci } 235562306a36Sopenharmony_ci }, 235662306a36Sopenharmony_ci [ALC882_FIXUP_GPIO1] = { 235762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 235862306a36Sopenharmony_ci .v.func = alc_fixup_gpio1, 235962306a36Sopenharmony_ci }, 236062306a36Sopenharmony_ci [ALC882_FIXUP_GPIO2] = { 236162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 236262306a36Sopenharmony_ci .v.func = alc_fixup_gpio2, 236362306a36Sopenharmony_ci }, 236462306a36Sopenharmony_ci [ALC882_FIXUP_GPIO3] = { 236562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 236662306a36Sopenharmony_ci .v.func = alc_fixup_gpio3, 236762306a36Sopenharmony_ci }, 236862306a36Sopenharmony_ci [ALC882_FIXUP_ASUS_W2JC] = { 236962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 237062306a36Sopenharmony_ci .v.func = alc_fixup_gpio1, 237162306a36Sopenharmony_ci .chained = true, 237262306a36Sopenharmony_ci .chain_id = ALC882_FIXUP_EAPD, 237362306a36Sopenharmony_ci }, 237462306a36Sopenharmony_ci [ALC889_FIXUP_COEF] = { 237562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 237662306a36Sopenharmony_ci .v.func = alc889_fixup_coef, 237762306a36Sopenharmony_ci }, 237862306a36Sopenharmony_ci [ALC882_FIXUP_ACER_ASPIRE_4930G] = { 237962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 238062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 238162306a36Sopenharmony_ci { 0x16, 0x99130111 }, /* CLFE speaker */ 238262306a36Sopenharmony_ci { 0x17, 0x99130112 }, /* surround speaker */ 238362306a36Sopenharmony_ci { } 238462306a36Sopenharmony_ci }, 238562306a36Sopenharmony_ci .chained = true, 238662306a36Sopenharmony_ci .chain_id = ALC882_FIXUP_GPIO1, 238762306a36Sopenharmony_ci }, 238862306a36Sopenharmony_ci [ALC882_FIXUP_ACER_ASPIRE_8930G] = { 238962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 239062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 239162306a36Sopenharmony_ci { 0x16, 0x99130111 }, /* CLFE speaker */ 239262306a36Sopenharmony_ci { 0x1b, 0x99130112 }, /* surround speaker */ 239362306a36Sopenharmony_ci { } 239462306a36Sopenharmony_ci }, 239562306a36Sopenharmony_ci .chained = true, 239662306a36Sopenharmony_ci .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS, 239762306a36Sopenharmony_ci }, 239862306a36Sopenharmony_ci [ALC882_FIXUP_ASPIRE_8930G_VERBS] = { 239962306a36Sopenharmony_ci /* additional init verbs for Acer Aspire 8930G */ 240062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 240162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 240262306a36Sopenharmony_ci /* Enable all DACs */ 240362306a36Sopenharmony_ci /* DAC DISABLE/MUTE 1? */ 240462306a36Sopenharmony_ci /* setting bits 1-5 disables DAC nids 0x02-0x06 240562306a36Sopenharmony_ci * apparently. Init=0x38 */ 240662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 }, 240762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, 240862306a36Sopenharmony_ci /* DAC DISABLE/MUTE 2? */ 240962306a36Sopenharmony_ci /* some bit here disables the other DACs. 241062306a36Sopenharmony_ci * Init=0x4900 */ 241162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 }, 241262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, 241362306a36Sopenharmony_ci /* DMIC fix 241462306a36Sopenharmony_ci * This laptop has a stereo digital microphone. 241562306a36Sopenharmony_ci * The mics are only 1cm apart which makes the stereo 241662306a36Sopenharmony_ci * useless. However, either the mic or the ALC889 241762306a36Sopenharmony_ci * makes the signal become a difference/sum signal 241862306a36Sopenharmony_ci * instead of standard stereo, which is annoying. 241962306a36Sopenharmony_ci * So instead we flip this bit which makes the 242062306a36Sopenharmony_ci * codec replicate the sum signal to both channels, 242162306a36Sopenharmony_ci * turning it into a normal mono mic. 242262306a36Sopenharmony_ci */ 242362306a36Sopenharmony_ci /* DMIC_CONTROL? Init value = 0x0001 */ 242462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b }, 242562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, 242662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 242762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, 242862306a36Sopenharmony_ci { } 242962306a36Sopenharmony_ci }, 243062306a36Sopenharmony_ci .chained = true, 243162306a36Sopenharmony_ci .chain_id = ALC882_FIXUP_GPIO1, 243262306a36Sopenharmony_ci }, 243362306a36Sopenharmony_ci [ALC885_FIXUP_MACPRO_GPIO] = { 243462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 243562306a36Sopenharmony_ci .v.func = alc885_fixup_macpro_gpio, 243662306a36Sopenharmony_ci }, 243762306a36Sopenharmony_ci [ALC889_FIXUP_DAC_ROUTE] = { 243862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 243962306a36Sopenharmony_ci .v.func = alc889_fixup_dac_route, 244062306a36Sopenharmony_ci }, 244162306a36Sopenharmony_ci [ALC889_FIXUP_MBP_VREF] = { 244262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 244362306a36Sopenharmony_ci .v.func = alc889_fixup_mbp_vref, 244462306a36Sopenharmony_ci .chained = true, 244562306a36Sopenharmony_ci .chain_id = ALC882_FIXUP_GPIO1, 244662306a36Sopenharmony_ci }, 244762306a36Sopenharmony_ci [ALC889_FIXUP_IMAC91_VREF] = { 244862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 244962306a36Sopenharmony_ci .v.func = alc889_fixup_imac91_vref, 245062306a36Sopenharmony_ci .chained = true, 245162306a36Sopenharmony_ci .chain_id = ALC882_FIXUP_GPIO1, 245262306a36Sopenharmony_ci }, 245362306a36Sopenharmony_ci [ALC889_FIXUP_MBA11_VREF] = { 245462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 245562306a36Sopenharmony_ci .v.func = alc889_fixup_mba11_vref, 245662306a36Sopenharmony_ci .chained = true, 245762306a36Sopenharmony_ci .chain_id = ALC889_FIXUP_MBP_VREF, 245862306a36Sopenharmony_ci }, 245962306a36Sopenharmony_ci [ALC889_FIXUP_MBA21_VREF] = { 246062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 246162306a36Sopenharmony_ci .v.func = alc889_fixup_mba21_vref, 246262306a36Sopenharmony_ci .chained = true, 246362306a36Sopenharmony_ci .chain_id = ALC889_FIXUP_MBP_VREF, 246462306a36Sopenharmony_ci }, 246562306a36Sopenharmony_ci [ALC889_FIXUP_MP11_VREF] = { 246662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 246762306a36Sopenharmony_ci .v.func = alc889_fixup_mba11_vref, 246862306a36Sopenharmony_ci .chained = true, 246962306a36Sopenharmony_ci .chain_id = ALC885_FIXUP_MACPRO_GPIO, 247062306a36Sopenharmony_ci }, 247162306a36Sopenharmony_ci [ALC889_FIXUP_MP41_VREF] = { 247262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 247362306a36Sopenharmony_ci .v.func = alc889_fixup_mbp_vref, 247462306a36Sopenharmony_ci .chained = true, 247562306a36Sopenharmony_ci .chain_id = ALC885_FIXUP_MACPRO_GPIO, 247662306a36Sopenharmony_ci }, 247762306a36Sopenharmony_ci [ALC882_FIXUP_INV_DMIC] = { 247862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 247962306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 248062306a36Sopenharmony_ci }, 248162306a36Sopenharmony_ci [ALC882_FIXUP_NO_PRIMARY_HP] = { 248262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 248362306a36Sopenharmony_ci .v.func = alc882_fixup_no_primary_hp, 248462306a36Sopenharmony_ci }, 248562306a36Sopenharmony_ci [ALC887_FIXUP_ASUS_BASS] = { 248662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 248762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 248862306a36Sopenharmony_ci {0x16, 0x99130130}, /* bass speaker */ 248962306a36Sopenharmony_ci {} 249062306a36Sopenharmony_ci }, 249162306a36Sopenharmony_ci .chained = true, 249262306a36Sopenharmony_ci .chain_id = ALC887_FIXUP_BASS_CHMAP, 249362306a36Sopenharmony_ci }, 249462306a36Sopenharmony_ci [ALC887_FIXUP_BASS_CHMAP] = { 249562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 249662306a36Sopenharmony_ci .v.func = alc_fixup_bass_chmap, 249762306a36Sopenharmony_ci }, 249862306a36Sopenharmony_ci [ALC1220_FIXUP_GB_DUAL_CODECS] = { 249962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 250062306a36Sopenharmony_ci .v.func = alc1220_fixup_gb_dual_codecs, 250162306a36Sopenharmony_ci }, 250262306a36Sopenharmony_ci [ALC1220_FIXUP_GB_X570] = { 250362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 250462306a36Sopenharmony_ci .v.func = alc1220_fixup_gb_x570, 250562306a36Sopenharmony_ci }, 250662306a36Sopenharmony_ci [ALC1220_FIXUP_CLEVO_P950] = { 250762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 250862306a36Sopenharmony_ci .v.func = alc1220_fixup_clevo_p950, 250962306a36Sopenharmony_ci }, 251062306a36Sopenharmony_ci [ALC1220_FIXUP_CLEVO_PB51ED] = { 251162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 251262306a36Sopenharmony_ci .v.func = alc1220_fixup_clevo_pb51ed, 251362306a36Sopenharmony_ci }, 251462306a36Sopenharmony_ci [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = { 251562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 251662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 251762306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 251862306a36Sopenharmony_ci {} 251962306a36Sopenharmony_ci }, 252062306a36Sopenharmony_ci .chained = true, 252162306a36Sopenharmony_ci .chain_id = ALC1220_FIXUP_CLEVO_PB51ED, 252262306a36Sopenharmony_ci }, 252362306a36Sopenharmony_ci [ALC887_FIXUP_ASUS_AUDIO] = { 252462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 252562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 252662306a36Sopenharmony_ci { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */ 252762306a36Sopenharmony_ci { 0x19, 0x22219420 }, 252862306a36Sopenharmony_ci {} 252962306a36Sopenharmony_ci }, 253062306a36Sopenharmony_ci }, 253162306a36Sopenharmony_ci [ALC887_FIXUP_ASUS_HMIC] = { 253262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 253362306a36Sopenharmony_ci .v.func = alc887_fixup_asus_jack, 253462306a36Sopenharmony_ci .chained = true, 253562306a36Sopenharmony_ci .chain_id = ALC887_FIXUP_ASUS_AUDIO, 253662306a36Sopenharmony_ci }, 253762306a36Sopenharmony_ci [ALCS1200A_FIXUP_MIC_VREF] = { 253862306a36Sopenharmony_ci .type = HDA_FIXUP_PINCTLS, 253962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 254062306a36Sopenharmony_ci { 0x18, PIN_VREF50 }, /* rear mic */ 254162306a36Sopenharmony_ci { 0x19, PIN_VREF50 }, /* front mic */ 254262306a36Sopenharmony_ci {} 254362306a36Sopenharmony_ci } 254462306a36Sopenharmony_ci }, 254562306a36Sopenharmony_ci [ALC888VD_FIXUP_MIC_100VREF] = { 254662306a36Sopenharmony_ci .type = HDA_FIXUP_PINCTLS, 254762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 254862306a36Sopenharmony_ci { 0x18, PIN_VREF100 }, /* headset mic */ 254962306a36Sopenharmony_ci {} 255062306a36Sopenharmony_ci } 255162306a36Sopenharmony_ci }, 255262306a36Sopenharmony_ci}; 255362306a36Sopenharmony_ci 255462306a36Sopenharmony_cistatic const struct snd_pci_quirk alc882_fixup_tbl[] = { 255562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD), 255662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), 255762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), 255862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD), 255962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), 256062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD), 256162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD), 256262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", 256362306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G), 256462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", 256562306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G), 256662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", 256762306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_8930G), 256862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", 256962306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_8930G), 257062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", 257162306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G), 257262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), 257362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", 257462306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G), 257562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", 257662306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G), 257762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G", 257862306a36Sopenharmony_ci ALC882_FIXUP_ACER_ASPIRE_4930G), 257962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), 258062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G), 258162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), 258262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), 258362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), 258462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC), 258562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC), 258662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601), 258762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS), 258862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3), 258962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF), 259062306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP), 259162306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP), 259262306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), 259362306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP), 259462306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP), 259562306a36Sopenharmony_ci 259662306a36Sopenharmony_ci /* All Apple entries are in codec SSIDs */ 259762306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF), 259862306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF), 259962306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF), 260062306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF), 260162306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO), 260262306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO), 260362306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF), 260462306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF), 260562306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD), 260662306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF), 260762306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF), 260862306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF), 260962306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF), 261062306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO), 261162306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF), 261262306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), 261362306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), 261462306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF), 261562306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF), 261662306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), 261762306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), 261862306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF), 261962306a36Sopenharmony_ci 262062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), 262162306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF), 262262306a36Sopenharmony_ci SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD), 262362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), 262462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), 262562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570), 262662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570), 262762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570), 262862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950), 262962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950), 263062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950), 263162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950), 263262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950), 263362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950), 263462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), 263562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS), 263662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), 263762306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), 263862306a36Sopenharmony_ci SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), 263962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 264962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 265062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 265162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 265262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 265362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 265462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 265562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED), 265662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950), 265762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950), 265862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950), 265962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950), 266062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950), 266162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950), 266262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950), 266362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950), 266462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950), 266562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950), 266662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950), 266762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950), 266862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 266962306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), 267062306a36Sopenharmony_ci SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), 267162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530), 267262306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF), 267362306a36Sopenharmony_ci {} 267462306a36Sopenharmony_ci}; 267562306a36Sopenharmony_ci 267662306a36Sopenharmony_cistatic const struct hda_model_fixup alc882_fixup_models[] = { 267762306a36Sopenharmony_ci {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"}, 267862306a36Sopenharmony_ci {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"}, 267962306a36Sopenharmony_ci {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"}, 268062306a36Sopenharmony_ci {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"}, 268162306a36Sopenharmony_ci {.id = ALC889_FIXUP_CD, .name = "cd"}, 268262306a36Sopenharmony_ci {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"}, 268362306a36Sopenharmony_ci {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"}, 268462306a36Sopenharmony_ci {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"}, 268562306a36Sopenharmony_ci {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"}, 268662306a36Sopenharmony_ci {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"}, 268762306a36Sopenharmony_ci {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"}, 268862306a36Sopenharmony_ci {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"}, 268962306a36Sopenharmony_ci {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"}, 269062306a36Sopenharmony_ci {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"}, 269162306a36Sopenharmony_ci {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"}, 269262306a36Sopenharmony_ci {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"}, 269362306a36Sopenharmony_ci {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"}, 269462306a36Sopenharmony_ci {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"}, 269562306a36Sopenharmony_ci {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"}, 269662306a36Sopenharmony_ci {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"}, 269762306a36Sopenharmony_ci {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"}, 269862306a36Sopenharmony_ci {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"}, 269962306a36Sopenharmony_ci {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"}, 270062306a36Sopenharmony_ci {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"}, 270162306a36Sopenharmony_ci {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"}, 270262306a36Sopenharmony_ci {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"}, 270362306a36Sopenharmony_ci {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"}, 270462306a36Sopenharmony_ci {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"}, 270562306a36Sopenharmony_ci {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"}, 270662306a36Sopenharmony_ci {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"}, 270762306a36Sopenharmony_ci {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"}, 270862306a36Sopenharmony_ci {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"}, 270962306a36Sopenharmony_ci {} 271062306a36Sopenharmony_ci}; 271162306a36Sopenharmony_ci 271262306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = { 271362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950, 271462306a36Sopenharmony_ci {0x14, 0x01014010}, 271562306a36Sopenharmony_ci {0x15, 0x01011012}, 271662306a36Sopenharmony_ci {0x16, 0x01016011}, 271762306a36Sopenharmony_ci {0x18, 0x01a19040}, 271862306a36Sopenharmony_ci {0x19, 0x02a19050}, 271962306a36Sopenharmony_ci {0x1a, 0x0181304f}, 272062306a36Sopenharmony_ci {0x1b, 0x0221401f}, 272162306a36Sopenharmony_ci {0x1e, 0x01456130}), 272262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950, 272362306a36Sopenharmony_ci {0x14, 0x01015010}, 272462306a36Sopenharmony_ci {0x15, 0x01011012}, 272562306a36Sopenharmony_ci {0x16, 0x01011011}, 272662306a36Sopenharmony_ci {0x18, 0x01a11040}, 272762306a36Sopenharmony_ci {0x19, 0x02a19050}, 272862306a36Sopenharmony_ci {0x1a, 0x0181104f}, 272962306a36Sopenharmony_ci {0x1b, 0x0221401f}, 273062306a36Sopenharmony_ci {0x1e, 0x01451130}), 273162306a36Sopenharmony_ci {} 273262306a36Sopenharmony_ci}; 273362306a36Sopenharmony_ci 273462306a36Sopenharmony_ci/* 273562306a36Sopenharmony_ci * BIOS auto configuration 273662306a36Sopenharmony_ci */ 273762306a36Sopenharmony_ci/* almost identical with ALC880 parser... */ 273862306a36Sopenharmony_cistatic int alc882_parse_auto_config(struct hda_codec *codec) 273962306a36Sopenharmony_ci{ 274062306a36Sopenharmony_ci static const hda_nid_t alc882_ignore[] = { 0x1d, 0 }; 274162306a36Sopenharmony_ci static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 274262306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids); 274362306a36Sopenharmony_ci} 274462306a36Sopenharmony_ci 274562306a36Sopenharmony_ci/* 274662306a36Sopenharmony_ci */ 274762306a36Sopenharmony_cistatic int patch_alc882(struct hda_codec *codec) 274862306a36Sopenharmony_ci{ 274962306a36Sopenharmony_ci struct alc_spec *spec; 275062306a36Sopenharmony_ci int err; 275162306a36Sopenharmony_ci 275262306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x0b); 275362306a36Sopenharmony_ci if (err < 0) 275462306a36Sopenharmony_ci return err; 275562306a36Sopenharmony_ci 275662306a36Sopenharmony_ci spec = codec->spec; 275762306a36Sopenharmony_ci 275862306a36Sopenharmony_ci switch (codec->core.vendor_id) { 275962306a36Sopenharmony_ci case 0x10ec0882: 276062306a36Sopenharmony_ci case 0x10ec0885: 276162306a36Sopenharmony_ci case 0x10ec0900: 276262306a36Sopenharmony_ci case 0x10ec0b00: 276362306a36Sopenharmony_ci case 0x10ec1220: 276462306a36Sopenharmony_ci break; 276562306a36Sopenharmony_ci default: 276662306a36Sopenharmony_ci /* ALC883 and variants */ 276762306a36Sopenharmony_ci alc_fix_pll_init(codec, 0x20, 0x0a, 10); 276862306a36Sopenharmony_ci break; 276962306a36Sopenharmony_ci } 277062306a36Sopenharmony_ci 277162306a36Sopenharmony_ci alc_pre_init(codec); 277262306a36Sopenharmony_ci 277362306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl, 277462306a36Sopenharmony_ci alc882_fixups); 277562306a36Sopenharmony_ci snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true); 277662306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 277762306a36Sopenharmony_ci 277862306a36Sopenharmony_ci alc_auto_parse_customize_define(codec); 277962306a36Sopenharmony_ci 278062306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 278162306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 278262306a36Sopenharmony_ci 278362306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 278462306a36Sopenharmony_ci err = alc882_parse_auto_config(codec); 278562306a36Sopenharmony_ci if (err < 0) 278662306a36Sopenharmony_ci goto error; 278762306a36Sopenharmony_ci 278862306a36Sopenharmony_ci if (!spec->gen.no_analog && spec->gen.beep_nid) { 278962306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 279062306a36Sopenharmony_ci if (err < 0) 279162306a36Sopenharmony_ci goto error; 279262306a36Sopenharmony_ci } 279362306a36Sopenharmony_ci 279462306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 279562306a36Sopenharmony_ci 279662306a36Sopenharmony_ci return 0; 279762306a36Sopenharmony_ci 279862306a36Sopenharmony_ci error: 279962306a36Sopenharmony_ci alc_free(codec); 280062306a36Sopenharmony_ci return err; 280162306a36Sopenharmony_ci} 280262306a36Sopenharmony_ci 280362306a36Sopenharmony_ci 280462306a36Sopenharmony_ci/* 280562306a36Sopenharmony_ci * ALC262 support 280662306a36Sopenharmony_ci */ 280762306a36Sopenharmony_cistatic int alc262_parse_auto_config(struct hda_codec *codec) 280862306a36Sopenharmony_ci{ 280962306a36Sopenharmony_ci static const hda_nid_t alc262_ignore[] = { 0x1d, 0 }; 281062306a36Sopenharmony_ci static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 281162306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids); 281262306a36Sopenharmony_ci} 281362306a36Sopenharmony_ci 281462306a36Sopenharmony_ci/* 281562306a36Sopenharmony_ci * Pin config fixes 281662306a36Sopenharmony_ci */ 281762306a36Sopenharmony_cienum { 281862306a36Sopenharmony_ci ALC262_FIXUP_FSC_H270, 281962306a36Sopenharmony_ci ALC262_FIXUP_FSC_S7110, 282062306a36Sopenharmony_ci ALC262_FIXUP_HP_Z200, 282162306a36Sopenharmony_ci ALC262_FIXUP_TYAN, 282262306a36Sopenharmony_ci ALC262_FIXUP_LENOVO_3000, 282362306a36Sopenharmony_ci ALC262_FIXUP_BENQ, 282462306a36Sopenharmony_ci ALC262_FIXUP_BENQ_T31, 282562306a36Sopenharmony_ci ALC262_FIXUP_INV_DMIC, 282662306a36Sopenharmony_ci ALC262_FIXUP_INTEL_BAYLEYBAY, 282762306a36Sopenharmony_ci}; 282862306a36Sopenharmony_ci 282962306a36Sopenharmony_cistatic const struct hda_fixup alc262_fixups[] = { 283062306a36Sopenharmony_ci [ALC262_FIXUP_FSC_H270] = { 283162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 283262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 283362306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 283462306a36Sopenharmony_ci { 0x15, 0x0221142f }, /* front HP */ 283562306a36Sopenharmony_ci { 0x1b, 0x0121141f }, /* rear HP */ 283662306a36Sopenharmony_ci { } 283762306a36Sopenharmony_ci } 283862306a36Sopenharmony_ci }, 283962306a36Sopenharmony_ci [ALC262_FIXUP_FSC_S7110] = { 284062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 284162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 284262306a36Sopenharmony_ci { 0x15, 0x90170110 }, /* speaker */ 284362306a36Sopenharmony_ci { } 284462306a36Sopenharmony_ci }, 284562306a36Sopenharmony_ci .chained = true, 284662306a36Sopenharmony_ci .chain_id = ALC262_FIXUP_BENQ, 284762306a36Sopenharmony_ci }, 284862306a36Sopenharmony_ci [ALC262_FIXUP_HP_Z200] = { 284962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 285062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 285162306a36Sopenharmony_ci { 0x16, 0x99130120 }, /* internal speaker */ 285262306a36Sopenharmony_ci { } 285362306a36Sopenharmony_ci } 285462306a36Sopenharmony_ci }, 285562306a36Sopenharmony_ci [ALC262_FIXUP_TYAN] = { 285662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 285762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 285862306a36Sopenharmony_ci { 0x14, 0x1993e1f0 }, /* int AUX */ 285962306a36Sopenharmony_ci { } 286062306a36Sopenharmony_ci } 286162306a36Sopenharmony_ci }, 286262306a36Sopenharmony_ci [ALC262_FIXUP_LENOVO_3000] = { 286362306a36Sopenharmony_ci .type = HDA_FIXUP_PINCTLS, 286462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 286562306a36Sopenharmony_ci { 0x19, PIN_VREF50 }, 286662306a36Sopenharmony_ci {} 286762306a36Sopenharmony_ci }, 286862306a36Sopenharmony_ci .chained = true, 286962306a36Sopenharmony_ci .chain_id = ALC262_FIXUP_BENQ, 287062306a36Sopenharmony_ci }, 287162306a36Sopenharmony_ci [ALC262_FIXUP_BENQ] = { 287262306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 287362306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 287462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 287562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 }, 287662306a36Sopenharmony_ci {} 287762306a36Sopenharmony_ci } 287862306a36Sopenharmony_ci }, 287962306a36Sopenharmony_ci [ALC262_FIXUP_BENQ_T31] = { 288062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 288162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 288262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 288362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, 288462306a36Sopenharmony_ci {} 288562306a36Sopenharmony_ci } 288662306a36Sopenharmony_ci }, 288762306a36Sopenharmony_ci [ALC262_FIXUP_INV_DMIC] = { 288862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 288962306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 289062306a36Sopenharmony_ci }, 289162306a36Sopenharmony_ci [ALC262_FIXUP_INTEL_BAYLEYBAY] = { 289262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 289362306a36Sopenharmony_ci .v.func = alc_fixup_no_depop_delay, 289462306a36Sopenharmony_ci }, 289562306a36Sopenharmony_ci}; 289662306a36Sopenharmony_ci 289762306a36Sopenharmony_cistatic const struct snd_pci_quirk alc262_fixup_tbl[] = { 289862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200), 289962306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110), 290062306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), 290162306a36Sopenharmony_ci SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN), 290262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270), 290362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270), 290462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000), 290562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ), 290662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31), 290762306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY), 290862306a36Sopenharmony_ci {} 290962306a36Sopenharmony_ci}; 291062306a36Sopenharmony_ci 291162306a36Sopenharmony_cistatic const struct hda_model_fixup alc262_fixup_models[] = { 291262306a36Sopenharmony_ci {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"}, 291362306a36Sopenharmony_ci {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"}, 291462306a36Sopenharmony_ci {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"}, 291562306a36Sopenharmony_ci {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"}, 291662306a36Sopenharmony_ci {.id = ALC262_FIXUP_TYAN, .name = "tyan"}, 291762306a36Sopenharmony_ci {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"}, 291862306a36Sopenharmony_ci {.id = ALC262_FIXUP_BENQ, .name = "benq"}, 291962306a36Sopenharmony_ci {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"}, 292062306a36Sopenharmony_ci {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"}, 292162306a36Sopenharmony_ci {} 292262306a36Sopenharmony_ci}; 292362306a36Sopenharmony_ci 292462306a36Sopenharmony_ci/* 292562306a36Sopenharmony_ci */ 292662306a36Sopenharmony_cistatic int patch_alc262(struct hda_codec *codec) 292762306a36Sopenharmony_ci{ 292862306a36Sopenharmony_ci struct alc_spec *spec; 292962306a36Sopenharmony_ci int err; 293062306a36Sopenharmony_ci 293162306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x0b); 293262306a36Sopenharmony_ci if (err < 0) 293362306a36Sopenharmony_ci return err; 293462306a36Sopenharmony_ci 293562306a36Sopenharmony_ci spec = codec->spec; 293662306a36Sopenharmony_ci spec->gen.shared_mic_vref_pin = 0x18; 293762306a36Sopenharmony_ci 293862306a36Sopenharmony_ci spec->shutup = alc_eapd_shutup; 293962306a36Sopenharmony_ci 294062306a36Sopenharmony_ci#if 0 294162306a36Sopenharmony_ci /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is 294262306a36Sopenharmony_ci * under-run 294362306a36Sopenharmony_ci */ 294462306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80); 294562306a36Sopenharmony_ci#endif 294662306a36Sopenharmony_ci alc_fix_pll_init(codec, 0x20, 0x0a, 10); 294762306a36Sopenharmony_ci 294862306a36Sopenharmony_ci alc_pre_init(codec); 294962306a36Sopenharmony_ci 295062306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl, 295162306a36Sopenharmony_ci alc262_fixups); 295262306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 295362306a36Sopenharmony_ci 295462306a36Sopenharmony_ci alc_auto_parse_customize_define(codec); 295562306a36Sopenharmony_ci 295662306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 295762306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 295862306a36Sopenharmony_ci 295962306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 296062306a36Sopenharmony_ci err = alc262_parse_auto_config(codec); 296162306a36Sopenharmony_ci if (err < 0) 296262306a36Sopenharmony_ci goto error; 296362306a36Sopenharmony_ci 296462306a36Sopenharmony_ci if (!spec->gen.no_analog && spec->gen.beep_nid) { 296562306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 296662306a36Sopenharmony_ci if (err < 0) 296762306a36Sopenharmony_ci goto error; 296862306a36Sopenharmony_ci } 296962306a36Sopenharmony_ci 297062306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 297162306a36Sopenharmony_ci 297262306a36Sopenharmony_ci return 0; 297362306a36Sopenharmony_ci 297462306a36Sopenharmony_ci error: 297562306a36Sopenharmony_ci alc_free(codec); 297662306a36Sopenharmony_ci return err; 297762306a36Sopenharmony_ci} 297862306a36Sopenharmony_ci 297962306a36Sopenharmony_ci/* 298062306a36Sopenharmony_ci * ALC268 298162306a36Sopenharmony_ci */ 298262306a36Sopenharmony_ci/* bind Beep switches of both NID 0x0f and 0x10 */ 298362306a36Sopenharmony_cistatic int alc268_beep_switch_put(struct snd_kcontrol *kcontrol, 298462306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 298562306a36Sopenharmony_ci{ 298662306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 298762306a36Sopenharmony_ci unsigned long pval; 298862306a36Sopenharmony_ci int err; 298962306a36Sopenharmony_ci 299062306a36Sopenharmony_ci mutex_lock(&codec->control_mutex); 299162306a36Sopenharmony_ci pval = kcontrol->private_value; 299262306a36Sopenharmony_ci kcontrol->private_value = (pval & ~0xff) | 0x0f; 299362306a36Sopenharmony_ci err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); 299462306a36Sopenharmony_ci if (err >= 0) { 299562306a36Sopenharmony_ci kcontrol->private_value = (pval & ~0xff) | 0x10; 299662306a36Sopenharmony_ci err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); 299762306a36Sopenharmony_ci } 299862306a36Sopenharmony_ci kcontrol->private_value = pval; 299962306a36Sopenharmony_ci mutex_unlock(&codec->control_mutex); 300062306a36Sopenharmony_ci return err; 300162306a36Sopenharmony_ci} 300262306a36Sopenharmony_ci 300362306a36Sopenharmony_cistatic const struct snd_kcontrol_new alc268_beep_mixer[] = { 300462306a36Sopenharmony_ci HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), 300562306a36Sopenharmony_ci { 300662306a36Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 300762306a36Sopenharmony_ci .name = "Beep Playback Switch", 300862306a36Sopenharmony_ci .subdevice = HDA_SUBDEV_AMP_FLAG, 300962306a36Sopenharmony_ci .info = snd_hda_mixer_amp_switch_info, 301062306a36Sopenharmony_ci .get = snd_hda_mixer_amp_switch_get, 301162306a36Sopenharmony_ci .put = alc268_beep_switch_put, 301262306a36Sopenharmony_ci .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT) 301362306a36Sopenharmony_ci }, 301462306a36Sopenharmony_ci}; 301562306a36Sopenharmony_ci 301662306a36Sopenharmony_ci/* set PCBEEP vol = 0, mute connections */ 301762306a36Sopenharmony_cistatic const struct hda_verb alc268_beep_init_verbs[] = { 301862306a36Sopenharmony_ci {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 301962306a36Sopenharmony_ci {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 302062306a36Sopenharmony_ci {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 302162306a36Sopenharmony_ci { } 302262306a36Sopenharmony_ci}; 302362306a36Sopenharmony_ci 302462306a36Sopenharmony_cienum { 302562306a36Sopenharmony_ci ALC268_FIXUP_INV_DMIC, 302662306a36Sopenharmony_ci ALC268_FIXUP_HP_EAPD, 302762306a36Sopenharmony_ci ALC268_FIXUP_SPDIF, 302862306a36Sopenharmony_ci}; 302962306a36Sopenharmony_ci 303062306a36Sopenharmony_cistatic const struct hda_fixup alc268_fixups[] = { 303162306a36Sopenharmony_ci [ALC268_FIXUP_INV_DMIC] = { 303262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 303362306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 303462306a36Sopenharmony_ci }, 303562306a36Sopenharmony_ci [ALC268_FIXUP_HP_EAPD] = { 303662306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 303762306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 303862306a36Sopenharmony_ci {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0}, 303962306a36Sopenharmony_ci {} 304062306a36Sopenharmony_ci } 304162306a36Sopenharmony_ci }, 304262306a36Sopenharmony_ci [ALC268_FIXUP_SPDIF] = { 304362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 304462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 304562306a36Sopenharmony_ci { 0x1e, 0x014b1180 }, /* enable SPDIF out */ 304662306a36Sopenharmony_ci {} 304762306a36Sopenharmony_ci } 304862306a36Sopenharmony_ci }, 304962306a36Sopenharmony_ci}; 305062306a36Sopenharmony_ci 305162306a36Sopenharmony_cistatic const struct hda_model_fixup alc268_fixup_models[] = { 305262306a36Sopenharmony_ci {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"}, 305362306a36Sopenharmony_ci {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"}, 305462306a36Sopenharmony_ci {.id = ALC268_FIXUP_SPDIF, .name = "spdif"}, 305562306a36Sopenharmony_ci {} 305662306a36Sopenharmony_ci}; 305762306a36Sopenharmony_ci 305862306a36Sopenharmony_cistatic const struct snd_pci_quirk alc268_fixup_tbl[] = { 305962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF), 306062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC), 306162306a36Sopenharmony_ci /* below is codec SSID since multiple Toshiba laptops have the 306262306a36Sopenharmony_ci * same PCI SSID 1179:ff00 306362306a36Sopenharmony_ci */ 306462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD), 306562306a36Sopenharmony_ci {} 306662306a36Sopenharmony_ci}; 306762306a36Sopenharmony_ci 306862306a36Sopenharmony_ci/* 306962306a36Sopenharmony_ci * BIOS auto configuration 307062306a36Sopenharmony_ci */ 307162306a36Sopenharmony_cistatic int alc268_parse_auto_config(struct hda_codec *codec) 307262306a36Sopenharmony_ci{ 307362306a36Sopenharmony_ci static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 307462306a36Sopenharmony_ci return alc_parse_auto_config(codec, NULL, alc268_ssids); 307562306a36Sopenharmony_ci} 307662306a36Sopenharmony_ci 307762306a36Sopenharmony_ci/* 307862306a36Sopenharmony_ci */ 307962306a36Sopenharmony_cistatic int patch_alc268(struct hda_codec *codec) 308062306a36Sopenharmony_ci{ 308162306a36Sopenharmony_ci struct alc_spec *spec; 308262306a36Sopenharmony_ci int i, err; 308362306a36Sopenharmony_ci 308462306a36Sopenharmony_ci /* ALC268 has no aa-loopback mixer */ 308562306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0); 308662306a36Sopenharmony_ci if (err < 0) 308762306a36Sopenharmony_ci return err; 308862306a36Sopenharmony_ci 308962306a36Sopenharmony_ci spec = codec->spec; 309062306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 309162306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 309262306a36Sopenharmony_ci 309362306a36Sopenharmony_ci spec->shutup = alc_eapd_shutup; 309462306a36Sopenharmony_ci 309562306a36Sopenharmony_ci alc_pre_init(codec); 309662306a36Sopenharmony_ci 309762306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups); 309862306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 309962306a36Sopenharmony_ci 310062306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 310162306a36Sopenharmony_ci err = alc268_parse_auto_config(codec); 310262306a36Sopenharmony_ci if (err < 0) 310362306a36Sopenharmony_ci goto error; 310462306a36Sopenharmony_ci 310562306a36Sopenharmony_ci if (err > 0 && !spec->gen.no_analog && 310662306a36Sopenharmony_ci spec->gen.autocfg.speaker_pins[0] != 0x1d) { 310762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) { 310862306a36Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, NULL, 310962306a36Sopenharmony_ci &alc268_beep_mixer[i])) { 311062306a36Sopenharmony_ci err = -ENOMEM; 311162306a36Sopenharmony_ci goto error; 311262306a36Sopenharmony_ci } 311362306a36Sopenharmony_ci } 311462306a36Sopenharmony_ci snd_hda_add_verbs(codec, alc268_beep_init_verbs); 311562306a36Sopenharmony_ci if (!query_amp_caps(codec, 0x1d, HDA_INPUT)) 311662306a36Sopenharmony_ci /* override the amp caps for beep generator */ 311762306a36Sopenharmony_ci snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT, 311862306a36Sopenharmony_ci (0x0c << AC_AMPCAP_OFFSET_SHIFT) | 311962306a36Sopenharmony_ci (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) | 312062306a36Sopenharmony_ci (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) | 312162306a36Sopenharmony_ci (0 << AC_AMPCAP_MUTE_SHIFT)); 312262306a36Sopenharmony_ci } 312362306a36Sopenharmony_ci 312462306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 312562306a36Sopenharmony_ci 312662306a36Sopenharmony_ci return 0; 312762306a36Sopenharmony_ci 312862306a36Sopenharmony_ci error: 312962306a36Sopenharmony_ci alc_free(codec); 313062306a36Sopenharmony_ci return err; 313162306a36Sopenharmony_ci} 313262306a36Sopenharmony_ci 313362306a36Sopenharmony_ci/* 313462306a36Sopenharmony_ci * ALC269 313562306a36Sopenharmony_ci */ 313662306a36Sopenharmony_ci 313762306a36Sopenharmony_cistatic const struct hda_pcm_stream alc269_44k_pcm_analog_playback = { 313862306a36Sopenharmony_ci .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ 313962306a36Sopenharmony_ci}; 314062306a36Sopenharmony_ci 314162306a36Sopenharmony_cistatic const struct hda_pcm_stream alc269_44k_pcm_analog_capture = { 314262306a36Sopenharmony_ci .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ 314362306a36Sopenharmony_ci}; 314462306a36Sopenharmony_ci 314562306a36Sopenharmony_ci/* different alc269-variants */ 314662306a36Sopenharmony_cienum { 314762306a36Sopenharmony_ci ALC269_TYPE_ALC269VA, 314862306a36Sopenharmony_ci ALC269_TYPE_ALC269VB, 314962306a36Sopenharmony_ci ALC269_TYPE_ALC269VC, 315062306a36Sopenharmony_ci ALC269_TYPE_ALC269VD, 315162306a36Sopenharmony_ci ALC269_TYPE_ALC280, 315262306a36Sopenharmony_ci ALC269_TYPE_ALC282, 315362306a36Sopenharmony_ci ALC269_TYPE_ALC283, 315462306a36Sopenharmony_ci ALC269_TYPE_ALC284, 315562306a36Sopenharmony_ci ALC269_TYPE_ALC293, 315662306a36Sopenharmony_ci ALC269_TYPE_ALC286, 315762306a36Sopenharmony_ci ALC269_TYPE_ALC298, 315862306a36Sopenharmony_ci ALC269_TYPE_ALC255, 315962306a36Sopenharmony_ci ALC269_TYPE_ALC256, 316062306a36Sopenharmony_ci ALC269_TYPE_ALC257, 316162306a36Sopenharmony_ci ALC269_TYPE_ALC215, 316262306a36Sopenharmony_ci ALC269_TYPE_ALC225, 316362306a36Sopenharmony_ci ALC269_TYPE_ALC245, 316462306a36Sopenharmony_ci ALC269_TYPE_ALC287, 316562306a36Sopenharmony_ci ALC269_TYPE_ALC294, 316662306a36Sopenharmony_ci ALC269_TYPE_ALC300, 316762306a36Sopenharmony_ci ALC269_TYPE_ALC623, 316862306a36Sopenharmony_ci ALC269_TYPE_ALC700, 316962306a36Sopenharmony_ci}; 317062306a36Sopenharmony_ci 317162306a36Sopenharmony_ci/* 317262306a36Sopenharmony_ci * BIOS auto configuration 317362306a36Sopenharmony_ci */ 317462306a36Sopenharmony_cistatic int alc269_parse_auto_config(struct hda_codec *codec) 317562306a36Sopenharmony_ci{ 317662306a36Sopenharmony_ci static const hda_nid_t alc269_ignore[] = { 0x1d, 0 }; 317762306a36Sopenharmony_ci static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 }; 317862306a36Sopenharmony_ci static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 317962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 318062306a36Sopenharmony_ci const hda_nid_t *ssids; 318162306a36Sopenharmony_ci 318262306a36Sopenharmony_ci switch (spec->codec_variant) { 318362306a36Sopenharmony_ci case ALC269_TYPE_ALC269VA: 318462306a36Sopenharmony_ci case ALC269_TYPE_ALC269VC: 318562306a36Sopenharmony_ci case ALC269_TYPE_ALC280: 318662306a36Sopenharmony_ci case ALC269_TYPE_ALC284: 318762306a36Sopenharmony_ci case ALC269_TYPE_ALC293: 318862306a36Sopenharmony_ci ssids = alc269va_ssids; 318962306a36Sopenharmony_ci break; 319062306a36Sopenharmony_ci case ALC269_TYPE_ALC269VB: 319162306a36Sopenharmony_ci case ALC269_TYPE_ALC269VD: 319262306a36Sopenharmony_ci case ALC269_TYPE_ALC282: 319362306a36Sopenharmony_ci case ALC269_TYPE_ALC283: 319462306a36Sopenharmony_ci case ALC269_TYPE_ALC286: 319562306a36Sopenharmony_ci case ALC269_TYPE_ALC298: 319662306a36Sopenharmony_ci case ALC269_TYPE_ALC255: 319762306a36Sopenharmony_ci case ALC269_TYPE_ALC256: 319862306a36Sopenharmony_ci case ALC269_TYPE_ALC257: 319962306a36Sopenharmony_ci case ALC269_TYPE_ALC215: 320062306a36Sopenharmony_ci case ALC269_TYPE_ALC225: 320162306a36Sopenharmony_ci case ALC269_TYPE_ALC245: 320262306a36Sopenharmony_ci case ALC269_TYPE_ALC287: 320362306a36Sopenharmony_ci case ALC269_TYPE_ALC294: 320462306a36Sopenharmony_ci case ALC269_TYPE_ALC300: 320562306a36Sopenharmony_ci case ALC269_TYPE_ALC623: 320662306a36Sopenharmony_ci case ALC269_TYPE_ALC700: 320762306a36Sopenharmony_ci ssids = alc269_ssids; 320862306a36Sopenharmony_ci break; 320962306a36Sopenharmony_ci default: 321062306a36Sopenharmony_ci ssids = alc269_ssids; 321162306a36Sopenharmony_ci break; 321262306a36Sopenharmony_ci } 321362306a36Sopenharmony_ci 321462306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc269_ignore, ssids); 321562306a36Sopenharmony_ci} 321662306a36Sopenharmony_ci 321762306a36Sopenharmony_cistatic const struct hda_jack_keymap alc_headset_btn_keymap[] = { 321862306a36Sopenharmony_ci { SND_JACK_BTN_0, KEY_PLAYPAUSE }, 321962306a36Sopenharmony_ci { SND_JACK_BTN_1, KEY_VOICECOMMAND }, 322062306a36Sopenharmony_ci { SND_JACK_BTN_2, KEY_VOLUMEUP }, 322162306a36Sopenharmony_ci { SND_JACK_BTN_3, KEY_VOLUMEDOWN }, 322262306a36Sopenharmony_ci {} 322362306a36Sopenharmony_ci}; 322462306a36Sopenharmony_ci 322562306a36Sopenharmony_cistatic void alc_headset_btn_callback(struct hda_codec *codec, 322662306a36Sopenharmony_ci struct hda_jack_callback *jack) 322762306a36Sopenharmony_ci{ 322862306a36Sopenharmony_ci int report = 0; 322962306a36Sopenharmony_ci 323062306a36Sopenharmony_ci if (jack->unsol_res & (7 << 13)) 323162306a36Sopenharmony_ci report |= SND_JACK_BTN_0; 323262306a36Sopenharmony_ci 323362306a36Sopenharmony_ci if (jack->unsol_res & (1 << 16 | 3 << 8)) 323462306a36Sopenharmony_ci report |= SND_JACK_BTN_1; 323562306a36Sopenharmony_ci 323662306a36Sopenharmony_ci /* Volume up key */ 323762306a36Sopenharmony_ci if (jack->unsol_res & (7 << 23)) 323862306a36Sopenharmony_ci report |= SND_JACK_BTN_2; 323962306a36Sopenharmony_ci 324062306a36Sopenharmony_ci /* Volume down key */ 324162306a36Sopenharmony_ci if (jack->unsol_res & (7 << 10)) 324262306a36Sopenharmony_ci report |= SND_JACK_BTN_3; 324362306a36Sopenharmony_ci 324462306a36Sopenharmony_ci snd_hda_jack_set_button_state(codec, jack->nid, report); 324562306a36Sopenharmony_ci} 324662306a36Sopenharmony_ci 324762306a36Sopenharmony_cistatic void alc_disable_headset_jack_key(struct hda_codec *codec) 324862306a36Sopenharmony_ci{ 324962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 325062306a36Sopenharmony_ci 325162306a36Sopenharmony_ci if (!spec->has_hs_key) 325262306a36Sopenharmony_ci return; 325362306a36Sopenharmony_ci 325462306a36Sopenharmony_ci switch (codec->core.vendor_id) { 325562306a36Sopenharmony_ci case 0x10ec0215: 325662306a36Sopenharmony_ci case 0x10ec0225: 325762306a36Sopenharmony_ci case 0x10ec0285: 325862306a36Sopenharmony_ci case 0x10ec0287: 325962306a36Sopenharmony_ci case 0x10ec0295: 326062306a36Sopenharmony_ci case 0x10ec0289: 326162306a36Sopenharmony_ci case 0x10ec0299: 326262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x48, 0x0); 326362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x49, 0x0045, 0x0); 326462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0); 326562306a36Sopenharmony_ci break; 326662306a36Sopenharmony_ci case 0x10ec0230: 326762306a36Sopenharmony_ci case 0x10ec0236: 326862306a36Sopenharmony_ci case 0x10ec0256: 326962306a36Sopenharmony_ci case 0x10ec0257: 327062306a36Sopenharmony_ci case 0x19e58326: 327162306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x48, 0x0); 327262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x49, 0x0045, 0x0); 327362306a36Sopenharmony_ci break; 327462306a36Sopenharmony_ci } 327562306a36Sopenharmony_ci} 327662306a36Sopenharmony_ci 327762306a36Sopenharmony_cistatic void alc_enable_headset_jack_key(struct hda_codec *codec) 327862306a36Sopenharmony_ci{ 327962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 328062306a36Sopenharmony_ci 328162306a36Sopenharmony_ci if (!spec->has_hs_key) 328262306a36Sopenharmony_ci return; 328362306a36Sopenharmony_ci 328462306a36Sopenharmony_ci switch (codec->core.vendor_id) { 328562306a36Sopenharmony_ci case 0x10ec0215: 328662306a36Sopenharmony_ci case 0x10ec0225: 328762306a36Sopenharmony_ci case 0x10ec0285: 328862306a36Sopenharmony_ci case 0x10ec0287: 328962306a36Sopenharmony_ci case 0x10ec0295: 329062306a36Sopenharmony_ci case 0x10ec0289: 329162306a36Sopenharmony_ci case 0x10ec0299: 329262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x48, 0xd011); 329362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045); 329462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8); 329562306a36Sopenharmony_ci break; 329662306a36Sopenharmony_ci case 0x10ec0230: 329762306a36Sopenharmony_ci case 0x10ec0236: 329862306a36Sopenharmony_ci case 0x10ec0256: 329962306a36Sopenharmony_ci case 0x10ec0257: 330062306a36Sopenharmony_ci case 0x19e58326: 330162306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x48, 0xd011); 330262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045); 330362306a36Sopenharmony_ci break; 330462306a36Sopenharmony_ci } 330562306a36Sopenharmony_ci} 330662306a36Sopenharmony_ci 330762306a36Sopenharmony_cistatic void alc_fixup_headset_jack(struct hda_codec *codec, 330862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 330962306a36Sopenharmony_ci{ 331062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 331162306a36Sopenharmony_ci hda_nid_t hp_pin; 331262306a36Sopenharmony_ci 331362306a36Sopenharmony_ci switch (action) { 331462306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 331562306a36Sopenharmony_ci spec->has_hs_key = 1; 331662306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x55, 331762306a36Sopenharmony_ci alc_headset_btn_callback); 331862306a36Sopenharmony_ci break; 331962306a36Sopenharmony_ci case HDA_FIXUP_ACT_BUILD: 332062306a36Sopenharmony_ci hp_pin = alc_get_hp_pin(spec); 332162306a36Sopenharmony_ci if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55, 332262306a36Sopenharmony_ci alc_headset_btn_keymap, 332362306a36Sopenharmony_ci hp_pin)) 332462306a36Sopenharmony_ci snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", 332562306a36Sopenharmony_ci false, SND_JACK_HEADSET, 332662306a36Sopenharmony_ci alc_headset_btn_keymap); 332762306a36Sopenharmony_ci 332862306a36Sopenharmony_ci alc_enable_headset_jack_key(codec); 332962306a36Sopenharmony_ci break; 333062306a36Sopenharmony_ci } 333162306a36Sopenharmony_ci} 333262306a36Sopenharmony_ci 333362306a36Sopenharmony_cistatic void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up) 333462306a36Sopenharmony_ci{ 333562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0); 333662306a36Sopenharmony_ci} 333762306a36Sopenharmony_ci 333862306a36Sopenharmony_cistatic void alc269_shutup(struct hda_codec *codec) 333962306a36Sopenharmony_ci{ 334062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 334162306a36Sopenharmony_ci 334262306a36Sopenharmony_ci if (spec->codec_variant == ALC269_TYPE_ALC269VB) 334362306a36Sopenharmony_ci alc269vb_toggle_power_output(codec, 0); 334462306a36Sopenharmony_ci if (spec->codec_variant == ALC269_TYPE_ALC269VB && 334562306a36Sopenharmony_ci (alc_get_coef0(codec) & 0x00ff) == 0x018) { 334662306a36Sopenharmony_ci msleep(150); 334762306a36Sopenharmony_ci } 334862306a36Sopenharmony_ci alc_shutup_pins(codec); 334962306a36Sopenharmony_ci} 335062306a36Sopenharmony_ci 335162306a36Sopenharmony_cistatic const struct coef_fw alc282_coefs[] = { 335262306a36Sopenharmony_ci WRITE_COEF(0x03, 0x0002), /* Power Down Control */ 335362306a36Sopenharmony_ci UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */ 335462306a36Sopenharmony_ci WRITE_COEF(0x07, 0x0200), /* DMIC control */ 335562306a36Sopenharmony_ci UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */ 335662306a36Sopenharmony_ci UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */ 335762306a36Sopenharmony_ci WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */ 335862306a36Sopenharmony_ci WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */ 335962306a36Sopenharmony_ci WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */ 336062306a36Sopenharmony_ci UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */ 336162306a36Sopenharmony_ci UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */ 336262306a36Sopenharmony_ci WRITE_COEF(0x6f, 0x0), /* Class D test 4 */ 336362306a36Sopenharmony_ci UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */ 336462306a36Sopenharmony_ci WRITE_COEF(0x34, 0xa0c0), /* ANC */ 336562306a36Sopenharmony_ci UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */ 336662306a36Sopenharmony_ci UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */ 336762306a36Sopenharmony_ci UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */ 336862306a36Sopenharmony_ci WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */ 336962306a36Sopenharmony_ci WRITE_COEF(0x63, 0x2902), /* PLL */ 337062306a36Sopenharmony_ci WRITE_COEF(0x68, 0xa080), /* capless control 2 */ 337162306a36Sopenharmony_ci WRITE_COEF(0x69, 0x3400), /* capless control 3 */ 337262306a36Sopenharmony_ci WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */ 337362306a36Sopenharmony_ci WRITE_COEF(0x6b, 0x0), /* capless control 5 */ 337462306a36Sopenharmony_ci UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */ 337562306a36Sopenharmony_ci WRITE_COEF(0x6e, 0x110a), /* class D test 3 */ 337662306a36Sopenharmony_ci UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */ 337762306a36Sopenharmony_ci WRITE_COEF(0x71, 0x0014), /* class D test 6 */ 337862306a36Sopenharmony_ci WRITE_COEF(0x72, 0xc2ba), /* classD OCP */ 337962306a36Sopenharmony_ci UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */ 338062306a36Sopenharmony_ci WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */ 338162306a36Sopenharmony_ci {} 338262306a36Sopenharmony_ci}; 338362306a36Sopenharmony_ci 338462306a36Sopenharmony_cistatic void alc282_restore_default_value(struct hda_codec *codec) 338562306a36Sopenharmony_ci{ 338662306a36Sopenharmony_ci alc_process_coef_fw(codec, alc282_coefs); 338762306a36Sopenharmony_ci} 338862306a36Sopenharmony_ci 338962306a36Sopenharmony_cistatic void alc282_init(struct hda_codec *codec) 339062306a36Sopenharmony_ci{ 339162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 339262306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 339362306a36Sopenharmony_ci bool hp_pin_sense; 339462306a36Sopenharmony_ci int coef78; 339562306a36Sopenharmony_ci 339662306a36Sopenharmony_ci alc282_restore_default_value(codec); 339762306a36Sopenharmony_ci 339862306a36Sopenharmony_ci if (!hp_pin) 339962306a36Sopenharmony_ci return; 340062306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 340162306a36Sopenharmony_ci coef78 = alc_read_coef_idx(codec, 0x78); 340262306a36Sopenharmony_ci 340362306a36Sopenharmony_ci /* Index 0x78 Direct Drive HP AMP LPM Control 1 */ 340462306a36Sopenharmony_ci /* Headphone capless set to high power mode */ 340562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x78, 0x9004); 340662306a36Sopenharmony_ci 340762306a36Sopenharmony_ci if (hp_pin_sense) 340862306a36Sopenharmony_ci msleep(2); 340962306a36Sopenharmony_ci 341062306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 341162306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 341262306a36Sopenharmony_ci 341362306a36Sopenharmony_ci if (hp_pin_sense) 341462306a36Sopenharmony_ci msleep(85); 341562306a36Sopenharmony_ci 341662306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 341762306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 341862306a36Sopenharmony_ci 341962306a36Sopenharmony_ci if (hp_pin_sense) 342062306a36Sopenharmony_ci msleep(100); 342162306a36Sopenharmony_ci 342262306a36Sopenharmony_ci /* Headphone capless set to normal mode */ 342362306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x78, coef78); 342462306a36Sopenharmony_ci} 342562306a36Sopenharmony_ci 342662306a36Sopenharmony_cistatic void alc282_shutup(struct hda_codec *codec) 342762306a36Sopenharmony_ci{ 342862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 342962306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 343062306a36Sopenharmony_ci bool hp_pin_sense; 343162306a36Sopenharmony_ci int coef78; 343262306a36Sopenharmony_ci 343362306a36Sopenharmony_ci if (!hp_pin) { 343462306a36Sopenharmony_ci alc269_shutup(codec); 343562306a36Sopenharmony_ci return; 343662306a36Sopenharmony_ci } 343762306a36Sopenharmony_ci 343862306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 343962306a36Sopenharmony_ci coef78 = alc_read_coef_idx(codec, 0x78); 344062306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x78, 0x9004); 344162306a36Sopenharmony_ci 344262306a36Sopenharmony_ci if (hp_pin_sense) 344362306a36Sopenharmony_ci msleep(2); 344462306a36Sopenharmony_ci 344562306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 344662306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 344762306a36Sopenharmony_ci 344862306a36Sopenharmony_ci if (hp_pin_sense) 344962306a36Sopenharmony_ci msleep(85); 345062306a36Sopenharmony_ci 345162306a36Sopenharmony_ci if (!spec->no_shutup_pins) 345262306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 345362306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 345462306a36Sopenharmony_ci 345562306a36Sopenharmony_ci if (hp_pin_sense) 345662306a36Sopenharmony_ci msleep(100); 345762306a36Sopenharmony_ci 345862306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 345962306a36Sopenharmony_ci alc_shutup_pins(codec); 346062306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x78, coef78); 346162306a36Sopenharmony_ci} 346262306a36Sopenharmony_ci 346362306a36Sopenharmony_cistatic const struct coef_fw alc283_coefs[] = { 346462306a36Sopenharmony_ci WRITE_COEF(0x03, 0x0002), /* Power Down Control */ 346562306a36Sopenharmony_ci UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */ 346662306a36Sopenharmony_ci WRITE_COEF(0x07, 0x0200), /* DMIC control */ 346762306a36Sopenharmony_ci UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */ 346862306a36Sopenharmony_ci UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */ 346962306a36Sopenharmony_ci WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */ 347062306a36Sopenharmony_ci WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */ 347162306a36Sopenharmony_ci WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */ 347262306a36Sopenharmony_ci UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */ 347362306a36Sopenharmony_ci UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */ 347462306a36Sopenharmony_ci WRITE_COEF(0x3a, 0x0), /* Class D test 4 */ 347562306a36Sopenharmony_ci UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */ 347662306a36Sopenharmony_ci WRITE_COEF(0x22, 0xa0c0), /* ANC */ 347762306a36Sopenharmony_ci UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */ 347862306a36Sopenharmony_ci UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */ 347962306a36Sopenharmony_ci UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */ 348062306a36Sopenharmony_ci WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */ 348162306a36Sopenharmony_ci WRITE_COEF(0x2e, 0x2902), /* PLL */ 348262306a36Sopenharmony_ci WRITE_COEF(0x33, 0xa080), /* capless control 2 */ 348362306a36Sopenharmony_ci WRITE_COEF(0x34, 0x3400), /* capless control 3 */ 348462306a36Sopenharmony_ci WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */ 348562306a36Sopenharmony_ci WRITE_COEF(0x36, 0x0), /* capless control 5 */ 348662306a36Sopenharmony_ci UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */ 348762306a36Sopenharmony_ci WRITE_COEF(0x39, 0x110a), /* class D test 3 */ 348862306a36Sopenharmony_ci UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */ 348962306a36Sopenharmony_ci WRITE_COEF(0x3c, 0x0014), /* class D test 6 */ 349062306a36Sopenharmony_ci WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */ 349162306a36Sopenharmony_ci UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */ 349262306a36Sopenharmony_ci WRITE_COEF(0x49, 0x0), /* test mode */ 349362306a36Sopenharmony_ci UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */ 349462306a36Sopenharmony_ci UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */ 349562306a36Sopenharmony_ci WRITE_COEF(0x37, 0xfc06), /* Class D amp control */ 349662306a36Sopenharmony_ci UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */ 349762306a36Sopenharmony_ci {} 349862306a36Sopenharmony_ci}; 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_cistatic void alc283_restore_default_value(struct hda_codec *codec) 350162306a36Sopenharmony_ci{ 350262306a36Sopenharmony_ci alc_process_coef_fw(codec, alc283_coefs); 350362306a36Sopenharmony_ci} 350462306a36Sopenharmony_ci 350562306a36Sopenharmony_cistatic void alc283_init(struct hda_codec *codec) 350662306a36Sopenharmony_ci{ 350762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 350862306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 350962306a36Sopenharmony_ci bool hp_pin_sense; 351062306a36Sopenharmony_ci 351162306a36Sopenharmony_ci alc283_restore_default_value(codec); 351262306a36Sopenharmony_ci 351362306a36Sopenharmony_ci if (!hp_pin) 351462306a36Sopenharmony_ci return; 351562306a36Sopenharmony_ci 351662306a36Sopenharmony_ci msleep(30); 351762306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 351862306a36Sopenharmony_ci 351962306a36Sopenharmony_ci /* Index 0x43 Direct Drive HP AMP LPM Control 1 */ 352062306a36Sopenharmony_ci /* Headphone capless set to high power mode */ 352162306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x43, 0x9004); 352262306a36Sopenharmony_ci 352362306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 352462306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 352562306a36Sopenharmony_ci 352662306a36Sopenharmony_ci if (hp_pin_sense) 352762306a36Sopenharmony_ci msleep(85); 352862306a36Sopenharmony_ci 352962306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 353062306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 353162306a36Sopenharmony_ci 353262306a36Sopenharmony_ci if (hp_pin_sense) 353362306a36Sopenharmony_ci msleep(85); 353462306a36Sopenharmony_ci /* Index 0x46 Combo jack auto switch control 2 */ 353562306a36Sopenharmony_ci /* 3k pull low control for Headset jack. */ 353662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x46, 3 << 12, 0); 353762306a36Sopenharmony_ci /* Headphone capless set to normal mode */ 353862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x43, 0x9614); 353962306a36Sopenharmony_ci} 354062306a36Sopenharmony_ci 354162306a36Sopenharmony_cistatic void alc283_shutup(struct hda_codec *codec) 354262306a36Sopenharmony_ci{ 354362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 354462306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 354562306a36Sopenharmony_ci bool hp_pin_sense; 354662306a36Sopenharmony_ci 354762306a36Sopenharmony_ci if (!hp_pin) { 354862306a36Sopenharmony_ci alc269_shutup(codec); 354962306a36Sopenharmony_ci return; 355062306a36Sopenharmony_ci } 355162306a36Sopenharmony_ci 355262306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 355362306a36Sopenharmony_ci 355462306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x43, 0x9004); 355562306a36Sopenharmony_ci 355662306a36Sopenharmony_ci /*depop hp during suspend*/ 355762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x06, 0x2100); 355862306a36Sopenharmony_ci 355962306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 356062306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 356162306a36Sopenharmony_ci 356262306a36Sopenharmony_ci if (hp_pin_sense) 356362306a36Sopenharmony_ci msleep(100); 356462306a36Sopenharmony_ci 356562306a36Sopenharmony_ci if (!spec->no_shutup_pins) 356662306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 356762306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 356862306a36Sopenharmony_ci 356962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x46, 0, 3 << 12); 357062306a36Sopenharmony_ci 357162306a36Sopenharmony_ci if (hp_pin_sense) 357262306a36Sopenharmony_ci msleep(100); 357362306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 357462306a36Sopenharmony_ci alc_shutup_pins(codec); 357562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x43, 0x9614); 357662306a36Sopenharmony_ci} 357762306a36Sopenharmony_ci 357862306a36Sopenharmony_cistatic void alc256_init(struct hda_codec *codec) 357962306a36Sopenharmony_ci{ 358062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 358162306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 358262306a36Sopenharmony_ci bool hp_pin_sense; 358362306a36Sopenharmony_ci 358462306a36Sopenharmony_ci if (spec->ultra_low_power) { 358562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1); 358662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2); 358762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x08, 7<<4, 0); 358862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x3b, 1<<15, 0); 358962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6); 359062306a36Sopenharmony_ci msleep(30); 359162306a36Sopenharmony_ci } 359262306a36Sopenharmony_ci 359362306a36Sopenharmony_ci if (!hp_pin) 359462306a36Sopenharmony_ci hp_pin = 0x21; 359562306a36Sopenharmony_ci 359662306a36Sopenharmony_ci msleep(30); 359762306a36Sopenharmony_ci 359862306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 359962306a36Sopenharmony_ci 360062306a36Sopenharmony_ci if (hp_pin_sense) 360162306a36Sopenharmony_ci msleep(2); 360262306a36Sopenharmony_ci 360362306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */ 360462306a36Sopenharmony_ci 360562306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 360662306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 360762306a36Sopenharmony_ci 360862306a36Sopenharmony_ci if (hp_pin_sense || spec->ultra_low_power) 360962306a36Sopenharmony_ci msleep(85); 361062306a36Sopenharmony_ci 361162306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 361262306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 361362306a36Sopenharmony_ci 361462306a36Sopenharmony_ci if (hp_pin_sense || spec->ultra_low_power) 361562306a36Sopenharmony_ci msleep(100); 361662306a36Sopenharmony_ci 361762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x46, 3 << 12, 0); 361862306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ 361962306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ 362062306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); 362162306a36Sopenharmony_ci /* 362262306a36Sopenharmony_ci * Expose headphone mic (or possibly Line In on some machines) instead 362362306a36Sopenharmony_ci * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See 362462306a36Sopenharmony_ci * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of 362562306a36Sopenharmony_ci * this register. 362662306a36Sopenharmony_ci */ 362762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x36, 0x5757); 362862306a36Sopenharmony_ci} 362962306a36Sopenharmony_ci 363062306a36Sopenharmony_cistatic void alc256_shutup(struct hda_codec *codec) 363162306a36Sopenharmony_ci{ 363262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 363362306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 363462306a36Sopenharmony_ci bool hp_pin_sense; 363562306a36Sopenharmony_ci 363662306a36Sopenharmony_ci if (!hp_pin) 363762306a36Sopenharmony_ci hp_pin = 0x21; 363862306a36Sopenharmony_ci 363962306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */ 364062306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 364162306a36Sopenharmony_ci 364262306a36Sopenharmony_ci if (hp_pin_sense) 364362306a36Sopenharmony_ci msleep(2); 364462306a36Sopenharmony_ci 364562306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 364662306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 364762306a36Sopenharmony_ci 364862306a36Sopenharmony_ci if (hp_pin_sense || spec->ultra_low_power) 364962306a36Sopenharmony_ci msleep(85); 365062306a36Sopenharmony_ci 365162306a36Sopenharmony_ci /* 3k pull low control for Headset jack. */ 365262306a36Sopenharmony_ci /* NOTE: call this before clearing the pin, otherwise codec stalls */ 365362306a36Sopenharmony_ci /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly 365462306a36Sopenharmony_ci * when booting with headset plugged. So skip setting it for the codec alc257 365562306a36Sopenharmony_ci */ 365662306a36Sopenharmony_ci if (spec->en_3kpull_low) 365762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x46, 0, 3 << 12); 365862306a36Sopenharmony_ci 365962306a36Sopenharmony_ci if (!spec->no_shutup_pins) 366062306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 366162306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 366262306a36Sopenharmony_ci 366362306a36Sopenharmony_ci if (hp_pin_sense || spec->ultra_low_power) 366462306a36Sopenharmony_ci msleep(100); 366562306a36Sopenharmony_ci 366662306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 366762306a36Sopenharmony_ci alc_shutup_pins(codec); 366862306a36Sopenharmony_ci if (spec->ultra_low_power) { 366962306a36Sopenharmony_ci msleep(50); 367062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x03, 1<<1, 0); 367162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4); 367262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x08, 3<<2, 0); 367362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15); 367462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0e, 7<<6, 0); 367562306a36Sopenharmony_ci msleep(30); 367662306a36Sopenharmony_ci } 367762306a36Sopenharmony_ci} 367862306a36Sopenharmony_ci 367962306a36Sopenharmony_cistatic void alc285_hp_init(struct hda_codec *codec) 368062306a36Sopenharmony_ci{ 368162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 368262306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 368362306a36Sopenharmony_ci int i, val; 368462306a36Sopenharmony_ci int coef38, coef0d, coef36; 368562306a36Sopenharmony_ci 368662306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */ 368762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */ 368862306a36Sopenharmony_ci coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */ 368962306a36Sopenharmony_ci coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */ 369062306a36Sopenharmony_ci coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */ 369162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x38, 1<<4, 0x0); 369262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0d, 0x110, 0x0); 369362306a36Sopenharmony_ci 369462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000); 369562306a36Sopenharmony_ci 369662306a36Sopenharmony_ci if (hp_pin) 369762306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 369862306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 369962306a36Sopenharmony_ci 370062306a36Sopenharmony_ci msleep(130); 370162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14); 370262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x36, 1<<13, 0x0); 370362306a36Sopenharmony_ci 370462306a36Sopenharmony_ci if (hp_pin) 370562306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 370662306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 370762306a36Sopenharmony_ci msleep(10); 370862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */ 370962306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880); 371062306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049); 371162306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0); 371262306a36Sopenharmony_ci 371362306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */ 371462306a36Sopenharmony_ci val = alc_read_coefex_idx(codec, 0x58, 0x00); 371562306a36Sopenharmony_ci for (i = 0; i < 20 && val & 0x8000; i++) { 371662306a36Sopenharmony_ci msleep(50); 371762306a36Sopenharmony_ci val = alc_read_coefex_idx(codec, 0x58, 0x00); 371862306a36Sopenharmony_ci } /* Wait for depop procedure finish */ 371962306a36Sopenharmony_ci 372062306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */ 372162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x38, 1<<4, coef38); 372262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0d, 0x110, coef0d); 372362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x36, 3<<13, coef36); 372462306a36Sopenharmony_ci 372562306a36Sopenharmony_ci msleep(50); 372662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 1<<15, 0); 372762306a36Sopenharmony_ci} 372862306a36Sopenharmony_ci 372962306a36Sopenharmony_cistatic void alc225_init(struct hda_codec *codec) 373062306a36Sopenharmony_ci{ 373162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 373262306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 373362306a36Sopenharmony_ci bool hp1_pin_sense, hp2_pin_sense; 373462306a36Sopenharmony_ci 373562306a36Sopenharmony_ci if (spec->ultra_low_power) { 373662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2); 373762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6); 373862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x33, 1<<11, 0); 373962306a36Sopenharmony_ci msleep(30); 374062306a36Sopenharmony_ci } 374162306a36Sopenharmony_ci 374262306a36Sopenharmony_ci if (spec->codec_variant != ALC269_TYPE_ALC287 && 374362306a36Sopenharmony_ci spec->codec_variant != ALC269_TYPE_ALC245) 374462306a36Sopenharmony_ci /* required only at boot or S3 and S4 resume time */ 374562306a36Sopenharmony_ci if (!spec->done_hp_init || 374662306a36Sopenharmony_ci is_s3_resume(codec) || 374762306a36Sopenharmony_ci is_s4_resume(codec)) { 374862306a36Sopenharmony_ci alc285_hp_init(codec); 374962306a36Sopenharmony_ci spec->done_hp_init = true; 375062306a36Sopenharmony_ci } 375162306a36Sopenharmony_ci 375262306a36Sopenharmony_ci if (!hp_pin) 375362306a36Sopenharmony_ci hp_pin = 0x21; 375462306a36Sopenharmony_ci msleep(30); 375562306a36Sopenharmony_ci 375662306a36Sopenharmony_ci hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin); 375762306a36Sopenharmony_ci hp2_pin_sense = snd_hda_jack_detect(codec, 0x16); 375862306a36Sopenharmony_ci 375962306a36Sopenharmony_ci if (hp1_pin_sense || hp2_pin_sense) 376062306a36Sopenharmony_ci msleep(2); 376162306a36Sopenharmony_ci 376262306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */ 376362306a36Sopenharmony_ci 376462306a36Sopenharmony_ci if (hp1_pin_sense || spec->ultra_low_power) 376562306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 376662306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 376762306a36Sopenharmony_ci if (hp2_pin_sense) 376862306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x16, 0, 376962306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 377062306a36Sopenharmony_ci 377162306a36Sopenharmony_ci if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power) 377262306a36Sopenharmony_ci msleep(85); 377362306a36Sopenharmony_ci 377462306a36Sopenharmony_ci if (hp1_pin_sense || spec->ultra_low_power) 377562306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 377662306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 377762306a36Sopenharmony_ci if (hp2_pin_sense) 377862306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x16, 0, 377962306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 378062306a36Sopenharmony_ci 378162306a36Sopenharmony_ci if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power) 378262306a36Sopenharmony_ci msleep(100); 378362306a36Sopenharmony_ci 378462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 3 << 10, 0); 378562306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ 378662306a36Sopenharmony_ci} 378762306a36Sopenharmony_ci 378862306a36Sopenharmony_cistatic void alc225_shutup(struct hda_codec *codec) 378962306a36Sopenharmony_ci{ 379062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 379162306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 379262306a36Sopenharmony_ci bool hp1_pin_sense, hp2_pin_sense; 379362306a36Sopenharmony_ci 379462306a36Sopenharmony_ci if (!hp_pin) 379562306a36Sopenharmony_ci hp_pin = 0x21; 379662306a36Sopenharmony_ci 379762306a36Sopenharmony_ci alc_disable_headset_jack_key(codec); 379862306a36Sopenharmony_ci /* 3k pull low control for Headset jack. */ 379962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 0, 3 << 10); 380062306a36Sopenharmony_ci 380162306a36Sopenharmony_ci hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin); 380262306a36Sopenharmony_ci hp2_pin_sense = snd_hda_jack_detect(codec, 0x16); 380362306a36Sopenharmony_ci 380462306a36Sopenharmony_ci if (hp1_pin_sense || hp2_pin_sense) 380562306a36Sopenharmony_ci msleep(2); 380662306a36Sopenharmony_ci 380762306a36Sopenharmony_ci if (hp1_pin_sense || spec->ultra_low_power) 380862306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 380962306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 381062306a36Sopenharmony_ci if (hp2_pin_sense) 381162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x16, 0, 381262306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 381362306a36Sopenharmony_ci 381462306a36Sopenharmony_ci if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power) 381562306a36Sopenharmony_ci msleep(85); 381662306a36Sopenharmony_ci 381762306a36Sopenharmony_ci if (hp1_pin_sense || spec->ultra_low_power) 381862306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 381962306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 382062306a36Sopenharmony_ci if (hp2_pin_sense) 382162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x16, 0, 382262306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 382362306a36Sopenharmony_ci 382462306a36Sopenharmony_ci if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power) 382562306a36Sopenharmony_ci msleep(100); 382662306a36Sopenharmony_ci 382762306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 382862306a36Sopenharmony_ci alc_shutup_pins(codec); 382962306a36Sopenharmony_ci if (spec->ultra_low_power) { 383062306a36Sopenharmony_ci msleep(50); 383162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2); 383262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0e, 7<<6, 0); 383362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11); 383462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4); 383562306a36Sopenharmony_ci msleep(30); 383662306a36Sopenharmony_ci } 383762306a36Sopenharmony_ci 383862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 3 << 10, 0); 383962306a36Sopenharmony_ci alc_enable_headset_jack_key(codec); 384062306a36Sopenharmony_ci} 384162306a36Sopenharmony_ci 384262306a36Sopenharmony_cistatic void alc_default_init(struct hda_codec *codec) 384362306a36Sopenharmony_ci{ 384462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 384562306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 384662306a36Sopenharmony_ci bool hp_pin_sense; 384762306a36Sopenharmony_ci 384862306a36Sopenharmony_ci if (!hp_pin) 384962306a36Sopenharmony_ci return; 385062306a36Sopenharmony_ci 385162306a36Sopenharmony_ci msleep(30); 385262306a36Sopenharmony_ci 385362306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 385462306a36Sopenharmony_ci 385562306a36Sopenharmony_ci if (hp_pin_sense) 385662306a36Sopenharmony_ci msleep(2); 385762306a36Sopenharmony_ci 385862306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 385962306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 386062306a36Sopenharmony_ci 386162306a36Sopenharmony_ci if (hp_pin_sense) 386262306a36Sopenharmony_ci msleep(85); 386362306a36Sopenharmony_ci 386462306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 386562306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 386662306a36Sopenharmony_ci 386762306a36Sopenharmony_ci if (hp_pin_sense) 386862306a36Sopenharmony_ci msleep(100); 386962306a36Sopenharmony_ci} 387062306a36Sopenharmony_ci 387162306a36Sopenharmony_cistatic void alc_default_shutup(struct hda_codec *codec) 387262306a36Sopenharmony_ci{ 387362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 387462306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 387562306a36Sopenharmony_ci bool hp_pin_sense; 387662306a36Sopenharmony_ci 387762306a36Sopenharmony_ci if (!hp_pin) { 387862306a36Sopenharmony_ci alc269_shutup(codec); 387962306a36Sopenharmony_ci return; 388062306a36Sopenharmony_ci } 388162306a36Sopenharmony_ci 388262306a36Sopenharmony_ci hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); 388362306a36Sopenharmony_ci 388462306a36Sopenharmony_ci if (hp_pin_sense) 388562306a36Sopenharmony_ci msleep(2); 388662306a36Sopenharmony_ci 388762306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 388862306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 388962306a36Sopenharmony_ci 389062306a36Sopenharmony_ci if (hp_pin_sense) 389162306a36Sopenharmony_ci msleep(85); 389262306a36Sopenharmony_ci 389362306a36Sopenharmony_ci if (!spec->no_shutup_pins) 389462306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 389562306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 389662306a36Sopenharmony_ci 389762306a36Sopenharmony_ci if (hp_pin_sense) 389862306a36Sopenharmony_ci msleep(100); 389962306a36Sopenharmony_ci 390062306a36Sopenharmony_ci alc_auto_setup_eapd(codec, false); 390162306a36Sopenharmony_ci alc_shutup_pins(codec); 390262306a36Sopenharmony_ci} 390362306a36Sopenharmony_ci 390462306a36Sopenharmony_cistatic void alc294_hp_init(struct hda_codec *codec) 390562306a36Sopenharmony_ci{ 390662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 390762306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 390862306a36Sopenharmony_ci int i, val; 390962306a36Sopenharmony_ci 391062306a36Sopenharmony_ci if (!hp_pin) 391162306a36Sopenharmony_ci return; 391262306a36Sopenharmony_ci 391362306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 391462306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 391562306a36Sopenharmony_ci 391662306a36Sopenharmony_ci msleep(100); 391762306a36Sopenharmony_ci 391862306a36Sopenharmony_ci if (!spec->no_shutup_pins) 391962306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 392062306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 392162306a36Sopenharmony_ci 392262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */ 392362306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */ 392462306a36Sopenharmony_ci 392562306a36Sopenharmony_ci /* Wait for depop procedure finish */ 392662306a36Sopenharmony_ci val = alc_read_coefex_idx(codec, 0x58, 0x01); 392762306a36Sopenharmony_ci for (i = 0; i < 20 && val & 0x0080; i++) { 392862306a36Sopenharmony_ci msleep(50); 392962306a36Sopenharmony_ci val = alc_read_coefex_idx(codec, 0x58, 0x01); 393062306a36Sopenharmony_ci } 393162306a36Sopenharmony_ci /* Set HP depop to auto mode */ 393262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b); 393362306a36Sopenharmony_ci msleep(50); 393462306a36Sopenharmony_ci} 393562306a36Sopenharmony_ci 393662306a36Sopenharmony_cistatic void alc294_init(struct hda_codec *codec) 393762306a36Sopenharmony_ci{ 393862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 393962306a36Sopenharmony_ci 394062306a36Sopenharmony_ci /* required only at boot or S4 resume time */ 394162306a36Sopenharmony_ci if (!spec->done_hp_init || 394262306a36Sopenharmony_ci codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) { 394362306a36Sopenharmony_ci alc294_hp_init(codec); 394462306a36Sopenharmony_ci spec->done_hp_init = true; 394562306a36Sopenharmony_ci } 394662306a36Sopenharmony_ci alc_default_init(codec); 394762306a36Sopenharmony_ci} 394862306a36Sopenharmony_ci 394962306a36Sopenharmony_cistatic void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, 395062306a36Sopenharmony_ci unsigned int val) 395162306a36Sopenharmony_ci{ 395262306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1); 395362306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */ 395462306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */ 395562306a36Sopenharmony_ci} 395662306a36Sopenharmony_ci 395762306a36Sopenharmony_cistatic int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg) 395862306a36Sopenharmony_ci{ 395962306a36Sopenharmony_ci unsigned int val; 396062306a36Sopenharmony_ci 396162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1); 396262306a36Sopenharmony_ci val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0) 396362306a36Sopenharmony_ci & 0xffff; 396462306a36Sopenharmony_ci val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0) 396562306a36Sopenharmony_ci << 16; 396662306a36Sopenharmony_ci return val; 396762306a36Sopenharmony_ci} 396862306a36Sopenharmony_ci 396962306a36Sopenharmony_cistatic void alc5505_dsp_halt(struct hda_codec *codec) 397062306a36Sopenharmony_ci{ 397162306a36Sopenharmony_ci unsigned int val; 397262306a36Sopenharmony_ci 397362306a36Sopenharmony_ci alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */ 397462306a36Sopenharmony_ci alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */ 397562306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */ 397662306a36Sopenharmony_ci alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */ 397762306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */ 397862306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */ 397962306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */ 398062306a36Sopenharmony_ci val = alc5505_coef_get(codec, 0x6220); 398162306a36Sopenharmony_ci alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */ 398262306a36Sopenharmony_ci} 398362306a36Sopenharmony_ci 398462306a36Sopenharmony_cistatic void alc5505_dsp_back_from_halt(struct hda_codec *codec) 398562306a36Sopenharmony_ci{ 398662306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x04133302); 398762306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b0, 0x00005b16); 398862306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b4, 0x040a2b02); 398962306a36Sopenharmony_ci alc5505_coef_set(codec, 0x6230, 0xf80d4011); 399062306a36Sopenharmony_ci alc5505_coef_set(codec, 0x6220, 0x2002010f); 399162306a36Sopenharmony_ci alc5505_coef_set(codec, 0x880c, 0x00000004); 399262306a36Sopenharmony_ci} 399362306a36Sopenharmony_ci 399462306a36Sopenharmony_cistatic void alc5505_dsp_init(struct hda_codec *codec) 399562306a36Sopenharmony_ci{ 399662306a36Sopenharmony_ci unsigned int val; 399762306a36Sopenharmony_ci 399862306a36Sopenharmony_ci alc5505_dsp_halt(codec); 399962306a36Sopenharmony_ci alc5505_dsp_back_from_halt(codec); 400062306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */ 400162306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b0, 0x5b16); 400262306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */ 400362306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b4, 0x04132b02); 400462306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/ 400562306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x041f3302); 400662306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */ 400762306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x041b3302); 400862306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x04173302); 400962306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b8, 0x04163302); 401062306a36Sopenharmony_ci alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */ 401162306a36Sopenharmony_ci alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */ 401262306a36Sopenharmony_ci alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */ 401362306a36Sopenharmony_ci 401462306a36Sopenharmony_ci val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */ 401562306a36Sopenharmony_ci if (val <= 3) 401662306a36Sopenharmony_ci alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */ 401762306a36Sopenharmony_ci else 401862306a36Sopenharmony_ci alc5505_coef_set(codec, 0x6220, 0x6002018f); 401962306a36Sopenharmony_ci 402062306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/ 402162306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */ 402262306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */ 402362306a36Sopenharmony_ci alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */ 402462306a36Sopenharmony_ci alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */ 402562306a36Sopenharmony_ci alc5505_coef_set(codec, 0x880c, 0x00000003); 402662306a36Sopenharmony_ci alc5505_coef_set(codec, 0x880c, 0x00000010); 402762306a36Sopenharmony_ci 402862306a36Sopenharmony_ci#ifdef HALT_REALTEK_ALC5505 402962306a36Sopenharmony_ci alc5505_dsp_halt(codec); 403062306a36Sopenharmony_ci#endif 403162306a36Sopenharmony_ci} 403262306a36Sopenharmony_ci 403362306a36Sopenharmony_ci#ifdef HALT_REALTEK_ALC5505 403462306a36Sopenharmony_ci#define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */ 403562306a36Sopenharmony_ci#define alc5505_dsp_resume(codec) do { } while (0) /* NOP */ 403662306a36Sopenharmony_ci#else 403762306a36Sopenharmony_ci#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec) 403862306a36Sopenharmony_ci#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec) 403962306a36Sopenharmony_ci#endif 404062306a36Sopenharmony_ci 404162306a36Sopenharmony_ci#ifdef CONFIG_PM 404262306a36Sopenharmony_cistatic int alc269_suspend(struct hda_codec *codec) 404362306a36Sopenharmony_ci{ 404462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 404562306a36Sopenharmony_ci 404662306a36Sopenharmony_ci if (spec->has_alc5505_dsp) 404762306a36Sopenharmony_ci alc5505_dsp_suspend(codec); 404862306a36Sopenharmony_ci 404962306a36Sopenharmony_ci return alc_suspend(codec); 405062306a36Sopenharmony_ci} 405162306a36Sopenharmony_ci 405262306a36Sopenharmony_cistatic int alc269_resume(struct hda_codec *codec) 405362306a36Sopenharmony_ci{ 405462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 405562306a36Sopenharmony_ci 405662306a36Sopenharmony_ci if (spec->codec_variant == ALC269_TYPE_ALC269VB) 405762306a36Sopenharmony_ci alc269vb_toggle_power_output(codec, 0); 405862306a36Sopenharmony_ci if (spec->codec_variant == ALC269_TYPE_ALC269VB && 405962306a36Sopenharmony_ci (alc_get_coef0(codec) & 0x00ff) == 0x018) { 406062306a36Sopenharmony_ci msleep(150); 406162306a36Sopenharmony_ci } 406262306a36Sopenharmony_ci 406362306a36Sopenharmony_ci codec->patch_ops.init(codec); 406462306a36Sopenharmony_ci 406562306a36Sopenharmony_ci if (spec->codec_variant == ALC269_TYPE_ALC269VB) 406662306a36Sopenharmony_ci alc269vb_toggle_power_output(codec, 1); 406762306a36Sopenharmony_ci if (spec->codec_variant == ALC269_TYPE_ALC269VB && 406862306a36Sopenharmony_ci (alc_get_coef0(codec) & 0x00ff) == 0x017) { 406962306a36Sopenharmony_ci msleep(200); 407062306a36Sopenharmony_ci } 407162306a36Sopenharmony_ci 407262306a36Sopenharmony_ci snd_hda_regmap_sync(codec); 407362306a36Sopenharmony_ci hda_call_check_power_status(codec, 0x01); 407462306a36Sopenharmony_ci 407562306a36Sopenharmony_ci /* on some machine, the BIOS will clear the codec gpio data when enter 407662306a36Sopenharmony_ci * suspend, and won't restore the data after resume, so we restore it 407762306a36Sopenharmony_ci * in the driver. 407862306a36Sopenharmony_ci */ 407962306a36Sopenharmony_ci if (spec->gpio_data) 408062306a36Sopenharmony_ci alc_write_gpio_data(codec); 408162306a36Sopenharmony_ci 408262306a36Sopenharmony_ci if (spec->has_alc5505_dsp) 408362306a36Sopenharmony_ci alc5505_dsp_resume(codec); 408462306a36Sopenharmony_ci 408562306a36Sopenharmony_ci return 0; 408662306a36Sopenharmony_ci} 408762306a36Sopenharmony_ci#endif /* CONFIG_PM */ 408862306a36Sopenharmony_ci 408962306a36Sopenharmony_cistatic void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec, 409062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 409162306a36Sopenharmony_ci{ 409262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 409362306a36Sopenharmony_ci 409462306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 409562306a36Sopenharmony_ci spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; 409662306a36Sopenharmony_ci} 409762306a36Sopenharmony_ci 409862306a36Sopenharmony_cistatic void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec, 409962306a36Sopenharmony_ci const struct hda_fixup *fix, 410062306a36Sopenharmony_ci int action) 410162306a36Sopenharmony_ci{ 410262306a36Sopenharmony_ci unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21); 410362306a36Sopenharmony_ci unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19); 410462306a36Sopenharmony_ci 410562306a36Sopenharmony_ci if (cfg_headphone && cfg_headset_mic == 0x411111f0) 410662306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x19, 410762306a36Sopenharmony_ci (cfg_headphone & ~AC_DEFCFG_DEVICE) | 410862306a36Sopenharmony_ci (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT)); 410962306a36Sopenharmony_ci} 411062306a36Sopenharmony_ci 411162306a36Sopenharmony_cistatic void alc269_fixup_hweq(struct hda_codec *codec, 411262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 411362306a36Sopenharmony_ci{ 411462306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_INIT) 411562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x1e, 0, 0x80); 411662306a36Sopenharmony_ci} 411762306a36Sopenharmony_ci 411862306a36Sopenharmony_cistatic void alc269_fixup_headset_mic(struct hda_codec *codec, 411962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 412062306a36Sopenharmony_ci{ 412162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 412262306a36Sopenharmony_ci 412362306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 412462306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 412562306a36Sopenharmony_ci} 412662306a36Sopenharmony_ci 412762306a36Sopenharmony_cistatic void alc271_fixup_dmic(struct hda_codec *codec, 412862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 412962306a36Sopenharmony_ci{ 413062306a36Sopenharmony_ci static const struct hda_verb verbs[] = { 413162306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x0d}, 413262306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x4000}, 413362306a36Sopenharmony_ci {} 413462306a36Sopenharmony_ci }; 413562306a36Sopenharmony_ci unsigned int cfg; 413662306a36Sopenharmony_ci 413762306a36Sopenharmony_ci if (strcmp(codec->core.chip_name, "ALC271X") && 413862306a36Sopenharmony_ci strcmp(codec->core.chip_name, "ALC269VB")) 413962306a36Sopenharmony_ci return; 414062306a36Sopenharmony_ci cfg = snd_hda_codec_get_pincfg(codec, 0x12); 414162306a36Sopenharmony_ci if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED) 414262306a36Sopenharmony_ci snd_hda_sequence_write(codec, verbs); 414362306a36Sopenharmony_ci} 414462306a36Sopenharmony_ci 414562306a36Sopenharmony_ci/* Fix the speaker amp after resume, etc */ 414662306a36Sopenharmony_cistatic void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec, 414762306a36Sopenharmony_ci const struct hda_fixup *fix, 414862306a36Sopenharmony_ci int action) 414962306a36Sopenharmony_ci{ 415062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_INIT) 415162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000); 415262306a36Sopenharmony_ci} 415362306a36Sopenharmony_ci 415462306a36Sopenharmony_cistatic void alc269_fixup_pcm_44k(struct hda_codec *codec, 415562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 415662306a36Sopenharmony_ci{ 415762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 415862306a36Sopenharmony_ci 415962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PROBE) 416062306a36Sopenharmony_ci return; 416162306a36Sopenharmony_ci 416262306a36Sopenharmony_ci /* Due to a hardware problem on Lenovo Ideadpad, we need to 416362306a36Sopenharmony_ci * fix the sample rate of analog I/O to 44.1kHz 416462306a36Sopenharmony_ci */ 416562306a36Sopenharmony_ci spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback; 416662306a36Sopenharmony_ci spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture; 416762306a36Sopenharmony_ci} 416862306a36Sopenharmony_ci 416962306a36Sopenharmony_cistatic void alc269_fixup_stereo_dmic(struct hda_codec *codec, 417062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 417162306a36Sopenharmony_ci{ 417262306a36Sopenharmony_ci /* The digital-mic unit sends PDM (differential signal) instead of 417362306a36Sopenharmony_ci * the standard PCM, thus you can't record a valid mono stream as is. 417462306a36Sopenharmony_ci * Below is a workaround specific to ALC269 to control the dmic 417562306a36Sopenharmony_ci * signal source as mono. 417662306a36Sopenharmony_ci */ 417762306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_INIT) 417862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x07, 0, 0x80); 417962306a36Sopenharmony_ci} 418062306a36Sopenharmony_ci 418162306a36Sopenharmony_cistatic void alc269_quanta_automute(struct hda_codec *codec) 418262306a36Sopenharmony_ci{ 418362306a36Sopenharmony_ci snd_hda_gen_update_outputs(codec); 418462306a36Sopenharmony_ci 418562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x0c, 0x680); 418662306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x0c, 0x480); 418762306a36Sopenharmony_ci} 418862306a36Sopenharmony_ci 418962306a36Sopenharmony_cistatic void alc269_fixup_quanta_mute(struct hda_codec *codec, 419062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 419162306a36Sopenharmony_ci{ 419262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 419362306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PROBE) 419462306a36Sopenharmony_ci return; 419562306a36Sopenharmony_ci spec->gen.automute_hook = alc269_quanta_automute; 419662306a36Sopenharmony_ci} 419762306a36Sopenharmony_ci 419862306a36Sopenharmony_cistatic void alc269_x101_hp_automute_hook(struct hda_codec *codec, 419962306a36Sopenharmony_ci struct hda_jack_callback *jack) 420062306a36Sopenharmony_ci{ 420162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 420262306a36Sopenharmony_ci int vref; 420362306a36Sopenharmony_ci msleep(200); 420462306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 420562306a36Sopenharmony_ci 420662306a36Sopenharmony_ci vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0; 420762306a36Sopenharmony_ci msleep(100); 420862306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 420962306a36Sopenharmony_ci vref); 421062306a36Sopenharmony_ci msleep(500); 421162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 421262306a36Sopenharmony_ci vref); 421362306a36Sopenharmony_ci} 421462306a36Sopenharmony_ci 421562306a36Sopenharmony_ci/* 421662306a36Sopenharmony_ci * Magic sequence to make Huawei Matebook X right speaker working (bko#197801) 421762306a36Sopenharmony_ci */ 421862306a36Sopenharmony_cistruct hda_alc298_mbxinit { 421962306a36Sopenharmony_ci unsigned char value_0x23; 422062306a36Sopenharmony_ci unsigned char value_0x25; 422162306a36Sopenharmony_ci}; 422262306a36Sopenharmony_ci 422362306a36Sopenharmony_cistatic void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec, 422462306a36Sopenharmony_ci const struct hda_alc298_mbxinit *initval, 422562306a36Sopenharmony_ci bool first) 422662306a36Sopenharmony_ci{ 422762306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0); 422862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x26, 0xb000); 422962306a36Sopenharmony_ci 423062306a36Sopenharmony_ci if (first) 423162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0); 423262306a36Sopenharmony_ci 423362306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80); 423462306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x26, 0xf000); 423562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x23, initval->value_0x23); 423662306a36Sopenharmony_ci 423762306a36Sopenharmony_ci if (initval->value_0x23 != 0x1e) 423862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x25, initval->value_0x25); 423962306a36Sopenharmony_ci 424062306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26); 424162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010); 424262306a36Sopenharmony_ci} 424362306a36Sopenharmony_ci 424462306a36Sopenharmony_cistatic void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec, 424562306a36Sopenharmony_ci const struct hda_fixup *fix, 424662306a36Sopenharmony_ci int action) 424762306a36Sopenharmony_ci{ 424862306a36Sopenharmony_ci /* Initialization magic */ 424962306a36Sopenharmony_ci static const struct hda_alc298_mbxinit dac_init[] = { 425062306a36Sopenharmony_ci {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00}, 425162306a36Sopenharmony_ci {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00}, 425262306a36Sopenharmony_ci {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00}, 425362306a36Sopenharmony_ci {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24}, 425462306a36Sopenharmony_ci {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f}, 425562306a36Sopenharmony_ci {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00}, 425662306a36Sopenharmony_ci {0x2f, 0x00}, 425762306a36Sopenharmony_ci {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, 425862306a36Sopenharmony_ci {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c}, 425962306a36Sopenharmony_ci {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80}, 426062306a36Sopenharmony_ci {} 426162306a36Sopenharmony_ci }; 426262306a36Sopenharmony_ci const struct hda_alc298_mbxinit *seq; 426362306a36Sopenharmony_ci 426462306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_INIT) 426562306a36Sopenharmony_ci return; 426662306a36Sopenharmony_ci 426762306a36Sopenharmony_ci /* Start */ 426862306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00); 426962306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80); 427062306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x26, 0xf000); 427162306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x22, 0x31); 427262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x23, 0x0b); 427362306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x25, 0x00); 427462306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26); 427562306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010); 427662306a36Sopenharmony_ci 427762306a36Sopenharmony_ci for (seq = dac_init; seq->value_0x23; seq++) 427862306a36Sopenharmony_ci alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init); 427962306a36Sopenharmony_ci} 428062306a36Sopenharmony_ci 428162306a36Sopenharmony_cistatic void alc269_fixup_x101_headset_mic(struct hda_codec *codec, 428262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 428362306a36Sopenharmony_ci{ 428462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 428562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 428662306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 428762306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook; 428862306a36Sopenharmony_ci } 428962306a36Sopenharmony_ci} 429062306a36Sopenharmony_ci 429162306a36Sopenharmony_cistatic void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin, 429262306a36Sopenharmony_ci bool polarity, bool on) 429362306a36Sopenharmony_ci{ 429462306a36Sopenharmony_ci unsigned int pinval; 429562306a36Sopenharmony_ci 429662306a36Sopenharmony_ci if (!pin) 429762306a36Sopenharmony_ci return; 429862306a36Sopenharmony_ci if (polarity) 429962306a36Sopenharmony_ci on = !on; 430062306a36Sopenharmony_ci pinval = snd_hda_codec_get_pin_target(codec, pin); 430162306a36Sopenharmony_ci pinval &= ~AC_PINCTL_VREFEN; 430262306a36Sopenharmony_ci pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ; 430362306a36Sopenharmony_ci /* temporarily power up/down for setting VREF */ 430462306a36Sopenharmony_ci snd_hda_power_up_pm(codec); 430562306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, pin, pinval); 430662306a36Sopenharmony_ci snd_hda_power_down_pm(codec); 430762306a36Sopenharmony_ci} 430862306a36Sopenharmony_ci 430962306a36Sopenharmony_ci/* update mute-LED according to the speaker mute state via mic VREF pin */ 431062306a36Sopenharmony_cistatic int vref_mute_led_set(struct led_classdev *led_cdev, 431162306a36Sopenharmony_ci enum led_brightness brightness) 431262306a36Sopenharmony_ci{ 431362306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 431462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 431562306a36Sopenharmony_ci 431662306a36Sopenharmony_ci alc_update_vref_led(codec, spec->mute_led_nid, 431762306a36Sopenharmony_ci spec->mute_led_polarity, brightness); 431862306a36Sopenharmony_ci return 0; 431962306a36Sopenharmony_ci} 432062306a36Sopenharmony_ci 432162306a36Sopenharmony_ci/* Make sure the led works even in runtime suspend */ 432262306a36Sopenharmony_cistatic unsigned int led_power_filter(struct hda_codec *codec, 432362306a36Sopenharmony_ci hda_nid_t nid, 432462306a36Sopenharmony_ci unsigned int power_state) 432562306a36Sopenharmony_ci{ 432662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 432762306a36Sopenharmony_ci 432862306a36Sopenharmony_ci if (power_state != AC_PWRST_D3 || nid == 0 || 432962306a36Sopenharmony_ci (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid)) 433062306a36Sopenharmony_ci return power_state; 433162306a36Sopenharmony_ci 433262306a36Sopenharmony_ci /* Set pin ctl again, it might have just been set to 0 */ 433362306a36Sopenharmony_ci snd_hda_set_pin_ctl(codec, nid, 433462306a36Sopenharmony_ci snd_hda_codec_get_pin_target(codec, nid)); 433562306a36Sopenharmony_ci 433662306a36Sopenharmony_ci return snd_hda_gen_path_power_filter(codec, nid, power_state); 433762306a36Sopenharmony_ci} 433862306a36Sopenharmony_ci 433962306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led(struct hda_codec *codec, 434062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 434162306a36Sopenharmony_ci{ 434262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 434362306a36Sopenharmony_ci const struct dmi_device *dev = NULL; 434462306a36Sopenharmony_ci 434562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 434662306a36Sopenharmony_ci return; 434762306a36Sopenharmony_ci 434862306a36Sopenharmony_ci while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) { 434962306a36Sopenharmony_ci int pol, pin; 435062306a36Sopenharmony_ci if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2) 435162306a36Sopenharmony_ci continue; 435262306a36Sopenharmony_ci if (pin < 0x0a || pin >= 0x10) 435362306a36Sopenharmony_ci break; 435462306a36Sopenharmony_ci spec->mute_led_polarity = pol; 435562306a36Sopenharmony_ci spec->mute_led_nid = pin - 0x0a + 0x18; 435662306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set); 435762306a36Sopenharmony_ci codec->power_filter = led_power_filter; 435862306a36Sopenharmony_ci codec_dbg(codec, 435962306a36Sopenharmony_ci "Detected mute LED for %x:%d\n", spec->mute_led_nid, 436062306a36Sopenharmony_ci spec->mute_led_polarity); 436162306a36Sopenharmony_ci break; 436262306a36Sopenharmony_ci } 436362306a36Sopenharmony_ci} 436462306a36Sopenharmony_ci 436562306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec, 436662306a36Sopenharmony_ci const struct hda_fixup *fix, 436762306a36Sopenharmony_ci int action, hda_nid_t pin) 436862306a36Sopenharmony_ci{ 436962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 437062306a36Sopenharmony_ci 437162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 437262306a36Sopenharmony_ci spec->mute_led_polarity = 0; 437362306a36Sopenharmony_ci spec->mute_led_nid = pin; 437462306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set); 437562306a36Sopenharmony_ci codec->power_filter = led_power_filter; 437662306a36Sopenharmony_ci } 437762306a36Sopenharmony_ci} 437862306a36Sopenharmony_ci 437962306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec, 438062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 438162306a36Sopenharmony_ci{ 438262306a36Sopenharmony_ci alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18); 438362306a36Sopenharmony_ci} 438462306a36Sopenharmony_ci 438562306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec, 438662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 438762306a36Sopenharmony_ci{ 438862306a36Sopenharmony_ci alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19); 438962306a36Sopenharmony_ci} 439062306a36Sopenharmony_ci 439162306a36Sopenharmony_cistatic void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec, 439262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 439362306a36Sopenharmony_ci{ 439462306a36Sopenharmony_ci alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b); 439562306a36Sopenharmony_ci} 439662306a36Sopenharmony_ci 439762306a36Sopenharmony_ci/* update LED status via GPIO */ 439862306a36Sopenharmony_cistatic void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask, 439962306a36Sopenharmony_ci int polarity, bool enabled) 440062306a36Sopenharmony_ci{ 440162306a36Sopenharmony_ci if (polarity) 440262306a36Sopenharmony_ci enabled = !enabled; 440362306a36Sopenharmony_ci alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */ 440462306a36Sopenharmony_ci} 440562306a36Sopenharmony_ci 440662306a36Sopenharmony_ci/* turn on/off mute LED via GPIO per vmaster hook */ 440762306a36Sopenharmony_cistatic int gpio_mute_led_set(struct led_classdev *led_cdev, 440862306a36Sopenharmony_ci enum led_brightness brightness) 440962306a36Sopenharmony_ci{ 441062306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 441162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 441262306a36Sopenharmony_ci 441362306a36Sopenharmony_ci alc_update_gpio_led(codec, spec->gpio_mute_led_mask, 441462306a36Sopenharmony_ci spec->mute_led_polarity, !brightness); 441562306a36Sopenharmony_ci return 0; 441662306a36Sopenharmony_ci} 441762306a36Sopenharmony_ci 441862306a36Sopenharmony_ci/* turn on/off mic-mute LED via GPIO per capture hook */ 441962306a36Sopenharmony_cistatic int micmute_led_set(struct led_classdev *led_cdev, 442062306a36Sopenharmony_ci enum led_brightness brightness) 442162306a36Sopenharmony_ci{ 442262306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 442362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 442462306a36Sopenharmony_ci 442562306a36Sopenharmony_ci alc_update_gpio_led(codec, spec->gpio_mic_led_mask, 442662306a36Sopenharmony_ci spec->micmute_led_polarity, !brightness); 442762306a36Sopenharmony_ci return 0; 442862306a36Sopenharmony_ci} 442962306a36Sopenharmony_ci 443062306a36Sopenharmony_ci/* setup mute and mic-mute GPIO bits, add hooks appropriately */ 443162306a36Sopenharmony_cistatic void alc_fixup_hp_gpio_led(struct hda_codec *codec, 443262306a36Sopenharmony_ci int action, 443362306a36Sopenharmony_ci unsigned int mute_mask, 443462306a36Sopenharmony_ci unsigned int micmute_mask) 443562306a36Sopenharmony_ci{ 443662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 443762306a36Sopenharmony_ci 443862306a36Sopenharmony_ci alc_fixup_gpio(codec, action, mute_mask | micmute_mask); 443962306a36Sopenharmony_ci 444062306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 444162306a36Sopenharmony_ci return; 444262306a36Sopenharmony_ci if (mute_mask) { 444362306a36Sopenharmony_ci spec->gpio_mute_led_mask = mute_mask; 444462306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set); 444562306a36Sopenharmony_ci } 444662306a36Sopenharmony_ci if (micmute_mask) { 444762306a36Sopenharmony_ci spec->gpio_mic_led_mask = micmute_mask; 444862306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set); 444962306a36Sopenharmony_ci } 445062306a36Sopenharmony_ci} 445162306a36Sopenharmony_ci 445262306a36Sopenharmony_cistatic void alc236_fixup_hp_gpio_led(struct hda_codec *codec, 445362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 445462306a36Sopenharmony_ci{ 445562306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01); 445662306a36Sopenharmony_ci} 445762306a36Sopenharmony_ci 445862306a36Sopenharmony_cistatic void alc269_fixup_hp_gpio_led(struct hda_codec *codec, 445962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 446062306a36Sopenharmony_ci{ 446162306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10); 446262306a36Sopenharmony_ci} 446362306a36Sopenharmony_ci 446462306a36Sopenharmony_cistatic void alc285_fixup_hp_gpio_led(struct hda_codec *codec, 446562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 446662306a36Sopenharmony_ci{ 446762306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01); 446862306a36Sopenharmony_ci} 446962306a36Sopenharmony_ci 447062306a36Sopenharmony_cistatic void alc286_fixup_hp_gpio_led(struct hda_codec *codec, 447162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 447262306a36Sopenharmony_ci{ 447362306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20); 447462306a36Sopenharmony_ci} 447562306a36Sopenharmony_ci 447662306a36Sopenharmony_cistatic void alc287_fixup_hp_gpio_led(struct hda_codec *codec, 447762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 447862306a36Sopenharmony_ci{ 447962306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x10, 0); 448062306a36Sopenharmony_ci} 448162306a36Sopenharmony_ci 448262306a36Sopenharmony_cistatic void alc245_fixup_hp_gpio_led(struct hda_codec *codec, 448362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 448462306a36Sopenharmony_ci{ 448562306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 448662306a36Sopenharmony_ci 448762306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 448862306a36Sopenharmony_ci spec->micmute_led_polarity = 1; 448962306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0, 0x04); 449062306a36Sopenharmony_ci} 449162306a36Sopenharmony_ci 449262306a36Sopenharmony_ci/* turn on/off mic-mute LED per capture hook via VREF change */ 449362306a36Sopenharmony_cistatic int vref_micmute_led_set(struct led_classdev *led_cdev, 449462306a36Sopenharmony_ci enum led_brightness brightness) 449562306a36Sopenharmony_ci{ 449662306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 449762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 449862306a36Sopenharmony_ci 449962306a36Sopenharmony_ci alc_update_vref_led(codec, spec->cap_mute_led_nid, 450062306a36Sopenharmony_ci spec->micmute_led_polarity, brightness); 450162306a36Sopenharmony_ci return 0; 450262306a36Sopenharmony_ci} 450362306a36Sopenharmony_ci 450462306a36Sopenharmony_cistatic void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec, 450562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 450662306a36Sopenharmony_ci{ 450762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 450862306a36Sopenharmony_ci 450962306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x08, 0); 451062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 451162306a36Sopenharmony_ci /* Like hp_gpio_mic1_led, but also needs GPIO4 low to 451262306a36Sopenharmony_ci * enable headphone amp 451362306a36Sopenharmony_ci */ 451462306a36Sopenharmony_ci spec->gpio_mask |= 0x10; 451562306a36Sopenharmony_ci spec->gpio_dir |= 0x10; 451662306a36Sopenharmony_ci spec->cap_mute_led_nid = 0x18; 451762306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set); 451862306a36Sopenharmony_ci codec->power_filter = led_power_filter; 451962306a36Sopenharmony_ci } 452062306a36Sopenharmony_ci} 452162306a36Sopenharmony_ci 452262306a36Sopenharmony_cistatic void alc280_fixup_hp_gpio4(struct hda_codec *codec, 452362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 452462306a36Sopenharmony_ci{ 452562306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 452662306a36Sopenharmony_ci 452762306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x08, 0); 452862306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 452962306a36Sopenharmony_ci spec->cap_mute_led_nid = 0x18; 453062306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set); 453162306a36Sopenharmony_ci codec->power_filter = led_power_filter; 453262306a36Sopenharmony_ci } 453362306a36Sopenharmony_ci} 453462306a36Sopenharmony_ci 453562306a36Sopenharmony_ci/* HP Spectre x360 14 model needs a unique workaround for enabling the amp; 453662306a36Sopenharmony_ci * it needs to toggle the GPIO0 once on and off at each time (bko#210633) 453762306a36Sopenharmony_ci */ 453862306a36Sopenharmony_cistatic void alc245_fixup_hp_x360_amp(struct hda_codec *codec, 453962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 454062306a36Sopenharmony_ci{ 454162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 454262306a36Sopenharmony_ci 454362306a36Sopenharmony_ci switch (action) { 454462306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 454562306a36Sopenharmony_ci spec->gpio_mask |= 0x01; 454662306a36Sopenharmony_ci spec->gpio_dir |= 0x01; 454762306a36Sopenharmony_ci break; 454862306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 454962306a36Sopenharmony_ci /* need to toggle GPIO to enable the amp */ 455062306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x01, true); 455162306a36Sopenharmony_ci msleep(100); 455262306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x01, false); 455362306a36Sopenharmony_ci break; 455462306a36Sopenharmony_ci } 455562306a36Sopenharmony_ci} 455662306a36Sopenharmony_ci 455762306a36Sopenharmony_ci/* toggle GPIO2 at each time stream is started; we use PREPARE state instead */ 455862306a36Sopenharmony_cistatic void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo, 455962306a36Sopenharmony_ci struct hda_codec *codec, 456062306a36Sopenharmony_ci struct snd_pcm_substream *substream, 456162306a36Sopenharmony_ci int action) 456262306a36Sopenharmony_ci{ 456362306a36Sopenharmony_ci switch (action) { 456462306a36Sopenharmony_ci case HDA_GEN_PCM_ACT_PREPARE: 456562306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x04, true); 456662306a36Sopenharmony_ci break; 456762306a36Sopenharmony_ci case HDA_GEN_PCM_ACT_CLEANUP: 456862306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x04, false); 456962306a36Sopenharmony_ci break; 457062306a36Sopenharmony_ci } 457162306a36Sopenharmony_ci} 457262306a36Sopenharmony_ci 457362306a36Sopenharmony_cistatic void alc274_fixup_hp_envy_gpio(struct hda_codec *codec, 457462306a36Sopenharmony_ci const struct hda_fixup *fix, 457562306a36Sopenharmony_ci int action) 457662306a36Sopenharmony_ci{ 457762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 457862306a36Sopenharmony_ci 457962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PROBE) { 458062306a36Sopenharmony_ci spec->gpio_mask |= 0x04; 458162306a36Sopenharmony_ci spec->gpio_dir |= 0x04; 458262306a36Sopenharmony_ci spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook; 458362306a36Sopenharmony_ci } 458462306a36Sopenharmony_ci} 458562306a36Sopenharmony_ci 458662306a36Sopenharmony_cistatic void alc_update_coef_led(struct hda_codec *codec, 458762306a36Sopenharmony_ci struct alc_coef_led *led, 458862306a36Sopenharmony_ci bool polarity, bool on) 458962306a36Sopenharmony_ci{ 459062306a36Sopenharmony_ci if (polarity) 459162306a36Sopenharmony_ci on = !on; 459262306a36Sopenharmony_ci /* temporarily power up/down for setting COEF bit */ 459362306a36Sopenharmony_ci alc_update_coef_idx(codec, led->idx, led->mask, 459462306a36Sopenharmony_ci on ? led->on : led->off); 459562306a36Sopenharmony_ci} 459662306a36Sopenharmony_ci 459762306a36Sopenharmony_ci/* update mute-LED according to the speaker mute state via COEF bit */ 459862306a36Sopenharmony_cistatic int coef_mute_led_set(struct led_classdev *led_cdev, 459962306a36Sopenharmony_ci enum led_brightness brightness) 460062306a36Sopenharmony_ci{ 460162306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 460262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 460362306a36Sopenharmony_ci 460462306a36Sopenharmony_ci alc_update_coef_led(codec, &spec->mute_led_coef, 460562306a36Sopenharmony_ci spec->mute_led_polarity, brightness); 460662306a36Sopenharmony_ci return 0; 460762306a36Sopenharmony_ci} 460862306a36Sopenharmony_ci 460962306a36Sopenharmony_cistatic void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec, 461062306a36Sopenharmony_ci const struct hda_fixup *fix, 461162306a36Sopenharmony_ci int action) 461262306a36Sopenharmony_ci{ 461362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 461462306a36Sopenharmony_ci 461562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 461662306a36Sopenharmony_ci spec->mute_led_polarity = 0; 461762306a36Sopenharmony_ci spec->mute_led_coef.idx = 0x0b; 461862306a36Sopenharmony_ci spec->mute_led_coef.mask = 1 << 3; 461962306a36Sopenharmony_ci spec->mute_led_coef.on = 1 << 3; 462062306a36Sopenharmony_ci spec->mute_led_coef.off = 0; 462162306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set); 462262306a36Sopenharmony_ci } 462362306a36Sopenharmony_ci} 462462306a36Sopenharmony_ci 462562306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec, 462662306a36Sopenharmony_ci const struct hda_fixup *fix, 462762306a36Sopenharmony_ci int action) 462862306a36Sopenharmony_ci{ 462962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 463062306a36Sopenharmony_ci 463162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 463262306a36Sopenharmony_ci spec->mute_led_polarity = 0; 463362306a36Sopenharmony_ci spec->mute_led_coef.idx = 0x34; 463462306a36Sopenharmony_ci spec->mute_led_coef.mask = 1 << 5; 463562306a36Sopenharmony_ci spec->mute_led_coef.on = 0; 463662306a36Sopenharmony_ci spec->mute_led_coef.off = 1 << 5; 463762306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set); 463862306a36Sopenharmony_ci } 463962306a36Sopenharmony_ci} 464062306a36Sopenharmony_ci 464162306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec, 464262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 464362306a36Sopenharmony_ci{ 464462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 464562306a36Sopenharmony_ci 464662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 464762306a36Sopenharmony_ci spec->mute_led_polarity = 0; 464862306a36Sopenharmony_ci spec->mute_led_coef.idx = 0x07; 464962306a36Sopenharmony_ci spec->mute_led_coef.mask = 1; 465062306a36Sopenharmony_ci spec->mute_led_coef.on = 1; 465162306a36Sopenharmony_ci spec->mute_led_coef.off = 0; 465262306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set); 465362306a36Sopenharmony_ci } 465462306a36Sopenharmony_ci} 465562306a36Sopenharmony_ci 465662306a36Sopenharmony_cistatic void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec, 465762306a36Sopenharmony_ci const struct hda_fixup *fix, 465862306a36Sopenharmony_ci int action) 465962306a36Sopenharmony_ci{ 466062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 466162306a36Sopenharmony_ci 466262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 466362306a36Sopenharmony_ci spec->mute_led_polarity = 0; 466462306a36Sopenharmony_ci spec->mute_led_coef.idx = 0x0b; 466562306a36Sopenharmony_ci spec->mute_led_coef.mask = 3 << 2; 466662306a36Sopenharmony_ci spec->mute_led_coef.on = 2 << 2; 466762306a36Sopenharmony_ci spec->mute_led_coef.off = 1 << 2; 466862306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set); 466962306a36Sopenharmony_ci } 467062306a36Sopenharmony_ci} 467162306a36Sopenharmony_ci 467262306a36Sopenharmony_ci/* turn on/off mic-mute LED per capture hook by coef bit */ 467362306a36Sopenharmony_cistatic int coef_micmute_led_set(struct led_classdev *led_cdev, 467462306a36Sopenharmony_ci enum led_brightness brightness) 467562306a36Sopenharmony_ci{ 467662306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 467762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 467862306a36Sopenharmony_ci 467962306a36Sopenharmony_ci alc_update_coef_led(codec, &spec->mic_led_coef, 468062306a36Sopenharmony_ci spec->micmute_led_polarity, brightness); 468162306a36Sopenharmony_ci return 0; 468262306a36Sopenharmony_ci} 468362306a36Sopenharmony_ci 468462306a36Sopenharmony_cistatic void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec, 468562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 468662306a36Sopenharmony_ci{ 468762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 468862306a36Sopenharmony_ci 468962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 469062306a36Sopenharmony_ci spec->mic_led_coef.idx = 0x19; 469162306a36Sopenharmony_ci spec->mic_led_coef.mask = 1 << 13; 469262306a36Sopenharmony_ci spec->mic_led_coef.on = 1 << 13; 469362306a36Sopenharmony_ci spec->mic_led_coef.off = 0; 469462306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set); 469562306a36Sopenharmony_ci } 469662306a36Sopenharmony_ci} 469762306a36Sopenharmony_ci 469862306a36Sopenharmony_cistatic void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec, 469962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 470062306a36Sopenharmony_ci{ 470162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 470262306a36Sopenharmony_ci 470362306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 470462306a36Sopenharmony_ci spec->micmute_led_polarity = 1; 470562306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0, 0x04); 470662306a36Sopenharmony_ci} 470762306a36Sopenharmony_ci 470862306a36Sopenharmony_cistatic void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec, 470962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 471062306a36Sopenharmony_ci{ 471162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 471262306a36Sopenharmony_ci 471362306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 471462306a36Sopenharmony_ci spec->mic_led_coef.idx = 0x35; 471562306a36Sopenharmony_ci spec->mic_led_coef.mask = 3 << 2; 471662306a36Sopenharmony_ci spec->mic_led_coef.on = 2 << 2; 471762306a36Sopenharmony_ci spec->mic_led_coef.off = 1 << 2; 471862306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set); 471962306a36Sopenharmony_ci } 472062306a36Sopenharmony_ci} 472162306a36Sopenharmony_ci 472262306a36Sopenharmony_cistatic void alc285_fixup_hp_mute_led(struct hda_codec *codec, 472362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 472462306a36Sopenharmony_ci{ 472562306a36Sopenharmony_ci alc285_fixup_hp_mute_led_coefbit(codec, fix, action); 472662306a36Sopenharmony_ci alc285_fixup_hp_coef_micmute_led(codec, fix, action); 472762306a36Sopenharmony_ci} 472862306a36Sopenharmony_ci 472962306a36Sopenharmony_cistatic void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec, 473062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 473162306a36Sopenharmony_ci{ 473262306a36Sopenharmony_ci alc285_fixup_hp_mute_led_coefbit(codec, fix, action); 473362306a36Sopenharmony_ci alc285_fixup_hp_gpio_micmute_led(codec, fix, action); 473462306a36Sopenharmony_ci} 473562306a36Sopenharmony_ci 473662306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led(struct hda_codec *codec, 473762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 473862306a36Sopenharmony_ci{ 473962306a36Sopenharmony_ci alc236_fixup_hp_mute_led_coefbit(codec, fix, action); 474062306a36Sopenharmony_ci alc236_fixup_hp_coef_micmute_led(codec, fix, action); 474162306a36Sopenharmony_ci} 474262306a36Sopenharmony_ci 474362306a36Sopenharmony_cistatic void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec, 474462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 474562306a36Sopenharmony_ci{ 474662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 474762306a36Sopenharmony_ci 474862306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 474962306a36Sopenharmony_ci spec->cap_mute_led_nid = 0x1a; 475062306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set); 475162306a36Sopenharmony_ci codec->power_filter = led_power_filter; 475262306a36Sopenharmony_ci } 475362306a36Sopenharmony_ci} 475462306a36Sopenharmony_ci 475562306a36Sopenharmony_cistatic void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec, 475662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 475762306a36Sopenharmony_ci{ 475862306a36Sopenharmony_ci alc236_fixup_hp_mute_led_coefbit(codec, fix, action); 475962306a36Sopenharmony_ci alc236_fixup_hp_micmute_led_vref(codec, fix, action); 476062306a36Sopenharmony_ci} 476162306a36Sopenharmony_ci 476262306a36Sopenharmony_cistatic inline void alc298_samsung_write_coef_pack(struct hda_codec *codec, 476362306a36Sopenharmony_ci const unsigned short coefs[2]) 476462306a36Sopenharmony_ci{ 476562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x23, coefs[0]); 476662306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x25, coefs[1]); 476762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x26, 0xb011); 476862306a36Sopenharmony_ci} 476962306a36Sopenharmony_ci 477062306a36Sopenharmony_cistruct alc298_samsung_amp_desc { 477162306a36Sopenharmony_ci unsigned char nid; 477262306a36Sopenharmony_ci unsigned short init_seq[2][2]; 477362306a36Sopenharmony_ci}; 477462306a36Sopenharmony_ci 477562306a36Sopenharmony_cistatic void alc298_fixup_samsung_amp(struct hda_codec *codec, 477662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 477762306a36Sopenharmony_ci{ 477862306a36Sopenharmony_ci int i, j; 477962306a36Sopenharmony_ci static const unsigned short init_seq[][2] = { 478062306a36Sopenharmony_ci { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 }, 478162306a36Sopenharmony_ci { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 }, 478262306a36Sopenharmony_ci { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e }, 478362306a36Sopenharmony_ci { 0x41, 0x07 }, { 0x400, 0x1 } 478462306a36Sopenharmony_ci }; 478562306a36Sopenharmony_ci static const struct alc298_samsung_amp_desc amps[] = { 478662306a36Sopenharmony_ci { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } }, 478762306a36Sopenharmony_ci { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } } 478862306a36Sopenharmony_ci }; 478962306a36Sopenharmony_ci 479062306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_INIT) 479162306a36Sopenharmony_ci return; 479262306a36Sopenharmony_ci 479362306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(amps); i++) { 479462306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x22, amps[i].nid); 479562306a36Sopenharmony_ci 479662306a36Sopenharmony_ci for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++) 479762306a36Sopenharmony_ci alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]); 479862306a36Sopenharmony_ci 479962306a36Sopenharmony_ci for (j = 0; j < ARRAY_SIZE(init_seq); j++) 480062306a36Sopenharmony_ci alc298_samsung_write_coef_pack(codec, init_seq[j]); 480162306a36Sopenharmony_ci } 480262306a36Sopenharmony_ci} 480362306a36Sopenharmony_ci 480462306a36Sopenharmony_ci#if IS_REACHABLE(CONFIG_INPUT) 480562306a36Sopenharmony_cistatic void gpio2_mic_hotkey_event(struct hda_codec *codec, 480662306a36Sopenharmony_ci struct hda_jack_callback *event) 480762306a36Sopenharmony_ci{ 480862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 480962306a36Sopenharmony_ci 481062306a36Sopenharmony_ci /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore 481162306a36Sopenharmony_ci send both key on and key off event for every interrupt. */ 481262306a36Sopenharmony_ci input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1); 481362306a36Sopenharmony_ci input_sync(spec->kb_dev); 481462306a36Sopenharmony_ci input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0); 481562306a36Sopenharmony_ci input_sync(spec->kb_dev); 481662306a36Sopenharmony_ci} 481762306a36Sopenharmony_ci 481862306a36Sopenharmony_cistatic int alc_register_micmute_input_device(struct hda_codec *codec) 481962306a36Sopenharmony_ci{ 482062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 482162306a36Sopenharmony_ci int i; 482262306a36Sopenharmony_ci 482362306a36Sopenharmony_ci spec->kb_dev = input_allocate_device(); 482462306a36Sopenharmony_ci if (!spec->kb_dev) { 482562306a36Sopenharmony_ci codec_err(codec, "Out of memory (input_allocate_device)\n"); 482662306a36Sopenharmony_ci return -ENOMEM; 482762306a36Sopenharmony_ci } 482862306a36Sopenharmony_ci 482962306a36Sopenharmony_ci spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE; 483062306a36Sopenharmony_ci 483162306a36Sopenharmony_ci spec->kb_dev->name = "Microphone Mute Button"; 483262306a36Sopenharmony_ci spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY); 483362306a36Sopenharmony_ci spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]); 483462306a36Sopenharmony_ci spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map); 483562306a36Sopenharmony_ci spec->kb_dev->keycode = spec->alc_mute_keycode_map; 483662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++) 483762306a36Sopenharmony_ci set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit); 483862306a36Sopenharmony_ci 483962306a36Sopenharmony_ci if (input_register_device(spec->kb_dev)) { 484062306a36Sopenharmony_ci codec_err(codec, "input_register_device failed\n"); 484162306a36Sopenharmony_ci input_free_device(spec->kb_dev); 484262306a36Sopenharmony_ci spec->kb_dev = NULL; 484362306a36Sopenharmony_ci return -ENOMEM; 484462306a36Sopenharmony_ci } 484562306a36Sopenharmony_ci 484662306a36Sopenharmony_ci return 0; 484762306a36Sopenharmony_ci} 484862306a36Sopenharmony_ci 484962306a36Sopenharmony_ci/* GPIO1 = set according to SKU external amp 485062306a36Sopenharmony_ci * GPIO2 = mic mute hotkey 485162306a36Sopenharmony_ci * GPIO3 = mute LED 485262306a36Sopenharmony_ci * GPIO4 = mic mute LED 485362306a36Sopenharmony_ci */ 485462306a36Sopenharmony_cistatic void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec, 485562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 485662306a36Sopenharmony_ci{ 485762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 485862306a36Sopenharmony_ci 485962306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10); 486062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 486162306a36Sopenharmony_ci spec->init_amp = ALC_INIT_DEFAULT; 486262306a36Sopenharmony_ci if (alc_register_micmute_input_device(codec) != 0) 486362306a36Sopenharmony_ci return; 486462306a36Sopenharmony_ci 486562306a36Sopenharmony_ci spec->gpio_mask |= 0x06; 486662306a36Sopenharmony_ci spec->gpio_dir |= 0x02; 486762306a36Sopenharmony_ci spec->gpio_data |= 0x02; 486862306a36Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 486962306a36Sopenharmony_ci AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04); 487062306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, codec->core.afg, 487162306a36Sopenharmony_ci gpio2_mic_hotkey_event); 487262306a36Sopenharmony_ci return; 487362306a36Sopenharmony_ci } 487462306a36Sopenharmony_ci 487562306a36Sopenharmony_ci if (!spec->kb_dev) 487662306a36Sopenharmony_ci return; 487762306a36Sopenharmony_ci 487862306a36Sopenharmony_ci switch (action) { 487962306a36Sopenharmony_ci case HDA_FIXUP_ACT_FREE: 488062306a36Sopenharmony_ci input_unregister_device(spec->kb_dev); 488162306a36Sopenharmony_ci spec->kb_dev = NULL; 488262306a36Sopenharmony_ci } 488362306a36Sopenharmony_ci} 488462306a36Sopenharmony_ci 488562306a36Sopenharmony_ci/* Line2 = mic mute hotkey 488662306a36Sopenharmony_ci * GPIO2 = mic mute LED 488762306a36Sopenharmony_ci */ 488862306a36Sopenharmony_cistatic void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec, 488962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 489062306a36Sopenharmony_ci{ 489162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 489262306a36Sopenharmony_ci 489362306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0, 0x04); 489462306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 489562306a36Sopenharmony_ci spec->init_amp = ALC_INIT_DEFAULT; 489662306a36Sopenharmony_ci if (alc_register_micmute_input_device(codec) != 0) 489762306a36Sopenharmony_ci return; 489862306a36Sopenharmony_ci 489962306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x1b, 490062306a36Sopenharmony_ci gpio2_mic_hotkey_event); 490162306a36Sopenharmony_ci return; 490262306a36Sopenharmony_ci } 490362306a36Sopenharmony_ci 490462306a36Sopenharmony_ci if (!spec->kb_dev) 490562306a36Sopenharmony_ci return; 490662306a36Sopenharmony_ci 490762306a36Sopenharmony_ci switch (action) { 490862306a36Sopenharmony_ci case HDA_FIXUP_ACT_FREE: 490962306a36Sopenharmony_ci input_unregister_device(spec->kb_dev); 491062306a36Sopenharmony_ci spec->kb_dev = NULL; 491162306a36Sopenharmony_ci } 491262306a36Sopenharmony_ci} 491362306a36Sopenharmony_ci#else /* INPUT */ 491462306a36Sopenharmony_ci#define alc280_fixup_hp_gpio2_mic_hotkey NULL 491562306a36Sopenharmony_ci#define alc233_fixup_lenovo_line2_mic_hotkey NULL 491662306a36Sopenharmony_ci#endif /* INPUT */ 491762306a36Sopenharmony_ci 491862306a36Sopenharmony_cistatic void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, 491962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 492062306a36Sopenharmony_ci{ 492162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 492262306a36Sopenharmony_ci 492362306a36Sopenharmony_ci alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a); 492462306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 492562306a36Sopenharmony_ci spec->cap_mute_led_nid = 0x18; 492662306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set); 492762306a36Sopenharmony_ci } 492862306a36Sopenharmony_ci} 492962306a36Sopenharmony_ci 493062306a36Sopenharmony_cistatic const struct coef_fw alc225_pre_hsmode[] = { 493162306a36Sopenharmony_ci UPDATE_COEF(0x4a, 1<<8, 0), 493262306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), 493362306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 3<<14), 493462306a36Sopenharmony_ci UPDATE_COEF(0x4a, 3<<4, 2<<4), 493562306a36Sopenharmony_ci UPDATE_COEF(0x4a, 3<<10, 3<<10), 493662306a36Sopenharmony_ci UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10), 493762306a36Sopenharmony_ci UPDATE_COEF(0x4a, 3<<10, 0), 493862306a36Sopenharmony_ci {} 493962306a36Sopenharmony_ci}; 494062306a36Sopenharmony_ci 494162306a36Sopenharmony_cistatic void alc_headset_mode_unplugged(struct hda_codec *codec) 494262306a36Sopenharmony_ci{ 494362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 494462306a36Sopenharmony_ci static const struct coef_fw coef0255[] = { 494562306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */ 494662306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */ 494762306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/ 494862306a36Sopenharmony_ci WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */ 494962306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */ 495062306a36Sopenharmony_ci {} 495162306a36Sopenharmony_ci }; 495262306a36Sopenharmony_ci static const struct coef_fw coef0256[] = { 495362306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */ 495462306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */ 495562306a36Sopenharmony_ci WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */ 495662306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */ 495762306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/ 495862306a36Sopenharmony_ci {} 495962306a36Sopenharmony_ci }; 496062306a36Sopenharmony_ci static const struct coef_fw coef0233[] = { 496162306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c0b), 496262306a36Sopenharmony_ci WRITE_COEF(0x45, 0xc429), 496362306a36Sopenharmony_ci UPDATE_COEF(0x35, 0x4000, 0), 496462306a36Sopenharmony_ci WRITE_COEF(0x06, 0x2104), 496562306a36Sopenharmony_ci WRITE_COEF(0x1a, 0x0001), 496662306a36Sopenharmony_ci WRITE_COEF(0x26, 0x0004), 496762306a36Sopenharmony_ci WRITE_COEF(0x32, 0x42a3), 496862306a36Sopenharmony_ci {} 496962306a36Sopenharmony_ci }; 497062306a36Sopenharmony_ci static const struct coef_fw coef0288[] = { 497162306a36Sopenharmony_ci UPDATE_COEF(0x4f, 0xfcc0, 0xc400), 497262306a36Sopenharmony_ci UPDATE_COEF(0x50, 0x2000, 0x2000), 497362306a36Sopenharmony_ci UPDATE_COEF(0x56, 0x0006, 0x0006), 497462306a36Sopenharmony_ci UPDATE_COEF(0x66, 0x0008, 0), 497562306a36Sopenharmony_ci UPDATE_COEF(0x67, 0x2000, 0), 497662306a36Sopenharmony_ci {} 497762306a36Sopenharmony_ci }; 497862306a36Sopenharmony_ci static const struct coef_fw coef0298[] = { 497962306a36Sopenharmony_ci UPDATE_COEF(0x19, 0x1300, 0x0300), 498062306a36Sopenharmony_ci {} 498162306a36Sopenharmony_ci }; 498262306a36Sopenharmony_ci static const struct coef_fw coef0292[] = { 498362306a36Sopenharmony_ci WRITE_COEF(0x76, 0x000e), 498462306a36Sopenharmony_ci WRITE_COEF(0x6c, 0x2400), 498562306a36Sopenharmony_ci WRITE_COEF(0x18, 0x7308), 498662306a36Sopenharmony_ci WRITE_COEF(0x6b, 0xc429), 498762306a36Sopenharmony_ci {} 498862306a36Sopenharmony_ci }; 498962306a36Sopenharmony_ci static const struct coef_fw coef0293[] = { 499062306a36Sopenharmony_ci UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */ 499162306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */ 499262306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */ 499362306a36Sopenharmony_ci UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */ 499462306a36Sopenharmony_ci WRITE_COEF(0x45, 0xc429), /* Set to TRS type */ 499562306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */ 499662306a36Sopenharmony_ci {} 499762306a36Sopenharmony_ci }; 499862306a36Sopenharmony_ci static const struct coef_fw coef0668[] = { 499962306a36Sopenharmony_ci WRITE_COEF(0x15, 0x0d40), 500062306a36Sopenharmony_ci WRITE_COEF(0xb7, 0x802b), 500162306a36Sopenharmony_ci {} 500262306a36Sopenharmony_ci }; 500362306a36Sopenharmony_ci static const struct coef_fw coef0225[] = { 500462306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 0), 500562306a36Sopenharmony_ci {} 500662306a36Sopenharmony_ci }; 500762306a36Sopenharmony_ci static const struct coef_fw coef0274[] = { 500862306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0100, 0), 500962306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 0x4000, 0), 501062306a36Sopenharmony_ci UPDATE_COEF(0x6b, 0xf000, 0x5000), 501162306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0010, 0), 501262306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0c00, 0x0c00), 501362306a36Sopenharmony_ci WRITE_COEF(0x45, 0x5289), 501462306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0c00, 0), 501562306a36Sopenharmony_ci {} 501662306a36Sopenharmony_ci }; 501762306a36Sopenharmony_ci 501862306a36Sopenharmony_ci if (spec->no_internal_mic_pin) { 501962306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 502062306a36Sopenharmony_ci return; 502162306a36Sopenharmony_ci } 502262306a36Sopenharmony_ci 502362306a36Sopenharmony_ci switch (codec->core.vendor_id) { 502462306a36Sopenharmony_ci case 0x10ec0255: 502562306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 502662306a36Sopenharmony_ci break; 502762306a36Sopenharmony_ci case 0x10ec0230: 502862306a36Sopenharmony_ci case 0x10ec0236: 502962306a36Sopenharmony_ci case 0x10ec0256: 503062306a36Sopenharmony_ci case 0x19e58326: 503162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0256); 503262306a36Sopenharmony_ci break; 503362306a36Sopenharmony_ci case 0x10ec0234: 503462306a36Sopenharmony_ci case 0x10ec0274: 503562306a36Sopenharmony_ci case 0x10ec0294: 503662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0274); 503762306a36Sopenharmony_ci break; 503862306a36Sopenharmony_ci case 0x10ec0233: 503962306a36Sopenharmony_ci case 0x10ec0283: 504062306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0233); 504162306a36Sopenharmony_ci break; 504262306a36Sopenharmony_ci case 0x10ec0286: 504362306a36Sopenharmony_ci case 0x10ec0288: 504462306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 504562306a36Sopenharmony_ci break; 504662306a36Sopenharmony_ci case 0x10ec0298: 504762306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0298); 504862306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 504962306a36Sopenharmony_ci break; 505062306a36Sopenharmony_ci case 0x10ec0292: 505162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0292); 505262306a36Sopenharmony_ci break; 505362306a36Sopenharmony_ci case 0x10ec0293: 505462306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0293); 505562306a36Sopenharmony_ci break; 505662306a36Sopenharmony_ci case 0x10ec0668: 505762306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0668); 505862306a36Sopenharmony_ci break; 505962306a36Sopenharmony_ci case 0x10ec0215: 506062306a36Sopenharmony_ci case 0x10ec0225: 506162306a36Sopenharmony_ci case 0x10ec0285: 506262306a36Sopenharmony_ci case 0x10ec0295: 506362306a36Sopenharmony_ci case 0x10ec0289: 506462306a36Sopenharmony_ci case 0x10ec0299: 506562306a36Sopenharmony_ci alc_process_coef_fw(codec, alc225_pre_hsmode); 506662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0225); 506762306a36Sopenharmony_ci break; 506862306a36Sopenharmony_ci case 0x10ec0867: 506962306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); 507062306a36Sopenharmony_ci break; 507162306a36Sopenharmony_ci } 507262306a36Sopenharmony_ci codec_dbg(codec, "Headset jack set to unplugged mode.\n"); 507362306a36Sopenharmony_ci} 507462306a36Sopenharmony_ci 507562306a36Sopenharmony_ci 507662306a36Sopenharmony_cistatic void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, 507762306a36Sopenharmony_ci hda_nid_t mic_pin) 507862306a36Sopenharmony_ci{ 507962306a36Sopenharmony_ci static const struct coef_fw coef0255[] = { 508062306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x8aa6), 508162306a36Sopenharmony_ci WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */ 508262306a36Sopenharmony_ci {} 508362306a36Sopenharmony_ci }; 508462306a36Sopenharmony_ci static const struct coef_fw coef0256[] = { 508562306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/ 508662306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x09a3), 508762306a36Sopenharmony_ci WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */ 508862306a36Sopenharmony_ci {} 508962306a36Sopenharmony_ci }; 509062306a36Sopenharmony_ci static const struct coef_fw coef0233[] = { 509162306a36Sopenharmony_ci UPDATE_COEF(0x35, 0, 1<<14), 509262306a36Sopenharmony_ci WRITE_COEF(0x06, 0x2100), 509362306a36Sopenharmony_ci WRITE_COEF(0x1a, 0x0021), 509462306a36Sopenharmony_ci WRITE_COEF(0x26, 0x008c), 509562306a36Sopenharmony_ci {} 509662306a36Sopenharmony_ci }; 509762306a36Sopenharmony_ci static const struct coef_fw coef0288[] = { 509862306a36Sopenharmony_ci UPDATE_COEF(0x4f, 0x00c0, 0), 509962306a36Sopenharmony_ci UPDATE_COEF(0x50, 0x2000, 0), 510062306a36Sopenharmony_ci UPDATE_COEF(0x56, 0x0006, 0), 510162306a36Sopenharmony_ci UPDATE_COEF(0x4f, 0xfcc0, 0xc400), 510262306a36Sopenharmony_ci UPDATE_COEF(0x66, 0x0008, 0x0008), 510362306a36Sopenharmony_ci UPDATE_COEF(0x67, 0x2000, 0x2000), 510462306a36Sopenharmony_ci {} 510562306a36Sopenharmony_ci }; 510662306a36Sopenharmony_ci static const struct coef_fw coef0292[] = { 510762306a36Sopenharmony_ci WRITE_COEF(0x19, 0xa208), 510862306a36Sopenharmony_ci WRITE_COEF(0x2e, 0xacf0), 510962306a36Sopenharmony_ci {} 511062306a36Sopenharmony_ci }; 511162306a36Sopenharmony_ci static const struct coef_fw coef0293[] = { 511262306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */ 511362306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */ 511462306a36Sopenharmony_ci UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */ 511562306a36Sopenharmony_ci {} 511662306a36Sopenharmony_ci }; 511762306a36Sopenharmony_ci static const struct coef_fw coef0688[] = { 511862306a36Sopenharmony_ci WRITE_COEF(0xb7, 0x802b), 511962306a36Sopenharmony_ci WRITE_COEF(0xb5, 0x1040), 512062306a36Sopenharmony_ci UPDATE_COEF(0xc3, 0, 1<<12), 512162306a36Sopenharmony_ci {} 512262306a36Sopenharmony_ci }; 512362306a36Sopenharmony_ci static const struct coef_fw coef0225[] = { 512462306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), 512562306a36Sopenharmony_ci UPDATE_COEF(0x4a, 3<<4, 2<<4), 512662306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 0), 512762306a36Sopenharmony_ci {} 512862306a36Sopenharmony_ci }; 512962306a36Sopenharmony_ci static const struct coef_fw coef0274[] = { 513062306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000), 513162306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0010, 0), 513262306a36Sopenharmony_ci UPDATE_COEF(0x6b, 0xf000, 0), 513362306a36Sopenharmony_ci {} 513462306a36Sopenharmony_ci }; 513562306a36Sopenharmony_ci 513662306a36Sopenharmony_ci switch (codec->core.vendor_id) { 513762306a36Sopenharmony_ci case 0x10ec0255: 513862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xc489); 513962306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 514062306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 514162306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 514262306a36Sopenharmony_ci break; 514362306a36Sopenharmony_ci case 0x10ec0230: 514462306a36Sopenharmony_ci case 0x10ec0236: 514562306a36Sopenharmony_ci case 0x10ec0256: 514662306a36Sopenharmony_ci case 0x19e58326: 514762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xc489); 514862306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 514962306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0256); 515062306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 515162306a36Sopenharmony_ci break; 515262306a36Sopenharmony_ci case 0x10ec0234: 515362306a36Sopenharmony_ci case 0x10ec0274: 515462306a36Sopenharmony_ci case 0x10ec0294: 515562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0x4689); 515662306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 515762306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0274); 515862306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 515962306a36Sopenharmony_ci break; 516062306a36Sopenharmony_ci case 0x10ec0233: 516162306a36Sopenharmony_ci case 0x10ec0283: 516262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xc429); 516362306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 516462306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0233); 516562306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 516662306a36Sopenharmony_ci break; 516762306a36Sopenharmony_ci case 0x10ec0286: 516862306a36Sopenharmony_ci case 0x10ec0288: 516962306a36Sopenharmony_ci case 0x10ec0298: 517062306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 517162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 517262306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 517362306a36Sopenharmony_ci break; 517462306a36Sopenharmony_ci case 0x10ec0292: 517562306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 517662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0292); 517762306a36Sopenharmony_ci break; 517862306a36Sopenharmony_ci case 0x10ec0293: 517962306a36Sopenharmony_ci /* Set to TRS mode */ 518062306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xc429); 518162306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 518262306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0293); 518362306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 518462306a36Sopenharmony_ci break; 518562306a36Sopenharmony_ci case 0x10ec0867: 518662306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14); 518762306a36Sopenharmony_ci fallthrough; 518862306a36Sopenharmony_ci case 0x10ec0221: 518962306a36Sopenharmony_ci case 0x10ec0662: 519062306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 519162306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 519262306a36Sopenharmony_ci break; 519362306a36Sopenharmony_ci case 0x10ec0668: 519462306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x11, 0x0001); 519562306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 519662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0688); 519762306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 519862306a36Sopenharmony_ci break; 519962306a36Sopenharmony_ci case 0x10ec0215: 520062306a36Sopenharmony_ci case 0x10ec0225: 520162306a36Sopenharmony_ci case 0x10ec0285: 520262306a36Sopenharmony_ci case 0x10ec0295: 520362306a36Sopenharmony_ci case 0x10ec0289: 520462306a36Sopenharmony_ci case 0x10ec0299: 520562306a36Sopenharmony_ci alc_process_coef_fw(codec, alc225_pre_hsmode); 520662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10); 520762306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); 520862306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0225); 520962306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 521062306a36Sopenharmony_ci break; 521162306a36Sopenharmony_ci } 521262306a36Sopenharmony_ci codec_dbg(codec, "Headset jack set to mic-in mode.\n"); 521362306a36Sopenharmony_ci} 521462306a36Sopenharmony_ci 521562306a36Sopenharmony_cistatic void alc_headset_mode_default(struct hda_codec *codec) 521662306a36Sopenharmony_ci{ 521762306a36Sopenharmony_ci static const struct coef_fw coef0225[] = { 521862306a36Sopenharmony_ci UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10), 521962306a36Sopenharmony_ci UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10), 522062306a36Sopenharmony_ci UPDATE_COEF(0x49, 3<<8, 0<<8), 522162306a36Sopenharmony_ci UPDATE_COEF(0x4a, 3<<4, 3<<4), 522262306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 0), 522362306a36Sopenharmony_ci UPDATE_COEF(0x67, 0xf000, 0x3000), 522462306a36Sopenharmony_ci {} 522562306a36Sopenharmony_ci }; 522662306a36Sopenharmony_ci static const struct coef_fw coef0255[] = { 522762306a36Sopenharmony_ci WRITE_COEF(0x45, 0xc089), 522862306a36Sopenharmony_ci WRITE_COEF(0x45, 0xc489), 522962306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x8ea6), 523062306a36Sopenharmony_ci WRITE_COEF(0x49, 0x0049), 523162306a36Sopenharmony_ci {} 523262306a36Sopenharmony_ci }; 523362306a36Sopenharmony_ci static const struct coef_fw coef0256[] = { 523462306a36Sopenharmony_ci WRITE_COEF(0x45, 0xc489), 523562306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x0da3), 523662306a36Sopenharmony_ci WRITE_COEF(0x49, 0x0049), 523762306a36Sopenharmony_ci UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/ 523862306a36Sopenharmony_ci WRITE_COEF(0x06, 0x6100), 523962306a36Sopenharmony_ci {} 524062306a36Sopenharmony_ci }; 524162306a36Sopenharmony_ci static const struct coef_fw coef0233[] = { 524262306a36Sopenharmony_ci WRITE_COEF(0x06, 0x2100), 524362306a36Sopenharmony_ci WRITE_COEF(0x32, 0x4ea3), 524462306a36Sopenharmony_ci {} 524562306a36Sopenharmony_ci }; 524662306a36Sopenharmony_ci static const struct coef_fw coef0288[] = { 524762306a36Sopenharmony_ci UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */ 524862306a36Sopenharmony_ci UPDATE_COEF(0x50, 0x2000, 0x2000), 524962306a36Sopenharmony_ci UPDATE_COEF(0x56, 0x0006, 0x0006), 525062306a36Sopenharmony_ci UPDATE_COEF(0x66, 0x0008, 0), 525162306a36Sopenharmony_ci UPDATE_COEF(0x67, 0x2000, 0), 525262306a36Sopenharmony_ci {} 525362306a36Sopenharmony_ci }; 525462306a36Sopenharmony_ci static const struct coef_fw coef0292[] = { 525562306a36Sopenharmony_ci WRITE_COEF(0x76, 0x000e), 525662306a36Sopenharmony_ci WRITE_COEF(0x6c, 0x2400), 525762306a36Sopenharmony_ci WRITE_COEF(0x6b, 0xc429), 525862306a36Sopenharmony_ci WRITE_COEF(0x18, 0x7308), 525962306a36Sopenharmony_ci {} 526062306a36Sopenharmony_ci }; 526162306a36Sopenharmony_ci static const struct coef_fw coef0293[] = { 526262306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */ 526362306a36Sopenharmony_ci WRITE_COEF(0x45, 0xC429), /* Set to TRS type */ 526462306a36Sopenharmony_ci UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */ 526562306a36Sopenharmony_ci {} 526662306a36Sopenharmony_ci }; 526762306a36Sopenharmony_ci static const struct coef_fw coef0688[] = { 526862306a36Sopenharmony_ci WRITE_COEF(0x11, 0x0041), 526962306a36Sopenharmony_ci WRITE_COEF(0x15, 0x0d40), 527062306a36Sopenharmony_ci WRITE_COEF(0xb7, 0x802b), 527162306a36Sopenharmony_ci {} 527262306a36Sopenharmony_ci }; 527362306a36Sopenharmony_ci static const struct coef_fw coef0274[] = { 527462306a36Sopenharmony_ci WRITE_COEF(0x45, 0x4289), 527562306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0010, 0x0010), 527662306a36Sopenharmony_ci UPDATE_COEF(0x6b, 0x0f00, 0), 527762306a36Sopenharmony_ci UPDATE_COEF(0x49, 0x0300, 0x0300), 527862306a36Sopenharmony_ci {} 527962306a36Sopenharmony_ci }; 528062306a36Sopenharmony_ci 528162306a36Sopenharmony_ci switch (codec->core.vendor_id) { 528262306a36Sopenharmony_ci case 0x10ec0215: 528362306a36Sopenharmony_ci case 0x10ec0225: 528462306a36Sopenharmony_ci case 0x10ec0285: 528562306a36Sopenharmony_ci case 0x10ec0295: 528662306a36Sopenharmony_ci case 0x10ec0289: 528762306a36Sopenharmony_ci case 0x10ec0299: 528862306a36Sopenharmony_ci alc_process_coef_fw(codec, alc225_pre_hsmode); 528962306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0225); 529062306a36Sopenharmony_ci break; 529162306a36Sopenharmony_ci case 0x10ec0255: 529262306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 529362306a36Sopenharmony_ci break; 529462306a36Sopenharmony_ci case 0x10ec0230: 529562306a36Sopenharmony_ci case 0x10ec0236: 529662306a36Sopenharmony_ci case 0x10ec0256: 529762306a36Sopenharmony_ci case 0x19e58326: 529862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x1b, 0x0e4b); 529962306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xc089); 530062306a36Sopenharmony_ci msleep(50); 530162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0256); 530262306a36Sopenharmony_ci break; 530362306a36Sopenharmony_ci case 0x10ec0234: 530462306a36Sopenharmony_ci case 0x10ec0274: 530562306a36Sopenharmony_ci case 0x10ec0294: 530662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0274); 530762306a36Sopenharmony_ci break; 530862306a36Sopenharmony_ci case 0x10ec0233: 530962306a36Sopenharmony_ci case 0x10ec0283: 531062306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0233); 531162306a36Sopenharmony_ci break; 531262306a36Sopenharmony_ci case 0x10ec0286: 531362306a36Sopenharmony_ci case 0x10ec0288: 531462306a36Sopenharmony_ci case 0x10ec0298: 531562306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 531662306a36Sopenharmony_ci break; 531762306a36Sopenharmony_ci case 0x10ec0292: 531862306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0292); 531962306a36Sopenharmony_ci break; 532062306a36Sopenharmony_ci case 0x10ec0293: 532162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0293); 532262306a36Sopenharmony_ci break; 532362306a36Sopenharmony_ci case 0x10ec0668: 532462306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0688); 532562306a36Sopenharmony_ci break; 532662306a36Sopenharmony_ci case 0x10ec0867: 532762306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); 532862306a36Sopenharmony_ci break; 532962306a36Sopenharmony_ci } 533062306a36Sopenharmony_ci codec_dbg(codec, "Headset jack set to headphone (default) mode.\n"); 533162306a36Sopenharmony_ci} 533262306a36Sopenharmony_ci 533362306a36Sopenharmony_ci/* Iphone type */ 533462306a36Sopenharmony_cistatic void alc_headset_mode_ctia(struct hda_codec *codec) 533562306a36Sopenharmony_ci{ 533662306a36Sopenharmony_ci int val; 533762306a36Sopenharmony_ci 533862306a36Sopenharmony_ci static const struct coef_fw coef0255[] = { 533962306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */ 534062306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c2b), 534162306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x8ea6), 534262306a36Sopenharmony_ci {} 534362306a36Sopenharmony_ci }; 534462306a36Sopenharmony_ci static const struct coef_fw coef0256[] = { 534562306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */ 534662306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0e6b), 534762306a36Sopenharmony_ci {} 534862306a36Sopenharmony_ci }; 534962306a36Sopenharmony_ci static const struct coef_fw coef0233[] = { 535062306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd429), 535162306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c2b), 535262306a36Sopenharmony_ci WRITE_COEF(0x32, 0x4ea3), 535362306a36Sopenharmony_ci {} 535462306a36Sopenharmony_ci }; 535562306a36Sopenharmony_ci static const struct coef_fw coef0288[] = { 535662306a36Sopenharmony_ci UPDATE_COEF(0x50, 0x2000, 0x2000), 535762306a36Sopenharmony_ci UPDATE_COEF(0x56, 0x0006, 0x0006), 535862306a36Sopenharmony_ci UPDATE_COEF(0x66, 0x0008, 0), 535962306a36Sopenharmony_ci UPDATE_COEF(0x67, 0x2000, 0), 536062306a36Sopenharmony_ci {} 536162306a36Sopenharmony_ci }; 536262306a36Sopenharmony_ci static const struct coef_fw coef0292[] = { 536362306a36Sopenharmony_ci WRITE_COEF(0x6b, 0xd429), 536462306a36Sopenharmony_ci WRITE_COEF(0x76, 0x0008), 536562306a36Sopenharmony_ci WRITE_COEF(0x18, 0x7388), 536662306a36Sopenharmony_ci {} 536762306a36Sopenharmony_ci }; 536862306a36Sopenharmony_ci static const struct coef_fw coef0293[] = { 536962306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd429), /* Set to ctia type */ 537062306a36Sopenharmony_ci UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */ 537162306a36Sopenharmony_ci {} 537262306a36Sopenharmony_ci }; 537362306a36Sopenharmony_ci static const struct coef_fw coef0688[] = { 537462306a36Sopenharmony_ci WRITE_COEF(0x11, 0x0001), 537562306a36Sopenharmony_ci WRITE_COEF(0x15, 0x0d60), 537662306a36Sopenharmony_ci WRITE_COEF(0xc3, 0x0000), 537762306a36Sopenharmony_ci {} 537862306a36Sopenharmony_ci }; 537962306a36Sopenharmony_ci static const struct coef_fw coef0225_1[] = { 538062306a36Sopenharmony_ci UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10), 538162306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 2<<14), 538262306a36Sopenharmony_ci {} 538362306a36Sopenharmony_ci }; 538462306a36Sopenharmony_ci static const struct coef_fw coef0225_2[] = { 538562306a36Sopenharmony_ci UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10), 538662306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 1<<14), 538762306a36Sopenharmony_ci {} 538862306a36Sopenharmony_ci }; 538962306a36Sopenharmony_ci 539062306a36Sopenharmony_ci switch (codec->core.vendor_id) { 539162306a36Sopenharmony_ci case 0x10ec0255: 539262306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 539362306a36Sopenharmony_ci break; 539462306a36Sopenharmony_ci case 0x10ec0230: 539562306a36Sopenharmony_ci case 0x10ec0236: 539662306a36Sopenharmony_ci case 0x10ec0256: 539762306a36Sopenharmony_ci case 0x19e58326: 539862306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0256); 539962306a36Sopenharmony_ci break; 540062306a36Sopenharmony_ci case 0x10ec0234: 540162306a36Sopenharmony_ci case 0x10ec0274: 540262306a36Sopenharmony_ci case 0x10ec0294: 540362306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xd689); 540462306a36Sopenharmony_ci break; 540562306a36Sopenharmony_ci case 0x10ec0233: 540662306a36Sopenharmony_ci case 0x10ec0283: 540762306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0233); 540862306a36Sopenharmony_ci break; 540962306a36Sopenharmony_ci case 0x10ec0298: 541062306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x50); 541162306a36Sopenharmony_ci if (val & (1 << 12)) { 541262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020); 541362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400); 541462306a36Sopenharmony_ci msleep(300); 541562306a36Sopenharmony_ci } else { 541662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010); 541762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400); 541862306a36Sopenharmony_ci msleep(300); 541962306a36Sopenharmony_ci } 542062306a36Sopenharmony_ci break; 542162306a36Sopenharmony_ci case 0x10ec0286: 542262306a36Sopenharmony_ci case 0x10ec0288: 542362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400); 542462306a36Sopenharmony_ci msleep(300); 542562306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 542662306a36Sopenharmony_ci break; 542762306a36Sopenharmony_ci case 0x10ec0292: 542862306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0292); 542962306a36Sopenharmony_ci break; 543062306a36Sopenharmony_ci case 0x10ec0293: 543162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0293); 543262306a36Sopenharmony_ci break; 543362306a36Sopenharmony_ci case 0x10ec0668: 543462306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0688); 543562306a36Sopenharmony_ci break; 543662306a36Sopenharmony_ci case 0x10ec0215: 543762306a36Sopenharmony_ci case 0x10ec0225: 543862306a36Sopenharmony_ci case 0x10ec0285: 543962306a36Sopenharmony_ci case 0x10ec0295: 544062306a36Sopenharmony_ci case 0x10ec0289: 544162306a36Sopenharmony_ci case 0x10ec0299: 544262306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x45); 544362306a36Sopenharmony_ci if (val & (1 << 9)) 544462306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0225_2); 544562306a36Sopenharmony_ci else 544662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0225_1); 544762306a36Sopenharmony_ci break; 544862306a36Sopenharmony_ci case 0x10ec0867: 544962306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); 545062306a36Sopenharmony_ci break; 545162306a36Sopenharmony_ci } 545262306a36Sopenharmony_ci codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n"); 545362306a36Sopenharmony_ci} 545462306a36Sopenharmony_ci 545562306a36Sopenharmony_ci/* Nokia type */ 545662306a36Sopenharmony_cistatic void alc_headset_mode_omtp(struct hda_codec *codec) 545762306a36Sopenharmony_ci{ 545862306a36Sopenharmony_ci static const struct coef_fw coef0255[] = { 545962306a36Sopenharmony_ci WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */ 546062306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c2b), 546162306a36Sopenharmony_ci WRITE_COEFEX(0x57, 0x03, 0x8ea6), 546262306a36Sopenharmony_ci {} 546362306a36Sopenharmony_ci }; 546462306a36Sopenharmony_ci static const struct coef_fw coef0256[] = { 546562306a36Sopenharmony_ci WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */ 546662306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0e6b), 546762306a36Sopenharmony_ci {} 546862306a36Sopenharmony_ci }; 546962306a36Sopenharmony_ci static const struct coef_fw coef0233[] = { 547062306a36Sopenharmony_ci WRITE_COEF(0x45, 0xe429), 547162306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c2b), 547262306a36Sopenharmony_ci WRITE_COEF(0x32, 0x4ea3), 547362306a36Sopenharmony_ci {} 547462306a36Sopenharmony_ci }; 547562306a36Sopenharmony_ci static const struct coef_fw coef0288[] = { 547662306a36Sopenharmony_ci UPDATE_COEF(0x50, 0x2000, 0x2000), 547762306a36Sopenharmony_ci UPDATE_COEF(0x56, 0x0006, 0x0006), 547862306a36Sopenharmony_ci UPDATE_COEF(0x66, 0x0008, 0), 547962306a36Sopenharmony_ci UPDATE_COEF(0x67, 0x2000, 0), 548062306a36Sopenharmony_ci {} 548162306a36Sopenharmony_ci }; 548262306a36Sopenharmony_ci static const struct coef_fw coef0292[] = { 548362306a36Sopenharmony_ci WRITE_COEF(0x6b, 0xe429), 548462306a36Sopenharmony_ci WRITE_COEF(0x76, 0x0008), 548562306a36Sopenharmony_ci WRITE_COEF(0x18, 0x7388), 548662306a36Sopenharmony_ci {} 548762306a36Sopenharmony_ci }; 548862306a36Sopenharmony_ci static const struct coef_fw coef0293[] = { 548962306a36Sopenharmony_ci WRITE_COEF(0x45, 0xe429), /* Set to omtp type */ 549062306a36Sopenharmony_ci UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */ 549162306a36Sopenharmony_ci {} 549262306a36Sopenharmony_ci }; 549362306a36Sopenharmony_ci static const struct coef_fw coef0688[] = { 549462306a36Sopenharmony_ci WRITE_COEF(0x11, 0x0001), 549562306a36Sopenharmony_ci WRITE_COEF(0x15, 0x0d50), 549662306a36Sopenharmony_ci WRITE_COEF(0xc3, 0x0000), 549762306a36Sopenharmony_ci {} 549862306a36Sopenharmony_ci }; 549962306a36Sopenharmony_ci static const struct coef_fw coef0225[] = { 550062306a36Sopenharmony_ci UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10), 550162306a36Sopenharmony_ci UPDATE_COEF(0x63, 3<<14, 2<<14), 550262306a36Sopenharmony_ci {} 550362306a36Sopenharmony_ci }; 550462306a36Sopenharmony_ci 550562306a36Sopenharmony_ci switch (codec->core.vendor_id) { 550662306a36Sopenharmony_ci case 0x10ec0255: 550762306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 550862306a36Sopenharmony_ci break; 550962306a36Sopenharmony_ci case 0x10ec0230: 551062306a36Sopenharmony_ci case 0x10ec0236: 551162306a36Sopenharmony_ci case 0x10ec0256: 551262306a36Sopenharmony_ci case 0x19e58326: 551362306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0256); 551462306a36Sopenharmony_ci break; 551562306a36Sopenharmony_ci case 0x10ec0234: 551662306a36Sopenharmony_ci case 0x10ec0274: 551762306a36Sopenharmony_ci case 0x10ec0294: 551862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xe689); 551962306a36Sopenharmony_ci break; 552062306a36Sopenharmony_ci case 0x10ec0233: 552162306a36Sopenharmony_ci case 0x10ec0283: 552262306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0233); 552362306a36Sopenharmony_ci break; 552462306a36Sopenharmony_ci case 0x10ec0298: 552562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */ 552662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400); 552762306a36Sopenharmony_ci msleep(300); 552862306a36Sopenharmony_ci break; 552962306a36Sopenharmony_ci case 0x10ec0286: 553062306a36Sopenharmony_ci case 0x10ec0288: 553162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400); 553262306a36Sopenharmony_ci msleep(300); 553362306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 553462306a36Sopenharmony_ci break; 553562306a36Sopenharmony_ci case 0x10ec0292: 553662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0292); 553762306a36Sopenharmony_ci break; 553862306a36Sopenharmony_ci case 0x10ec0293: 553962306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0293); 554062306a36Sopenharmony_ci break; 554162306a36Sopenharmony_ci case 0x10ec0668: 554262306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0688); 554362306a36Sopenharmony_ci break; 554462306a36Sopenharmony_ci case 0x10ec0215: 554562306a36Sopenharmony_ci case 0x10ec0225: 554662306a36Sopenharmony_ci case 0x10ec0285: 554762306a36Sopenharmony_ci case 0x10ec0295: 554862306a36Sopenharmony_ci case 0x10ec0289: 554962306a36Sopenharmony_ci case 0x10ec0299: 555062306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0225); 555162306a36Sopenharmony_ci break; 555262306a36Sopenharmony_ci } 555362306a36Sopenharmony_ci codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n"); 555462306a36Sopenharmony_ci} 555562306a36Sopenharmony_ci 555662306a36Sopenharmony_cistatic void alc_determine_headset_type(struct hda_codec *codec) 555762306a36Sopenharmony_ci{ 555862306a36Sopenharmony_ci int val; 555962306a36Sopenharmony_ci bool is_ctia = false; 556062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 556162306a36Sopenharmony_ci static const struct coef_fw coef0255[] = { 556262306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/ 556362306a36Sopenharmony_ci WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref 556462306a36Sopenharmony_ci conteol) */ 556562306a36Sopenharmony_ci {} 556662306a36Sopenharmony_ci }; 556762306a36Sopenharmony_ci static const struct coef_fw coef0288[] = { 556862306a36Sopenharmony_ci UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */ 556962306a36Sopenharmony_ci {} 557062306a36Sopenharmony_ci }; 557162306a36Sopenharmony_ci static const struct coef_fw coef0298[] = { 557262306a36Sopenharmony_ci UPDATE_COEF(0x50, 0x2000, 0x2000), 557362306a36Sopenharmony_ci UPDATE_COEF(0x56, 0x0006, 0x0006), 557462306a36Sopenharmony_ci UPDATE_COEF(0x66, 0x0008, 0), 557562306a36Sopenharmony_ci UPDATE_COEF(0x67, 0x2000, 0), 557662306a36Sopenharmony_ci UPDATE_COEF(0x19, 0x1300, 0x1300), 557762306a36Sopenharmony_ci {} 557862306a36Sopenharmony_ci }; 557962306a36Sopenharmony_ci static const struct coef_fw coef0293[] = { 558062306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */ 558162306a36Sopenharmony_ci WRITE_COEF(0x45, 0xD429), /* Set to ctia type */ 558262306a36Sopenharmony_ci {} 558362306a36Sopenharmony_ci }; 558462306a36Sopenharmony_ci static const struct coef_fw coef0688[] = { 558562306a36Sopenharmony_ci WRITE_COEF(0x11, 0x0001), 558662306a36Sopenharmony_ci WRITE_COEF(0xb7, 0x802b), 558762306a36Sopenharmony_ci WRITE_COEF(0x15, 0x0d60), 558862306a36Sopenharmony_ci WRITE_COEF(0xc3, 0x0c00), 558962306a36Sopenharmony_ci {} 559062306a36Sopenharmony_ci }; 559162306a36Sopenharmony_ci static const struct coef_fw coef0274[] = { 559262306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x0010, 0), 559362306a36Sopenharmony_ci UPDATE_COEF(0x4a, 0x8000, 0), 559462306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd289), 559562306a36Sopenharmony_ci UPDATE_COEF(0x49, 0x0300, 0x0300), 559662306a36Sopenharmony_ci {} 559762306a36Sopenharmony_ci }; 559862306a36Sopenharmony_ci 559962306a36Sopenharmony_ci if (spec->no_internal_mic_pin) { 560062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 560162306a36Sopenharmony_ci return; 560262306a36Sopenharmony_ci } 560362306a36Sopenharmony_ci 560462306a36Sopenharmony_ci switch (codec->core.vendor_id) { 560562306a36Sopenharmony_ci case 0x10ec0255: 560662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 560762306a36Sopenharmony_ci msleep(300); 560862306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 560962306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 561062306a36Sopenharmony_ci break; 561162306a36Sopenharmony_ci case 0x10ec0230: 561262306a36Sopenharmony_ci case 0x10ec0236: 561362306a36Sopenharmony_ci case 0x10ec0256: 561462306a36Sopenharmony_ci case 0x19e58326: 561562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x1b, 0x0e4b); 561662306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x06, 0x6104); 561762306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3); 561862306a36Sopenharmony_ci 561962306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 562062306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 562162306a36Sopenharmony_ci msleep(80); 562262306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 562362306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 562462306a36Sopenharmony_ci 562562306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0255); 562662306a36Sopenharmony_ci msleep(300); 562762306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 562862306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 562962306a36Sopenharmony_ci 563062306a36Sopenharmony_ci alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3); 563162306a36Sopenharmony_ci alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); 563262306a36Sopenharmony_ci 563362306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 563462306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 563562306a36Sopenharmony_ci msleep(80); 563662306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 563762306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE); 563862306a36Sopenharmony_ci break; 563962306a36Sopenharmony_ci case 0x10ec0234: 564062306a36Sopenharmony_ci case 0x10ec0274: 564162306a36Sopenharmony_ci case 0x10ec0294: 564262306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0274); 564362306a36Sopenharmony_ci msleep(850); 564462306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 564562306a36Sopenharmony_ci is_ctia = (val & 0x00f0) == 0x00f0; 564662306a36Sopenharmony_ci break; 564762306a36Sopenharmony_ci case 0x10ec0233: 564862306a36Sopenharmony_ci case 0x10ec0283: 564962306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x45, 0xd029); 565062306a36Sopenharmony_ci msleep(300); 565162306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 565262306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 565362306a36Sopenharmony_ci break; 565462306a36Sopenharmony_ci case 0x10ec0298: 565562306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 565662306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 565762306a36Sopenharmony_ci msleep(100); 565862306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 565962306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 566062306a36Sopenharmony_ci msleep(200); 566162306a36Sopenharmony_ci 566262306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x50); 566362306a36Sopenharmony_ci if (val & (1 << 12)) { 566462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020); 566562306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 566662306a36Sopenharmony_ci msleep(350); 566762306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x50); 566862306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 566962306a36Sopenharmony_ci } else { 567062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010); 567162306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 567262306a36Sopenharmony_ci msleep(350); 567362306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x50); 567462306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 567562306a36Sopenharmony_ci } 567662306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0298); 567762306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 567862306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP); 567962306a36Sopenharmony_ci msleep(75); 568062306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 568162306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE); 568262306a36Sopenharmony_ci break; 568362306a36Sopenharmony_ci case 0x10ec0286: 568462306a36Sopenharmony_ci case 0x10ec0288: 568562306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0288); 568662306a36Sopenharmony_ci msleep(350); 568762306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x50); 568862306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 568962306a36Sopenharmony_ci break; 569062306a36Sopenharmony_ci case 0x10ec0292: 569162306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x6b, 0xd429); 569262306a36Sopenharmony_ci msleep(300); 569362306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x6c); 569462306a36Sopenharmony_ci is_ctia = (val & 0x001c) == 0x001c; 569562306a36Sopenharmony_ci break; 569662306a36Sopenharmony_ci case 0x10ec0293: 569762306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0293); 569862306a36Sopenharmony_ci msleep(300); 569962306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 570062306a36Sopenharmony_ci is_ctia = (val & 0x0070) == 0x0070; 570162306a36Sopenharmony_ci break; 570262306a36Sopenharmony_ci case 0x10ec0668: 570362306a36Sopenharmony_ci alc_process_coef_fw(codec, coef0688); 570462306a36Sopenharmony_ci msleep(300); 570562306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0xbe); 570662306a36Sopenharmony_ci is_ctia = (val & 0x1c02) == 0x1c02; 570762306a36Sopenharmony_ci break; 570862306a36Sopenharmony_ci case 0x10ec0215: 570962306a36Sopenharmony_ci case 0x10ec0225: 571062306a36Sopenharmony_ci case 0x10ec0285: 571162306a36Sopenharmony_ci case 0x10ec0295: 571262306a36Sopenharmony_ci case 0x10ec0289: 571362306a36Sopenharmony_ci case 0x10ec0299: 571462306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 571562306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 571662306a36Sopenharmony_ci msleep(80); 571762306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 571862306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); 571962306a36Sopenharmony_ci 572062306a36Sopenharmony_ci alc_process_coef_fw(codec, alc225_pre_hsmode); 572162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000); 572262306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x45); 572362306a36Sopenharmony_ci if (val & (1 << 9)) { 572462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10); 572562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8); 572662306a36Sopenharmony_ci msleep(800); 572762306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 572862306a36Sopenharmony_ci is_ctia = (val & 0x00f0) == 0x00f0; 572962306a36Sopenharmony_ci } else { 573062306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10); 573162306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8); 573262306a36Sopenharmony_ci msleep(800); 573362306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x46); 573462306a36Sopenharmony_ci is_ctia = (val & 0x00f0) == 0x00f0; 573562306a36Sopenharmony_ci } 573662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6); 573762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4); 573862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000); 573962306a36Sopenharmony_ci 574062306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 574162306a36Sopenharmony_ci AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 574262306a36Sopenharmony_ci msleep(80); 574362306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x21, 0, 574462306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE); 574562306a36Sopenharmony_ci break; 574662306a36Sopenharmony_ci case 0x10ec0867: 574762306a36Sopenharmony_ci is_ctia = true; 574862306a36Sopenharmony_ci break; 574962306a36Sopenharmony_ci } 575062306a36Sopenharmony_ci 575162306a36Sopenharmony_ci codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n", 575262306a36Sopenharmony_ci is_ctia ? "yes" : "no"); 575362306a36Sopenharmony_ci spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP; 575462306a36Sopenharmony_ci} 575562306a36Sopenharmony_ci 575662306a36Sopenharmony_cistatic void alc_update_headset_mode(struct hda_codec *codec) 575762306a36Sopenharmony_ci{ 575862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 575962306a36Sopenharmony_ci 576062306a36Sopenharmony_ci hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]]; 576162306a36Sopenharmony_ci hda_nid_t hp_pin = alc_get_hp_pin(spec); 576262306a36Sopenharmony_ci 576362306a36Sopenharmony_ci int new_headset_mode; 576462306a36Sopenharmony_ci 576562306a36Sopenharmony_ci if (!snd_hda_jack_detect(codec, hp_pin)) 576662306a36Sopenharmony_ci new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED; 576762306a36Sopenharmony_ci else if (mux_pin == spec->headset_mic_pin) 576862306a36Sopenharmony_ci new_headset_mode = ALC_HEADSET_MODE_HEADSET; 576962306a36Sopenharmony_ci else if (mux_pin == spec->headphone_mic_pin) 577062306a36Sopenharmony_ci new_headset_mode = ALC_HEADSET_MODE_MIC; 577162306a36Sopenharmony_ci else 577262306a36Sopenharmony_ci new_headset_mode = ALC_HEADSET_MODE_HEADPHONE; 577362306a36Sopenharmony_ci 577462306a36Sopenharmony_ci if (new_headset_mode == spec->current_headset_mode) { 577562306a36Sopenharmony_ci snd_hda_gen_update_outputs(codec); 577662306a36Sopenharmony_ci return; 577762306a36Sopenharmony_ci } 577862306a36Sopenharmony_ci 577962306a36Sopenharmony_ci switch (new_headset_mode) { 578062306a36Sopenharmony_ci case ALC_HEADSET_MODE_UNPLUGGED: 578162306a36Sopenharmony_ci alc_headset_mode_unplugged(codec); 578262306a36Sopenharmony_ci spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN; 578362306a36Sopenharmony_ci spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; 578462306a36Sopenharmony_ci spec->gen.hp_jack_present = false; 578562306a36Sopenharmony_ci break; 578662306a36Sopenharmony_ci case ALC_HEADSET_MODE_HEADSET: 578762306a36Sopenharmony_ci if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN) 578862306a36Sopenharmony_ci alc_determine_headset_type(codec); 578962306a36Sopenharmony_ci if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA) 579062306a36Sopenharmony_ci alc_headset_mode_ctia(codec); 579162306a36Sopenharmony_ci else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP) 579262306a36Sopenharmony_ci alc_headset_mode_omtp(codec); 579362306a36Sopenharmony_ci spec->gen.hp_jack_present = true; 579462306a36Sopenharmony_ci break; 579562306a36Sopenharmony_ci case ALC_HEADSET_MODE_MIC: 579662306a36Sopenharmony_ci alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin); 579762306a36Sopenharmony_ci spec->gen.hp_jack_present = false; 579862306a36Sopenharmony_ci break; 579962306a36Sopenharmony_ci case ALC_HEADSET_MODE_HEADPHONE: 580062306a36Sopenharmony_ci alc_headset_mode_default(codec); 580162306a36Sopenharmony_ci spec->gen.hp_jack_present = true; 580262306a36Sopenharmony_ci break; 580362306a36Sopenharmony_ci } 580462306a36Sopenharmony_ci if (new_headset_mode != ALC_HEADSET_MODE_MIC) { 580562306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, hp_pin, 580662306a36Sopenharmony_ci AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN); 580762306a36Sopenharmony_ci if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin) 580862306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin, 580962306a36Sopenharmony_ci PIN_VREFHIZ); 581062306a36Sopenharmony_ci } 581162306a36Sopenharmony_ci spec->current_headset_mode = new_headset_mode; 581262306a36Sopenharmony_ci 581362306a36Sopenharmony_ci snd_hda_gen_update_outputs(codec); 581462306a36Sopenharmony_ci} 581562306a36Sopenharmony_ci 581662306a36Sopenharmony_cistatic void alc_update_headset_mode_hook(struct hda_codec *codec, 581762306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, 581862306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 581962306a36Sopenharmony_ci{ 582062306a36Sopenharmony_ci alc_update_headset_mode(codec); 582162306a36Sopenharmony_ci} 582262306a36Sopenharmony_ci 582362306a36Sopenharmony_cistatic void alc_update_headset_jack_cb(struct hda_codec *codec, 582462306a36Sopenharmony_ci struct hda_jack_callback *jack) 582562306a36Sopenharmony_ci{ 582662306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 582762306a36Sopenharmony_ci alc_update_headset_mode(codec); 582862306a36Sopenharmony_ci} 582962306a36Sopenharmony_ci 583062306a36Sopenharmony_cistatic void alc_probe_headset_mode(struct hda_codec *codec) 583162306a36Sopenharmony_ci{ 583262306a36Sopenharmony_ci int i; 583362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 583462306a36Sopenharmony_ci struct auto_pin_cfg *cfg = &spec->gen.autocfg; 583562306a36Sopenharmony_ci 583662306a36Sopenharmony_ci /* Find mic pins */ 583762306a36Sopenharmony_ci for (i = 0; i < cfg->num_inputs; i++) { 583862306a36Sopenharmony_ci if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin) 583962306a36Sopenharmony_ci spec->headset_mic_pin = cfg->inputs[i].pin; 584062306a36Sopenharmony_ci if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin) 584162306a36Sopenharmony_ci spec->headphone_mic_pin = cfg->inputs[i].pin; 584262306a36Sopenharmony_ci } 584362306a36Sopenharmony_ci 584462306a36Sopenharmony_ci WARN_ON(spec->gen.cap_sync_hook); 584562306a36Sopenharmony_ci spec->gen.cap_sync_hook = alc_update_headset_mode_hook; 584662306a36Sopenharmony_ci spec->gen.automute_hook = alc_update_headset_mode; 584762306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc_update_headset_jack_cb; 584862306a36Sopenharmony_ci} 584962306a36Sopenharmony_ci 585062306a36Sopenharmony_cistatic void alc_fixup_headset_mode(struct hda_codec *codec, 585162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 585262306a36Sopenharmony_ci{ 585362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 585462306a36Sopenharmony_ci 585562306a36Sopenharmony_ci switch (action) { 585662306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 585762306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC; 585862306a36Sopenharmony_ci break; 585962306a36Sopenharmony_ci case HDA_FIXUP_ACT_PROBE: 586062306a36Sopenharmony_ci alc_probe_headset_mode(codec); 586162306a36Sopenharmony_ci break; 586262306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 586362306a36Sopenharmony_ci if (is_s3_resume(codec) || is_s4_resume(codec)) { 586462306a36Sopenharmony_ci spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN; 586562306a36Sopenharmony_ci spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN; 586662306a36Sopenharmony_ci } 586762306a36Sopenharmony_ci alc_update_headset_mode(codec); 586862306a36Sopenharmony_ci break; 586962306a36Sopenharmony_ci } 587062306a36Sopenharmony_ci} 587162306a36Sopenharmony_ci 587262306a36Sopenharmony_cistatic void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec, 587362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 587462306a36Sopenharmony_ci{ 587562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 587662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 587762306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 587862306a36Sopenharmony_ci } 587962306a36Sopenharmony_ci else 588062306a36Sopenharmony_ci alc_fixup_headset_mode(codec, fix, action); 588162306a36Sopenharmony_ci} 588262306a36Sopenharmony_ci 588362306a36Sopenharmony_cistatic void alc255_set_default_jack_type(struct hda_codec *codec) 588462306a36Sopenharmony_ci{ 588562306a36Sopenharmony_ci /* Set to iphone type */ 588662306a36Sopenharmony_ci static const struct coef_fw alc255fw[] = { 588762306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x880b), 588862306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd089), 588962306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x080b), 589062306a36Sopenharmony_ci WRITE_COEF(0x46, 0x0004), 589162306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c0b), 589262306a36Sopenharmony_ci {} 589362306a36Sopenharmony_ci }; 589462306a36Sopenharmony_ci static const struct coef_fw alc256fw[] = { 589562306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x884b), 589662306a36Sopenharmony_ci WRITE_COEF(0x45, 0xd089), 589762306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x084b), 589862306a36Sopenharmony_ci WRITE_COEF(0x46, 0x0004), 589962306a36Sopenharmony_ci WRITE_COEF(0x1b, 0x0c4b), 590062306a36Sopenharmony_ci {} 590162306a36Sopenharmony_ci }; 590262306a36Sopenharmony_ci switch (codec->core.vendor_id) { 590362306a36Sopenharmony_ci case 0x10ec0255: 590462306a36Sopenharmony_ci alc_process_coef_fw(codec, alc255fw); 590562306a36Sopenharmony_ci break; 590662306a36Sopenharmony_ci case 0x10ec0230: 590762306a36Sopenharmony_ci case 0x10ec0236: 590862306a36Sopenharmony_ci case 0x10ec0256: 590962306a36Sopenharmony_ci case 0x19e58326: 591062306a36Sopenharmony_ci alc_process_coef_fw(codec, alc256fw); 591162306a36Sopenharmony_ci break; 591262306a36Sopenharmony_ci } 591362306a36Sopenharmony_ci msleep(30); 591462306a36Sopenharmony_ci} 591562306a36Sopenharmony_ci 591662306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc255(struct hda_codec *codec, 591762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 591862306a36Sopenharmony_ci{ 591962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 592062306a36Sopenharmony_ci alc255_set_default_jack_type(codec); 592162306a36Sopenharmony_ci } 592262306a36Sopenharmony_ci alc_fixup_headset_mode(codec, fix, action); 592362306a36Sopenharmony_ci} 592462306a36Sopenharmony_ci 592562306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec, 592662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 592762306a36Sopenharmony_ci{ 592862306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 592962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 593062306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 593162306a36Sopenharmony_ci alc255_set_default_jack_type(codec); 593262306a36Sopenharmony_ci } 593362306a36Sopenharmony_ci else 593462306a36Sopenharmony_ci alc_fixup_headset_mode(codec, fix, action); 593562306a36Sopenharmony_ci} 593662306a36Sopenharmony_ci 593762306a36Sopenharmony_cistatic void alc288_update_headset_jack_cb(struct hda_codec *codec, 593862306a36Sopenharmony_ci struct hda_jack_callback *jack) 593962306a36Sopenharmony_ci{ 594062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 594162306a36Sopenharmony_ci 594262306a36Sopenharmony_ci alc_update_headset_jack_cb(codec, jack); 594362306a36Sopenharmony_ci /* Headset Mic enable or disable, only for Dell Dino */ 594462306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present); 594562306a36Sopenharmony_ci} 594662306a36Sopenharmony_ci 594762306a36Sopenharmony_cistatic void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec, 594862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 594962306a36Sopenharmony_ci{ 595062306a36Sopenharmony_ci alc_fixup_headset_mode(codec, fix, action); 595162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PROBE) { 595262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 595362306a36Sopenharmony_ci /* toggled via hp_automute_hook */ 595462306a36Sopenharmony_ci spec->gpio_mask |= 0x40; 595562306a36Sopenharmony_ci spec->gpio_dir |= 0x40; 595662306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc288_update_headset_jack_cb; 595762306a36Sopenharmony_ci } 595862306a36Sopenharmony_ci} 595962306a36Sopenharmony_ci 596062306a36Sopenharmony_cistatic void alc_fixup_auto_mute_via_amp(struct hda_codec *codec, 596162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 596262306a36Sopenharmony_ci{ 596362306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 596462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 596562306a36Sopenharmony_ci spec->gen.auto_mute_via_amp = 1; 596662306a36Sopenharmony_ci } 596762306a36Sopenharmony_ci} 596862306a36Sopenharmony_ci 596962306a36Sopenharmony_cistatic void alc_fixup_no_shutup(struct hda_codec *codec, 597062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 597162306a36Sopenharmony_ci{ 597262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 597362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 597462306a36Sopenharmony_ci spec->no_shutup_pins = 1; 597562306a36Sopenharmony_ci } 597662306a36Sopenharmony_ci} 597762306a36Sopenharmony_ci 597862306a36Sopenharmony_cistatic void alc_fixup_disable_aamix(struct hda_codec *codec, 597962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 598062306a36Sopenharmony_ci{ 598162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 598262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 598362306a36Sopenharmony_ci /* Disable AA-loopback as it causes white noise */ 598462306a36Sopenharmony_ci spec->gen.mixer_nid = 0; 598562306a36Sopenharmony_ci } 598662306a36Sopenharmony_ci} 598762306a36Sopenharmony_ci 598862306a36Sopenharmony_ci/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */ 598962306a36Sopenharmony_cistatic void alc_fixup_tpt440_dock(struct hda_codec *codec, 599062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 599162306a36Sopenharmony_ci{ 599262306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 599362306a36Sopenharmony_ci { 0x16, 0x21211010 }, /* dock headphone */ 599462306a36Sopenharmony_ci { 0x19, 0x21a11010 }, /* dock mic */ 599562306a36Sopenharmony_ci { } 599662306a36Sopenharmony_ci }; 599762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 599862306a36Sopenharmony_ci 599962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 600062306a36Sopenharmony_ci spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; 600162306a36Sopenharmony_ci codec->power_save_node = 0; /* avoid click noises */ 600262306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 600362306a36Sopenharmony_ci } 600462306a36Sopenharmony_ci} 600562306a36Sopenharmony_ci 600662306a36Sopenharmony_cistatic void alc_fixup_tpt470_dock(struct hda_codec *codec, 600762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 600862306a36Sopenharmony_ci{ 600962306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 601062306a36Sopenharmony_ci { 0x17, 0x21211010 }, /* dock headphone */ 601162306a36Sopenharmony_ci { 0x19, 0x21a11010 }, /* dock mic */ 601262306a36Sopenharmony_ci { } 601362306a36Sopenharmony_ci }; 601462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 601562306a36Sopenharmony_ci 601662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 601762306a36Sopenharmony_ci spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; 601862306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 601962306a36Sopenharmony_ci } else if (action == HDA_FIXUP_ACT_INIT) { 602062306a36Sopenharmony_ci /* Enable DOCK device */ 602162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x17, 0, 602262306a36Sopenharmony_ci AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); 602362306a36Sopenharmony_ci /* Enable DOCK device */ 602462306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x19, 0, 602562306a36Sopenharmony_ci AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); 602662306a36Sopenharmony_ci } 602762306a36Sopenharmony_ci} 602862306a36Sopenharmony_ci 602962306a36Sopenharmony_cistatic void alc_fixup_tpt470_dacs(struct hda_codec *codec, 603062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 603162306a36Sopenharmony_ci{ 603262306a36Sopenharmony_ci /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise 603362306a36Sopenharmony_ci * the speaker output becomes too low by some reason on Thinkpads with 603462306a36Sopenharmony_ci * ALC298 codec 603562306a36Sopenharmony_ci */ 603662306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 603762306a36Sopenharmony_ci 0x14, 0x03, 0x17, 0x02, 0x21, 0x02, 603862306a36Sopenharmony_ci 0 603962306a36Sopenharmony_ci }; 604062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 604162306a36Sopenharmony_ci 604262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 604362306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 604462306a36Sopenharmony_ci} 604562306a36Sopenharmony_ci 604662306a36Sopenharmony_cistatic void alc295_fixup_asus_dacs(struct hda_codec *codec, 604762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 604862306a36Sopenharmony_ci{ 604962306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 605062306a36Sopenharmony_ci 0x17, 0x02, 0x21, 0x03, 0 605162306a36Sopenharmony_ci }; 605262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 605362306a36Sopenharmony_ci 605462306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 605562306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 605662306a36Sopenharmony_ci} 605762306a36Sopenharmony_ci 605862306a36Sopenharmony_cistatic void alc_shutup_dell_xps13(struct hda_codec *codec) 605962306a36Sopenharmony_ci{ 606062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 606162306a36Sopenharmony_ci int hp_pin = alc_get_hp_pin(spec); 606262306a36Sopenharmony_ci 606362306a36Sopenharmony_ci /* Prevent pop noises when headphones are plugged in */ 606462306a36Sopenharmony_ci snd_hda_codec_write(codec, hp_pin, 0, 606562306a36Sopenharmony_ci AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); 606662306a36Sopenharmony_ci msleep(20); 606762306a36Sopenharmony_ci} 606862306a36Sopenharmony_ci 606962306a36Sopenharmony_cistatic void alc_fixup_dell_xps13(struct hda_codec *codec, 607062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 607162306a36Sopenharmony_ci{ 607262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 607362306a36Sopenharmony_ci struct hda_input_mux *imux = &spec->gen.input_mux; 607462306a36Sopenharmony_ci int i; 607562306a36Sopenharmony_ci 607662306a36Sopenharmony_ci switch (action) { 607762306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 607862306a36Sopenharmony_ci /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise 607962306a36Sopenharmony_ci * it causes a click noise at start up 608062306a36Sopenharmony_ci */ 608162306a36Sopenharmony_ci snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ); 608262306a36Sopenharmony_ci spec->shutup = alc_shutup_dell_xps13; 608362306a36Sopenharmony_ci break; 608462306a36Sopenharmony_ci case HDA_FIXUP_ACT_PROBE: 608562306a36Sopenharmony_ci /* Make the internal mic the default input source. */ 608662306a36Sopenharmony_ci for (i = 0; i < imux->num_items; i++) { 608762306a36Sopenharmony_ci if (spec->gen.imux_pins[i] == 0x12) { 608862306a36Sopenharmony_ci spec->gen.cur_mux[0] = i; 608962306a36Sopenharmony_ci break; 609062306a36Sopenharmony_ci } 609162306a36Sopenharmony_ci } 609262306a36Sopenharmony_ci break; 609362306a36Sopenharmony_ci } 609462306a36Sopenharmony_ci} 609562306a36Sopenharmony_ci 609662306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc662(struct hda_codec *codec, 609762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 609862306a36Sopenharmony_ci{ 609962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 610062306a36Sopenharmony_ci 610162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 610262306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 610362306a36Sopenharmony_ci spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */ 610462306a36Sopenharmony_ci 610562306a36Sopenharmony_ci /* Disable boost for mic-in permanently. (This code is only called 610662306a36Sopenharmony_ci from quirks that guarantee that the headphone is at NID 0x1b.) */ 610762306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000); 610862306a36Sopenharmony_ci snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP); 610962306a36Sopenharmony_ci } else 611062306a36Sopenharmony_ci alc_fixup_headset_mode(codec, fix, action); 611162306a36Sopenharmony_ci} 611262306a36Sopenharmony_ci 611362306a36Sopenharmony_cistatic void alc_fixup_headset_mode_alc668(struct hda_codec *codec, 611462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 611562306a36Sopenharmony_ci{ 611662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 611762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0xc4, 0x8000); 611862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0xc2, ~0xfe, 0); 611962306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, 0x18, 0); 612062306a36Sopenharmony_ci } 612162306a36Sopenharmony_ci alc_fixup_headset_mode(codec, fix, action); 612262306a36Sopenharmony_ci} 612362306a36Sopenharmony_ci 612462306a36Sopenharmony_ci/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */ 612562306a36Sopenharmony_cistatic int find_ext_mic_pin(struct hda_codec *codec) 612662306a36Sopenharmony_ci{ 612762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 612862306a36Sopenharmony_ci struct auto_pin_cfg *cfg = &spec->gen.autocfg; 612962306a36Sopenharmony_ci hda_nid_t nid; 613062306a36Sopenharmony_ci unsigned int defcfg; 613162306a36Sopenharmony_ci int i; 613262306a36Sopenharmony_ci 613362306a36Sopenharmony_ci for (i = 0; i < cfg->num_inputs; i++) { 613462306a36Sopenharmony_ci if (cfg->inputs[i].type != AUTO_PIN_MIC) 613562306a36Sopenharmony_ci continue; 613662306a36Sopenharmony_ci nid = cfg->inputs[i].pin; 613762306a36Sopenharmony_ci defcfg = snd_hda_codec_get_pincfg(codec, nid); 613862306a36Sopenharmony_ci if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT) 613962306a36Sopenharmony_ci continue; 614062306a36Sopenharmony_ci return nid; 614162306a36Sopenharmony_ci } 614262306a36Sopenharmony_ci 614362306a36Sopenharmony_ci return 0; 614462306a36Sopenharmony_ci} 614562306a36Sopenharmony_ci 614662306a36Sopenharmony_cistatic void alc271_hp_gate_mic_jack(struct hda_codec *codec, 614762306a36Sopenharmony_ci const struct hda_fixup *fix, 614862306a36Sopenharmony_ci int action) 614962306a36Sopenharmony_ci{ 615062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 615162306a36Sopenharmony_ci 615262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PROBE) { 615362306a36Sopenharmony_ci int mic_pin = find_ext_mic_pin(codec); 615462306a36Sopenharmony_ci int hp_pin = alc_get_hp_pin(spec); 615562306a36Sopenharmony_ci 615662306a36Sopenharmony_ci if (snd_BUG_ON(!mic_pin || !hp_pin)) 615762306a36Sopenharmony_ci return; 615862306a36Sopenharmony_ci snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin); 615962306a36Sopenharmony_ci } 616062306a36Sopenharmony_ci} 616162306a36Sopenharmony_ci 616262306a36Sopenharmony_cistatic void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec, 616362306a36Sopenharmony_ci const struct hda_fixup *fix, 616462306a36Sopenharmony_ci int action) 616562306a36Sopenharmony_ci{ 616662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 616762306a36Sopenharmony_ci struct auto_pin_cfg *cfg = &spec->gen.autocfg; 616862306a36Sopenharmony_ci int i; 616962306a36Sopenharmony_ci 617062306a36Sopenharmony_ci /* The mic boosts on level 2 and 3 are too noisy 617162306a36Sopenharmony_ci on the internal mic input. 617262306a36Sopenharmony_ci Therefore limit the boost to 0 or 1. */ 617362306a36Sopenharmony_ci 617462306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PROBE) 617562306a36Sopenharmony_ci return; 617662306a36Sopenharmony_ci 617762306a36Sopenharmony_ci for (i = 0; i < cfg->num_inputs; i++) { 617862306a36Sopenharmony_ci hda_nid_t nid = cfg->inputs[i].pin; 617962306a36Sopenharmony_ci unsigned int defcfg; 618062306a36Sopenharmony_ci if (cfg->inputs[i].type != AUTO_PIN_MIC) 618162306a36Sopenharmony_ci continue; 618262306a36Sopenharmony_ci defcfg = snd_hda_codec_get_pincfg(codec, nid); 618362306a36Sopenharmony_ci if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT) 618462306a36Sopenharmony_ci continue; 618562306a36Sopenharmony_ci 618662306a36Sopenharmony_ci snd_hda_override_amp_caps(codec, nid, HDA_INPUT, 618762306a36Sopenharmony_ci (0x00 << AC_AMPCAP_OFFSET_SHIFT) | 618862306a36Sopenharmony_ci (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) | 618962306a36Sopenharmony_ci (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) | 619062306a36Sopenharmony_ci (0 << AC_AMPCAP_MUTE_SHIFT)); 619162306a36Sopenharmony_ci } 619262306a36Sopenharmony_ci} 619362306a36Sopenharmony_ci 619462306a36Sopenharmony_cistatic void alc283_hp_automute_hook(struct hda_codec *codec, 619562306a36Sopenharmony_ci struct hda_jack_callback *jack) 619662306a36Sopenharmony_ci{ 619762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 619862306a36Sopenharmony_ci int vref; 619962306a36Sopenharmony_ci 620062306a36Sopenharmony_ci msleep(200); 620162306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 620262306a36Sopenharmony_ci 620362306a36Sopenharmony_ci vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0; 620462306a36Sopenharmony_ci 620562306a36Sopenharmony_ci msleep(600); 620662306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 620762306a36Sopenharmony_ci vref); 620862306a36Sopenharmony_ci} 620962306a36Sopenharmony_ci 621062306a36Sopenharmony_cistatic void alc283_fixup_chromebook(struct hda_codec *codec, 621162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 621262306a36Sopenharmony_ci{ 621362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 621462306a36Sopenharmony_ci 621562306a36Sopenharmony_ci switch (action) { 621662306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 621762306a36Sopenharmony_ci snd_hda_override_wcaps(codec, 0x03, 0); 621862306a36Sopenharmony_ci /* Disable AA-loopback as it causes white noise */ 621962306a36Sopenharmony_ci spec->gen.mixer_nid = 0; 622062306a36Sopenharmony_ci break; 622162306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 622262306a36Sopenharmony_ci /* MIC2-VREF control */ 622362306a36Sopenharmony_ci /* Set to manual mode */ 622462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x06, 0x000c, 0); 622562306a36Sopenharmony_ci /* Enable Line1 input control by verb */ 622662306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x1a, 0, 1 << 4); 622762306a36Sopenharmony_ci break; 622862306a36Sopenharmony_ci } 622962306a36Sopenharmony_ci} 623062306a36Sopenharmony_ci 623162306a36Sopenharmony_cistatic void alc283_fixup_sense_combo_jack(struct hda_codec *codec, 623262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 623362306a36Sopenharmony_ci{ 623462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 623562306a36Sopenharmony_ci 623662306a36Sopenharmony_ci switch (action) { 623762306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 623862306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc283_hp_automute_hook; 623962306a36Sopenharmony_ci break; 624062306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 624162306a36Sopenharmony_ci /* MIC2-VREF control */ 624262306a36Sopenharmony_ci /* Set to manual mode */ 624362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x06, 0x000c, 0); 624462306a36Sopenharmony_ci break; 624562306a36Sopenharmony_ci } 624662306a36Sopenharmony_ci} 624762306a36Sopenharmony_ci 624862306a36Sopenharmony_ci/* mute tablet speaker pin (0x14) via dock plugging in addition */ 624962306a36Sopenharmony_cistatic void asus_tx300_automute(struct hda_codec *codec) 625062306a36Sopenharmony_ci{ 625162306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 625262306a36Sopenharmony_ci snd_hda_gen_update_outputs(codec); 625362306a36Sopenharmony_ci if (snd_hda_jack_detect(codec, 0x1b)) 625462306a36Sopenharmony_ci spec->gen.mute_bits |= (1ULL << 0x14); 625562306a36Sopenharmony_ci} 625662306a36Sopenharmony_ci 625762306a36Sopenharmony_cistatic void alc282_fixup_asus_tx300(struct hda_codec *codec, 625862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 625962306a36Sopenharmony_ci{ 626062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 626162306a36Sopenharmony_ci static const struct hda_pintbl dock_pins[] = { 626262306a36Sopenharmony_ci { 0x1b, 0x21114000 }, /* dock speaker pin */ 626362306a36Sopenharmony_ci {} 626462306a36Sopenharmony_ci }; 626562306a36Sopenharmony_ci 626662306a36Sopenharmony_ci switch (action) { 626762306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 626862306a36Sopenharmony_ci spec->init_amp = ALC_INIT_DEFAULT; 626962306a36Sopenharmony_ci /* TX300 needs to set up GPIO2 for the speaker amp */ 627062306a36Sopenharmony_ci alc_setup_gpio(codec, 0x04); 627162306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, dock_pins); 627262306a36Sopenharmony_ci spec->gen.auto_mute_via_amp = 1; 627362306a36Sopenharmony_ci spec->gen.automute_hook = asus_tx300_automute; 627462306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x1b, 627562306a36Sopenharmony_ci snd_hda_gen_hp_automute); 627662306a36Sopenharmony_ci break; 627762306a36Sopenharmony_ci case HDA_FIXUP_ACT_PROBE: 627862306a36Sopenharmony_ci spec->init_amp = ALC_INIT_DEFAULT; 627962306a36Sopenharmony_ci break; 628062306a36Sopenharmony_ci case HDA_FIXUP_ACT_BUILD: 628162306a36Sopenharmony_ci /* this is a bit tricky; give more sane names for the main 628262306a36Sopenharmony_ci * (tablet) speaker and the dock speaker, respectively 628362306a36Sopenharmony_ci */ 628462306a36Sopenharmony_ci rename_ctl(codec, "Speaker Playback Switch", 628562306a36Sopenharmony_ci "Dock Speaker Playback Switch"); 628662306a36Sopenharmony_ci rename_ctl(codec, "Bass Speaker Playback Switch", 628762306a36Sopenharmony_ci "Speaker Playback Switch"); 628862306a36Sopenharmony_ci break; 628962306a36Sopenharmony_ci } 629062306a36Sopenharmony_ci} 629162306a36Sopenharmony_ci 629262306a36Sopenharmony_cistatic void alc290_fixup_mono_speakers(struct hda_codec *codec, 629362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 629462306a36Sopenharmony_ci{ 629562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 629662306a36Sopenharmony_ci /* DAC node 0x03 is giving mono output. We therefore want to 629762306a36Sopenharmony_ci make sure 0x14 (front speaker) and 0x15 (headphones) use the 629862306a36Sopenharmony_ci stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */ 629962306a36Sopenharmony_ci static const hda_nid_t conn1[] = { 0x0c }; 630062306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1); 630162306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1); 630262306a36Sopenharmony_ci } 630362306a36Sopenharmony_ci} 630462306a36Sopenharmony_ci 630562306a36Sopenharmony_cistatic void alc298_fixup_speaker_volume(struct hda_codec *codec, 630662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 630762306a36Sopenharmony_ci{ 630862306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 630962306a36Sopenharmony_ci /* The speaker is routed to the Node 0x06 by a mistake, as a result 631062306a36Sopenharmony_ci we can't adjust the speaker's volume since this node does not has 631162306a36Sopenharmony_ci Amp-out capability. we change the speaker's route to: 631262306a36Sopenharmony_ci Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 ( 631362306a36Sopenharmony_ci Pin Complex), since Node 0x02 has Amp-out caps, we can adjust 631462306a36Sopenharmony_ci speaker's volume now. */ 631562306a36Sopenharmony_ci 631662306a36Sopenharmony_ci static const hda_nid_t conn1[] = { 0x0c }; 631762306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1); 631862306a36Sopenharmony_ci } 631962306a36Sopenharmony_ci} 632062306a36Sopenharmony_ci 632162306a36Sopenharmony_ci/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */ 632262306a36Sopenharmony_cistatic void alc295_fixup_disable_dac3(struct hda_codec *codec, 632362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 632462306a36Sopenharmony_ci{ 632562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 632662306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02, 0x03 }; 632762306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 632862306a36Sopenharmony_ci } 632962306a36Sopenharmony_ci} 633062306a36Sopenharmony_ci 633162306a36Sopenharmony_ci/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */ 633262306a36Sopenharmony_cistatic void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec, 633362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 633462306a36Sopenharmony_ci{ 633562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 633662306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02 }; 633762306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 633862306a36Sopenharmony_ci } 633962306a36Sopenharmony_ci} 634062306a36Sopenharmony_ci 634162306a36Sopenharmony_ci/* Hook to update amp GPIO4 for automute */ 634262306a36Sopenharmony_cistatic void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, 634362306a36Sopenharmony_ci struct hda_jack_callback *jack) 634462306a36Sopenharmony_ci{ 634562306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 634662306a36Sopenharmony_ci 634762306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 634862306a36Sopenharmony_ci /* mute_led_polarity is set to 0, so we pass inverted value here */ 634962306a36Sopenharmony_ci alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity, 635062306a36Sopenharmony_ci !spec->gen.hp_jack_present); 635162306a36Sopenharmony_ci} 635262306a36Sopenharmony_ci 635362306a36Sopenharmony_ci/* Manage GPIOs for HP EliteBook Folio 9480m. 635462306a36Sopenharmony_ci * 635562306a36Sopenharmony_ci * GPIO4 is the headphone amplifier power control 635662306a36Sopenharmony_ci * GPIO3 is the audio output mute indicator LED 635762306a36Sopenharmony_ci */ 635862306a36Sopenharmony_ci 635962306a36Sopenharmony_cistatic void alc280_fixup_hp_9480m(struct hda_codec *codec, 636062306a36Sopenharmony_ci const struct hda_fixup *fix, 636162306a36Sopenharmony_ci int action) 636262306a36Sopenharmony_ci{ 636362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 636462306a36Sopenharmony_ci 636562306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x08, 0); 636662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 636762306a36Sopenharmony_ci /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */ 636862306a36Sopenharmony_ci spec->gpio_mask |= 0x10; 636962306a36Sopenharmony_ci spec->gpio_dir |= 0x10; 637062306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook; 637162306a36Sopenharmony_ci } 637262306a36Sopenharmony_ci} 637362306a36Sopenharmony_ci 637462306a36Sopenharmony_cistatic void alc275_fixup_gpio4_off(struct hda_codec *codec, 637562306a36Sopenharmony_ci const struct hda_fixup *fix, 637662306a36Sopenharmony_ci int action) 637762306a36Sopenharmony_ci{ 637862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 637962306a36Sopenharmony_ci 638062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 638162306a36Sopenharmony_ci spec->gpio_mask |= 0x04; 638262306a36Sopenharmony_ci spec->gpio_dir |= 0x04; 638362306a36Sopenharmony_ci /* set data bit low */ 638462306a36Sopenharmony_ci } 638562306a36Sopenharmony_ci} 638662306a36Sopenharmony_ci 638762306a36Sopenharmony_ci/* Quirk for Thinkpad X1 7th and 8th Gen 638862306a36Sopenharmony_ci * The following fixed routing needed 638962306a36Sopenharmony_ci * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly 639062306a36Sopenharmony_ci * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC 639162306a36Sopenharmony_ci * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp 639262306a36Sopenharmony_ci */ 639362306a36Sopenharmony_cistatic void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec, 639462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 639562306a36Sopenharmony_ci{ 639662306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */ 639762306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 639862306a36Sopenharmony_ci 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0 639962306a36Sopenharmony_ci }; 640062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 640162306a36Sopenharmony_ci 640262306a36Sopenharmony_ci switch (action) { 640362306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 640462306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 640562306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 640662306a36Sopenharmony_ci break; 640762306a36Sopenharmony_ci case HDA_FIXUP_ACT_BUILD: 640862306a36Sopenharmony_ci /* The generic parser creates somewhat unintuitive volume ctls 640962306a36Sopenharmony_ci * with the fixed routing above, and the shared DAC2 may be 641062306a36Sopenharmony_ci * confusing for PA. 641162306a36Sopenharmony_ci * Rename those to unique names so that PA doesn't touch them 641262306a36Sopenharmony_ci * and use only Master volume. 641362306a36Sopenharmony_ci */ 641462306a36Sopenharmony_ci rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume"); 641562306a36Sopenharmony_ci rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume"); 641662306a36Sopenharmony_ci break; 641762306a36Sopenharmony_ci } 641862306a36Sopenharmony_ci} 641962306a36Sopenharmony_ci 642062306a36Sopenharmony_cistatic void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec, 642162306a36Sopenharmony_ci const struct hda_fixup *fix, 642262306a36Sopenharmony_ci int action) 642362306a36Sopenharmony_ci{ 642462306a36Sopenharmony_ci alc_fixup_dual_codecs(codec, fix, action); 642562306a36Sopenharmony_ci switch (action) { 642662306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 642762306a36Sopenharmony_ci /* override card longname to provide a unique UCM profile */ 642862306a36Sopenharmony_ci strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs"); 642962306a36Sopenharmony_ci break; 643062306a36Sopenharmony_ci case HDA_FIXUP_ACT_BUILD: 643162306a36Sopenharmony_ci /* rename Capture controls depending on the codec */ 643262306a36Sopenharmony_ci rename_ctl(codec, "Capture Volume", 643362306a36Sopenharmony_ci codec->addr == 0 ? 643462306a36Sopenharmony_ci "Rear-Panel Capture Volume" : 643562306a36Sopenharmony_ci "Front-Panel Capture Volume"); 643662306a36Sopenharmony_ci rename_ctl(codec, "Capture Switch", 643762306a36Sopenharmony_ci codec->addr == 0 ? 643862306a36Sopenharmony_ci "Rear-Panel Capture Switch" : 643962306a36Sopenharmony_ci "Front-Panel Capture Switch"); 644062306a36Sopenharmony_ci break; 644162306a36Sopenharmony_ci } 644262306a36Sopenharmony_ci} 644362306a36Sopenharmony_ci 644462306a36Sopenharmony_cistatic void alc225_fixup_s3_pop_noise(struct hda_codec *codec, 644562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 644662306a36Sopenharmony_ci{ 644762306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 644862306a36Sopenharmony_ci return; 644962306a36Sopenharmony_ci 645062306a36Sopenharmony_ci codec->power_save_node = 1; 645162306a36Sopenharmony_ci} 645262306a36Sopenharmony_ci 645362306a36Sopenharmony_ci/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */ 645462306a36Sopenharmony_cistatic void alc274_fixup_bind_dacs(struct hda_codec *codec, 645562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 645662306a36Sopenharmony_ci{ 645762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 645862306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 645962306a36Sopenharmony_ci 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02, 646062306a36Sopenharmony_ci 0 646162306a36Sopenharmony_ci }; 646262306a36Sopenharmony_ci 646362306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 646462306a36Sopenharmony_ci return; 646562306a36Sopenharmony_ci 646662306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 646762306a36Sopenharmony_ci spec->gen.auto_mute_via_amp = 1; 646862306a36Sopenharmony_ci codec->power_save_node = 0; 646962306a36Sopenharmony_ci} 647062306a36Sopenharmony_ci 647162306a36Sopenharmony_ci/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */ 647262306a36Sopenharmony_cistatic void alc289_fixup_asus_ga401(struct hda_codec *codec, 647362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 647462306a36Sopenharmony_ci{ 647562306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 647662306a36Sopenharmony_ci 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0 647762306a36Sopenharmony_ci }; 647862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 647962306a36Sopenharmony_ci 648062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 648162306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 648262306a36Sopenharmony_ci spec->gen.obey_preferred_dacs = 1; 648362306a36Sopenharmony_ci } 648462306a36Sopenharmony_ci} 648562306a36Sopenharmony_ci 648662306a36Sopenharmony_ci/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */ 648762306a36Sopenharmony_cistatic void alc285_fixup_invalidate_dacs(struct hda_codec *codec, 648862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 648962306a36Sopenharmony_ci{ 649062306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 649162306a36Sopenharmony_ci return; 649262306a36Sopenharmony_ci 649362306a36Sopenharmony_ci snd_hda_override_wcaps(codec, 0x03, 0); 649462306a36Sopenharmony_ci} 649562306a36Sopenharmony_ci 649662306a36Sopenharmony_cistatic void alc_combo_jack_hp_jd_restart(struct hda_codec *codec) 649762306a36Sopenharmony_ci{ 649862306a36Sopenharmony_ci switch (codec->core.vendor_id) { 649962306a36Sopenharmony_ci case 0x10ec0274: 650062306a36Sopenharmony_ci case 0x10ec0294: 650162306a36Sopenharmony_ci case 0x10ec0225: 650262306a36Sopenharmony_ci case 0x10ec0295: 650362306a36Sopenharmony_ci case 0x10ec0299: 650462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */ 650562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15); 650662306a36Sopenharmony_ci break; 650762306a36Sopenharmony_ci case 0x10ec0230: 650862306a36Sopenharmony_ci case 0x10ec0235: 650962306a36Sopenharmony_ci case 0x10ec0236: 651062306a36Sopenharmony_ci case 0x10ec0255: 651162306a36Sopenharmony_ci case 0x10ec0256: 651262306a36Sopenharmony_ci case 0x10ec0257: 651362306a36Sopenharmony_ci case 0x19e58326: 651462306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */ 651562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15); 651662306a36Sopenharmony_ci break; 651762306a36Sopenharmony_ci } 651862306a36Sopenharmony_ci} 651962306a36Sopenharmony_ci 652062306a36Sopenharmony_cistatic void alc295_fixup_chromebook(struct hda_codec *codec, 652162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 652262306a36Sopenharmony_ci{ 652362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 652462306a36Sopenharmony_ci 652562306a36Sopenharmony_ci switch (action) { 652662306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 652762306a36Sopenharmony_ci spec->ultra_low_power = true; 652862306a36Sopenharmony_ci break; 652962306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 653062306a36Sopenharmony_ci alc_combo_jack_hp_jd_restart(codec); 653162306a36Sopenharmony_ci break; 653262306a36Sopenharmony_ci } 653362306a36Sopenharmony_ci} 653462306a36Sopenharmony_ci 653562306a36Sopenharmony_cistatic void alc_fixup_disable_mic_vref(struct hda_codec *codec, 653662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 653762306a36Sopenharmony_ci{ 653862306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 653962306a36Sopenharmony_ci snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ); 654062306a36Sopenharmony_ci} 654162306a36Sopenharmony_ci 654262306a36Sopenharmony_ci 654362306a36Sopenharmony_cistatic void alc294_gx502_toggle_output(struct hda_codec *codec, 654462306a36Sopenharmony_ci struct hda_jack_callback *cb) 654562306a36Sopenharmony_ci{ 654662306a36Sopenharmony_ci /* The Windows driver sets the codec up in a very different way where 654762306a36Sopenharmony_ci * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it 654862306a36Sopenharmony_ci */ 654962306a36Sopenharmony_ci if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT) 655062306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x10, 0x8a20); 655162306a36Sopenharmony_ci else 655262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x10, 0x0a20); 655362306a36Sopenharmony_ci} 655462306a36Sopenharmony_ci 655562306a36Sopenharmony_cistatic void alc294_fixup_gx502_hp(struct hda_codec *codec, 655662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 655762306a36Sopenharmony_ci{ 655862306a36Sopenharmony_ci /* Pin 0x21: headphones/headset mic */ 655962306a36Sopenharmony_ci if (!is_jack_detectable(codec, 0x21)) 656062306a36Sopenharmony_ci return; 656162306a36Sopenharmony_ci 656262306a36Sopenharmony_ci switch (action) { 656362306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 656462306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x21, 656562306a36Sopenharmony_ci alc294_gx502_toggle_output); 656662306a36Sopenharmony_ci break; 656762306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 656862306a36Sopenharmony_ci /* Make sure to start in a correct state, i.e. if 656962306a36Sopenharmony_ci * headphones have been plugged in before powering up the system 657062306a36Sopenharmony_ci */ 657162306a36Sopenharmony_ci alc294_gx502_toggle_output(codec, NULL); 657262306a36Sopenharmony_ci break; 657362306a36Sopenharmony_ci } 657462306a36Sopenharmony_ci} 657562306a36Sopenharmony_ci 657662306a36Sopenharmony_cistatic void alc294_gu502_toggle_output(struct hda_codec *codec, 657762306a36Sopenharmony_ci struct hda_jack_callback *cb) 657862306a36Sopenharmony_ci{ 657962306a36Sopenharmony_ci /* Windows sets 0x10 to 0x8420 for Node 0x20 which is 658062306a36Sopenharmony_ci * responsible from changes between speakers and headphones 658162306a36Sopenharmony_ci */ 658262306a36Sopenharmony_ci if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT) 658362306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x10, 0x8420); 658462306a36Sopenharmony_ci else 658562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x10, 0x0a20); 658662306a36Sopenharmony_ci} 658762306a36Sopenharmony_ci 658862306a36Sopenharmony_cistatic void alc294_fixup_gu502_hp(struct hda_codec *codec, 658962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 659062306a36Sopenharmony_ci{ 659162306a36Sopenharmony_ci if (!is_jack_detectable(codec, 0x21)) 659262306a36Sopenharmony_ci return; 659362306a36Sopenharmony_ci 659462306a36Sopenharmony_ci switch (action) { 659562306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 659662306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x21, 659762306a36Sopenharmony_ci alc294_gu502_toggle_output); 659862306a36Sopenharmony_ci break; 659962306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 660062306a36Sopenharmony_ci alc294_gu502_toggle_output(codec, NULL); 660162306a36Sopenharmony_ci break; 660262306a36Sopenharmony_ci } 660362306a36Sopenharmony_ci} 660462306a36Sopenharmony_ci 660562306a36Sopenharmony_cistatic void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec, 660662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 660762306a36Sopenharmony_ci{ 660862306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_INIT) 660962306a36Sopenharmony_ci return; 661062306a36Sopenharmony_ci 661162306a36Sopenharmony_ci msleep(100); 661262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x65, 0x0); 661362306a36Sopenharmony_ci} 661462306a36Sopenharmony_ci 661562306a36Sopenharmony_cistatic void alc274_fixup_hp_headset_mic(struct hda_codec *codec, 661662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 661762306a36Sopenharmony_ci{ 661862306a36Sopenharmony_ci switch (action) { 661962306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 662062306a36Sopenharmony_ci alc_combo_jack_hp_jd_restart(codec); 662162306a36Sopenharmony_ci break; 662262306a36Sopenharmony_ci } 662362306a36Sopenharmony_ci} 662462306a36Sopenharmony_ci 662562306a36Sopenharmony_cistatic void alc_fixup_no_int_mic(struct hda_codec *codec, 662662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 662762306a36Sopenharmony_ci{ 662862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 662962306a36Sopenharmony_ci 663062306a36Sopenharmony_ci switch (action) { 663162306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 663262306a36Sopenharmony_ci /* Mic RING SLEEVE swap for combo jack */ 663362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 663462306a36Sopenharmony_ci spec->no_internal_mic_pin = true; 663562306a36Sopenharmony_ci break; 663662306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 663762306a36Sopenharmony_ci alc_combo_jack_hp_jd_restart(codec); 663862306a36Sopenharmony_ci break; 663962306a36Sopenharmony_ci } 664062306a36Sopenharmony_ci} 664162306a36Sopenharmony_ci 664262306a36Sopenharmony_ci/* GPIO1 = amplifier on/off 664362306a36Sopenharmony_ci * GPIO3 = mic mute LED 664462306a36Sopenharmony_ci */ 664562306a36Sopenharmony_cistatic void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec, 664662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 664762306a36Sopenharmony_ci{ 664862306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02 }; 664962306a36Sopenharmony_ci 665062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 665162306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 665262306a36Sopenharmony_ci { 0x14, 0x90170110 }, /* front/high speakers */ 665362306a36Sopenharmony_ci { 0x17, 0x90170130 }, /* back/bass speakers */ 665462306a36Sopenharmony_ci { } 665562306a36Sopenharmony_ci }; 665662306a36Sopenharmony_ci 665762306a36Sopenharmony_ci //enable micmute led 665862306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04); 665962306a36Sopenharmony_ci 666062306a36Sopenharmony_ci switch (action) { 666162306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 666262306a36Sopenharmony_ci spec->micmute_led_polarity = 1; 666362306a36Sopenharmony_ci /* needed for amp of back speakers */ 666462306a36Sopenharmony_ci spec->gpio_mask |= 0x01; 666562306a36Sopenharmony_ci spec->gpio_dir |= 0x01; 666662306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 666762306a36Sopenharmony_ci /* share DAC to have unified volume control */ 666862306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn); 666962306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 667062306a36Sopenharmony_ci break; 667162306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 667262306a36Sopenharmony_ci /* need to toggle GPIO to enable the amp of back speakers */ 667362306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x01, true); 667462306a36Sopenharmony_ci msleep(100); 667562306a36Sopenharmony_ci alc_update_gpio_data(codec, 0x01, false); 667662306a36Sopenharmony_ci break; 667762306a36Sopenharmony_ci } 667862306a36Sopenharmony_ci} 667962306a36Sopenharmony_ci 668062306a36Sopenharmony_cistatic void alc285_fixup_hp_spectre_x360(struct hda_codec *codec, 668162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 668262306a36Sopenharmony_ci{ 668362306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02 }; 668462306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 668562306a36Sopenharmony_ci { 0x14, 0x90170110 }, /* rear speaker */ 668662306a36Sopenharmony_ci { } 668762306a36Sopenharmony_ci }; 668862306a36Sopenharmony_ci 668962306a36Sopenharmony_ci switch (action) { 669062306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 669162306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 669262306a36Sopenharmony_ci /* force front speaker to DAC1 */ 669362306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 669462306a36Sopenharmony_ci break; 669562306a36Sopenharmony_ci } 669662306a36Sopenharmony_ci} 669762306a36Sopenharmony_ci 669862306a36Sopenharmony_cistatic void alc285_fixup_hp_envy_x360(struct hda_codec *codec, 669962306a36Sopenharmony_ci const struct hda_fixup *fix, 670062306a36Sopenharmony_ci int action) 670162306a36Sopenharmony_ci{ 670262306a36Sopenharmony_ci static const struct coef_fw coefs[] = { 670362306a36Sopenharmony_ci WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023), 670462306a36Sopenharmony_ci WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03), 670562306a36Sopenharmony_ci WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a), 670662306a36Sopenharmony_ci WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014), 670762306a36Sopenharmony_ci WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15), 670862306a36Sopenharmony_ci WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489), 670962306a36Sopenharmony_ci WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0), 671062306a36Sopenharmony_ci WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000), 671162306a36Sopenharmony_ci WRITE_COEF(0x6e, 0x1005), { } 671262306a36Sopenharmony_ci }; 671362306a36Sopenharmony_ci 671462306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 671562306a36Sopenharmony_ci { 0x12, 0xb7a60130 }, /* Internal microphone*/ 671662306a36Sopenharmony_ci { 0x14, 0x90170150 }, /* B&O soundbar speakers */ 671762306a36Sopenharmony_ci { 0x17, 0x90170153 }, /* Side speakers */ 671862306a36Sopenharmony_ci { 0x19, 0x03a11040 }, /* Headset microphone */ 671962306a36Sopenharmony_ci { } 672062306a36Sopenharmony_ci }; 672162306a36Sopenharmony_ci 672262306a36Sopenharmony_ci switch (action) { 672362306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 672462306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 672562306a36Sopenharmony_ci 672662306a36Sopenharmony_ci /* Fixes volume control problem for side speakers */ 672762306a36Sopenharmony_ci alc295_fixup_disable_dac3(codec, fix, action); 672862306a36Sopenharmony_ci 672962306a36Sopenharmony_ci /* Fixes no sound from headset speaker */ 673062306a36Sopenharmony_ci snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0); 673162306a36Sopenharmony_ci 673262306a36Sopenharmony_ci /* Auto-enable headset mic when plugged */ 673362306a36Sopenharmony_ci snd_hda_jack_set_gating_jack(codec, 0x19, 0x21); 673462306a36Sopenharmony_ci 673562306a36Sopenharmony_ci /* Headset mic volume enhancement */ 673662306a36Sopenharmony_ci snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50); 673762306a36Sopenharmony_ci break; 673862306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 673962306a36Sopenharmony_ci alc_process_coef_fw(codec, coefs); 674062306a36Sopenharmony_ci break; 674162306a36Sopenharmony_ci case HDA_FIXUP_ACT_BUILD: 674262306a36Sopenharmony_ci rename_ctl(codec, "Bass Speaker Playback Volume", 674362306a36Sopenharmony_ci "B&O-Tuned Playback Volume"); 674462306a36Sopenharmony_ci rename_ctl(codec, "Front Playback Switch", 674562306a36Sopenharmony_ci "B&O Soundbar Playback Switch"); 674662306a36Sopenharmony_ci rename_ctl(codec, "Bass Speaker Playback Switch", 674762306a36Sopenharmony_ci "Side Speaker Playback Switch"); 674862306a36Sopenharmony_ci break; 674962306a36Sopenharmony_ci } 675062306a36Sopenharmony_ci} 675162306a36Sopenharmony_ci 675262306a36Sopenharmony_ci/* for hda_fixup_thinkpad_acpi() */ 675362306a36Sopenharmony_ci#include "thinkpad_helper.c" 675462306a36Sopenharmony_ci 675562306a36Sopenharmony_cistatic void alc_fixup_thinkpad_acpi(struct hda_codec *codec, 675662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 675762306a36Sopenharmony_ci{ 675862306a36Sopenharmony_ci alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */ 675962306a36Sopenharmony_ci hda_fixup_thinkpad_acpi(codec, fix, action); 676062306a36Sopenharmony_ci} 676162306a36Sopenharmony_ci 676262306a36Sopenharmony_ci/* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */ 676362306a36Sopenharmony_cistatic void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec, 676462306a36Sopenharmony_ci const struct hda_fixup *fix, 676562306a36Sopenharmony_ci int action) 676662306a36Sopenharmony_ci{ 676762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 676862306a36Sopenharmony_ci 676962306a36Sopenharmony_ci switch (action) { 677062306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 677162306a36Sopenharmony_ci spec->gen.suppress_auto_mute = 1; 677262306a36Sopenharmony_ci break; 677362306a36Sopenharmony_ci } 677462306a36Sopenharmony_ci} 677562306a36Sopenharmony_ci 677662306a36Sopenharmony_cistatic int comp_bind(struct device *dev) 677762306a36Sopenharmony_ci{ 677862306a36Sopenharmony_ci struct hda_codec *cdc = dev_to_hda_codec(dev); 677962306a36Sopenharmony_ci struct alc_spec *spec = cdc->spec; 678062306a36Sopenharmony_ci 678162306a36Sopenharmony_ci return component_bind_all(dev, spec->comps); 678262306a36Sopenharmony_ci} 678362306a36Sopenharmony_ci 678462306a36Sopenharmony_cistatic void comp_unbind(struct device *dev) 678562306a36Sopenharmony_ci{ 678662306a36Sopenharmony_ci struct hda_codec *cdc = dev_to_hda_codec(dev); 678762306a36Sopenharmony_ci struct alc_spec *spec = cdc->spec; 678862306a36Sopenharmony_ci 678962306a36Sopenharmony_ci component_unbind_all(dev, spec->comps); 679062306a36Sopenharmony_ci} 679162306a36Sopenharmony_ci 679262306a36Sopenharmony_cistatic const struct component_master_ops comp_master_ops = { 679362306a36Sopenharmony_ci .bind = comp_bind, 679462306a36Sopenharmony_ci .unbind = comp_unbind, 679562306a36Sopenharmony_ci}; 679662306a36Sopenharmony_ci 679762306a36Sopenharmony_cistatic void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc, 679862306a36Sopenharmony_ci struct snd_pcm_substream *sub, int action) 679962306a36Sopenharmony_ci{ 680062306a36Sopenharmony_ci struct alc_spec *spec = cdc->spec; 680162306a36Sopenharmony_ci int i; 680262306a36Sopenharmony_ci 680362306a36Sopenharmony_ci for (i = 0; i < HDA_MAX_COMPONENTS; i++) { 680462306a36Sopenharmony_ci if (spec->comps[i].dev && spec->comps[i].pre_playback_hook) 680562306a36Sopenharmony_ci spec->comps[i].pre_playback_hook(spec->comps[i].dev, action); 680662306a36Sopenharmony_ci } 680762306a36Sopenharmony_ci for (i = 0; i < HDA_MAX_COMPONENTS; i++) { 680862306a36Sopenharmony_ci if (spec->comps[i].dev && spec->comps[i].playback_hook) 680962306a36Sopenharmony_ci spec->comps[i].playback_hook(spec->comps[i].dev, action); 681062306a36Sopenharmony_ci } 681162306a36Sopenharmony_ci for (i = 0; i < HDA_MAX_COMPONENTS; i++) { 681262306a36Sopenharmony_ci if (spec->comps[i].dev && spec->comps[i].post_playback_hook) 681362306a36Sopenharmony_ci spec->comps[i].post_playback_hook(spec->comps[i].dev, action); 681462306a36Sopenharmony_ci } 681562306a36Sopenharmony_ci} 681662306a36Sopenharmony_ci 681762306a36Sopenharmony_cistruct scodec_dev_name { 681862306a36Sopenharmony_ci const char *bus; 681962306a36Sopenharmony_ci const char *hid; 682062306a36Sopenharmony_ci int index; 682162306a36Sopenharmony_ci}; 682262306a36Sopenharmony_ci 682362306a36Sopenharmony_ci/* match the device name in a slightly relaxed manner */ 682462306a36Sopenharmony_cistatic int comp_match_cs35l41_dev_name(struct device *dev, void *data) 682562306a36Sopenharmony_ci{ 682662306a36Sopenharmony_ci struct scodec_dev_name *p = data; 682762306a36Sopenharmony_ci const char *d = dev_name(dev); 682862306a36Sopenharmony_ci int n = strlen(p->bus); 682962306a36Sopenharmony_ci char tmp[32]; 683062306a36Sopenharmony_ci 683162306a36Sopenharmony_ci /* check the bus name */ 683262306a36Sopenharmony_ci if (strncmp(d, p->bus, n)) 683362306a36Sopenharmony_ci return 0; 683462306a36Sopenharmony_ci /* skip the bus number */ 683562306a36Sopenharmony_ci if (isdigit(d[n])) 683662306a36Sopenharmony_ci n++; 683762306a36Sopenharmony_ci /* the rest must be exact matching */ 683862306a36Sopenharmony_ci snprintf(tmp, sizeof(tmp), "-%s:00-cs35l41-hda.%d", p->hid, p->index); 683962306a36Sopenharmony_ci return !strcmp(d + n, tmp); 684062306a36Sopenharmony_ci} 684162306a36Sopenharmony_ci 684262306a36Sopenharmony_cistatic int comp_match_tas2781_dev_name(struct device *dev, 684362306a36Sopenharmony_ci void *data) 684462306a36Sopenharmony_ci{ 684562306a36Sopenharmony_ci struct scodec_dev_name *p = data; 684662306a36Sopenharmony_ci const char *d = dev_name(dev); 684762306a36Sopenharmony_ci int n = strlen(p->bus); 684862306a36Sopenharmony_ci char tmp[32]; 684962306a36Sopenharmony_ci 685062306a36Sopenharmony_ci /* check the bus name */ 685162306a36Sopenharmony_ci if (strncmp(d, p->bus, n)) 685262306a36Sopenharmony_ci return 0; 685362306a36Sopenharmony_ci /* skip the bus number */ 685462306a36Sopenharmony_ci if (isdigit(d[n])) 685562306a36Sopenharmony_ci n++; 685662306a36Sopenharmony_ci /* the rest must be exact matching */ 685762306a36Sopenharmony_ci snprintf(tmp, sizeof(tmp), "-%s:00", p->hid); 685862306a36Sopenharmony_ci 685962306a36Sopenharmony_ci return !strcmp(d + n, tmp); 686062306a36Sopenharmony_ci} 686162306a36Sopenharmony_ci 686262306a36Sopenharmony_cistatic void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus, 686362306a36Sopenharmony_ci const char *hid, int count) 686462306a36Sopenharmony_ci{ 686562306a36Sopenharmony_ci struct device *dev = hda_codec_dev(cdc); 686662306a36Sopenharmony_ci struct alc_spec *spec = cdc->spec; 686762306a36Sopenharmony_ci struct scodec_dev_name *rec; 686862306a36Sopenharmony_ci int ret, i; 686962306a36Sopenharmony_ci 687062306a36Sopenharmony_ci switch (action) { 687162306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 687262306a36Sopenharmony_ci for (i = 0; i < count; i++) { 687362306a36Sopenharmony_ci rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL); 687462306a36Sopenharmony_ci if (!rec) 687562306a36Sopenharmony_ci return; 687662306a36Sopenharmony_ci rec->bus = bus; 687762306a36Sopenharmony_ci rec->hid = hid; 687862306a36Sopenharmony_ci rec->index = i; 687962306a36Sopenharmony_ci spec->comps[i].codec = cdc; 688062306a36Sopenharmony_ci component_match_add(dev, &spec->match, 688162306a36Sopenharmony_ci comp_match_cs35l41_dev_name, rec); 688262306a36Sopenharmony_ci } 688362306a36Sopenharmony_ci ret = component_master_add_with_match(dev, &comp_master_ops, spec->match); 688462306a36Sopenharmony_ci if (ret) 688562306a36Sopenharmony_ci codec_err(cdc, "Fail to register component aggregator %d\n", ret); 688662306a36Sopenharmony_ci else 688762306a36Sopenharmony_ci spec->gen.pcm_playback_hook = comp_generic_playback_hook; 688862306a36Sopenharmony_ci break; 688962306a36Sopenharmony_ci case HDA_FIXUP_ACT_FREE: 689062306a36Sopenharmony_ci component_master_del(dev, &comp_master_ops); 689162306a36Sopenharmony_ci break; 689262306a36Sopenharmony_ci } 689362306a36Sopenharmony_ci} 689462306a36Sopenharmony_ci 689562306a36Sopenharmony_cistatic void tas2781_generic_fixup(struct hda_codec *cdc, int action, 689662306a36Sopenharmony_ci const char *bus, const char *hid) 689762306a36Sopenharmony_ci{ 689862306a36Sopenharmony_ci struct device *dev = hda_codec_dev(cdc); 689962306a36Sopenharmony_ci struct alc_spec *spec = cdc->spec; 690062306a36Sopenharmony_ci struct scodec_dev_name *rec; 690162306a36Sopenharmony_ci int ret; 690262306a36Sopenharmony_ci 690362306a36Sopenharmony_ci switch (action) { 690462306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 690562306a36Sopenharmony_ci rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL); 690662306a36Sopenharmony_ci if (!rec) 690762306a36Sopenharmony_ci return; 690862306a36Sopenharmony_ci rec->bus = bus; 690962306a36Sopenharmony_ci rec->hid = hid; 691062306a36Sopenharmony_ci rec->index = 0; 691162306a36Sopenharmony_ci spec->comps[0].codec = cdc; 691262306a36Sopenharmony_ci component_match_add(dev, &spec->match, 691362306a36Sopenharmony_ci comp_match_tas2781_dev_name, rec); 691462306a36Sopenharmony_ci ret = component_master_add_with_match(dev, &comp_master_ops, 691562306a36Sopenharmony_ci spec->match); 691662306a36Sopenharmony_ci if (ret) 691762306a36Sopenharmony_ci codec_err(cdc, 691862306a36Sopenharmony_ci "Fail to register component aggregator %d\n", 691962306a36Sopenharmony_ci ret); 692062306a36Sopenharmony_ci else 692162306a36Sopenharmony_ci spec->gen.pcm_playback_hook = 692262306a36Sopenharmony_ci comp_generic_playback_hook; 692362306a36Sopenharmony_ci break; 692462306a36Sopenharmony_ci case HDA_FIXUP_ACT_FREE: 692562306a36Sopenharmony_ci component_master_del(dev, &comp_master_ops); 692662306a36Sopenharmony_ci break; 692762306a36Sopenharmony_ci } 692862306a36Sopenharmony_ci} 692962306a36Sopenharmony_ci 693062306a36Sopenharmony_cistatic void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action) 693162306a36Sopenharmony_ci{ 693262306a36Sopenharmony_ci cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2); 693362306a36Sopenharmony_ci} 693462306a36Sopenharmony_ci 693562306a36Sopenharmony_cistatic void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action) 693662306a36Sopenharmony_ci{ 693762306a36Sopenharmony_ci cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 2); 693862306a36Sopenharmony_ci} 693962306a36Sopenharmony_ci 694062306a36Sopenharmony_cistatic void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action) 694162306a36Sopenharmony_ci{ 694262306a36Sopenharmony_ci cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 4); 694362306a36Sopenharmony_ci} 694462306a36Sopenharmony_ci 694562306a36Sopenharmony_cistatic void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix, 694662306a36Sopenharmony_ci int action) 694762306a36Sopenharmony_ci{ 694862306a36Sopenharmony_ci cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2); 694962306a36Sopenharmony_ci} 695062306a36Sopenharmony_ci 695162306a36Sopenharmony_cistatic void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix, 695262306a36Sopenharmony_ci int action) 695362306a36Sopenharmony_ci{ 695462306a36Sopenharmony_ci cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2); 695562306a36Sopenharmony_ci} 695662306a36Sopenharmony_ci 695762306a36Sopenharmony_cistatic void tas2781_fixup_i2c(struct hda_codec *cdc, 695862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 695962306a36Sopenharmony_ci{ 696062306a36Sopenharmony_ci tas2781_generic_fixup(cdc, action, "i2c", "TIAS2781"); 696162306a36Sopenharmony_ci} 696262306a36Sopenharmony_ci 696362306a36Sopenharmony_ci/* for alc295_fixup_hp_top_speakers */ 696462306a36Sopenharmony_ci#include "hp_x360_helper.c" 696562306a36Sopenharmony_ci 696662306a36Sopenharmony_ci/* for alc285_fixup_ideapad_s740_coef() */ 696762306a36Sopenharmony_ci#include "ideapad_s740_helper.c" 696862306a36Sopenharmony_ci 696962306a36Sopenharmony_cistatic const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = { 697062306a36Sopenharmony_ci WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000), 697162306a36Sopenharmony_ci WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000), 697262306a36Sopenharmony_ci WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089), 697362306a36Sopenharmony_ci {} 697462306a36Sopenharmony_ci}; 697562306a36Sopenharmony_ci 697662306a36Sopenharmony_cistatic void alc256_fixup_set_coef_defaults(struct hda_codec *codec, 697762306a36Sopenharmony_ci const struct hda_fixup *fix, 697862306a36Sopenharmony_ci int action) 697962306a36Sopenharmony_ci{ 698062306a36Sopenharmony_ci /* 698162306a36Sopenharmony_ci * A certain other OS sets these coeffs to different values. On at least 698262306a36Sopenharmony_ci * one TongFang barebone these settings might survive even a cold 698362306a36Sopenharmony_ci * reboot. So to restore a clean slate the values are explicitly reset 698462306a36Sopenharmony_ci * to default here. Without this, the external microphone is always in a 698562306a36Sopenharmony_ci * plugged-in state, while the internal microphone is always in an 698662306a36Sopenharmony_ci * unplugged state, breaking the ability to use the internal microphone. 698762306a36Sopenharmony_ci */ 698862306a36Sopenharmony_ci alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs); 698962306a36Sopenharmony_ci} 699062306a36Sopenharmony_ci 699162306a36Sopenharmony_cistatic const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = { 699262306a36Sopenharmony_ci WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06), 699362306a36Sopenharmony_ci WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074), 699462306a36Sopenharmony_ci WRITE_COEF(0x49, 0x0149), 699562306a36Sopenharmony_ci {} 699662306a36Sopenharmony_ci}; 699762306a36Sopenharmony_ci 699862306a36Sopenharmony_cistatic void alc233_fixup_no_audio_jack(struct hda_codec *codec, 699962306a36Sopenharmony_ci const struct hda_fixup *fix, 700062306a36Sopenharmony_ci int action) 700162306a36Sopenharmony_ci{ 700262306a36Sopenharmony_ci /* 700362306a36Sopenharmony_ci * The audio jack input and output is not detected on the ASRock NUC Box 700462306a36Sopenharmony_ci * 1100 series when cold booting without this fix. Warm rebooting from a 700562306a36Sopenharmony_ci * certain other OS makes the audio functional, as COEF settings are 700662306a36Sopenharmony_ci * preserved in this case. This fix sets these altered COEF values as 700762306a36Sopenharmony_ci * the default. 700862306a36Sopenharmony_ci */ 700962306a36Sopenharmony_ci alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs); 701062306a36Sopenharmony_ci} 701162306a36Sopenharmony_ci 701262306a36Sopenharmony_cistatic void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec, 701362306a36Sopenharmony_ci const struct hda_fixup *fix, 701462306a36Sopenharmony_ci int action) 701562306a36Sopenharmony_ci{ 701662306a36Sopenharmony_ci /* 701762306a36Sopenharmony_ci * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec, 701862306a36Sopenharmony_ci * but uses the 0x8686 subproduct id in both cases. The ALC256 codec 701962306a36Sopenharmony_ci * needs an additional quirk for sound working after suspend and resume. 702062306a36Sopenharmony_ci */ 702162306a36Sopenharmony_ci if (codec->core.vendor_id == 0x10ec0256) { 702262306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x10, 1<<9, 0); 702362306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120); 702462306a36Sopenharmony_ci } else { 702562306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c); 702662306a36Sopenharmony_ci } 702762306a36Sopenharmony_ci} 702862306a36Sopenharmony_ci 702962306a36Sopenharmony_cistatic void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec, 703062306a36Sopenharmony_ci const struct hda_fixup *fix, 703162306a36Sopenharmony_ci int action) 703262306a36Sopenharmony_ci{ 703362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 703462306a36Sopenharmony_ci struct hda_input_mux *imux = &spec->gen.input_mux; 703562306a36Sopenharmony_ci int i; 703662306a36Sopenharmony_ci 703762306a36Sopenharmony_ci alc269_fixup_limit_int_mic_boost(codec, fix, action); 703862306a36Sopenharmony_ci 703962306a36Sopenharmony_ci switch (action) { 704062306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 704162306a36Sopenharmony_ci /** 704262306a36Sopenharmony_ci * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic) 704362306a36Sopenharmony_ci * to Hi-Z to avoid pop noises at startup and when plugging and 704462306a36Sopenharmony_ci * unplugging headphones. 704562306a36Sopenharmony_ci */ 704662306a36Sopenharmony_ci snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ); 704762306a36Sopenharmony_ci snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ); 704862306a36Sopenharmony_ci break; 704962306a36Sopenharmony_ci case HDA_FIXUP_ACT_PROBE: 705062306a36Sopenharmony_ci /** 705162306a36Sopenharmony_ci * Make the internal mic (0x12) the default input source to 705262306a36Sopenharmony_ci * prevent pop noises on cold boot. 705362306a36Sopenharmony_ci */ 705462306a36Sopenharmony_ci for (i = 0; i < imux->num_items; i++) { 705562306a36Sopenharmony_ci if (spec->gen.imux_pins[i] == 0x12) { 705662306a36Sopenharmony_ci spec->gen.cur_mux[0] = i; 705762306a36Sopenharmony_ci break; 705862306a36Sopenharmony_ci } 705962306a36Sopenharmony_ci } 706062306a36Sopenharmony_ci break; 706162306a36Sopenharmony_ci } 706262306a36Sopenharmony_ci} 706362306a36Sopenharmony_ci 706462306a36Sopenharmony_cistatic void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec, 706562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 706662306a36Sopenharmony_ci{ 706762306a36Sopenharmony_ci /* 706862306a36Sopenharmony_ci * The Pin Complex 0x17 for the bass speakers is wrongly reported as 706962306a36Sopenharmony_ci * unconnected. 707062306a36Sopenharmony_ci */ 707162306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 707262306a36Sopenharmony_ci { 0x17, 0x90170121 }, 707362306a36Sopenharmony_ci { } 707462306a36Sopenharmony_ci }; 707562306a36Sopenharmony_ci /* 707662306a36Sopenharmony_ci * Avoid DAC 0x06 and 0x08, as they have no volume controls. 707762306a36Sopenharmony_ci * DAC 0x02 and 0x03 would be fine. 707862306a36Sopenharmony_ci */ 707962306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02, 0x03 }; 708062306a36Sopenharmony_ci /* 708162306a36Sopenharmony_ci * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02. 708262306a36Sopenharmony_ci * Headphones (0x21) are connected to DAC 0x03. 708362306a36Sopenharmony_ci */ 708462306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 708562306a36Sopenharmony_ci 0x14, 0x02, 708662306a36Sopenharmony_ci 0x17, 0x02, 708762306a36Sopenharmony_ci 0x21, 0x03, 708862306a36Sopenharmony_ci 0 708962306a36Sopenharmony_ci }; 709062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 709162306a36Sopenharmony_ci 709262306a36Sopenharmony_ci switch (action) { 709362306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 709462306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 709562306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 709662306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 709762306a36Sopenharmony_ci break; 709862306a36Sopenharmony_ci } 709962306a36Sopenharmony_ci} 710062306a36Sopenharmony_ci 710162306a36Sopenharmony_cistatic void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec, 710262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 710362306a36Sopenharmony_ci{ 710462306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 710562306a36Sopenharmony_ci { 0x14, 0x90170151 }, 710662306a36Sopenharmony_ci { 0x17, 0x90170150 }, 710762306a36Sopenharmony_ci { } 710862306a36Sopenharmony_ci }; 710962306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02, 0x03 }; 711062306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 711162306a36Sopenharmony_ci 0x14, 0x02, 711262306a36Sopenharmony_ci 0x17, 0x03, 711362306a36Sopenharmony_ci 0x21, 0x02, 711462306a36Sopenharmony_ci 0 711562306a36Sopenharmony_ci }; 711662306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 711762306a36Sopenharmony_ci 711862306a36Sopenharmony_ci alc_fixup_no_shutup(codec, fix, action); 711962306a36Sopenharmony_ci 712062306a36Sopenharmony_ci switch (action) { 712162306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 712262306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 712362306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 712462306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 712562306a36Sopenharmony_ci break; 712662306a36Sopenharmony_ci } 712762306a36Sopenharmony_ci} 712862306a36Sopenharmony_ci 712962306a36Sopenharmony_ci/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */ 713062306a36Sopenharmony_cistatic void alc287_fixup_bind_dacs(struct hda_codec *codec, 713162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 713262306a36Sopenharmony_ci{ 713362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 713462306a36Sopenharmony_ci static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */ 713562306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 713662306a36Sopenharmony_ci 0x17, 0x02, 0x21, 0x03, 0 713762306a36Sopenharmony_ci }; 713862306a36Sopenharmony_ci 713962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 714062306a36Sopenharmony_ci return; 714162306a36Sopenharmony_ci 714262306a36Sopenharmony_ci snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 714362306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 714462306a36Sopenharmony_ci spec->gen.auto_mute_via_amp = 1; 714562306a36Sopenharmony_ci if (spec->gen.autocfg.speaker_pins[0] != 0x14) { 714662306a36Sopenharmony_ci snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 714762306a36Sopenharmony_ci 0x0); /* Make sure 0x14 was disable */ 714862306a36Sopenharmony_ci } 714962306a36Sopenharmony_ci} 715062306a36Sopenharmony_ci/* Fix none verb table of Headset Mic pin */ 715162306a36Sopenharmony_cistatic void alc_fixup_headset_mic(struct hda_codec *codec, 715262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 715362306a36Sopenharmony_ci{ 715462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 715562306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 715662306a36Sopenharmony_ci { 0x19, 0x03a1103c }, 715762306a36Sopenharmony_ci { } 715862306a36Sopenharmony_ci }; 715962306a36Sopenharmony_ci 716062306a36Sopenharmony_ci switch (action) { 716162306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 716262306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 716362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 716462306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 716562306a36Sopenharmony_ci break; 716662306a36Sopenharmony_ci } 716762306a36Sopenharmony_ci} 716862306a36Sopenharmony_ci 716962306a36Sopenharmony_ci 717062306a36Sopenharmony_cienum { 717162306a36Sopenharmony_ci ALC269_FIXUP_GPIO2, 717262306a36Sopenharmony_ci ALC269_FIXUP_SONY_VAIO, 717362306a36Sopenharmony_ci ALC275_FIXUP_SONY_VAIO_GPIO2, 717462306a36Sopenharmony_ci ALC269_FIXUP_DELL_M101Z, 717562306a36Sopenharmony_ci ALC269_FIXUP_SKU_IGNORE, 717662306a36Sopenharmony_ci ALC269_FIXUP_ASUS_G73JW, 717762306a36Sopenharmony_ci ALC269_FIXUP_ASUS_N7601ZM_PINS, 717862306a36Sopenharmony_ci ALC269_FIXUP_ASUS_N7601ZM, 717962306a36Sopenharmony_ci ALC269_FIXUP_LENOVO_EAPD, 718062306a36Sopenharmony_ci ALC275_FIXUP_SONY_HWEQ, 718162306a36Sopenharmony_ci ALC275_FIXUP_SONY_DISABLE_AAMIX, 718262306a36Sopenharmony_ci ALC271_FIXUP_DMIC, 718362306a36Sopenharmony_ci ALC269_FIXUP_PCM_44K, 718462306a36Sopenharmony_ci ALC269_FIXUP_STEREO_DMIC, 718562306a36Sopenharmony_ci ALC269_FIXUP_HEADSET_MIC, 718662306a36Sopenharmony_ci ALC269_FIXUP_QUANTA_MUTE, 718762306a36Sopenharmony_ci ALC269_FIXUP_LIFEBOOK, 718862306a36Sopenharmony_ci ALC269_FIXUP_LIFEBOOK_EXTMIC, 718962306a36Sopenharmony_ci ALC269_FIXUP_LIFEBOOK_HP_PIN, 719062306a36Sopenharmony_ci ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT, 719162306a36Sopenharmony_ci ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, 719262306a36Sopenharmony_ci ALC269_FIXUP_AMIC, 719362306a36Sopenharmony_ci ALC269_FIXUP_DMIC, 719462306a36Sopenharmony_ci ALC269VB_FIXUP_AMIC, 719562306a36Sopenharmony_ci ALC269VB_FIXUP_DMIC, 719662306a36Sopenharmony_ci ALC269_FIXUP_HP_MUTE_LED, 719762306a36Sopenharmony_ci ALC269_FIXUP_HP_MUTE_LED_MIC1, 719862306a36Sopenharmony_ci ALC269_FIXUP_HP_MUTE_LED_MIC2, 719962306a36Sopenharmony_ci ALC269_FIXUP_HP_MUTE_LED_MIC3, 720062306a36Sopenharmony_ci ALC269_FIXUP_HP_GPIO_LED, 720162306a36Sopenharmony_ci ALC269_FIXUP_HP_GPIO_MIC1_LED, 720262306a36Sopenharmony_ci ALC269_FIXUP_HP_LINE1_MIC1_LED, 720362306a36Sopenharmony_ci ALC269_FIXUP_INV_DMIC, 720462306a36Sopenharmony_ci ALC269_FIXUP_LENOVO_DOCK, 720562306a36Sopenharmony_ci ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, 720662306a36Sopenharmony_ci ALC269_FIXUP_NO_SHUTUP, 720762306a36Sopenharmony_ci ALC286_FIXUP_SONY_MIC_NO_PRESENCE, 720862306a36Sopenharmony_ci ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT, 720962306a36Sopenharmony_ci ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, 721062306a36Sopenharmony_ci ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, 721162306a36Sopenharmony_ci ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, 721262306a36Sopenharmony_ci ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, 721362306a36Sopenharmony_ci ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET, 721462306a36Sopenharmony_ci ALC269_FIXUP_HEADSET_MODE, 721562306a36Sopenharmony_ci ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, 721662306a36Sopenharmony_ci ALC269_FIXUP_ASPIRE_HEADSET_MIC, 721762306a36Sopenharmony_ci ALC269_FIXUP_ASUS_X101_FUNC, 721862306a36Sopenharmony_ci ALC269_FIXUP_ASUS_X101_VERB, 721962306a36Sopenharmony_ci ALC269_FIXUP_ASUS_X101, 722062306a36Sopenharmony_ci ALC271_FIXUP_AMIC_MIC2, 722162306a36Sopenharmony_ci ALC271_FIXUP_HP_GATE_MIC_JACK, 722262306a36Sopenharmony_ci ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, 722362306a36Sopenharmony_ci ALC269_FIXUP_ACER_AC700, 722462306a36Sopenharmony_ci ALC269_FIXUP_LIMIT_INT_MIC_BOOST, 722562306a36Sopenharmony_ci ALC269VB_FIXUP_ASUS_ZENBOOK, 722662306a36Sopenharmony_ci ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, 722762306a36Sopenharmony_ci ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE, 722862306a36Sopenharmony_ci ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED, 722962306a36Sopenharmony_ci ALC269VB_FIXUP_ORDISSIMO_EVE2, 723062306a36Sopenharmony_ci ALC283_FIXUP_CHROME_BOOK, 723162306a36Sopenharmony_ci ALC283_FIXUP_SENSE_COMBO_JACK, 723262306a36Sopenharmony_ci ALC282_FIXUP_ASUS_TX300, 723362306a36Sopenharmony_ci ALC283_FIXUP_INT_MIC, 723462306a36Sopenharmony_ci ALC290_FIXUP_MONO_SPEAKERS, 723562306a36Sopenharmony_ci ALC290_FIXUP_MONO_SPEAKERS_HSJACK, 723662306a36Sopenharmony_ci ALC290_FIXUP_SUBWOOFER, 723762306a36Sopenharmony_ci ALC290_FIXUP_SUBWOOFER_HSJACK, 723862306a36Sopenharmony_ci ALC269_FIXUP_THINKPAD_ACPI, 723962306a36Sopenharmony_ci ALC269_FIXUP_DMIC_THINKPAD_ACPI, 724062306a36Sopenharmony_ci ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO, 724162306a36Sopenharmony_ci ALC255_FIXUP_ACER_MIC_NO_PRESENCE, 724262306a36Sopenharmony_ci ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, 724362306a36Sopenharmony_ci ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 724462306a36Sopenharmony_ci ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, 724562306a36Sopenharmony_ci ALC255_FIXUP_HEADSET_MODE, 724662306a36Sopenharmony_ci ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC, 724762306a36Sopenharmony_ci ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, 724862306a36Sopenharmony_ci ALC292_FIXUP_TPT440_DOCK, 724962306a36Sopenharmony_ci ALC292_FIXUP_TPT440, 725062306a36Sopenharmony_ci ALC283_FIXUP_HEADSET_MIC, 725162306a36Sopenharmony_ci ALC255_FIXUP_MIC_MUTE_LED, 725262306a36Sopenharmony_ci ALC282_FIXUP_ASPIRE_V5_PINS, 725362306a36Sopenharmony_ci ALC269VB_FIXUP_ASPIRE_E1_COEF, 725462306a36Sopenharmony_ci ALC280_FIXUP_HP_GPIO4, 725562306a36Sopenharmony_ci ALC286_FIXUP_HP_GPIO_LED, 725662306a36Sopenharmony_ci ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, 725762306a36Sopenharmony_ci ALC280_FIXUP_HP_DOCK_PINS, 725862306a36Sopenharmony_ci ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, 725962306a36Sopenharmony_ci ALC280_FIXUP_HP_9480M, 726062306a36Sopenharmony_ci ALC245_FIXUP_HP_X360_AMP, 726162306a36Sopenharmony_ci ALC285_FIXUP_HP_SPECTRE_X360_EB1, 726262306a36Sopenharmony_ci ALC285_FIXUP_HP_ENVY_X360, 726362306a36Sopenharmony_ci ALC288_FIXUP_DELL_HEADSET_MODE, 726462306a36Sopenharmony_ci ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, 726562306a36Sopenharmony_ci ALC288_FIXUP_DELL_XPS_13, 726662306a36Sopenharmony_ci ALC288_FIXUP_DISABLE_AAMIX, 726762306a36Sopenharmony_ci ALC292_FIXUP_DELL_E7X_AAMIX, 726862306a36Sopenharmony_ci ALC292_FIXUP_DELL_E7X, 726962306a36Sopenharmony_ci ALC292_FIXUP_DISABLE_AAMIX, 727062306a36Sopenharmony_ci ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, 727162306a36Sopenharmony_ci ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE, 727262306a36Sopenharmony_ci ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, 727362306a36Sopenharmony_ci ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, 727462306a36Sopenharmony_ci ALC275_FIXUP_DELL_XPS, 727562306a36Sopenharmony_ci ALC293_FIXUP_LENOVO_SPK_NOISE, 727662306a36Sopenharmony_ci ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, 727762306a36Sopenharmony_ci ALC255_FIXUP_DELL_SPK_NOISE, 727862306a36Sopenharmony_ci ALC225_FIXUP_DISABLE_MIC_VREF, 727962306a36Sopenharmony_ci ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 728062306a36Sopenharmony_ci ALC295_FIXUP_DISABLE_DAC3, 728162306a36Sopenharmony_ci ALC285_FIXUP_SPEAKER2_TO_DAC1, 728262306a36Sopenharmony_ci ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1, 728362306a36Sopenharmony_ci ALC285_FIXUP_ASUS_HEADSET_MIC, 728462306a36Sopenharmony_ci ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS, 728562306a36Sopenharmony_ci ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1, 728662306a36Sopenharmony_ci ALC285_FIXUP_ASUS_I2C_HEADSET_MIC, 728762306a36Sopenharmony_ci ALC280_FIXUP_HP_HEADSET_MIC, 728862306a36Sopenharmony_ci ALC221_FIXUP_HP_FRONT_MIC, 728962306a36Sopenharmony_ci ALC292_FIXUP_TPT460, 729062306a36Sopenharmony_ci ALC298_FIXUP_SPK_VOLUME, 729162306a36Sopenharmony_ci ALC298_FIXUP_LENOVO_SPK_VOLUME, 729262306a36Sopenharmony_ci ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, 729362306a36Sopenharmony_ci ALC269_FIXUP_ATIV_BOOK_8, 729462306a36Sopenharmony_ci ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE, 729562306a36Sopenharmony_ci ALC221_FIXUP_HP_MIC_NO_PRESENCE, 729662306a36Sopenharmony_ci ALC256_FIXUP_ASUS_HEADSET_MODE, 729762306a36Sopenharmony_ci ALC256_FIXUP_ASUS_MIC, 729862306a36Sopenharmony_ci ALC256_FIXUP_ASUS_AIO_GPIO2, 729962306a36Sopenharmony_ci ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, 730062306a36Sopenharmony_ci ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, 730162306a36Sopenharmony_ci ALC233_FIXUP_LENOVO_MULTI_CODECS, 730262306a36Sopenharmony_ci ALC233_FIXUP_ACER_HEADSET_MIC, 730362306a36Sopenharmony_ci ALC294_FIXUP_LENOVO_MIC_LOCATION, 730462306a36Sopenharmony_ci ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, 730562306a36Sopenharmony_ci ALC225_FIXUP_S3_POP_NOISE, 730662306a36Sopenharmony_ci ALC700_FIXUP_INTEL_REFERENCE, 730762306a36Sopenharmony_ci ALC274_FIXUP_DELL_BIND_DACS, 730862306a36Sopenharmony_ci ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, 730962306a36Sopenharmony_ci ALC298_FIXUP_TPT470_DOCK_FIX, 731062306a36Sopenharmony_ci ALC298_FIXUP_TPT470_DOCK, 731162306a36Sopenharmony_ci ALC255_FIXUP_DUMMY_LINEOUT_VERB, 731262306a36Sopenharmony_ci ALC255_FIXUP_DELL_HEADSET_MIC, 731362306a36Sopenharmony_ci ALC256_FIXUP_HUAWEI_MACH_WX9_PINS, 731462306a36Sopenharmony_ci ALC298_FIXUP_HUAWEI_MBX_STEREO, 731562306a36Sopenharmony_ci ALC295_FIXUP_HP_X360, 731662306a36Sopenharmony_ci ALC221_FIXUP_HP_HEADSET_MIC, 731762306a36Sopenharmony_ci ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, 731862306a36Sopenharmony_ci ALC295_FIXUP_HP_AUTO_MUTE, 731962306a36Sopenharmony_ci ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE, 732062306a36Sopenharmony_ci ALC294_FIXUP_ASUS_MIC, 732162306a36Sopenharmony_ci ALC294_FIXUP_ASUS_HEADSET_MIC, 732262306a36Sopenharmony_ci ALC294_FIXUP_ASUS_SPK, 732362306a36Sopenharmony_ci ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE, 732462306a36Sopenharmony_ci ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE, 732562306a36Sopenharmony_ci ALC255_FIXUP_ACER_HEADSET_MIC, 732662306a36Sopenharmony_ci ALC295_FIXUP_CHROME_BOOK, 732762306a36Sopenharmony_ci ALC225_FIXUP_HEADSET_JACK, 732862306a36Sopenharmony_ci ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE, 732962306a36Sopenharmony_ci ALC225_FIXUP_WYSE_AUTO_MUTE, 733062306a36Sopenharmony_ci ALC225_FIXUP_WYSE_DISABLE_MIC_VREF, 733162306a36Sopenharmony_ci ALC286_FIXUP_ACER_AIO_HEADSET_MIC, 733262306a36Sopenharmony_ci ALC256_FIXUP_ASUS_HEADSET_MIC, 733362306a36Sopenharmony_ci ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, 733462306a36Sopenharmony_ci ALC299_FIXUP_PREDATOR_SPK, 733562306a36Sopenharmony_ci ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, 733662306a36Sopenharmony_ci ALC289_FIXUP_DELL_SPK1, 733762306a36Sopenharmony_ci ALC289_FIXUP_DELL_SPK2, 733862306a36Sopenharmony_ci ALC289_FIXUP_DUAL_SPK, 733962306a36Sopenharmony_ci ALC289_FIXUP_RTK_AMP_DUAL_SPK, 734062306a36Sopenharmony_ci ALC294_FIXUP_SPK2_TO_DAC1, 734162306a36Sopenharmony_ci ALC294_FIXUP_ASUS_DUAL_SPK, 734262306a36Sopenharmony_ci ALC285_FIXUP_THINKPAD_X1_GEN7, 734362306a36Sopenharmony_ci ALC285_FIXUP_THINKPAD_HEADSET_JACK, 734462306a36Sopenharmony_ci ALC294_FIXUP_ASUS_ALLY, 734562306a36Sopenharmony_ci ALC294_FIXUP_ASUS_ALLY_PINS, 734662306a36Sopenharmony_ci ALC294_FIXUP_ASUS_ALLY_VERBS, 734762306a36Sopenharmony_ci ALC294_FIXUP_ASUS_ALLY_SPEAKER, 734862306a36Sopenharmony_ci ALC294_FIXUP_ASUS_HPE, 734962306a36Sopenharmony_ci ALC294_FIXUP_ASUS_COEF_1B, 735062306a36Sopenharmony_ci ALC294_FIXUP_ASUS_GX502_HP, 735162306a36Sopenharmony_ci ALC294_FIXUP_ASUS_GX502_PINS, 735262306a36Sopenharmony_ci ALC294_FIXUP_ASUS_GX502_VERBS, 735362306a36Sopenharmony_ci ALC294_FIXUP_ASUS_GU502_HP, 735462306a36Sopenharmony_ci ALC294_FIXUP_ASUS_GU502_PINS, 735562306a36Sopenharmony_ci ALC294_FIXUP_ASUS_GU502_VERBS, 735662306a36Sopenharmony_ci ALC294_FIXUP_ASUS_G513_PINS, 735762306a36Sopenharmony_ci ALC285_FIXUP_ASUS_G533Z_PINS, 735862306a36Sopenharmony_ci ALC285_FIXUP_HP_GPIO_LED, 735962306a36Sopenharmony_ci ALC285_FIXUP_HP_MUTE_LED, 736062306a36Sopenharmony_ci ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED, 736162306a36Sopenharmony_ci ALC236_FIXUP_HP_MUTE_LED_COEFBIT2, 736262306a36Sopenharmony_ci ALC236_FIXUP_HP_GPIO_LED, 736362306a36Sopenharmony_ci ALC236_FIXUP_HP_MUTE_LED, 736462306a36Sopenharmony_ci ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF, 736562306a36Sopenharmony_ci ALC298_FIXUP_SAMSUNG_AMP, 736662306a36Sopenharmony_ci ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, 736762306a36Sopenharmony_ci ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, 736862306a36Sopenharmony_ci ALC295_FIXUP_ASUS_MIC_NO_PRESENCE, 736962306a36Sopenharmony_ci ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS, 737062306a36Sopenharmony_ci ALC269VC_FIXUP_ACER_HEADSET_MIC, 737162306a36Sopenharmony_ci ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE, 737262306a36Sopenharmony_ci ALC289_FIXUP_ASUS_GA401, 737362306a36Sopenharmony_ci ALC289_FIXUP_ASUS_GA502, 737462306a36Sopenharmony_ci ALC256_FIXUP_ACER_MIC_NO_PRESENCE, 737562306a36Sopenharmony_ci ALC285_FIXUP_HP_GPIO_AMP_INIT, 737662306a36Sopenharmony_ci ALC269_FIXUP_CZC_B20, 737762306a36Sopenharmony_ci ALC269_FIXUP_CZC_TMI, 737862306a36Sopenharmony_ci ALC269_FIXUP_CZC_L101, 737962306a36Sopenharmony_ci ALC269_FIXUP_LEMOTE_A1802, 738062306a36Sopenharmony_ci ALC269_FIXUP_LEMOTE_A190X, 738162306a36Sopenharmony_ci ALC256_FIXUP_INTEL_NUC8_RUGGED, 738262306a36Sopenharmony_ci ALC233_FIXUP_INTEL_NUC8_DMIC, 738362306a36Sopenharmony_ci ALC233_FIXUP_INTEL_NUC8_BOOST, 738462306a36Sopenharmony_ci ALC256_FIXUP_INTEL_NUC10, 738562306a36Sopenharmony_ci ALC255_FIXUP_XIAOMI_HEADSET_MIC, 738662306a36Sopenharmony_ci ALC274_FIXUP_HP_MIC, 738762306a36Sopenharmony_ci ALC274_FIXUP_HP_HEADSET_MIC, 738862306a36Sopenharmony_ci ALC274_FIXUP_HP_ENVY_GPIO, 738962306a36Sopenharmony_ci ALC256_FIXUP_ASUS_HPE, 739062306a36Sopenharmony_ci ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK, 739162306a36Sopenharmony_ci ALC287_FIXUP_HP_GPIO_LED, 739262306a36Sopenharmony_ci ALC256_FIXUP_HP_HEADSET_MIC, 739362306a36Sopenharmony_ci ALC245_FIXUP_HP_GPIO_LED, 739462306a36Sopenharmony_ci ALC236_FIXUP_DELL_AIO_HEADSET_MIC, 739562306a36Sopenharmony_ci ALC282_FIXUP_ACER_DISABLE_LINEOUT, 739662306a36Sopenharmony_ci ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST, 739762306a36Sopenharmony_ci ALC256_FIXUP_ACER_HEADSET_MIC, 739862306a36Sopenharmony_ci ALC285_FIXUP_IDEAPAD_S740_COEF, 739962306a36Sopenharmony_ci ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST, 740062306a36Sopenharmony_ci ALC295_FIXUP_ASUS_DACS, 740162306a36Sopenharmony_ci ALC295_FIXUP_HP_OMEN, 740262306a36Sopenharmony_ci ALC285_FIXUP_HP_SPECTRE_X360, 740362306a36Sopenharmony_ci ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, 740462306a36Sopenharmony_ci ALC623_FIXUP_LENOVO_THINKSTATION_P340, 740562306a36Sopenharmony_ci ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, 740662306a36Sopenharmony_ci ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST, 740762306a36Sopenharmony_ci ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS, 740862306a36Sopenharmony_ci ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE, 740962306a36Sopenharmony_ci ALC287_FIXUP_YOGA7_14ITL_SPEAKERS, 741062306a36Sopenharmony_ci ALC298_FIXUP_LENOVO_C940_DUET7, 741162306a36Sopenharmony_ci ALC287_FIXUP_LENOVO_14IRP8_DUETITL, 741262306a36Sopenharmony_ci ALC287_FIXUP_13S_GEN2_SPEAKERS, 741362306a36Sopenharmony_ci ALC256_FIXUP_SET_COEF_DEFAULTS, 741462306a36Sopenharmony_ci ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE, 741562306a36Sopenharmony_ci ALC233_FIXUP_NO_AUDIO_JACK, 741662306a36Sopenharmony_ci ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME, 741762306a36Sopenharmony_ci ALC285_FIXUP_LEGION_Y9000X_SPEAKERS, 741862306a36Sopenharmony_ci ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE, 741962306a36Sopenharmony_ci ALC287_FIXUP_LEGION_16ACHG6, 742062306a36Sopenharmony_ci ALC287_FIXUP_CS35L41_I2C_2, 742162306a36Sopenharmony_ci ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED, 742262306a36Sopenharmony_ci ALC245_FIXUP_CS35L41_SPI_2, 742362306a36Sopenharmony_ci ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED, 742462306a36Sopenharmony_ci ALC245_FIXUP_CS35L41_SPI_4, 742562306a36Sopenharmony_ci ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED, 742662306a36Sopenharmony_ci ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED, 742762306a36Sopenharmony_ci ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE, 742862306a36Sopenharmony_ci ALC287_FIXUP_LEGION_16ITHG6, 742962306a36Sopenharmony_ci ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK, 743062306a36Sopenharmony_ci ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, 743162306a36Sopenharmony_ci ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS, 743262306a36Sopenharmony_ci ALC236_FIXUP_DELL_DUAL_CODECS, 743362306a36Sopenharmony_ci ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI, 743462306a36Sopenharmony_ci ALC287_FIXUP_TAS2781_I2C, 743562306a36Sopenharmony_ci ALC245_FIXUP_HP_MUTE_LED_COEFBIT, 743662306a36Sopenharmony_ci ALC245_FIXUP_HP_X360_MUTE_LEDS, 743762306a36Sopenharmony_ci ALC287_FIXUP_THINKPAD_I2S_SPK, 743862306a36Sopenharmony_ci ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD, 743962306a36Sopenharmony_ci ALC2XX_FIXUP_HEADSET_MIC, 744062306a36Sopenharmony_ci ALC289_FIXUP_DELL_CS35L41_SPI_2, 744162306a36Sopenharmony_ci ALC294_FIXUP_CS35L41_I2C_2, 744262306a36Sopenharmony_ci}; 744362306a36Sopenharmony_ci 744462306a36Sopenharmony_ci/* A special fixup for Lenovo C940 and Yoga Duet 7; 744562306a36Sopenharmony_ci * both have the very same PCI SSID, and we need to apply different fixups 744662306a36Sopenharmony_ci * depending on the codec ID 744762306a36Sopenharmony_ci */ 744862306a36Sopenharmony_cistatic void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec, 744962306a36Sopenharmony_ci const struct hda_fixup *fix, 745062306a36Sopenharmony_ci int action) 745162306a36Sopenharmony_ci{ 745262306a36Sopenharmony_ci int id; 745362306a36Sopenharmony_ci 745462306a36Sopenharmony_ci if (codec->core.vendor_id == 0x10ec0298) 745562306a36Sopenharmony_ci id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */ 745662306a36Sopenharmony_ci else 745762306a36Sopenharmony_ci id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */ 745862306a36Sopenharmony_ci __snd_hda_apply_fixup(codec, id, action, 0); 745962306a36Sopenharmony_ci} 746062306a36Sopenharmony_ci 746162306a36Sopenharmony_ci/* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021; 746262306a36Sopenharmony_ci * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID, 746362306a36Sopenharmony_ci * so we need to apply a different fixup in this case. The only DuetITL codec 746462306a36Sopenharmony_ci * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be 746562306a36Sopenharmony_ci * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would 746662306a36Sopenharmony_ci * have matched correctly by their codecs. 746762306a36Sopenharmony_ci */ 746862306a36Sopenharmony_cistatic void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec, 746962306a36Sopenharmony_ci const struct hda_fixup *fix, 747062306a36Sopenharmony_ci int action) 747162306a36Sopenharmony_ci{ 747262306a36Sopenharmony_ci int id; 747362306a36Sopenharmony_ci 747462306a36Sopenharmony_ci if (codec->core.subsystem_id == 0x17aa3802) 747562306a36Sopenharmony_ci id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */ 747662306a36Sopenharmony_ci else 747762306a36Sopenharmony_ci id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */ 747862306a36Sopenharmony_ci __snd_hda_apply_fixup(codec, id, action, 0); 747962306a36Sopenharmony_ci} 748062306a36Sopenharmony_ci 748162306a36Sopenharmony_cistatic const struct hda_fixup alc269_fixups[] = { 748262306a36Sopenharmony_ci [ALC269_FIXUP_GPIO2] = { 748362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 748462306a36Sopenharmony_ci .v.func = alc_fixup_gpio2, 748562306a36Sopenharmony_ci }, 748662306a36Sopenharmony_ci [ALC269_FIXUP_SONY_VAIO] = { 748762306a36Sopenharmony_ci .type = HDA_FIXUP_PINCTLS, 748862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 748962306a36Sopenharmony_ci {0x19, PIN_VREFGRD}, 749062306a36Sopenharmony_ci {} 749162306a36Sopenharmony_ci } 749262306a36Sopenharmony_ci }, 749362306a36Sopenharmony_ci [ALC275_FIXUP_SONY_VAIO_GPIO2] = { 749462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 749562306a36Sopenharmony_ci .v.func = alc275_fixup_gpio4_off, 749662306a36Sopenharmony_ci .chained = true, 749762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_SONY_VAIO 749862306a36Sopenharmony_ci }, 749962306a36Sopenharmony_ci [ALC269_FIXUP_DELL_M101Z] = { 750062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 750162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 750262306a36Sopenharmony_ci /* Enables internal speaker */ 750362306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 13}, 750462306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, 750562306a36Sopenharmony_ci {} 750662306a36Sopenharmony_ci } 750762306a36Sopenharmony_ci }, 750862306a36Sopenharmony_ci [ALC269_FIXUP_SKU_IGNORE] = { 750962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 751062306a36Sopenharmony_ci .v.func = alc_fixup_sku_ignore, 751162306a36Sopenharmony_ci }, 751262306a36Sopenharmony_ci [ALC269_FIXUP_ASUS_G73JW] = { 751362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 751462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 751562306a36Sopenharmony_ci { 0x17, 0x99130111 }, /* subwoofer */ 751662306a36Sopenharmony_ci { } 751762306a36Sopenharmony_ci } 751862306a36Sopenharmony_ci }, 751962306a36Sopenharmony_ci [ALC269_FIXUP_ASUS_N7601ZM_PINS] = { 752062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 752162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 752262306a36Sopenharmony_ci { 0x19, 0x03A11050 }, 752362306a36Sopenharmony_ci { 0x1a, 0x03A11C30 }, 752462306a36Sopenharmony_ci { 0x21, 0x03211420 }, 752562306a36Sopenharmony_ci { } 752662306a36Sopenharmony_ci } 752762306a36Sopenharmony_ci }, 752862306a36Sopenharmony_ci [ALC269_FIXUP_ASUS_N7601ZM] = { 752962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 753062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 753162306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x62}, 753262306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0xa007}, 753362306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x10}, 753462306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x8420}, 753562306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x0f}, 753662306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x7774}, 753762306a36Sopenharmony_ci { } 753862306a36Sopenharmony_ci }, 753962306a36Sopenharmony_ci .chained = true, 754062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS, 754162306a36Sopenharmony_ci }, 754262306a36Sopenharmony_ci [ALC269_FIXUP_LENOVO_EAPD] = { 754362306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 754462306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 754562306a36Sopenharmony_ci {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, 754662306a36Sopenharmony_ci {} 754762306a36Sopenharmony_ci } 754862306a36Sopenharmony_ci }, 754962306a36Sopenharmony_ci [ALC275_FIXUP_SONY_HWEQ] = { 755062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 755162306a36Sopenharmony_ci .v.func = alc269_fixup_hweq, 755262306a36Sopenharmony_ci .chained = true, 755362306a36Sopenharmony_ci .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2 755462306a36Sopenharmony_ci }, 755562306a36Sopenharmony_ci [ALC275_FIXUP_SONY_DISABLE_AAMIX] = { 755662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 755762306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 755862306a36Sopenharmony_ci .chained = true, 755962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_SONY_VAIO 756062306a36Sopenharmony_ci }, 756162306a36Sopenharmony_ci [ALC271_FIXUP_DMIC] = { 756262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 756362306a36Sopenharmony_ci .v.func = alc271_fixup_dmic, 756462306a36Sopenharmony_ci }, 756562306a36Sopenharmony_ci [ALC269_FIXUP_PCM_44K] = { 756662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 756762306a36Sopenharmony_ci .v.func = alc269_fixup_pcm_44k, 756862306a36Sopenharmony_ci .chained = true, 756962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_QUANTA_MUTE 757062306a36Sopenharmony_ci }, 757162306a36Sopenharmony_ci [ALC269_FIXUP_STEREO_DMIC] = { 757262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 757362306a36Sopenharmony_ci .v.func = alc269_fixup_stereo_dmic, 757462306a36Sopenharmony_ci }, 757562306a36Sopenharmony_ci [ALC269_FIXUP_HEADSET_MIC] = { 757662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 757762306a36Sopenharmony_ci .v.func = alc269_fixup_headset_mic, 757862306a36Sopenharmony_ci }, 757962306a36Sopenharmony_ci [ALC269_FIXUP_QUANTA_MUTE] = { 758062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 758162306a36Sopenharmony_ci .v.func = alc269_fixup_quanta_mute, 758262306a36Sopenharmony_ci }, 758362306a36Sopenharmony_ci [ALC269_FIXUP_LIFEBOOK] = { 758462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 758562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 758662306a36Sopenharmony_ci { 0x1a, 0x2101103f }, /* dock line-out */ 758762306a36Sopenharmony_ci { 0x1b, 0x23a11040 }, /* dock mic-in */ 758862306a36Sopenharmony_ci { } 758962306a36Sopenharmony_ci }, 759062306a36Sopenharmony_ci .chained = true, 759162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_QUANTA_MUTE 759262306a36Sopenharmony_ci }, 759362306a36Sopenharmony_ci [ALC269_FIXUP_LIFEBOOK_EXTMIC] = { 759462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 759562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 759662306a36Sopenharmony_ci { 0x19, 0x01a1903c }, /* headset mic, with jack detect */ 759762306a36Sopenharmony_ci { } 759862306a36Sopenharmony_ci }, 759962306a36Sopenharmony_ci }, 760062306a36Sopenharmony_ci [ALC269_FIXUP_LIFEBOOK_HP_PIN] = { 760162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 760262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 760362306a36Sopenharmony_ci { 0x21, 0x0221102f }, /* HP out */ 760462306a36Sopenharmony_ci { } 760562306a36Sopenharmony_ci }, 760662306a36Sopenharmony_ci }, 760762306a36Sopenharmony_ci [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = { 760862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 760962306a36Sopenharmony_ci .v.func = alc269_fixup_pincfg_no_hp_to_lineout, 761062306a36Sopenharmony_ci }, 761162306a36Sopenharmony_ci [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = { 761262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 761362306a36Sopenharmony_ci .v.func = alc269_fixup_pincfg_U7x7_headset_mic, 761462306a36Sopenharmony_ci }, 761562306a36Sopenharmony_ci [ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = { 761662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 761762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 761862306a36Sopenharmony_ci { 0x18, 0x03a19020 }, /* headset mic */ 761962306a36Sopenharmony_ci { 0x1b, 0x90170150 }, /* speaker */ 762062306a36Sopenharmony_ci { } 762162306a36Sopenharmony_ci }, 762262306a36Sopenharmony_ci }, 762362306a36Sopenharmony_ci [ALC269_FIXUP_AMIC] = { 762462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 762562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 762662306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 762762306a36Sopenharmony_ci { 0x15, 0x0121401f }, /* HP out */ 762862306a36Sopenharmony_ci { 0x18, 0x01a19c20 }, /* mic */ 762962306a36Sopenharmony_ci { 0x19, 0x99a3092f }, /* int-mic */ 763062306a36Sopenharmony_ci { } 763162306a36Sopenharmony_ci }, 763262306a36Sopenharmony_ci }, 763362306a36Sopenharmony_ci [ALC269_FIXUP_DMIC] = { 763462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 763562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 763662306a36Sopenharmony_ci { 0x12, 0x99a3092f }, /* int-mic */ 763762306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 763862306a36Sopenharmony_ci { 0x15, 0x0121401f }, /* HP out */ 763962306a36Sopenharmony_ci { 0x18, 0x01a19c20 }, /* mic */ 764062306a36Sopenharmony_ci { } 764162306a36Sopenharmony_ci }, 764262306a36Sopenharmony_ci }, 764362306a36Sopenharmony_ci [ALC269VB_FIXUP_AMIC] = { 764462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 764562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 764662306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 764762306a36Sopenharmony_ci { 0x18, 0x01a19c20 }, /* mic */ 764862306a36Sopenharmony_ci { 0x19, 0x99a3092f }, /* int-mic */ 764962306a36Sopenharmony_ci { 0x21, 0x0121401f }, /* HP out */ 765062306a36Sopenharmony_ci { } 765162306a36Sopenharmony_ci }, 765262306a36Sopenharmony_ci }, 765362306a36Sopenharmony_ci [ALC269VB_FIXUP_DMIC] = { 765462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 765562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 765662306a36Sopenharmony_ci { 0x12, 0x99a3092f }, /* int-mic */ 765762306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 765862306a36Sopenharmony_ci { 0x18, 0x01a19c20 }, /* mic */ 765962306a36Sopenharmony_ci { 0x21, 0x0121401f }, /* HP out */ 766062306a36Sopenharmony_ci { } 766162306a36Sopenharmony_ci }, 766262306a36Sopenharmony_ci }, 766362306a36Sopenharmony_ci [ALC269_FIXUP_HP_MUTE_LED] = { 766462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 766562306a36Sopenharmony_ci .v.func = alc269_fixup_hp_mute_led, 766662306a36Sopenharmony_ci }, 766762306a36Sopenharmony_ci [ALC269_FIXUP_HP_MUTE_LED_MIC1] = { 766862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 766962306a36Sopenharmony_ci .v.func = alc269_fixup_hp_mute_led_mic1, 767062306a36Sopenharmony_ci }, 767162306a36Sopenharmony_ci [ALC269_FIXUP_HP_MUTE_LED_MIC2] = { 767262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 767362306a36Sopenharmony_ci .v.func = alc269_fixup_hp_mute_led_mic2, 767462306a36Sopenharmony_ci }, 767562306a36Sopenharmony_ci [ALC269_FIXUP_HP_MUTE_LED_MIC3] = { 767662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 767762306a36Sopenharmony_ci .v.func = alc269_fixup_hp_mute_led_mic3, 767862306a36Sopenharmony_ci .chained = true, 767962306a36Sopenharmony_ci .chain_id = ALC295_FIXUP_HP_AUTO_MUTE 768062306a36Sopenharmony_ci }, 768162306a36Sopenharmony_ci [ALC269_FIXUP_HP_GPIO_LED] = { 768262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 768362306a36Sopenharmony_ci .v.func = alc269_fixup_hp_gpio_led, 768462306a36Sopenharmony_ci }, 768562306a36Sopenharmony_ci [ALC269_FIXUP_HP_GPIO_MIC1_LED] = { 768662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 768762306a36Sopenharmony_ci .v.func = alc269_fixup_hp_gpio_mic1_led, 768862306a36Sopenharmony_ci }, 768962306a36Sopenharmony_ci [ALC269_FIXUP_HP_LINE1_MIC1_LED] = { 769062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 769162306a36Sopenharmony_ci .v.func = alc269_fixup_hp_line1_mic1_led, 769262306a36Sopenharmony_ci }, 769362306a36Sopenharmony_ci [ALC269_FIXUP_INV_DMIC] = { 769462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 769562306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 769662306a36Sopenharmony_ci }, 769762306a36Sopenharmony_ci [ALC269_FIXUP_NO_SHUTUP] = { 769862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 769962306a36Sopenharmony_ci .v.func = alc_fixup_no_shutup, 770062306a36Sopenharmony_ci }, 770162306a36Sopenharmony_ci [ALC269_FIXUP_LENOVO_DOCK] = { 770262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 770362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 770462306a36Sopenharmony_ci { 0x19, 0x23a11040 }, /* dock mic */ 770562306a36Sopenharmony_ci { 0x1b, 0x2121103f }, /* dock headphone */ 770662306a36Sopenharmony_ci { } 770762306a36Sopenharmony_ci }, 770862306a36Sopenharmony_ci .chained = true, 770962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT 771062306a36Sopenharmony_ci }, 771162306a36Sopenharmony_ci [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = { 771262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 771362306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 771462306a36Sopenharmony_ci .chained = true, 771562306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_LENOVO_DOCK, 771662306a36Sopenharmony_ci }, 771762306a36Sopenharmony_ci [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = { 771862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 771962306a36Sopenharmony_ci .v.func = alc269_fixup_pincfg_no_hp_to_lineout, 772062306a36Sopenharmony_ci .chained = true, 772162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI, 772262306a36Sopenharmony_ci }, 772362306a36Sopenharmony_ci [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = { 772462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 772562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 772662306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 772762306a36Sopenharmony_ci { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 772862306a36Sopenharmony_ci { } 772962306a36Sopenharmony_ci }, 773062306a36Sopenharmony_ci .chained = true, 773162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 773262306a36Sopenharmony_ci }, 773362306a36Sopenharmony_ci [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = { 773462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 773562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 773662306a36Sopenharmony_ci { 0x16, 0x21014020 }, /* dock line out */ 773762306a36Sopenharmony_ci { 0x19, 0x21a19030 }, /* dock mic */ 773862306a36Sopenharmony_ci { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 773962306a36Sopenharmony_ci { } 774062306a36Sopenharmony_ci }, 774162306a36Sopenharmony_ci .chained = true, 774262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 774362306a36Sopenharmony_ci }, 774462306a36Sopenharmony_ci [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = { 774562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 774662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 774762306a36Sopenharmony_ci { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 774862306a36Sopenharmony_ci { } 774962306a36Sopenharmony_ci }, 775062306a36Sopenharmony_ci .chained = true, 775162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 775262306a36Sopenharmony_ci }, 775362306a36Sopenharmony_ci [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = { 775462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 775562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 775662306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 775762306a36Sopenharmony_ci { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 775862306a36Sopenharmony_ci { } 775962306a36Sopenharmony_ci }, 776062306a36Sopenharmony_ci .chained = true, 776162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 776262306a36Sopenharmony_ci }, 776362306a36Sopenharmony_ci [ALC269_FIXUP_HEADSET_MODE] = { 776462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 776562306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode, 776662306a36Sopenharmony_ci .chained = true, 776762306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_MIC_MUTE_LED 776862306a36Sopenharmony_ci }, 776962306a36Sopenharmony_ci [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = { 777062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 777162306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_no_hp_mic, 777262306a36Sopenharmony_ci }, 777362306a36Sopenharmony_ci [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = { 777462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 777562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 777662306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */ 777762306a36Sopenharmony_ci { } 777862306a36Sopenharmony_ci }, 777962306a36Sopenharmony_ci .chained = true, 778062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE, 778162306a36Sopenharmony_ci }, 778262306a36Sopenharmony_ci [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = { 778362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 778462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 778562306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 778662306a36Sopenharmony_ci { } 778762306a36Sopenharmony_ci }, 778862306a36Sopenharmony_ci .chained = true, 778962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 779062306a36Sopenharmony_ci }, 779162306a36Sopenharmony_ci [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = { 779262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 779362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 779462306a36Sopenharmony_ci {0x12, 0x90a60130}, 779562306a36Sopenharmony_ci {0x13, 0x40000000}, 779662306a36Sopenharmony_ci {0x14, 0x90170110}, 779762306a36Sopenharmony_ci {0x18, 0x411111f0}, 779862306a36Sopenharmony_ci {0x19, 0x04a11040}, 779962306a36Sopenharmony_ci {0x1a, 0x411111f0}, 780062306a36Sopenharmony_ci {0x1b, 0x90170112}, 780162306a36Sopenharmony_ci {0x1d, 0x40759a05}, 780262306a36Sopenharmony_ci {0x1e, 0x411111f0}, 780362306a36Sopenharmony_ci {0x21, 0x04211020}, 780462306a36Sopenharmony_ci { } 780562306a36Sopenharmony_ci }, 780662306a36Sopenharmony_ci .chained = true, 780762306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_MIC_MUTE_LED 780862306a36Sopenharmony_ci }, 780962306a36Sopenharmony_ci [ALC298_FIXUP_HUAWEI_MBX_STEREO] = { 781062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 781162306a36Sopenharmony_ci .v.func = alc298_fixup_huawei_mbx_stereo, 781262306a36Sopenharmony_ci .chained = true, 781362306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_MIC_MUTE_LED 781462306a36Sopenharmony_ci }, 781562306a36Sopenharmony_ci [ALC269_FIXUP_ASUS_X101_FUNC] = { 781662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 781762306a36Sopenharmony_ci .v.func = alc269_fixup_x101_headset_mic, 781862306a36Sopenharmony_ci }, 781962306a36Sopenharmony_ci [ALC269_FIXUP_ASUS_X101_VERB] = { 782062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 782162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 782262306a36Sopenharmony_ci {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 782362306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x08}, 782462306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x0310}, 782562306a36Sopenharmony_ci { } 782662306a36Sopenharmony_ci }, 782762306a36Sopenharmony_ci .chained = true, 782862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_ASUS_X101_FUNC 782962306a36Sopenharmony_ci }, 783062306a36Sopenharmony_ci [ALC269_FIXUP_ASUS_X101] = { 783162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 783262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 783362306a36Sopenharmony_ci { 0x18, 0x04a1182c }, /* Headset mic */ 783462306a36Sopenharmony_ci { } 783562306a36Sopenharmony_ci }, 783662306a36Sopenharmony_ci .chained = true, 783762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_ASUS_X101_VERB 783862306a36Sopenharmony_ci }, 783962306a36Sopenharmony_ci [ALC271_FIXUP_AMIC_MIC2] = { 784062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 784162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 784262306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 784362306a36Sopenharmony_ci { 0x19, 0x01a19c20 }, /* mic */ 784462306a36Sopenharmony_ci { 0x1b, 0x99a7012f }, /* int-mic */ 784562306a36Sopenharmony_ci { 0x21, 0x0121401f }, /* HP out */ 784662306a36Sopenharmony_ci { } 784762306a36Sopenharmony_ci }, 784862306a36Sopenharmony_ci }, 784962306a36Sopenharmony_ci [ALC271_FIXUP_HP_GATE_MIC_JACK] = { 785062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 785162306a36Sopenharmony_ci .v.func = alc271_hp_gate_mic_jack, 785262306a36Sopenharmony_ci .chained = true, 785362306a36Sopenharmony_ci .chain_id = ALC271_FIXUP_AMIC_MIC2, 785462306a36Sopenharmony_ci }, 785562306a36Sopenharmony_ci [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = { 785662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 785762306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 785862306a36Sopenharmony_ci .chained = true, 785962306a36Sopenharmony_ci .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK, 786062306a36Sopenharmony_ci }, 786162306a36Sopenharmony_ci [ALC269_FIXUP_ACER_AC700] = { 786262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 786362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 786462306a36Sopenharmony_ci { 0x12, 0x99a3092f }, /* int-mic */ 786562306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 786662306a36Sopenharmony_ci { 0x18, 0x03a11c20 }, /* mic */ 786762306a36Sopenharmony_ci { 0x1e, 0x0346101e }, /* SPDIF1 */ 786862306a36Sopenharmony_ci { 0x21, 0x0321101f }, /* HP out */ 786962306a36Sopenharmony_ci { } 787062306a36Sopenharmony_ci }, 787162306a36Sopenharmony_ci .chained = true, 787262306a36Sopenharmony_ci .chain_id = ALC271_FIXUP_DMIC, 787362306a36Sopenharmony_ci }, 787462306a36Sopenharmony_ci [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = { 787562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 787662306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 787762306a36Sopenharmony_ci .chained = true, 787862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI, 787962306a36Sopenharmony_ci }, 788062306a36Sopenharmony_ci [ALC269VB_FIXUP_ASUS_ZENBOOK] = { 788162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 788262306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 788362306a36Sopenharmony_ci .chained = true, 788462306a36Sopenharmony_ci .chain_id = ALC269VB_FIXUP_DMIC, 788562306a36Sopenharmony_ci }, 788662306a36Sopenharmony_ci [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = { 788762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 788862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 788962306a36Sopenharmony_ci /* class-D output amp +5dB */ 789062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 }, 789162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 }, 789262306a36Sopenharmony_ci {} 789362306a36Sopenharmony_ci }, 789462306a36Sopenharmony_ci .chained = true, 789562306a36Sopenharmony_ci .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK, 789662306a36Sopenharmony_ci }, 789762306a36Sopenharmony_ci [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = { 789862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 789962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 790062306a36Sopenharmony_ci { 0x18, 0x01a110f0 }, /* use as headset mic */ 790162306a36Sopenharmony_ci { } 790262306a36Sopenharmony_ci }, 790362306a36Sopenharmony_ci .chained = true, 790462306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 790562306a36Sopenharmony_ci }, 790662306a36Sopenharmony_ci [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = { 790762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 790862306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 790962306a36Sopenharmony_ci .chained = true, 791062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1, 791162306a36Sopenharmony_ci }, 791262306a36Sopenharmony_ci [ALC269VB_FIXUP_ORDISSIMO_EVE2] = { 791362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 791462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 791562306a36Sopenharmony_ci { 0x12, 0x99a3092f }, /* int-mic */ 791662306a36Sopenharmony_ci { 0x18, 0x03a11d20 }, /* mic */ 791762306a36Sopenharmony_ci { 0x19, 0x411111f0 }, /* Unused bogus pin */ 791862306a36Sopenharmony_ci { } 791962306a36Sopenharmony_ci }, 792062306a36Sopenharmony_ci }, 792162306a36Sopenharmony_ci [ALC283_FIXUP_CHROME_BOOK] = { 792262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 792362306a36Sopenharmony_ci .v.func = alc283_fixup_chromebook, 792462306a36Sopenharmony_ci }, 792562306a36Sopenharmony_ci [ALC283_FIXUP_SENSE_COMBO_JACK] = { 792662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 792762306a36Sopenharmony_ci .v.func = alc283_fixup_sense_combo_jack, 792862306a36Sopenharmony_ci .chained = true, 792962306a36Sopenharmony_ci .chain_id = ALC283_FIXUP_CHROME_BOOK, 793062306a36Sopenharmony_ci }, 793162306a36Sopenharmony_ci [ALC282_FIXUP_ASUS_TX300] = { 793262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 793362306a36Sopenharmony_ci .v.func = alc282_fixup_asus_tx300, 793462306a36Sopenharmony_ci }, 793562306a36Sopenharmony_ci [ALC283_FIXUP_INT_MIC] = { 793662306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 793762306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 793862306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x1a}, 793962306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x0011}, 794062306a36Sopenharmony_ci { } 794162306a36Sopenharmony_ci }, 794262306a36Sopenharmony_ci .chained = true, 794362306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST 794462306a36Sopenharmony_ci }, 794562306a36Sopenharmony_ci [ALC290_FIXUP_SUBWOOFER_HSJACK] = { 794662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 794762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 794862306a36Sopenharmony_ci { 0x17, 0x90170112 }, /* subwoofer */ 794962306a36Sopenharmony_ci { } 795062306a36Sopenharmony_ci }, 795162306a36Sopenharmony_ci .chained = true, 795262306a36Sopenharmony_ci .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, 795362306a36Sopenharmony_ci }, 795462306a36Sopenharmony_ci [ALC290_FIXUP_SUBWOOFER] = { 795562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 795662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 795762306a36Sopenharmony_ci { 0x17, 0x90170112 }, /* subwoofer */ 795862306a36Sopenharmony_ci { } 795962306a36Sopenharmony_ci }, 796062306a36Sopenharmony_ci .chained = true, 796162306a36Sopenharmony_ci .chain_id = ALC290_FIXUP_MONO_SPEAKERS, 796262306a36Sopenharmony_ci }, 796362306a36Sopenharmony_ci [ALC290_FIXUP_MONO_SPEAKERS] = { 796462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 796562306a36Sopenharmony_ci .v.func = alc290_fixup_mono_speakers, 796662306a36Sopenharmony_ci }, 796762306a36Sopenharmony_ci [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = { 796862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 796962306a36Sopenharmony_ci .v.func = alc290_fixup_mono_speakers, 797062306a36Sopenharmony_ci .chained = true, 797162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, 797262306a36Sopenharmony_ci }, 797362306a36Sopenharmony_ci [ALC269_FIXUP_THINKPAD_ACPI] = { 797462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 797562306a36Sopenharmony_ci .v.func = alc_fixup_thinkpad_acpi, 797662306a36Sopenharmony_ci .chained = true, 797762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_SKU_IGNORE, 797862306a36Sopenharmony_ci }, 797962306a36Sopenharmony_ci [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = { 798062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 798162306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 798262306a36Sopenharmony_ci .chained = true, 798362306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI, 798462306a36Sopenharmony_ci }, 798562306a36Sopenharmony_ci [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = { 798662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 798762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 798862306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 798962306a36Sopenharmony_ci { } 799062306a36Sopenharmony_ci }, 799162306a36Sopenharmony_ci .chained = true, 799262306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_HEADSET_MODE 799362306a36Sopenharmony_ci }, 799462306a36Sopenharmony_ci [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = { 799562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 799662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 799762306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 799862306a36Sopenharmony_ci { } 799962306a36Sopenharmony_ci }, 800062306a36Sopenharmony_ci .chained = true, 800162306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_HEADSET_MODE 800262306a36Sopenharmony_ci }, 800362306a36Sopenharmony_ci [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = { 800462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 800562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 800662306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 800762306a36Sopenharmony_ci { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 800862306a36Sopenharmony_ci { } 800962306a36Sopenharmony_ci }, 801062306a36Sopenharmony_ci .chained = true, 801162306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_HEADSET_MODE 801262306a36Sopenharmony_ci }, 801362306a36Sopenharmony_ci [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = { 801462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 801562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 801662306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 801762306a36Sopenharmony_ci { } 801862306a36Sopenharmony_ci }, 801962306a36Sopenharmony_ci .chained = true, 802062306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC 802162306a36Sopenharmony_ci }, 802262306a36Sopenharmony_ci [ALC255_FIXUP_HEADSET_MODE] = { 802362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 802462306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_alc255, 802562306a36Sopenharmony_ci .chained = true, 802662306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_MIC_MUTE_LED 802762306a36Sopenharmony_ci }, 802862306a36Sopenharmony_ci [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = { 802962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 803062306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_alc255_no_hp_mic, 803162306a36Sopenharmony_ci }, 803262306a36Sopenharmony_ci [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = { 803362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 803462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 803562306a36Sopenharmony_ci { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 803662306a36Sopenharmony_ci { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 803762306a36Sopenharmony_ci { } 803862306a36Sopenharmony_ci }, 803962306a36Sopenharmony_ci .chained = true, 804062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 804162306a36Sopenharmony_ci }, 804262306a36Sopenharmony_ci [ALC292_FIXUP_TPT440_DOCK] = { 804362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 804462306a36Sopenharmony_ci .v.func = alc_fixup_tpt440_dock, 804562306a36Sopenharmony_ci .chained = true, 804662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST 804762306a36Sopenharmony_ci }, 804862306a36Sopenharmony_ci [ALC292_FIXUP_TPT440] = { 804962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 805062306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 805162306a36Sopenharmony_ci .chained = true, 805262306a36Sopenharmony_ci .chain_id = ALC292_FIXUP_TPT440_DOCK, 805362306a36Sopenharmony_ci }, 805462306a36Sopenharmony_ci [ALC283_FIXUP_HEADSET_MIC] = { 805562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 805662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 805762306a36Sopenharmony_ci { 0x19, 0x04a110f0 }, 805862306a36Sopenharmony_ci { }, 805962306a36Sopenharmony_ci }, 806062306a36Sopenharmony_ci }, 806162306a36Sopenharmony_ci [ALC255_FIXUP_MIC_MUTE_LED] = { 806262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 806362306a36Sopenharmony_ci .v.func = alc_fixup_micmute_led, 806462306a36Sopenharmony_ci }, 806562306a36Sopenharmony_ci [ALC282_FIXUP_ASPIRE_V5_PINS] = { 806662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 806762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 806862306a36Sopenharmony_ci { 0x12, 0x90a60130 }, 806962306a36Sopenharmony_ci { 0x14, 0x90170110 }, 807062306a36Sopenharmony_ci { 0x17, 0x40000008 }, 807162306a36Sopenharmony_ci { 0x18, 0x411111f0 }, 807262306a36Sopenharmony_ci { 0x19, 0x01a1913c }, 807362306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, 807462306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, 807562306a36Sopenharmony_ci { 0x1d, 0x40f89b2d }, 807662306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, 807762306a36Sopenharmony_ci { 0x21, 0x0321101f }, 807862306a36Sopenharmony_ci { }, 807962306a36Sopenharmony_ci }, 808062306a36Sopenharmony_ci }, 808162306a36Sopenharmony_ci [ALC269VB_FIXUP_ASPIRE_E1_COEF] = { 808262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 808362306a36Sopenharmony_ci .v.func = alc269vb_fixup_aspire_e1_coef, 808462306a36Sopenharmony_ci }, 808562306a36Sopenharmony_ci [ALC280_FIXUP_HP_GPIO4] = { 808662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 808762306a36Sopenharmony_ci .v.func = alc280_fixup_hp_gpio4, 808862306a36Sopenharmony_ci }, 808962306a36Sopenharmony_ci [ALC286_FIXUP_HP_GPIO_LED] = { 809062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 809162306a36Sopenharmony_ci .v.func = alc286_fixup_hp_gpio_led, 809262306a36Sopenharmony_ci }, 809362306a36Sopenharmony_ci [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = { 809462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 809562306a36Sopenharmony_ci .v.func = alc280_fixup_hp_gpio2_mic_hotkey, 809662306a36Sopenharmony_ci }, 809762306a36Sopenharmony_ci [ALC280_FIXUP_HP_DOCK_PINS] = { 809862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 809962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 810062306a36Sopenharmony_ci { 0x1b, 0x21011020 }, /* line-out */ 810162306a36Sopenharmony_ci { 0x1a, 0x01a1903c }, /* headset mic */ 810262306a36Sopenharmony_ci { 0x18, 0x2181103f }, /* line-in */ 810362306a36Sopenharmony_ci { }, 810462306a36Sopenharmony_ci }, 810562306a36Sopenharmony_ci .chained = true, 810662306a36Sopenharmony_ci .chain_id = ALC280_FIXUP_HP_GPIO4 810762306a36Sopenharmony_ci }, 810862306a36Sopenharmony_ci [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = { 810962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 811062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 811162306a36Sopenharmony_ci { 0x1b, 0x21011020 }, /* line-out */ 811262306a36Sopenharmony_ci { 0x18, 0x2181103f }, /* line-in */ 811362306a36Sopenharmony_ci { }, 811462306a36Sopenharmony_ci }, 811562306a36Sopenharmony_ci .chained = true, 811662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED 811762306a36Sopenharmony_ci }, 811862306a36Sopenharmony_ci [ALC280_FIXUP_HP_9480M] = { 811962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 812062306a36Sopenharmony_ci .v.func = alc280_fixup_hp_9480m, 812162306a36Sopenharmony_ci }, 812262306a36Sopenharmony_ci [ALC245_FIXUP_HP_X360_AMP] = { 812362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 812462306a36Sopenharmony_ci .v.func = alc245_fixup_hp_x360_amp, 812562306a36Sopenharmony_ci .chained = true, 812662306a36Sopenharmony_ci .chain_id = ALC245_FIXUP_HP_GPIO_LED 812762306a36Sopenharmony_ci }, 812862306a36Sopenharmony_ci [ALC288_FIXUP_DELL_HEADSET_MODE] = { 812962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 813062306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_dell_alc288, 813162306a36Sopenharmony_ci .chained = true, 813262306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_MIC_MUTE_LED 813362306a36Sopenharmony_ci }, 813462306a36Sopenharmony_ci [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = { 813562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 813662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 813762306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 813862306a36Sopenharmony_ci { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 813962306a36Sopenharmony_ci { } 814062306a36Sopenharmony_ci }, 814162306a36Sopenharmony_ci .chained = true, 814262306a36Sopenharmony_ci .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE 814362306a36Sopenharmony_ci }, 814462306a36Sopenharmony_ci [ALC288_FIXUP_DISABLE_AAMIX] = { 814562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 814662306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 814762306a36Sopenharmony_ci .chained = true, 814862306a36Sopenharmony_ci .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE 814962306a36Sopenharmony_ci }, 815062306a36Sopenharmony_ci [ALC288_FIXUP_DELL_XPS_13] = { 815162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 815262306a36Sopenharmony_ci .v.func = alc_fixup_dell_xps13, 815362306a36Sopenharmony_ci .chained = true, 815462306a36Sopenharmony_ci .chain_id = ALC288_FIXUP_DISABLE_AAMIX 815562306a36Sopenharmony_ci }, 815662306a36Sopenharmony_ci [ALC292_FIXUP_DISABLE_AAMIX] = { 815762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 815862306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 815962306a36Sopenharmony_ci .chained = true, 816062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE 816162306a36Sopenharmony_ci }, 816262306a36Sopenharmony_ci [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = { 816362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 816462306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 816562306a36Sopenharmony_ci .chained = true, 816662306a36Sopenharmony_ci .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE 816762306a36Sopenharmony_ci }, 816862306a36Sopenharmony_ci [ALC292_FIXUP_DELL_E7X_AAMIX] = { 816962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 817062306a36Sopenharmony_ci .v.func = alc_fixup_dell_xps13, 817162306a36Sopenharmony_ci .chained = true, 817262306a36Sopenharmony_ci .chain_id = ALC292_FIXUP_DISABLE_AAMIX 817362306a36Sopenharmony_ci }, 817462306a36Sopenharmony_ci [ALC292_FIXUP_DELL_E7X] = { 817562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 817662306a36Sopenharmony_ci .v.func = alc_fixup_micmute_led, 817762306a36Sopenharmony_ci /* micmute fixup must be applied at last */ 817862306a36Sopenharmony_ci .chained_before = true, 817962306a36Sopenharmony_ci .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX, 818062306a36Sopenharmony_ci }, 818162306a36Sopenharmony_ci [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = { 818262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 818362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 818462306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */ 818562306a36Sopenharmony_ci { } 818662306a36Sopenharmony_ci }, 818762306a36Sopenharmony_ci .chained_before = true, 818862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE, 818962306a36Sopenharmony_ci }, 819062306a36Sopenharmony_ci [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = { 819162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 819262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 819362306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 819462306a36Sopenharmony_ci { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 819562306a36Sopenharmony_ci { } 819662306a36Sopenharmony_ci }, 819762306a36Sopenharmony_ci .chained = true, 819862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 819962306a36Sopenharmony_ci }, 820062306a36Sopenharmony_ci [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = { 820162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 820262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 820362306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 820462306a36Sopenharmony_ci { } 820562306a36Sopenharmony_ci }, 820662306a36Sopenharmony_ci .chained = true, 820762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 820862306a36Sopenharmony_ci }, 820962306a36Sopenharmony_ci [ALC275_FIXUP_DELL_XPS] = { 821062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 821162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 821262306a36Sopenharmony_ci /* Enables internal speaker */ 821362306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x1f}, 821462306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x00c0}, 821562306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x30}, 821662306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x00b1}, 821762306a36Sopenharmony_ci {} 821862306a36Sopenharmony_ci } 821962306a36Sopenharmony_ci }, 822062306a36Sopenharmony_ci [ALC293_FIXUP_LENOVO_SPK_NOISE] = { 822162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 822262306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 822362306a36Sopenharmony_ci .chained = true, 822462306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI 822562306a36Sopenharmony_ci }, 822662306a36Sopenharmony_ci [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = { 822762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 822862306a36Sopenharmony_ci .v.func = alc233_fixup_lenovo_line2_mic_hotkey, 822962306a36Sopenharmony_ci }, 823062306a36Sopenharmony_ci [ALC233_FIXUP_INTEL_NUC8_DMIC] = { 823162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 823262306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 823362306a36Sopenharmony_ci .chained = true, 823462306a36Sopenharmony_ci .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST, 823562306a36Sopenharmony_ci }, 823662306a36Sopenharmony_ci [ALC233_FIXUP_INTEL_NUC8_BOOST] = { 823762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 823862306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost 823962306a36Sopenharmony_ci }, 824062306a36Sopenharmony_ci [ALC255_FIXUP_DELL_SPK_NOISE] = { 824162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 824262306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 824362306a36Sopenharmony_ci .chained = true, 824462306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE 824562306a36Sopenharmony_ci }, 824662306a36Sopenharmony_ci [ALC225_FIXUP_DISABLE_MIC_VREF] = { 824762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 824862306a36Sopenharmony_ci .v.func = alc_fixup_disable_mic_vref, 824962306a36Sopenharmony_ci .chained = true, 825062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE 825162306a36Sopenharmony_ci }, 825262306a36Sopenharmony_ci [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = { 825362306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 825462306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 825562306a36Sopenharmony_ci /* Disable pass-through path for FRONT 14h */ 825662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 }, 825762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 }, 825862306a36Sopenharmony_ci {} 825962306a36Sopenharmony_ci }, 826062306a36Sopenharmony_ci .chained = true, 826162306a36Sopenharmony_ci .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF 826262306a36Sopenharmony_ci }, 826362306a36Sopenharmony_ci [ALC280_FIXUP_HP_HEADSET_MIC] = { 826462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 826562306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 826662306a36Sopenharmony_ci .chained = true, 826762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC, 826862306a36Sopenharmony_ci }, 826962306a36Sopenharmony_ci [ALC221_FIXUP_HP_FRONT_MIC] = { 827062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 827162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 827262306a36Sopenharmony_ci { 0x19, 0x02a19020 }, /* Front Mic */ 827362306a36Sopenharmony_ci { } 827462306a36Sopenharmony_ci }, 827562306a36Sopenharmony_ci }, 827662306a36Sopenharmony_ci [ALC292_FIXUP_TPT460] = { 827762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 827862306a36Sopenharmony_ci .v.func = alc_fixup_tpt440_dock, 827962306a36Sopenharmony_ci .chained = true, 828062306a36Sopenharmony_ci .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE, 828162306a36Sopenharmony_ci }, 828262306a36Sopenharmony_ci [ALC298_FIXUP_SPK_VOLUME] = { 828362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 828462306a36Sopenharmony_ci .v.func = alc298_fixup_speaker_volume, 828562306a36Sopenharmony_ci .chained = true, 828662306a36Sopenharmony_ci .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, 828762306a36Sopenharmony_ci }, 828862306a36Sopenharmony_ci [ALC298_FIXUP_LENOVO_SPK_VOLUME] = { 828962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 829062306a36Sopenharmony_ci .v.func = alc298_fixup_speaker_volume, 829162306a36Sopenharmony_ci }, 829262306a36Sopenharmony_ci [ALC295_FIXUP_DISABLE_DAC3] = { 829362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 829462306a36Sopenharmony_ci .v.func = alc295_fixup_disable_dac3, 829562306a36Sopenharmony_ci }, 829662306a36Sopenharmony_ci [ALC285_FIXUP_SPEAKER2_TO_DAC1] = { 829762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 829862306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 829962306a36Sopenharmony_ci .chained = true, 830062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI 830162306a36Sopenharmony_ci }, 830262306a36Sopenharmony_ci [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = { 830362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 830462306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 830562306a36Sopenharmony_ci .chained = true, 830662306a36Sopenharmony_ci .chain_id = ALC245_FIXUP_CS35L41_SPI_2 830762306a36Sopenharmony_ci }, 830862306a36Sopenharmony_ci [ALC285_FIXUP_ASUS_HEADSET_MIC] = { 830962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 831062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 831162306a36Sopenharmony_ci { 0x19, 0x03a11050 }, 831262306a36Sopenharmony_ci { 0x1b, 0x03a11c30 }, 831362306a36Sopenharmony_ci { } 831462306a36Sopenharmony_ci }, 831562306a36Sopenharmony_ci .chained = true, 831662306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1 831762306a36Sopenharmony_ci }, 831862306a36Sopenharmony_ci [ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = { 831962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 832062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 832162306a36Sopenharmony_ci { 0x14, 0x90170120 }, 832262306a36Sopenharmony_ci { } 832362306a36Sopenharmony_ci }, 832462306a36Sopenharmony_ci .chained = true, 832562306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC 832662306a36Sopenharmony_ci }, 832762306a36Sopenharmony_ci [ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = { 832862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 832962306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 833062306a36Sopenharmony_ci .chained = true, 833162306a36Sopenharmony_ci .chain_id = ALC287_FIXUP_CS35L41_I2C_2 833262306a36Sopenharmony_ci }, 833362306a36Sopenharmony_ci [ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = { 833462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 833562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 833662306a36Sopenharmony_ci { 0x19, 0x03a11050 }, 833762306a36Sopenharmony_ci { 0x1b, 0x03a11c30 }, 833862306a36Sopenharmony_ci { } 833962306a36Sopenharmony_ci }, 834062306a36Sopenharmony_ci .chained = true, 834162306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1 834262306a36Sopenharmony_ci }, 834362306a36Sopenharmony_ci [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { 834462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 834562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 834662306a36Sopenharmony_ci { 0x1b, 0x90170151 }, 834762306a36Sopenharmony_ci { } 834862306a36Sopenharmony_ci }, 834962306a36Sopenharmony_ci .chained = true, 835062306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE 835162306a36Sopenharmony_ci }, 835262306a36Sopenharmony_ci [ALC269_FIXUP_ATIV_BOOK_8] = { 835362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 835462306a36Sopenharmony_ci .v.func = alc_fixup_auto_mute_via_amp, 835562306a36Sopenharmony_ci .chained = true, 835662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_NO_SHUTUP 835762306a36Sopenharmony_ci }, 835862306a36Sopenharmony_ci [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = { 835962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 836062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 836162306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 836262306a36Sopenharmony_ci { 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */ 836362306a36Sopenharmony_ci { } 836462306a36Sopenharmony_ci }, 836562306a36Sopenharmony_ci .chained = true, 836662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 836762306a36Sopenharmony_ci }, 836862306a36Sopenharmony_ci [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = { 836962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 837062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 837162306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 837262306a36Sopenharmony_ci { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ 837362306a36Sopenharmony_ci { } 837462306a36Sopenharmony_ci }, 837562306a36Sopenharmony_ci .chained = true, 837662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 837762306a36Sopenharmony_ci }, 837862306a36Sopenharmony_ci [ALC256_FIXUP_ASUS_HEADSET_MODE] = { 837962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 838062306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode, 838162306a36Sopenharmony_ci }, 838262306a36Sopenharmony_ci [ALC256_FIXUP_ASUS_MIC] = { 838362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 838462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 838562306a36Sopenharmony_ci { 0x13, 0x90a60160 }, /* use as internal mic */ 838662306a36Sopenharmony_ci { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */ 838762306a36Sopenharmony_ci { } 838862306a36Sopenharmony_ci }, 838962306a36Sopenharmony_ci .chained = true, 839062306a36Sopenharmony_ci .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE 839162306a36Sopenharmony_ci }, 839262306a36Sopenharmony_ci [ALC256_FIXUP_ASUS_AIO_GPIO2] = { 839362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 839462306a36Sopenharmony_ci /* Set up GPIO2 for the speaker amp */ 839562306a36Sopenharmony_ci .v.func = alc_fixup_gpio4, 839662306a36Sopenharmony_ci }, 839762306a36Sopenharmony_ci [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = { 839862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 839962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 840062306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 840162306a36Sopenharmony_ci { } 840262306a36Sopenharmony_ci }, 840362306a36Sopenharmony_ci .chained = true, 840462306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 840562306a36Sopenharmony_ci }, 840662306a36Sopenharmony_ci [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = { 840762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 840862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 840962306a36Sopenharmony_ci /* Enables internal speaker */ 841062306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x40}, 841162306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x8800}, 841262306a36Sopenharmony_ci {} 841362306a36Sopenharmony_ci }, 841462306a36Sopenharmony_ci .chained = true, 841562306a36Sopenharmony_ci .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE 841662306a36Sopenharmony_ci }, 841762306a36Sopenharmony_ci [ALC233_FIXUP_LENOVO_MULTI_CODECS] = { 841862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 841962306a36Sopenharmony_ci .v.func = alc233_alc662_fixup_lenovo_dual_codecs, 842062306a36Sopenharmony_ci .chained = true, 842162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_GPIO2 842262306a36Sopenharmony_ci }, 842362306a36Sopenharmony_ci [ALC233_FIXUP_ACER_HEADSET_MIC] = { 842462306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 842562306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 842662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 }, 842762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 }, 842862306a36Sopenharmony_ci { } 842962306a36Sopenharmony_ci }, 843062306a36Sopenharmony_ci .chained = true, 843162306a36Sopenharmony_ci .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE 843262306a36Sopenharmony_ci }, 843362306a36Sopenharmony_ci [ALC294_FIXUP_LENOVO_MIC_LOCATION] = { 843462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 843562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 843662306a36Sopenharmony_ci /* Change the mic location from front to right, otherwise there are 843762306a36Sopenharmony_ci two front mics with the same name, pulseaudio can't handle them. 843862306a36Sopenharmony_ci This is just a temporary workaround, after applying this fixup, 843962306a36Sopenharmony_ci there will be one "Front Mic" and one "Mic" in this machine. 844062306a36Sopenharmony_ci */ 844162306a36Sopenharmony_ci { 0x1a, 0x04a19040 }, 844262306a36Sopenharmony_ci { } 844362306a36Sopenharmony_ci }, 844462306a36Sopenharmony_ci }, 844562306a36Sopenharmony_ci [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = { 844662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 844762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 844862306a36Sopenharmony_ci { 0x16, 0x0101102f }, /* Rear Headset HP */ 844962306a36Sopenharmony_ci { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */ 845062306a36Sopenharmony_ci { 0x1a, 0x01a19030 }, /* Rear Headset MIC */ 845162306a36Sopenharmony_ci { 0x1b, 0x02011020 }, 845262306a36Sopenharmony_ci { } 845362306a36Sopenharmony_ci }, 845462306a36Sopenharmony_ci .chained = true, 845562306a36Sopenharmony_ci .chain_id = ALC225_FIXUP_S3_POP_NOISE 845662306a36Sopenharmony_ci }, 845762306a36Sopenharmony_ci [ALC225_FIXUP_S3_POP_NOISE] = { 845862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 845962306a36Sopenharmony_ci .v.func = alc225_fixup_s3_pop_noise, 846062306a36Sopenharmony_ci .chained = true, 846162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 846262306a36Sopenharmony_ci }, 846362306a36Sopenharmony_ci [ALC700_FIXUP_INTEL_REFERENCE] = { 846462306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 846562306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 846662306a36Sopenharmony_ci /* Enables internal speaker */ 846762306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x45}, 846862306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x5289}, 846962306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x4A}, 847062306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x001b}, 847162306a36Sopenharmony_ci {0x58, AC_VERB_SET_COEF_INDEX, 0x00}, 847262306a36Sopenharmony_ci {0x58, AC_VERB_SET_PROC_COEF, 0x3888}, 847362306a36Sopenharmony_ci {0x20, AC_VERB_SET_COEF_INDEX, 0x6f}, 847462306a36Sopenharmony_ci {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b}, 847562306a36Sopenharmony_ci {} 847662306a36Sopenharmony_ci } 847762306a36Sopenharmony_ci }, 847862306a36Sopenharmony_ci [ALC274_FIXUP_DELL_BIND_DACS] = { 847962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 848062306a36Sopenharmony_ci .v.func = alc274_fixup_bind_dacs, 848162306a36Sopenharmony_ci .chained = true, 848262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE 848362306a36Sopenharmony_ci }, 848462306a36Sopenharmony_ci [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = { 848562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 848662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 848762306a36Sopenharmony_ci { 0x1b, 0x0401102f }, 848862306a36Sopenharmony_ci { } 848962306a36Sopenharmony_ci }, 849062306a36Sopenharmony_ci .chained = true, 849162306a36Sopenharmony_ci .chain_id = ALC274_FIXUP_DELL_BIND_DACS 849262306a36Sopenharmony_ci }, 849362306a36Sopenharmony_ci [ALC298_FIXUP_TPT470_DOCK_FIX] = { 849462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 849562306a36Sopenharmony_ci .v.func = alc_fixup_tpt470_dock, 849662306a36Sopenharmony_ci .chained = true, 849762306a36Sopenharmony_ci .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE 849862306a36Sopenharmony_ci }, 849962306a36Sopenharmony_ci [ALC298_FIXUP_TPT470_DOCK] = { 850062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 850162306a36Sopenharmony_ci .v.func = alc_fixup_tpt470_dacs, 850262306a36Sopenharmony_ci .chained = true, 850362306a36Sopenharmony_ci .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX 850462306a36Sopenharmony_ci }, 850562306a36Sopenharmony_ci [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = { 850662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 850762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 850862306a36Sopenharmony_ci { 0x14, 0x0201101f }, 850962306a36Sopenharmony_ci { } 851062306a36Sopenharmony_ci }, 851162306a36Sopenharmony_ci .chained = true, 851262306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE 851362306a36Sopenharmony_ci }, 851462306a36Sopenharmony_ci [ALC255_FIXUP_DELL_HEADSET_MIC] = { 851562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 851662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 851762306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 851862306a36Sopenharmony_ci { } 851962306a36Sopenharmony_ci }, 852062306a36Sopenharmony_ci .chained = true, 852162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 852262306a36Sopenharmony_ci }, 852362306a36Sopenharmony_ci [ALC295_FIXUP_HP_X360] = { 852462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 852562306a36Sopenharmony_ci .v.func = alc295_fixup_hp_top_speakers, 852662306a36Sopenharmony_ci .chained = true, 852762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3 852862306a36Sopenharmony_ci }, 852962306a36Sopenharmony_ci [ALC221_FIXUP_HP_HEADSET_MIC] = { 853062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 853162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 853262306a36Sopenharmony_ci { 0x19, 0x0181313f}, 853362306a36Sopenharmony_ci { } 853462306a36Sopenharmony_ci }, 853562306a36Sopenharmony_ci .chained = true, 853662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 853762306a36Sopenharmony_ci }, 853862306a36Sopenharmony_ci [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = { 853962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 854062306a36Sopenharmony_ci .v.func = alc285_fixup_invalidate_dacs, 854162306a36Sopenharmony_ci .chained = true, 854262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI 854362306a36Sopenharmony_ci }, 854462306a36Sopenharmony_ci [ALC295_FIXUP_HP_AUTO_MUTE] = { 854562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 854662306a36Sopenharmony_ci .v.func = alc_fixup_auto_mute_via_amp, 854762306a36Sopenharmony_ci }, 854862306a36Sopenharmony_ci [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = { 854962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 855062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 855162306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 855262306a36Sopenharmony_ci { } 855362306a36Sopenharmony_ci }, 855462306a36Sopenharmony_ci .chained = true, 855562306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 855662306a36Sopenharmony_ci }, 855762306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_MIC] = { 855862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 855962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 856062306a36Sopenharmony_ci { 0x13, 0x90a60160 }, /* use as internal mic */ 856162306a36Sopenharmony_ci { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */ 856262306a36Sopenharmony_ci { } 856362306a36Sopenharmony_ci }, 856462306a36Sopenharmony_ci .chained = true, 856562306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 856662306a36Sopenharmony_ci }, 856762306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_HEADSET_MIC] = { 856862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 856962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 857062306a36Sopenharmony_ci { 0x19, 0x01a1103c }, /* use as headset mic */ 857162306a36Sopenharmony_ci { } 857262306a36Sopenharmony_ci }, 857362306a36Sopenharmony_ci .chained = true, 857462306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 857562306a36Sopenharmony_ci }, 857662306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_SPK] = { 857762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 857862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 857962306a36Sopenharmony_ci /* Set EAPD high */ 858062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 }, 858162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 }, 858262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f }, 858362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 }, 858462306a36Sopenharmony_ci { } 858562306a36Sopenharmony_ci }, 858662306a36Sopenharmony_ci .chained = true, 858762306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC 858862306a36Sopenharmony_ci }, 858962306a36Sopenharmony_ci [ALC295_FIXUP_CHROME_BOOK] = { 859062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 859162306a36Sopenharmony_ci .v.func = alc295_fixup_chromebook, 859262306a36Sopenharmony_ci .chained = true, 859362306a36Sopenharmony_ci .chain_id = ALC225_FIXUP_HEADSET_JACK 859462306a36Sopenharmony_ci }, 859562306a36Sopenharmony_ci [ALC225_FIXUP_HEADSET_JACK] = { 859662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 859762306a36Sopenharmony_ci .v.func = alc_fixup_headset_jack, 859862306a36Sopenharmony_ci }, 859962306a36Sopenharmony_ci [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = { 860062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 860162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 860262306a36Sopenharmony_ci { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 860362306a36Sopenharmony_ci { } 860462306a36Sopenharmony_ci }, 860562306a36Sopenharmony_ci .chained = true, 860662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 860762306a36Sopenharmony_ci }, 860862306a36Sopenharmony_ci [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = { 860962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 861062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 861162306a36Sopenharmony_ci /* Disable PCBEEP-IN passthrough */ 861262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 }, 861362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 }, 861462306a36Sopenharmony_ci { } 861562306a36Sopenharmony_ci }, 861662306a36Sopenharmony_ci .chained = true, 861762306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE 861862306a36Sopenharmony_ci }, 861962306a36Sopenharmony_ci [ALC255_FIXUP_ACER_HEADSET_MIC] = { 862062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 862162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 862262306a36Sopenharmony_ci { 0x19, 0x03a11130 }, 862362306a36Sopenharmony_ci { 0x1a, 0x90a60140 }, /* use as internal mic */ 862462306a36Sopenharmony_ci { } 862562306a36Sopenharmony_ci }, 862662306a36Sopenharmony_ci .chained = true, 862762306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC 862862306a36Sopenharmony_ci }, 862962306a36Sopenharmony_ci [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = { 863062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 863162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 863262306a36Sopenharmony_ci { 0x16, 0x01011020 }, /* Rear Line out */ 863362306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */ 863462306a36Sopenharmony_ci { } 863562306a36Sopenharmony_ci }, 863662306a36Sopenharmony_ci .chained = true, 863762306a36Sopenharmony_ci .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE 863862306a36Sopenharmony_ci }, 863962306a36Sopenharmony_ci [ALC225_FIXUP_WYSE_AUTO_MUTE] = { 864062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 864162306a36Sopenharmony_ci .v.func = alc_fixup_auto_mute_via_amp, 864262306a36Sopenharmony_ci .chained = true, 864362306a36Sopenharmony_ci .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF 864462306a36Sopenharmony_ci }, 864562306a36Sopenharmony_ci [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = { 864662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 864762306a36Sopenharmony_ci .v.func = alc_fixup_disable_mic_vref, 864862306a36Sopenharmony_ci .chained = true, 864962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 865062306a36Sopenharmony_ci }, 865162306a36Sopenharmony_ci [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = { 865262306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 865362306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 865462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f }, 865562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 }, 865662306a36Sopenharmony_ci { } 865762306a36Sopenharmony_ci }, 865862306a36Sopenharmony_ci .chained = true, 865962306a36Sopenharmony_ci .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE 866062306a36Sopenharmony_ci }, 866162306a36Sopenharmony_ci [ALC256_FIXUP_ASUS_HEADSET_MIC] = { 866262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 866362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 866462306a36Sopenharmony_ci { 0x19, 0x03a11020 }, /* headset mic with jack detect */ 866562306a36Sopenharmony_ci { } 866662306a36Sopenharmony_ci }, 866762306a36Sopenharmony_ci .chained = true, 866862306a36Sopenharmony_ci .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE 866962306a36Sopenharmony_ci }, 867062306a36Sopenharmony_ci [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = { 867162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 867262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 867362306a36Sopenharmony_ci { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */ 867462306a36Sopenharmony_ci { } 867562306a36Sopenharmony_ci }, 867662306a36Sopenharmony_ci .chained = true, 867762306a36Sopenharmony_ci .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE 867862306a36Sopenharmony_ci }, 867962306a36Sopenharmony_ci [ALC299_FIXUP_PREDATOR_SPK] = { 868062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 868162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 868262306a36Sopenharmony_ci { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */ 868362306a36Sopenharmony_ci { } 868462306a36Sopenharmony_ci } 868562306a36Sopenharmony_ci }, 868662306a36Sopenharmony_ci [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = { 868762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 868862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 868962306a36Sopenharmony_ci { 0x19, 0x04a11040 }, 869062306a36Sopenharmony_ci { 0x21, 0x04211020 }, 869162306a36Sopenharmony_ci { } 869262306a36Sopenharmony_ci }, 869362306a36Sopenharmony_ci .chained = true, 869462306a36Sopenharmony_ci .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE 869562306a36Sopenharmony_ci }, 869662306a36Sopenharmony_ci [ALC289_FIXUP_DELL_SPK1] = { 869762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 869862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 869962306a36Sopenharmony_ci { 0x14, 0x90170140 }, 870062306a36Sopenharmony_ci { } 870162306a36Sopenharmony_ci }, 870262306a36Sopenharmony_ci .chained = true, 870362306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE 870462306a36Sopenharmony_ci }, 870562306a36Sopenharmony_ci [ALC289_FIXUP_DELL_SPK2] = { 870662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 870762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 870862306a36Sopenharmony_ci { 0x17, 0x90170130 }, /* bass spk */ 870962306a36Sopenharmony_ci { } 871062306a36Sopenharmony_ci }, 871162306a36Sopenharmony_ci .chained = true, 871262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE 871362306a36Sopenharmony_ci }, 871462306a36Sopenharmony_ci [ALC289_FIXUP_DUAL_SPK] = { 871562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 871662306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 871762306a36Sopenharmony_ci .chained = true, 871862306a36Sopenharmony_ci .chain_id = ALC289_FIXUP_DELL_SPK2 871962306a36Sopenharmony_ci }, 872062306a36Sopenharmony_ci [ALC289_FIXUP_RTK_AMP_DUAL_SPK] = { 872162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 872262306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 872362306a36Sopenharmony_ci .chained = true, 872462306a36Sopenharmony_ci .chain_id = ALC289_FIXUP_DELL_SPK1 872562306a36Sopenharmony_ci }, 872662306a36Sopenharmony_ci [ALC294_FIXUP_SPK2_TO_DAC1] = { 872762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 872862306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 872962306a36Sopenharmony_ci .chained = true, 873062306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC 873162306a36Sopenharmony_ci }, 873262306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_DUAL_SPK] = { 873362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 873462306a36Sopenharmony_ci /* The GPIO must be pulled to initialize the AMP */ 873562306a36Sopenharmony_ci .v.func = alc_fixup_gpio4, 873662306a36Sopenharmony_ci .chained = true, 873762306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_SPK2_TO_DAC1 873862306a36Sopenharmony_ci }, 873962306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_ALLY] = { 874062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 874162306a36Sopenharmony_ci .v.func = cs35l41_fixup_i2c_two, 874262306a36Sopenharmony_ci .chained = true, 874362306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS 874462306a36Sopenharmony_ci }, 874562306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_ALLY_PINS] = { 874662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 874762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 874862306a36Sopenharmony_ci { 0x19, 0x03a11050 }, 874962306a36Sopenharmony_ci { 0x1a, 0x03a11c30 }, 875062306a36Sopenharmony_ci { 0x21, 0x03211420 }, 875162306a36Sopenharmony_ci { } 875262306a36Sopenharmony_ci }, 875362306a36Sopenharmony_ci .chained = true, 875462306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS 875562306a36Sopenharmony_ci }, 875662306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_ALLY_VERBS] = { 875762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 875862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 875962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 }, 876062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 }, 876162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x46 }, 876262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0004 }, 876362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x47 }, 876462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xa47a }, 876562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 }, 876662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0049}, 876762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a }, 876862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x201b }, 876962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b }, 877062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x4278}, 877162306a36Sopenharmony_ci { } 877262306a36Sopenharmony_ci }, 877362306a36Sopenharmony_ci .chained = true, 877462306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER 877562306a36Sopenharmony_ci }, 877662306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_ALLY_SPEAKER] = { 877762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 877862306a36Sopenharmony_ci .v.func = alc285_fixup_speaker2_to_dac1, 877962306a36Sopenharmony_ci }, 878062306a36Sopenharmony_ci [ALC285_FIXUP_THINKPAD_X1_GEN7] = { 878162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 878262306a36Sopenharmony_ci .v.func = alc285_fixup_thinkpad_x1_gen7, 878362306a36Sopenharmony_ci .chained = true, 878462306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI 878562306a36Sopenharmony_ci }, 878662306a36Sopenharmony_ci [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = { 878762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 878862306a36Sopenharmony_ci .v.func = alc_fixup_headset_jack, 878962306a36Sopenharmony_ci .chained = true, 879062306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7 879162306a36Sopenharmony_ci }, 879262306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_HPE] = { 879362306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 879462306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 879562306a36Sopenharmony_ci /* Set EAPD high */ 879662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f }, 879762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 }, 879862306a36Sopenharmony_ci { } 879962306a36Sopenharmony_ci }, 880062306a36Sopenharmony_ci .chained = true, 880162306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC 880262306a36Sopenharmony_ci }, 880362306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_GX502_PINS] = { 880462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 880562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 880662306a36Sopenharmony_ci { 0x19, 0x03a11050 }, /* front HP mic */ 880762306a36Sopenharmony_ci { 0x1a, 0x01a11830 }, /* rear external mic */ 880862306a36Sopenharmony_ci { 0x21, 0x03211020 }, /* front HP out */ 880962306a36Sopenharmony_ci { } 881062306a36Sopenharmony_ci }, 881162306a36Sopenharmony_ci .chained = true, 881262306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS 881362306a36Sopenharmony_ci }, 881462306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_GX502_VERBS] = { 881562306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 881662306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 881762306a36Sopenharmony_ci /* set 0x15 to HP-OUT ctrl */ 881862306a36Sopenharmony_ci { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, 881962306a36Sopenharmony_ci /* unmute the 0x15 amp */ 882062306a36Sopenharmony_ci { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 }, 882162306a36Sopenharmony_ci { } 882262306a36Sopenharmony_ci }, 882362306a36Sopenharmony_ci .chained = true, 882462306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_GX502_HP 882562306a36Sopenharmony_ci }, 882662306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_GX502_HP] = { 882762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 882862306a36Sopenharmony_ci .v.func = alc294_fixup_gx502_hp, 882962306a36Sopenharmony_ci }, 883062306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_GU502_PINS] = { 883162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 883262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 883362306a36Sopenharmony_ci { 0x19, 0x01a11050 }, /* rear HP mic */ 883462306a36Sopenharmony_ci { 0x1a, 0x01a11830 }, /* rear external mic */ 883562306a36Sopenharmony_ci { 0x21, 0x012110f0 }, /* rear HP out */ 883662306a36Sopenharmony_ci { } 883762306a36Sopenharmony_ci }, 883862306a36Sopenharmony_ci .chained = true, 883962306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS 884062306a36Sopenharmony_ci }, 884162306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_GU502_VERBS] = { 884262306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 884362306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 884462306a36Sopenharmony_ci /* set 0x15 to HP-OUT ctrl */ 884562306a36Sopenharmony_ci { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, 884662306a36Sopenharmony_ci /* unmute the 0x15 amp */ 884762306a36Sopenharmony_ci { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 }, 884862306a36Sopenharmony_ci /* set 0x1b to HP-OUT */ 884962306a36Sopenharmony_ci { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 885062306a36Sopenharmony_ci { } 885162306a36Sopenharmony_ci }, 885262306a36Sopenharmony_ci .chained = true, 885362306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_GU502_HP 885462306a36Sopenharmony_ci }, 885562306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_GU502_HP] = { 885662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 885762306a36Sopenharmony_ci .v.func = alc294_fixup_gu502_hp, 885862306a36Sopenharmony_ci }, 885962306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_G513_PINS] = { 886062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 886162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 886262306a36Sopenharmony_ci { 0x19, 0x03a11050 }, /* front HP mic */ 886362306a36Sopenharmony_ci { 0x1a, 0x03a11c30 }, /* rear external mic */ 886462306a36Sopenharmony_ci { 0x21, 0x03211420 }, /* front HP out */ 886562306a36Sopenharmony_ci { } 886662306a36Sopenharmony_ci }, 886762306a36Sopenharmony_ci }, 886862306a36Sopenharmony_ci [ALC285_FIXUP_ASUS_G533Z_PINS] = { 886962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 887062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 887162306a36Sopenharmony_ci { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */ 887262306a36Sopenharmony_ci { 0x19, 0x03a19020 }, /* Mic Boost Volume */ 887362306a36Sopenharmony_ci { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */ 887462306a36Sopenharmony_ci { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */ 887562306a36Sopenharmony_ci { 0x21, 0x03211420 }, 887662306a36Sopenharmony_ci { } 887762306a36Sopenharmony_ci }, 887862306a36Sopenharmony_ci }, 887962306a36Sopenharmony_ci [ALC294_FIXUP_ASUS_COEF_1B] = { 888062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 888162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 888262306a36Sopenharmony_ci /* Set bit 10 to correct noisy output after reboot from 888362306a36Sopenharmony_ci * Windows 10 (due to pop noise reduction?) 888462306a36Sopenharmony_ci */ 888562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b }, 888662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b }, 888762306a36Sopenharmony_ci { } 888862306a36Sopenharmony_ci }, 888962306a36Sopenharmony_ci .chained = true, 889062306a36Sopenharmony_ci .chain_id = ALC289_FIXUP_ASUS_GA401, 889162306a36Sopenharmony_ci }, 889262306a36Sopenharmony_ci [ALC285_FIXUP_HP_GPIO_LED] = { 889362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 889462306a36Sopenharmony_ci .v.func = alc285_fixup_hp_gpio_led, 889562306a36Sopenharmony_ci }, 889662306a36Sopenharmony_ci [ALC285_FIXUP_HP_MUTE_LED] = { 889762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 889862306a36Sopenharmony_ci .v.func = alc285_fixup_hp_mute_led, 889962306a36Sopenharmony_ci }, 890062306a36Sopenharmony_ci [ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = { 890162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 890262306a36Sopenharmony_ci .v.func = alc285_fixup_hp_spectre_x360_mute_led, 890362306a36Sopenharmony_ci }, 890462306a36Sopenharmony_ci [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = { 890562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 890662306a36Sopenharmony_ci .v.func = alc236_fixup_hp_mute_led_coefbit2, 890762306a36Sopenharmony_ci }, 890862306a36Sopenharmony_ci [ALC236_FIXUP_HP_GPIO_LED] = { 890962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 891062306a36Sopenharmony_ci .v.func = alc236_fixup_hp_gpio_led, 891162306a36Sopenharmony_ci }, 891262306a36Sopenharmony_ci [ALC236_FIXUP_HP_MUTE_LED] = { 891362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 891462306a36Sopenharmony_ci .v.func = alc236_fixup_hp_mute_led, 891562306a36Sopenharmony_ci }, 891662306a36Sopenharmony_ci [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = { 891762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 891862306a36Sopenharmony_ci .v.func = alc236_fixup_hp_mute_led_micmute_vref, 891962306a36Sopenharmony_ci }, 892062306a36Sopenharmony_ci [ALC298_FIXUP_SAMSUNG_AMP] = { 892162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 892262306a36Sopenharmony_ci .v.func = alc298_fixup_samsung_amp, 892362306a36Sopenharmony_ci .chained = true, 892462306a36Sopenharmony_ci .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET 892562306a36Sopenharmony_ci }, 892662306a36Sopenharmony_ci [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = { 892762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 892862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 892962306a36Sopenharmony_ci { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 }, 893062306a36Sopenharmony_ci { } 893162306a36Sopenharmony_ci }, 893262306a36Sopenharmony_ci }, 893362306a36Sopenharmony_ci [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = { 893462306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 893562306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 893662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x08}, 893762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf}, 893862306a36Sopenharmony_ci { } 893962306a36Sopenharmony_ci }, 894062306a36Sopenharmony_ci }, 894162306a36Sopenharmony_ci [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = { 894262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 894362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 894462306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 894562306a36Sopenharmony_ci { } 894662306a36Sopenharmony_ci }, 894762306a36Sopenharmony_ci .chained = true, 894862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 894962306a36Sopenharmony_ci }, 895062306a36Sopenharmony_ci [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = { 895162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 895262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 895362306a36Sopenharmony_ci { 0x14, 0x90100120 }, /* use as internal speaker */ 895462306a36Sopenharmony_ci { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */ 895562306a36Sopenharmony_ci { 0x1a, 0x01011020 }, /* use as line out */ 895662306a36Sopenharmony_ci { }, 895762306a36Sopenharmony_ci }, 895862306a36Sopenharmony_ci .chained = true, 895962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 896062306a36Sopenharmony_ci }, 896162306a36Sopenharmony_ci [ALC269VC_FIXUP_ACER_HEADSET_MIC] = { 896262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 896362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 896462306a36Sopenharmony_ci { 0x18, 0x02a11030 }, /* use as headset mic */ 896562306a36Sopenharmony_ci { } 896662306a36Sopenharmony_ci }, 896762306a36Sopenharmony_ci .chained = true, 896862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 896962306a36Sopenharmony_ci }, 897062306a36Sopenharmony_ci [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = { 897162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 897262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 897362306a36Sopenharmony_ci { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */ 897462306a36Sopenharmony_ci { } 897562306a36Sopenharmony_ci }, 897662306a36Sopenharmony_ci .chained = true, 897762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MIC 897862306a36Sopenharmony_ci }, 897962306a36Sopenharmony_ci [ALC289_FIXUP_ASUS_GA401] = { 898062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 898162306a36Sopenharmony_ci .v.func = alc289_fixup_asus_ga401, 898262306a36Sopenharmony_ci .chained = true, 898362306a36Sopenharmony_ci .chain_id = ALC289_FIXUP_ASUS_GA502, 898462306a36Sopenharmony_ci }, 898562306a36Sopenharmony_ci [ALC289_FIXUP_ASUS_GA502] = { 898662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 898762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 898862306a36Sopenharmony_ci { 0x19, 0x03a11020 }, /* headset mic with jack detect */ 898962306a36Sopenharmony_ci { } 899062306a36Sopenharmony_ci }, 899162306a36Sopenharmony_ci }, 899262306a36Sopenharmony_ci [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = { 899362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 899462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 899562306a36Sopenharmony_ci { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */ 899662306a36Sopenharmony_ci { } 899762306a36Sopenharmony_ci }, 899862306a36Sopenharmony_ci .chained = true, 899962306a36Sopenharmony_ci .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE 900062306a36Sopenharmony_ci }, 900162306a36Sopenharmony_ci [ALC285_FIXUP_HP_GPIO_AMP_INIT] = { 900262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 900362306a36Sopenharmony_ci .v.func = alc285_fixup_hp_gpio_amp_init, 900462306a36Sopenharmony_ci .chained = true, 900562306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_GPIO_LED 900662306a36Sopenharmony_ci }, 900762306a36Sopenharmony_ci [ALC269_FIXUP_CZC_B20] = { 900862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 900962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 901062306a36Sopenharmony_ci { 0x12, 0x411111f0 }, 901162306a36Sopenharmony_ci { 0x14, 0x90170110 }, /* speaker */ 901262306a36Sopenharmony_ci { 0x15, 0x032f1020 }, /* HP out */ 901362306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 901462306a36Sopenharmony_ci { 0x18, 0x03ab1040 }, /* mic */ 901562306a36Sopenharmony_ci { 0x19, 0xb7a7013f }, 901662306a36Sopenharmony_ci { 0x1a, 0x0181305f }, 901762306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, 901862306a36Sopenharmony_ci { 0x1d, 0x411111f0 }, 901962306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, 902062306a36Sopenharmony_ci { } 902162306a36Sopenharmony_ci }, 902262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DMIC, 902362306a36Sopenharmony_ci }, 902462306a36Sopenharmony_ci [ALC269_FIXUP_CZC_TMI] = { 902562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 902662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 902762306a36Sopenharmony_ci { 0x12, 0x4000c000 }, 902862306a36Sopenharmony_ci { 0x14, 0x90170110 }, /* speaker */ 902962306a36Sopenharmony_ci { 0x15, 0x0421401f }, /* HP out */ 903062306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 903162306a36Sopenharmony_ci { 0x18, 0x04a19020 }, /* mic */ 903262306a36Sopenharmony_ci { 0x19, 0x411111f0 }, 903362306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, 903462306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, 903562306a36Sopenharmony_ci { 0x1d, 0x40448505 }, 903662306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, 903762306a36Sopenharmony_ci { 0x20, 0x8000ffff }, 903862306a36Sopenharmony_ci { } 903962306a36Sopenharmony_ci }, 904062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DMIC, 904162306a36Sopenharmony_ci }, 904262306a36Sopenharmony_ci [ALC269_FIXUP_CZC_L101] = { 904362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 904462306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 904562306a36Sopenharmony_ci { 0x12, 0x40000000 }, 904662306a36Sopenharmony_ci { 0x14, 0x01014010 }, /* speaker */ 904762306a36Sopenharmony_ci { 0x15, 0x411111f0 }, /* HP out */ 904862306a36Sopenharmony_ci { 0x16, 0x411111f0 }, 904962306a36Sopenharmony_ci { 0x18, 0x01a19020 }, /* mic */ 905062306a36Sopenharmony_ci { 0x19, 0x02a19021 }, 905162306a36Sopenharmony_ci { 0x1a, 0x0181302f }, 905262306a36Sopenharmony_ci { 0x1b, 0x0221401f }, 905362306a36Sopenharmony_ci { 0x1c, 0x411111f0 }, 905462306a36Sopenharmony_ci { 0x1d, 0x4044c601 }, 905562306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, 905662306a36Sopenharmony_ci { } 905762306a36Sopenharmony_ci }, 905862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DMIC, 905962306a36Sopenharmony_ci }, 906062306a36Sopenharmony_ci [ALC269_FIXUP_LEMOTE_A1802] = { 906162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 906262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 906362306a36Sopenharmony_ci { 0x12, 0x40000000 }, 906462306a36Sopenharmony_ci { 0x14, 0x90170110 }, /* speaker */ 906562306a36Sopenharmony_ci { 0x17, 0x411111f0 }, 906662306a36Sopenharmony_ci { 0x18, 0x03a19040 }, /* mic1 */ 906762306a36Sopenharmony_ci { 0x19, 0x90a70130 }, /* mic2 */ 906862306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, 906962306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, 907062306a36Sopenharmony_ci { 0x1d, 0x40489d2d }, 907162306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, 907262306a36Sopenharmony_ci { 0x20, 0x0003ffff }, 907362306a36Sopenharmony_ci { 0x21, 0x03214020 }, 907462306a36Sopenharmony_ci { } 907562306a36Sopenharmony_ci }, 907662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DMIC, 907762306a36Sopenharmony_ci }, 907862306a36Sopenharmony_ci [ALC269_FIXUP_LEMOTE_A190X] = { 907962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 908062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 908162306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 908262306a36Sopenharmony_ci { 0x15, 0x0121401f }, /* HP out */ 908362306a36Sopenharmony_ci { 0x18, 0x01a19c20 }, /* rear mic */ 908462306a36Sopenharmony_ci { 0x19, 0x99a3092f }, /* front mic */ 908562306a36Sopenharmony_ci { 0x1b, 0x0201401f }, /* front lineout */ 908662306a36Sopenharmony_ci { } 908762306a36Sopenharmony_ci }, 908862306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DMIC, 908962306a36Sopenharmony_ci }, 909062306a36Sopenharmony_ci [ALC256_FIXUP_INTEL_NUC8_RUGGED] = { 909162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 909262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 909362306a36Sopenharmony_ci { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 909462306a36Sopenharmony_ci { } 909562306a36Sopenharmony_ci }, 909662306a36Sopenharmony_ci .chained = true, 909762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 909862306a36Sopenharmony_ci }, 909962306a36Sopenharmony_ci [ALC256_FIXUP_INTEL_NUC10] = { 910062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 910162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 910262306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 910362306a36Sopenharmony_ci { } 910462306a36Sopenharmony_ci }, 910562306a36Sopenharmony_ci .chained = true, 910662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 910762306a36Sopenharmony_ci }, 910862306a36Sopenharmony_ci [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = { 910962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 911062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 911162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 }, 911262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 }, 911362306a36Sopenharmony_ci { } 911462306a36Sopenharmony_ci }, 911562306a36Sopenharmony_ci .chained = true, 911662306a36Sopenharmony_ci .chain_id = ALC289_FIXUP_ASUS_GA502 911762306a36Sopenharmony_ci }, 911862306a36Sopenharmony_ci [ALC274_FIXUP_HP_MIC] = { 911962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 912062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 912162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 }, 912262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 }, 912362306a36Sopenharmony_ci { } 912462306a36Sopenharmony_ci }, 912562306a36Sopenharmony_ci }, 912662306a36Sopenharmony_ci [ALC274_FIXUP_HP_HEADSET_MIC] = { 912762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 912862306a36Sopenharmony_ci .v.func = alc274_fixup_hp_headset_mic, 912962306a36Sopenharmony_ci .chained = true, 913062306a36Sopenharmony_ci .chain_id = ALC274_FIXUP_HP_MIC 913162306a36Sopenharmony_ci }, 913262306a36Sopenharmony_ci [ALC274_FIXUP_HP_ENVY_GPIO] = { 913362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 913462306a36Sopenharmony_ci .v.func = alc274_fixup_hp_envy_gpio, 913562306a36Sopenharmony_ci }, 913662306a36Sopenharmony_ci [ALC256_FIXUP_ASUS_HPE] = { 913762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 913862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 913962306a36Sopenharmony_ci /* Set EAPD high */ 914062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f }, 914162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 }, 914262306a36Sopenharmony_ci { } 914362306a36Sopenharmony_ci }, 914462306a36Sopenharmony_ci .chained = true, 914562306a36Sopenharmony_ci .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC 914662306a36Sopenharmony_ci }, 914762306a36Sopenharmony_ci [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = { 914862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 914962306a36Sopenharmony_ci .v.func = alc_fixup_headset_jack, 915062306a36Sopenharmony_ci .chained = true, 915162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI 915262306a36Sopenharmony_ci }, 915362306a36Sopenharmony_ci [ALC287_FIXUP_HP_GPIO_LED] = { 915462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 915562306a36Sopenharmony_ci .v.func = alc287_fixup_hp_gpio_led, 915662306a36Sopenharmony_ci }, 915762306a36Sopenharmony_ci [ALC256_FIXUP_HP_HEADSET_MIC] = { 915862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 915962306a36Sopenharmony_ci .v.func = alc274_fixup_hp_headset_mic, 916062306a36Sopenharmony_ci }, 916162306a36Sopenharmony_ci [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = { 916262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 916362306a36Sopenharmony_ci .v.func = alc_fixup_no_int_mic, 916462306a36Sopenharmony_ci .chained = true, 916562306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE 916662306a36Sopenharmony_ci }, 916762306a36Sopenharmony_ci [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = { 916862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 916962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 917062306a36Sopenharmony_ci { 0x1b, 0x411111f0 }, 917162306a36Sopenharmony_ci { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 917262306a36Sopenharmony_ci { }, 917362306a36Sopenharmony_ci }, 917462306a36Sopenharmony_ci .chained = true, 917562306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE 917662306a36Sopenharmony_ci }, 917762306a36Sopenharmony_ci [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = { 917862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 917962306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 918062306a36Sopenharmony_ci .chained = true, 918162306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, 918262306a36Sopenharmony_ci }, 918362306a36Sopenharmony_ci [ALC256_FIXUP_ACER_HEADSET_MIC] = { 918462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 918562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 918662306a36Sopenharmony_ci { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */ 918762306a36Sopenharmony_ci { 0x1a, 0x90a1092f }, /* use as internal mic */ 918862306a36Sopenharmony_ci { } 918962306a36Sopenharmony_ci }, 919062306a36Sopenharmony_ci .chained = true, 919162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 919262306a36Sopenharmony_ci }, 919362306a36Sopenharmony_ci [ALC285_FIXUP_IDEAPAD_S740_COEF] = { 919462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 919562306a36Sopenharmony_ci .v.func = alc285_fixup_ideapad_s740_coef, 919662306a36Sopenharmony_ci .chained = true, 919762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI, 919862306a36Sopenharmony_ci }, 919962306a36Sopenharmony_ci [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = { 920062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 920162306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 920262306a36Sopenharmony_ci .chained = true, 920362306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_MUTE_LED, 920462306a36Sopenharmony_ci }, 920562306a36Sopenharmony_ci [ALC295_FIXUP_ASUS_DACS] = { 920662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 920762306a36Sopenharmony_ci .v.func = alc295_fixup_asus_dacs, 920862306a36Sopenharmony_ci }, 920962306a36Sopenharmony_ci [ALC295_FIXUP_HP_OMEN] = { 921062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 921162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 921262306a36Sopenharmony_ci { 0x12, 0xb7a60130 }, 921362306a36Sopenharmony_ci { 0x13, 0x40000000 }, 921462306a36Sopenharmony_ci { 0x14, 0x411111f0 }, 921562306a36Sopenharmony_ci { 0x16, 0x411111f0 }, 921662306a36Sopenharmony_ci { 0x17, 0x90170110 }, 921762306a36Sopenharmony_ci { 0x18, 0x411111f0 }, 921862306a36Sopenharmony_ci { 0x19, 0x02a11030 }, 921962306a36Sopenharmony_ci { 0x1a, 0x411111f0 }, 922062306a36Sopenharmony_ci { 0x1b, 0x04a19030 }, 922162306a36Sopenharmony_ci { 0x1d, 0x40600001 }, 922262306a36Sopenharmony_ci { 0x1e, 0x411111f0 }, 922362306a36Sopenharmony_ci { 0x21, 0x03211020 }, 922462306a36Sopenharmony_ci {} 922562306a36Sopenharmony_ci }, 922662306a36Sopenharmony_ci .chained = true, 922762306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED, 922862306a36Sopenharmony_ci }, 922962306a36Sopenharmony_ci [ALC285_FIXUP_HP_SPECTRE_X360] = { 923062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 923162306a36Sopenharmony_ci .v.func = alc285_fixup_hp_spectre_x360, 923262306a36Sopenharmony_ci }, 923362306a36Sopenharmony_ci [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = { 923462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 923562306a36Sopenharmony_ci .v.func = alc285_fixup_hp_spectre_x360_eb1 923662306a36Sopenharmony_ci }, 923762306a36Sopenharmony_ci [ALC285_FIXUP_HP_ENVY_X360] = { 923862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 923962306a36Sopenharmony_ci .v.func = alc285_fixup_hp_envy_x360, 924062306a36Sopenharmony_ci .chained = true, 924162306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT, 924262306a36Sopenharmony_ci }, 924362306a36Sopenharmony_ci [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = { 924462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 924562306a36Sopenharmony_ci .v.func = alc285_fixup_ideapad_s740_coef, 924662306a36Sopenharmony_ci .chained = true, 924762306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK, 924862306a36Sopenharmony_ci }, 924962306a36Sopenharmony_ci [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = { 925062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 925162306a36Sopenharmony_ci .v.func = alc_fixup_no_shutup, 925262306a36Sopenharmony_ci .chained = true, 925362306a36Sopenharmony_ci .chain_id = ALC283_FIXUP_HEADSET_MIC, 925462306a36Sopenharmony_ci }, 925562306a36Sopenharmony_ci [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = { 925662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 925762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 925862306a36Sopenharmony_ci { 0x21, 0x03211030 }, /* Change the Headphone location to Left */ 925962306a36Sopenharmony_ci { } 926062306a36Sopenharmony_ci }, 926162306a36Sopenharmony_ci .chained = true, 926262306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC 926362306a36Sopenharmony_ci }, 926462306a36Sopenharmony_ci [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = { 926562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 926662306a36Sopenharmony_ci .v.func = alc269_fixup_limit_int_mic_boost, 926762306a36Sopenharmony_ci .chained = true, 926862306a36Sopenharmony_ci .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF, 926962306a36Sopenharmony_ci }, 927062306a36Sopenharmony_ci [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = { 927162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 927262306a36Sopenharmony_ci .v.func = alc285_fixup_ideapad_s740_coef, 927362306a36Sopenharmony_ci .chained = true, 927462306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE, 927562306a36Sopenharmony_ci }, 927662306a36Sopenharmony_ci [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = { 927762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 927862306a36Sopenharmony_ci .v.func = alc287_fixup_legion_15imhg05_speakers, 927962306a36Sopenharmony_ci .chained = true, 928062306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_THINKPAD_ACPI, 928162306a36Sopenharmony_ci }, 928262306a36Sopenharmony_ci [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = { 928362306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 928462306a36Sopenharmony_ci //.v.verbs = legion_15imhg05_coefs, 928562306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 928662306a36Sopenharmony_ci // set left speaker Legion 7i. 928762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 928862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x41 }, 928962306a36Sopenharmony_ci 929062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 929162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xc }, 929262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 929362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x1a }, 929462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 929562306a36Sopenharmony_ci 929662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 929762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 929862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 929962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 930062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 930162306a36Sopenharmony_ci 930262306a36Sopenharmony_ci // set right speaker Legion 7i. 930362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 930462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x42 }, 930562306a36Sopenharmony_ci 930662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 930762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xc }, 930862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 930962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2a }, 931062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 931162306a36Sopenharmony_ci 931262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 931362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 931462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 931562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 931662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 931762306a36Sopenharmony_ci {} 931862306a36Sopenharmony_ci }, 931962306a36Sopenharmony_ci .chained = true, 932062306a36Sopenharmony_ci .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE, 932162306a36Sopenharmony_ci }, 932262306a36Sopenharmony_ci [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = { 932362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 932462306a36Sopenharmony_ci .v.func = alc287_fixup_legion_15imhg05_speakers, 932562306a36Sopenharmony_ci .chained = true, 932662306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE, 932762306a36Sopenharmony_ci }, 932862306a36Sopenharmony_ci [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = { 932962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 933062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 933162306a36Sopenharmony_ci // set left speaker Yoga 7i. 933262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 933362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x41 }, 933462306a36Sopenharmony_ci 933562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 933662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xc }, 933762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 933862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x1a }, 933962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 934062306a36Sopenharmony_ci 934162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 934262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 934362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 934462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 934562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 934662306a36Sopenharmony_ci 934762306a36Sopenharmony_ci // set right speaker Yoga 7i. 934862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 934962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x46 }, 935062306a36Sopenharmony_ci 935162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 935262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xc }, 935362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 935462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2a }, 935562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 935662306a36Sopenharmony_ci 935762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 935862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 935962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 936062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 936162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 936262306a36Sopenharmony_ci {} 936362306a36Sopenharmony_ci }, 936462306a36Sopenharmony_ci .chained = true, 936562306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE, 936662306a36Sopenharmony_ci }, 936762306a36Sopenharmony_ci [ALC298_FIXUP_LENOVO_C940_DUET7] = { 936862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 936962306a36Sopenharmony_ci .v.func = alc298_fixup_lenovo_c940_duet7, 937062306a36Sopenharmony_ci }, 937162306a36Sopenharmony_ci [ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = { 937262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 937362306a36Sopenharmony_ci .v.func = alc287_fixup_lenovo_14irp8_duetitl, 937462306a36Sopenharmony_ci }, 937562306a36Sopenharmony_ci [ALC287_FIXUP_13S_GEN2_SPEAKERS] = { 937662306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 937762306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 937862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 937962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x41 }, 938062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 938162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 938262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 938362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 938462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 938562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 938662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x42 }, 938762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 938862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 938962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 939062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 939162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 939262306a36Sopenharmony_ci {} 939362306a36Sopenharmony_ci }, 939462306a36Sopenharmony_ci .chained = true, 939562306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE, 939662306a36Sopenharmony_ci }, 939762306a36Sopenharmony_ci [ALC256_FIXUP_SET_COEF_DEFAULTS] = { 939862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 939962306a36Sopenharmony_ci .v.func = alc256_fixup_set_coef_defaults, 940062306a36Sopenharmony_ci }, 940162306a36Sopenharmony_ci [ALC245_FIXUP_HP_GPIO_LED] = { 940262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 940362306a36Sopenharmony_ci .v.func = alc245_fixup_hp_gpio_led, 940462306a36Sopenharmony_ci }, 940562306a36Sopenharmony_ci [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = { 940662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 940762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 940862306a36Sopenharmony_ci { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */ 940962306a36Sopenharmony_ci { } 941062306a36Sopenharmony_ci }, 941162306a36Sopenharmony_ci .chained = true, 941262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, 941362306a36Sopenharmony_ci }, 941462306a36Sopenharmony_ci [ALC233_FIXUP_NO_AUDIO_JACK] = { 941562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 941662306a36Sopenharmony_ci .v.func = alc233_fixup_no_audio_jack, 941762306a36Sopenharmony_ci }, 941862306a36Sopenharmony_ci [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = { 941962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 942062306a36Sopenharmony_ci .v.func = alc256_fixup_mic_no_presence_and_resume, 942162306a36Sopenharmony_ci .chained = true, 942262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 942362306a36Sopenharmony_ci }, 942462306a36Sopenharmony_ci [ALC287_FIXUP_LEGION_16ACHG6] = { 942562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 942662306a36Sopenharmony_ci .v.func = alc287_fixup_legion_16achg6_speakers, 942762306a36Sopenharmony_ci }, 942862306a36Sopenharmony_ci [ALC287_FIXUP_CS35L41_I2C_2] = { 942962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 943062306a36Sopenharmony_ci .v.func = cs35l41_fixup_i2c_two, 943162306a36Sopenharmony_ci }, 943262306a36Sopenharmony_ci [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = { 943362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 943462306a36Sopenharmony_ci .v.func = cs35l41_fixup_i2c_two, 943562306a36Sopenharmony_ci .chained = true, 943662306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_MUTE_LED, 943762306a36Sopenharmony_ci }, 943862306a36Sopenharmony_ci [ALC245_FIXUP_CS35L41_SPI_2] = { 943962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 944062306a36Sopenharmony_ci .v.func = cs35l41_fixup_spi_two, 944162306a36Sopenharmony_ci }, 944262306a36Sopenharmony_ci [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = { 944362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 944462306a36Sopenharmony_ci .v.func = cs35l41_fixup_spi_two, 944562306a36Sopenharmony_ci .chained = true, 944662306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_GPIO_LED, 944762306a36Sopenharmony_ci }, 944862306a36Sopenharmony_ci [ALC245_FIXUP_CS35L41_SPI_4] = { 944962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 945062306a36Sopenharmony_ci .v.func = cs35l41_fixup_spi_four, 945162306a36Sopenharmony_ci }, 945262306a36Sopenharmony_ci [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = { 945362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 945462306a36Sopenharmony_ci .v.func = cs35l41_fixup_spi_four, 945562306a36Sopenharmony_ci .chained = true, 945662306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_GPIO_LED, 945762306a36Sopenharmony_ci }, 945862306a36Sopenharmony_ci [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = { 945962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 946062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 946162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 }, 946262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 }, 946362306a36Sopenharmony_ci { } 946462306a36Sopenharmony_ci }, 946562306a36Sopenharmony_ci .chained = true, 946662306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_HP_MUTE_LED, 946762306a36Sopenharmony_ci }, 946862306a36Sopenharmony_ci [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = { 946962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 947062306a36Sopenharmony_ci .v.func = alc_fixup_dell4_mic_no_presence_quiet, 947162306a36Sopenharmony_ci .chained = true, 947262306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, 947362306a36Sopenharmony_ci }, 947462306a36Sopenharmony_ci [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = { 947562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 947662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 947762306a36Sopenharmony_ci { 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */ 947862306a36Sopenharmony_ci { } 947962306a36Sopenharmony_ci }, 948062306a36Sopenharmony_ci .chained = true, 948162306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 948262306a36Sopenharmony_ci }, 948362306a36Sopenharmony_ci [ALC287_FIXUP_LEGION_16ITHG6] = { 948462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 948562306a36Sopenharmony_ci .v.func = alc287_fixup_legion_16ithg6_speakers, 948662306a36Sopenharmony_ci }, 948762306a36Sopenharmony_ci [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = { 948862306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 948962306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 949062306a36Sopenharmony_ci // enable left speaker 949162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 949262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x41 }, 949362306a36Sopenharmony_ci 949462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 949562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xc }, 949662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 949762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x1a }, 949862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 949962306a36Sopenharmony_ci 950062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 950162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xf }, 950262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 950362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x42 }, 950462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 950562306a36Sopenharmony_ci 950662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 950762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x10 }, 950862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 950962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x40 }, 951062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 951162306a36Sopenharmony_ci 951262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 951362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 951462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 951562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 951662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 951762306a36Sopenharmony_ci 951862306a36Sopenharmony_ci // enable right speaker 951962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 }, 952062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x46 }, 952162306a36Sopenharmony_ci 952262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 952362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xc }, 952462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 952562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2a }, 952662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 952762306a36Sopenharmony_ci 952862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 952962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xf }, 953062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 953162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x46 }, 953262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 953362306a36Sopenharmony_ci 953462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 953562306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x10 }, 953662306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 953762306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x44 }, 953862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 953962306a36Sopenharmony_ci 954062306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 }, 954162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x2 }, 954262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 954362306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0 }, 954462306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 }, 954562306a36Sopenharmony_ci 954662306a36Sopenharmony_ci { }, 954762306a36Sopenharmony_ci }, 954862306a36Sopenharmony_ci }, 954962306a36Sopenharmony_ci [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = { 955062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 955162306a36Sopenharmony_ci .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin, 955262306a36Sopenharmony_ci .chained = true, 955362306a36Sopenharmony_ci .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK, 955462306a36Sopenharmony_ci }, 955562306a36Sopenharmony_ci [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = { 955662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 955762306a36Sopenharmony_ci .v.func = alc295_fixup_dell_inspiron_top_speakers, 955862306a36Sopenharmony_ci .chained = true, 955962306a36Sopenharmony_ci .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, 956062306a36Sopenharmony_ci }, 956162306a36Sopenharmony_ci [ALC236_FIXUP_DELL_DUAL_CODECS] = { 956262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 956362306a36Sopenharmony_ci .v.func = alc1220_fixup_gb_dual_codecs, 956462306a36Sopenharmony_ci .chained = true, 956562306a36Sopenharmony_ci .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 956662306a36Sopenharmony_ci }, 956762306a36Sopenharmony_ci [ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = { 956862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 956962306a36Sopenharmony_ci .v.func = cs35l41_fixup_i2c_two, 957062306a36Sopenharmony_ci .chained = true, 957162306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK, 957262306a36Sopenharmony_ci }, 957362306a36Sopenharmony_ci [ALC287_FIXUP_TAS2781_I2C] = { 957462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 957562306a36Sopenharmony_ci .v.func = tas2781_fixup_i2c, 957662306a36Sopenharmony_ci .chained = true, 957762306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK, 957862306a36Sopenharmony_ci }, 957962306a36Sopenharmony_ci [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = { 958062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 958162306a36Sopenharmony_ci .v.func = alc245_fixup_hp_mute_led_coefbit, 958262306a36Sopenharmony_ci }, 958362306a36Sopenharmony_ci [ALC245_FIXUP_HP_X360_MUTE_LEDS] = { 958462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 958562306a36Sopenharmony_ci .v.func = alc245_fixup_hp_mute_led_coefbit, 958662306a36Sopenharmony_ci .chained = true, 958762306a36Sopenharmony_ci .chain_id = ALC245_FIXUP_HP_GPIO_LED 958862306a36Sopenharmony_ci }, 958962306a36Sopenharmony_ci [ALC287_FIXUP_THINKPAD_I2S_SPK] = { 959062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 959162306a36Sopenharmony_ci .v.func = alc287_fixup_bind_dacs, 959262306a36Sopenharmony_ci .chained = true, 959362306a36Sopenharmony_ci .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK, 959462306a36Sopenharmony_ci }, 959562306a36Sopenharmony_ci [ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = { 959662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 959762306a36Sopenharmony_ci .v.func = alc287_fixup_bind_dacs, 959862306a36Sopenharmony_ci .chained = true, 959962306a36Sopenharmony_ci .chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI, 960062306a36Sopenharmony_ci }, 960162306a36Sopenharmony_ci [ALC2XX_FIXUP_HEADSET_MIC] = { 960262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 960362306a36Sopenharmony_ci .v.func = alc_fixup_headset_mic, 960462306a36Sopenharmony_ci }, 960562306a36Sopenharmony_ci [ALC289_FIXUP_DELL_CS35L41_SPI_2] = { 960662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 960762306a36Sopenharmony_ci .v.func = cs35l41_fixup_spi_two, 960862306a36Sopenharmony_ci .chained = true, 960962306a36Sopenharmony_ci .chain_id = ALC289_FIXUP_DUAL_SPK 961062306a36Sopenharmony_ci }, 961162306a36Sopenharmony_ci [ALC294_FIXUP_CS35L41_I2C_2] = { 961262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 961362306a36Sopenharmony_ci .v.func = cs35l41_fixup_i2c_two, 961462306a36Sopenharmony_ci }, 961562306a36Sopenharmony_ci}; 961662306a36Sopenharmony_ci 961762306a36Sopenharmony_cistatic const struct snd_pci_quirk alc269_fixup_tbl[] = { 961862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC), 961962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), 962062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), 962162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700), 962262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC), 962362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK), 962462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK), 962562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572), 962662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572), 962762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS), 962862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC), 962962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF), 963062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK), 963162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), 963262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC), 963362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK), 963462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST), 963562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), 963662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), 963762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK), 963862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK), 963962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK), 964062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS), 964162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE), 964262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC), 964362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), 964462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), 964562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), 964662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), 964762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC), 964862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), 964962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), 965062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), 965162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC), 965262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), 965362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), 965462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), 965562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), 965662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC), 965762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), 965862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), 965962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X), 966062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), 966162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X), 966262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X), 966362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X), 966462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X), 966562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER), 966662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), 966762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), 966862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), 966962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), 967062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), 967162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X), 967262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X), 967362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), 967462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 967562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 967662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13), 967762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), 967862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK), 967962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), 968062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 968162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 968262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), 968362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), 968462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), 968562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), 968662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), 968762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), 968862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), 968962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP), 969062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME), 969162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), 969262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), 969362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3), 969462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE), 969562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), 969662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), 969762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), 969862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), 969962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), 970062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE), 970162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE), 970262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), 970362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK), 970462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK), 970562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), 970662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), 970762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC), 970862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC), 970962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET), 971062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC), 971162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK), 971262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK), 971362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), 971462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), 971562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK), 971662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK), 971762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS), 971862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS), 971962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2), 972062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), 972162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK), 972262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK), 972362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK), 972462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS), 972562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS), 972662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS), 972762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS), 972862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS), 972962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS), 973062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK), 973462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 973862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK), 973962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 974062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 974162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), 974262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), 974362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), 974462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 974562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 974662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 974762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 974862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC), 974962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 975062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 975162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), 975262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), 975362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), 975462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), 975562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), 975662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 975762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 975862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 975962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 976062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 976162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 976262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED), 976362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY), 976462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 976562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 976662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 976762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 976862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 976962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 977062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 977162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 977262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED), 977362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 977462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS), 977562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 977662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS), 977762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 977862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 977962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 978962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 979062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 979162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M), 979262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 979362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), 979462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 979562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 979662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 979762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), 979862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE), 979962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE), 980062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE), 980162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC), 980262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC), 980362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360), 980462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC), 980562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360), 980662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), 980762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE), 980862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE), 980962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), 981062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3), 981162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), 981262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 981362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN), 981462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), 981562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360), 981662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 981762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360), 981862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT), 981962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT), 982062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), 982162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO), 982262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), 982362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), 982462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED), 982562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), 982662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), 982762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED), 982862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED), 982962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED), 983062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 983162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 983262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT), 983362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED), 983462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS), 983562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED), 983662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED), 983762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation", 983862306a36Sopenharmony_ci ALC285_FIXUP_HP_GPIO_AMP_INIT), 983962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation", 984062306a36Sopenharmony_ci ALC285_FIXUP_HP_GPIO_AMP_INIT), 984162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED), 984262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED), 984362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED), 984462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 984562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED), 984662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), 984762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), 984862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), 984962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), 985062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED), 985162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED), 985262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP), 985362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP), 985462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 985562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), 985662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED), 985762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), 985862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), 985962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 986062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED), 986162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED), 986262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED), 986362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED), 986462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST), 986562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST), 986662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), 986762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), 986862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), 986962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 987062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS), 987162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED), 987262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED), 987362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED), 987462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST), 987562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED), 987662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED), 987762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 987862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED), 987962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 988662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED), 988762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4), 988862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2), 988962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2), 989062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 989162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2), 989262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 989362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2), 989462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED), 989562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED), 989662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED), 989762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED), 989862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED), 989962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 990062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), 990162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 990262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 990362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 990462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED), 990562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 990662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), 990762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST), 990862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED), 990962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED), 991062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED), 991162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED), 991262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED), 991362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 991462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 991562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 991662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 991762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 991862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED), 991962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 992062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 992162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 992262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 992362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 992462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 992562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 992662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 992762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 992862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), 992962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 993062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 993162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 993262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 993362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 993462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2), 993562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED), 993662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED), 993762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED), 993862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED), 993962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED), 994062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED), 994162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), 994262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 994362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 994462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 994562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED), 994662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 994762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 994862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 994962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 995062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 995162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 995262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 995362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 995462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 995562306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED), 995662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED), 995762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 995862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 995962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), 996062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), 996162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), 996262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 996362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK), 996462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), 996562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 996662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK), 996762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 996862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 996962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 997062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 997162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE), 997262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE), 997362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM), 997462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2), 997562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC), 997662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC), 997762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE), 997862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC), 997962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK), 998062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC), 998162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC), 998262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC), 998362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC), 998462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC), 998562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A), 998662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA", ALC287_FIXUP_CS35L41_I2C_2), 998762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC), 998862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK), 998962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZV", ALC285_FIXUP_ASUS_HEADSET_MIC), 999062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2), 999162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401), 999262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), 999362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS), 999462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK), 999562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY), 999662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS), 999762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC), 999862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2), 999962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC), 1000062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE), 1000162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401), 1000262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE), 1000362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE), 1000462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE), 1000562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), 1000662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC), 1000762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2), 1000862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2), 1000962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2), 1001062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B), 1001162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC), 1001262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2), 1001362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 1001462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2), 1001562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 1001662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2), 1001762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2), 1001862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401), 1001962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS), 1002062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC), 1002162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS), 1002262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC), 1002362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2), 1002462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401), 1002562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE), 1002662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2), 1002762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2), 1002862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2), 1002962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2), 1003062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502), 1003162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2), 1003262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS), 1003362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS), 1003462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401), 1003562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2), 1003662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401), 1003762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401), 1003862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2), 1003962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2), 1004062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401), 1004162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2), 1004262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2), 1004362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2), 1004462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2), 1004562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2), 1004662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2), 1004762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), 1004862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC), 1004962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC), 1005062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC), 1005162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101), 1005262306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2), 1005362306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), 1005462306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), 1005562306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX), 1005662306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE), 1005762306a36Sopenharmony_ci SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE), 1005862306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK), 1005962306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT), 1006062306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN), 1006162306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC), 1006262306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN), 1006362306a36Sopenharmony_ci SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), 1006462306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE), 1006562306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE), 1006662306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), 1006762306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), 1006862306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), 1006962306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), 1007062306a36Sopenharmony_ci SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), 1007162306a36Sopenharmony_ci SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE), 1007262306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), 1007362306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP), 1007462306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP), 1007562306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP), 1007662306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP), 1007762306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP), 1007862306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP), 1007962306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8), 1008062306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP), 1008162306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP), 1008262306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET), 1008362306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP), 1008462306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP), 1008562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC), 1008662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC), 1008762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC), 1008862306a36Sopenharmony_ci SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK), 1008962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1009962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1010962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1011962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1012962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1013962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC), 1014062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC), 1014162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC), 1014262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1014362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1014462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1014562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1014662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1014762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME), 1014862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1014962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1015962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1016062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1016162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1016262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1016362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1016462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 1016562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS), 1016662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340), 1016762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE), 1016862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE), 1016962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), 1017062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE), 1017162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE), 1017262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK), 1017362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST), 1017462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK), 1017562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), 1017662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), 1017762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK), 1017862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440), 1017962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK), 1018062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK), 1018162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK), 1018262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), 1018362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK), 1018462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 1018562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), 1018662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), 1018762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), 1018862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1018962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1019062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460), 1019162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), 1019262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK), 1019362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1019462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1019562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460), 1019662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1019762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1019862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1019962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 1020062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK), 1020162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK), 1020262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK), 1020362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK), 1020462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1020562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1020662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1020762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1020862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1020962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1021062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1021162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 1021262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), 1021362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), 1021462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), 1021562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), 1021662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), 1021762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), 1021862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), 1021962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), 1022062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), 1022162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), 1022262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340), 1022362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC), 1022462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), 1022562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL), 1022662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS), 1022762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7), 1022862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS), 1022962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 1023062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS), 1023162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF), 1023262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 1023362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS), 1023462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP), 1023562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6), 1023662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 1023762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 1023862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 1023962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6), 1024062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), 1024162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C), 1024262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C), 1024362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C), 1024462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), 1024562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C), 1024662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C), 1024762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C), 1024862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C), 1024962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C), 1025062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C), 1025162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C), 1025262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C), 1025362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C), 1025462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C), 1025562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C), 1025662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), 1025762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), 1025862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI), 1025962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), 1026062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 1026162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC), 1026262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK), 1026362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 1026462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK), 1026562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK), 1026662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK), 1026762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK), 1026862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), 1026962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460), 1027062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460), 1027162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460), 1027262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1027362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1027462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1027562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS), 1027662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 1027762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1027862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 1027962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), 1028062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE), 1028162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK), 1028262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC), 1028362306a36Sopenharmony_ci SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS), 1028462306a36Sopenharmony_ci SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 1028562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20), 1028662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI), 1028762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101), 1028862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */ 1028962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802), 1029062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X), 1029162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE), 1029262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS), 1029362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP), 1029462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP), 1029562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP), 1029662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP), 1029762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP), 1029862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP), 1029962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP), 1030062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP), 1030162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC), 1030262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE), 1030362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC), 1030462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC), 1030562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC), 1030662306a36Sopenharmony_ci SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO), 1030762306a36Sopenharmony_ci SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME), 1030862306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC), 1030962306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED), 1031062306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10), 1031162306a36Sopenharmony_ci SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK), 1031262306a36Sopenharmony_ci SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE), 1031362306a36Sopenharmony_ci SND_PCI_QUIRK(0xf111, 0x0005, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE), 1031462306a36Sopenharmony_ci SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE), 1031562306a36Sopenharmony_ci 1031662306a36Sopenharmony_ci#if 0 1031762306a36Sopenharmony_ci /* Below is a quirk table taken from the old code. 1031862306a36Sopenharmony_ci * Basically the device should work as is without the fixup table. 1031962306a36Sopenharmony_ci * If BIOS doesn't give a proper info, enable the corresponding 1032062306a36Sopenharmony_ci * fixup entry. 1032162306a36Sopenharmony_ci */ 1032262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", 1032362306a36Sopenharmony_ci ALC269_FIXUP_AMIC), 1032462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), 1032562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC), 1032662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC), 1032762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC), 1032862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC), 1032962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC), 1033062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC), 1033162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC), 1033262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC), 1033362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC), 1033462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC), 1033562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC), 1033662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC), 1033762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC), 1033862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC), 1033962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC), 1034062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC), 1034162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC), 1034262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC), 1034362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC), 1034462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC), 1034562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC), 1034662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC), 1034762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC), 1034862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC), 1034962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC), 1035062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC), 1035162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC), 1035262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC), 1035362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC), 1035462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC), 1035562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC), 1035662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC), 1035762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC), 1035862306a36Sopenharmony_ci SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC), 1035962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC), 1036062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC), 1036162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC), 1036262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC), 1036362306a36Sopenharmony_ci#endif 1036462306a36Sopenharmony_ci {} 1036562306a36Sopenharmony_ci}; 1036662306a36Sopenharmony_ci 1036762306a36Sopenharmony_cistatic const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = { 1036862306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC), 1036962306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), 1037062306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), 1037162306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI), 1037262306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED), 1037362306a36Sopenharmony_ci {} 1037462306a36Sopenharmony_ci}; 1037562306a36Sopenharmony_ci 1037662306a36Sopenharmony_cistatic const struct hda_model_fixup alc269_fixup_models[] = { 1037762306a36Sopenharmony_ci {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"}, 1037862306a36Sopenharmony_ci {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"}, 1037962306a36Sopenharmony_ci {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"}, 1038062306a36Sopenharmony_ci {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"}, 1038162306a36Sopenharmony_ci {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"}, 1038262306a36Sopenharmony_ci {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"}, 1038362306a36Sopenharmony_ci {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"}, 1038462306a36Sopenharmony_ci {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"}, 1038562306a36Sopenharmony_ci {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, 1038662306a36Sopenharmony_ci {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"}, 1038762306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, 1038862306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"}, 1038962306a36Sopenharmony_ci {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"}, 1039062306a36Sopenharmony_ci {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"}, 1039162306a36Sopenharmony_ci {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"}, 1039262306a36Sopenharmony_ci {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"}, 1039362306a36Sopenharmony_ci {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"}, 1039462306a36Sopenharmony_ci {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"}, 1039562306a36Sopenharmony_ci {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"}, 1039662306a36Sopenharmony_ci {.id = ALC292_FIXUP_TPT440, .name = "tpt440"}, 1039762306a36Sopenharmony_ci {.id = ALC292_FIXUP_TPT460, .name = "tpt460"}, 1039862306a36Sopenharmony_ci {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"}, 1039962306a36Sopenharmony_ci {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"}, 1040062306a36Sopenharmony_ci {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"}, 1040162306a36Sopenharmony_ci {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"}, 1040262306a36Sopenharmony_ci {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"}, 1040362306a36Sopenharmony_ci {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"}, 1040462306a36Sopenharmony_ci {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"}, 1040562306a36Sopenharmony_ci {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"}, 1040662306a36Sopenharmony_ci {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"}, 1040762306a36Sopenharmony_ci {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"}, 1040862306a36Sopenharmony_ci {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"}, 1040962306a36Sopenharmony_ci {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"}, 1041062306a36Sopenharmony_ci {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"}, 1041162306a36Sopenharmony_ci {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"}, 1041262306a36Sopenharmony_ci {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"}, 1041362306a36Sopenharmony_ci {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"}, 1041462306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"}, 1041562306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"}, 1041662306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"}, 1041762306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"}, 1041862306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"}, 1041962306a36Sopenharmony_ci {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"}, 1042062306a36Sopenharmony_ci {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"}, 1042162306a36Sopenharmony_ci {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"}, 1042262306a36Sopenharmony_ci {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"}, 1042362306a36Sopenharmony_ci {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"}, 1042462306a36Sopenharmony_ci {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"}, 1042562306a36Sopenharmony_ci {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"}, 1042662306a36Sopenharmony_ci {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"}, 1042762306a36Sopenharmony_ci {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"}, 1042862306a36Sopenharmony_ci {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"}, 1042962306a36Sopenharmony_ci {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"}, 1043062306a36Sopenharmony_ci {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"}, 1043162306a36Sopenharmony_ci {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"}, 1043262306a36Sopenharmony_ci {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"}, 1043362306a36Sopenharmony_ci {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"}, 1043462306a36Sopenharmony_ci {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"}, 1043562306a36Sopenharmony_ci {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"}, 1043662306a36Sopenharmony_ci {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"}, 1043762306a36Sopenharmony_ci {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"}, 1043862306a36Sopenharmony_ci {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"}, 1043962306a36Sopenharmony_ci {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"}, 1044062306a36Sopenharmony_ci {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"}, 1044162306a36Sopenharmony_ci {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"}, 1044262306a36Sopenharmony_ci {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"}, 1044362306a36Sopenharmony_ci {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"}, 1044462306a36Sopenharmony_ci {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"}, 1044562306a36Sopenharmony_ci {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"}, 1044662306a36Sopenharmony_ci {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, 1044762306a36Sopenharmony_ci {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"}, 1044862306a36Sopenharmony_ci {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"}, 1044962306a36Sopenharmony_ci {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"}, 1045062306a36Sopenharmony_ci {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"}, 1045162306a36Sopenharmony_ci {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"}, 1045262306a36Sopenharmony_ci {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"}, 1045362306a36Sopenharmony_ci {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"}, 1045462306a36Sopenharmony_ci {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"}, 1045562306a36Sopenharmony_ci {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"}, 1045662306a36Sopenharmony_ci {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"}, 1045762306a36Sopenharmony_ci {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"}, 1045862306a36Sopenharmony_ci {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"}, 1045962306a36Sopenharmony_ci {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"}, 1046062306a36Sopenharmony_ci {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"}, 1046162306a36Sopenharmony_ci {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"}, 1046262306a36Sopenharmony_ci {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"}, 1046362306a36Sopenharmony_ci {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"}, 1046462306a36Sopenharmony_ci {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"}, 1046562306a36Sopenharmony_ci {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"}, 1046662306a36Sopenharmony_ci {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"}, 1046762306a36Sopenharmony_ci {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"}, 1046862306a36Sopenharmony_ci {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"}, 1046962306a36Sopenharmony_ci {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"}, 1047062306a36Sopenharmony_ci {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"}, 1047162306a36Sopenharmony_ci {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"}, 1047262306a36Sopenharmony_ci {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"}, 1047362306a36Sopenharmony_ci {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"}, 1047462306a36Sopenharmony_ci {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"}, 1047562306a36Sopenharmony_ci {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"}, 1047662306a36Sopenharmony_ci {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"}, 1047762306a36Sopenharmony_ci {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"}, 1047862306a36Sopenharmony_ci {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"}, 1047962306a36Sopenharmony_ci {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"}, 1048062306a36Sopenharmony_ci {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"}, 1048162306a36Sopenharmony_ci {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"}, 1048262306a36Sopenharmony_ci {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"}, 1048362306a36Sopenharmony_ci {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"}, 1048462306a36Sopenharmony_ci {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"}, 1048562306a36Sopenharmony_ci {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"}, 1048662306a36Sopenharmony_ci {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"}, 1048762306a36Sopenharmony_ci {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"}, 1048862306a36Sopenharmony_ci {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"}, 1048962306a36Sopenharmony_ci {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"}, 1049062306a36Sopenharmony_ci {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"}, 1049162306a36Sopenharmony_ci {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"}, 1049262306a36Sopenharmony_ci {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"}, 1049362306a36Sopenharmony_ci {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"}, 1049462306a36Sopenharmony_ci {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"}, 1049562306a36Sopenharmony_ci {.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"}, 1049662306a36Sopenharmony_ci {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"}, 1049762306a36Sopenharmony_ci {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"}, 1049862306a36Sopenharmony_ci {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"}, 1049962306a36Sopenharmony_ci {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"}, 1050062306a36Sopenharmony_ci {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"}, 1050162306a36Sopenharmony_ci {} 1050262306a36Sopenharmony_ci}; 1050362306a36Sopenharmony_ci#define ALC225_STANDARD_PINS \ 1050462306a36Sopenharmony_ci {0x21, 0x04211020} 1050562306a36Sopenharmony_ci 1050662306a36Sopenharmony_ci#define ALC256_STANDARD_PINS \ 1050762306a36Sopenharmony_ci {0x12, 0x90a60140}, \ 1050862306a36Sopenharmony_ci {0x14, 0x90170110}, \ 1050962306a36Sopenharmony_ci {0x21, 0x02211020} 1051062306a36Sopenharmony_ci 1051162306a36Sopenharmony_ci#define ALC282_STANDARD_PINS \ 1051262306a36Sopenharmony_ci {0x14, 0x90170110} 1051362306a36Sopenharmony_ci 1051462306a36Sopenharmony_ci#define ALC290_STANDARD_PINS \ 1051562306a36Sopenharmony_ci {0x12, 0x99a30130} 1051662306a36Sopenharmony_ci 1051762306a36Sopenharmony_ci#define ALC292_STANDARD_PINS \ 1051862306a36Sopenharmony_ci {0x14, 0x90170110}, \ 1051962306a36Sopenharmony_ci {0x15, 0x0221401f} 1052062306a36Sopenharmony_ci 1052162306a36Sopenharmony_ci#define ALC295_STANDARD_PINS \ 1052262306a36Sopenharmony_ci {0x12, 0xb7a60130}, \ 1052362306a36Sopenharmony_ci {0x14, 0x90170110}, \ 1052462306a36Sopenharmony_ci {0x21, 0x04211020} 1052562306a36Sopenharmony_ci 1052662306a36Sopenharmony_ci#define ALC298_STANDARD_PINS \ 1052762306a36Sopenharmony_ci {0x12, 0x90a60130}, \ 1052862306a36Sopenharmony_ci {0x21, 0x03211020} 1052962306a36Sopenharmony_ci 1053062306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { 1053162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC, 1053262306a36Sopenharmony_ci {0x14, 0x01014020}, 1053362306a36Sopenharmony_ci {0x17, 0x90170110}, 1053462306a36Sopenharmony_ci {0x18, 0x02a11030}, 1053562306a36Sopenharmony_ci {0x19, 0x0181303F}, 1053662306a36Sopenharmony_ci {0x21, 0x0221102f}), 1053762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE, 1053862306a36Sopenharmony_ci {0x12, 0x90a601c0}, 1053962306a36Sopenharmony_ci {0x14, 0x90171120}, 1054062306a36Sopenharmony_ci {0x21, 0x02211030}), 1054162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, 1054262306a36Sopenharmony_ci {0x14, 0x90170110}, 1054362306a36Sopenharmony_ci {0x1b, 0x90a70130}, 1054462306a36Sopenharmony_ci {0x21, 0x03211020}), 1054562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, 1054662306a36Sopenharmony_ci {0x1a, 0x90a70130}, 1054762306a36Sopenharmony_ci {0x1b, 0x90170110}, 1054862306a36Sopenharmony_ci {0x21, 0x03211020}), 1054962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 1055062306a36Sopenharmony_ci ALC225_STANDARD_PINS, 1055162306a36Sopenharmony_ci {0x12, 0xb7a60130}, 1055262306a36Sopenharmony_ci {0x14, 0x901701a0}), 1055362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 1055462306a36Sopenharmony_ci ALC225_STANDARD_PINS, 1055562306a36Sopenharmony_ci {0x12, 0xb7a60130}, 1055662306a36Sopenharmony_ci {0x14, 0x901701b0}), 1055762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 1055862306a36Sopenharmony_ci ALC225_STANDARD_PINS, 1055962306a36Sopenharmony_ci {0x12, 0xb7a60150}, 1056062306a36Sopenharmony_ci {0x14, 0x901701a0}), 1056162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 1056262306a36Sopenharmony_ci ALC225_STANDARD_PINS, 1056362306a36Sopenharmony_ci {0x12, 0xb7a60150}, 1056462306a36Sopenharmony_ci {0x14, 0x901701b0}), 1056562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 1056662306a36Sopenharmony_ci ALC225_STANDARD_PINS, 1056762306a36Sopenharmony_ci {0x12, 0xb7a60130}, 1056862306a36Sopenharmony_ci {0x1b, 0x90170110}), 1056962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, 1057062306a36Sopenharmony_ci {0x1b, 0x01111010}, 1057162306a36Sopenharmony_ci {0x1e, 0x01451130}, 1057262306a36Sopenharmony_ci {0x21, 0x02211020}), 1057362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, 1057462306a36Sopenharmony_ci {0x12, 0x90a60140}, 1057562306a36Sopenharmony_ci {0x14, 0x90170110}, 1057662306a36Sopenharmony_ci {0x19, 0x02a11030}, 1057762306a36Sopenharmony_ci {0x21, 0x02211020}), 1057862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION, 1057962306a36Sopenharmony_ci {0x14, 0x90170110}, 1058062306a36Sopenharmony_ci {0x19, 0x02a11030}, 1058162306a36Sopenharmony_ci {0x1a, 0x02a11040}, 1058262306a36Sopenharmony_ci {0x1b, 0x01014020}, 1058362306a36Sopenharmony_ci {0x21, 0x0221101f}), 1058462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION, 1058562306a36Sopenharmony_ci {0x14, 0x90170110}, 1058662306a36Sopenharmony_ci {0x19, 0x02a11030}, 1058762306a36Sopenharmony_ci {0x1a, 0x02a11040}, 1058862306a36Sopenharmony_ci {0x1b, 0x01011020}, 1058962306a36Sopenharmony_ci {0x21, 0x0221101f}), 1059062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION, 1059162306a36Sopenharmony_ci {0x14, 0x90170110}, 1059262306a36Sopenharmony_ci {0x19, 0x02a11020}, 1059362306a36Sopenharmony_ci {0x1a, 0x02a11030}, 1059462306a36Sopenharmony_ci {0x21, 0x0221101f}), 1059562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC, 1059662306a36Sopenharmony_ci {0x21, 0x02211010}), 1059762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC, 1059862306a36Sopenharmony_ci {0x14, 0x90170110}, 1059962306a36Sopenharmony_ci {0x19, 0x02a11020}, 1060062306a36Sopenharmony_ci {0x21, 0x02211030}), 1060162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, 1060262306a36Sopenharmony_ci {0x14, 0x90170110}, 1060362306a36Sopenharmony_ci {0x21, 0x02211020}), 1060462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1060562306a36Sopenharmony_ci {0x14, 0x90170130}, 1060662306a36Sopenharmony_ci {0x21, 0x02211040}), 1060762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1060862306a36Sopenharmony_ci {0x12, 0x90a60140}, 1060962306a36Sopenharmony_ci {0x14, 0x90170110}, 1061062306a36Sopenharmony_ci {0x21, 0x02211020}), 1061162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1061262306a36Sopenharmony_ci {0x12, 0x90a60160}, 1061362306a36Sopenharmony_ci {0x14, 0x90170120}, 1061462306a36Sopenharmony_ci {0x21, 0x02211030}), 1061562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1061662306a36Sopenharmony_ci {0x14, 0x90170110}, 1061762306a36Sopenharmony_ci {0x1b, 0x02011020}, 1061862306a36Sopenharmony_ci {0x21, 0x0221101f}), 1061962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1062062306a36Sopenharmony_ci {0x14, 0x90170110}, 1062162306a36Sopenharmony_ci {0x1b, 0x01011020}, 1062262306a36Sopenharmony_ci {0x21, 0x0221101f}), 1062362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1062462306a36Sopenharmony_ci {0x14, 0x90170130}, 1062562306a36Sopenharmony_ci {0x1b, 0x01014020}, 1062662306a36Sopenharmony_ci {0x21, 0x0221103f}), 1062762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1062862306a36Sopenharmony_ci {0x14, 0x90170130}, 1062962306a36Sopenharmony_ci {0x1b, 0x01011020}, 1063062306a36Sopenharmony_ci {0x21, 0x0221103f}), 1063162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1063262306a36Sopenharmony_ci {0x14, 0x90170130}, 1063362306a36Sopenharmony_ci {0x1b, 0x02011020}, 1063462306a36Sopenharmony_ci {0x21, 0x0221103f}), 1063562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1063662306a36Sopenharmony_ci {0x14, 0x90170150}, 1063762306a36Sopenharmony_ci {0x1b, 0x02011020}, 1063862306a36Sopenharmony_ci {0x21, 0x0221105f}), 1063962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1064062306a36Sopenharmony_ci {0x14, 0x90170110}, 1064162306a36Sopenharmony_ci {0x1b, 0x01014020}, 1064262306a36Sopenharmony_ci {0x21, 0x0221101f}), 1064362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1064462306a36Sopenharmony_ci {0x12, 0x90a60160}, 1064562306a36Sopenharmony_ci {0x14, 0x90170120}, 1064662306a36Sopenharmony_ci {0x17, 0x90170140}, 1064762306a36Sopenharmony_ci {0x21, 0x0321102f}), 1064862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1064962306a36Sopenharmony_ci {0x12, 0x90a60160}, 1065062306a36Sopenharmony_ci {0x14, 0x90170130}, 1065162306a36Sopenharmony_ci {0x21, 0x02211040}), 1065262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1065362306a36Sopenharmony_ci {0x12, 0x90a60160}, 1065462306a36Sopenharmony_ci {0x14, 0x90170140}, 1065562306a36Sopenharmony_ci {0x21, 0x02211050}), 1065662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1065762306a36Sopenharmony_ci {0x12, 0x90a60170}, 1065862306a36Sopenharmony_ci {0x14, 0x90170120}, 1065962306a36Sopenharmony_ci {0x21, 0x02211030}), 1066062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1066162306a36Sopenharmony_ci {0x12, 0x90a60170}, 1066262306a36Sopenharmony_ci {0x14, 0x90170130}, 1066362306a36Sopenharmony_ci {0x21, 0x02211040}), 1066462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1066562306a36Sopenharmony_ci {0x12, 0x90a60170}, 1066662306a36Sopenharmony_ci {0x14, 0x90171130}, 1066762306a36Sopenharmony_ci {0x21, 0x02211040}), 1066862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1066962306a36Sopenharmony_ci {0x12, 0x90a60170}, 1067062306a36Sopenharmony_ci {0x14, 0x90170140}, 1067162306a36Sopenharmony_ci {0x21, 0x02211050}), 1067262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1067362306a36Sopenharmony_ci {0x12, 0x90a60180}, 1067462306a36Sopenharmony_ci {0x14, 0x90170130}, 1067562306a36Sopenharmony_ci {0x21, 0x02211040}), 1067662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1067762306a36Sopenharmony_ci {0x12, 0x90a60180}, 1067862306a36Sopenharmony_ci {0x14, 0x90170120}, 1067962306a36Sopenharmony_ci {0x21, 0x02211030}), 1068062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1068162306a36Sopenharmony_ci {0x1b, 0x01011020}, 1068262306a36Sopenharmony_ci {0x21, 0x02211010}), 1068362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC, 1068462306a36Sopenharmony_ci {0x14, 0x90170110}, 1068562306a36Sopenharmony_ci {0x1b, 0x90a70130}, 1068662306a36Sopenharmony_ci {0x21, 0x04211020}), 1068762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC, 1068862306a36Sopenharmony_ci {0x14, 0x90170110}, 1068962306a36Sopenharmony_ci {0x1b, 0x90a70130}, 1069062306a36Sopenharmony_ci {0x21, 0x03211020}), 1069162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, 1069262306a36Sopenharmony_ci {0x12, 0x90a60130}, 1069362306a36Sopenharmony_ci {0x14, 0x90170110}, 1069462306a36Sopenharmony_ci {0x21, 0x03211020}), 1069562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, 1069662306a36Sopenharmony_ci {0x12, 0x90a60130}, 1069762306a36Sopenharmony_ci {0x14, 0x90170110}, 1069862306a36Sopenharmony_ci {0x21, 0x04211020}), 1069962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, 1070062306a36Sopenharmony_ci {0x1a, 0x90a70130}, 1070162306a36Sopenharmony_ci {0x1b, 0x90170110}, 1070262306a36Sopenharmony_ci {0x21, 0x03211020}), 1070362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC, 1070462306a36Sopenharmony_ci {0x14, 0x90170110}, 1070562306a36Sopenharmony_ci {0x19, 0x02a11020}, 1070662306a36Sopenharmony_ci {0x21, 0x0221101f}), 1070762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC, 1070862306a36Sopenharmony_ci {0x17, 0x90170110}, 1070962306a36Sopenharmony_ci {0x19, 0x03a11030}, 1071062306a36Sopenharmony_ci {0x21, 0x03211020}), 1071162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, 1071262306a36Sopenharmony_ci {0x12, 0x90a60130}, 1071362306a36Sopenharmony_ci {0x14, 0x90170110}, 1071462306a36Sopenharmony_ci {0x15, 0x0421101f}, 1071562306a36Sopenharmony_ci {0x1a, 0x04a11020}), 1071662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED, 1071762306a36Sopenharmony_ci {0x12, 0x90a60140}, 1071862306a36Sopenharmony_ci {0x14, 0x90170110}, 1071962306a36Sopenharmony_ci {0x15, 0x0421101f}, 1072062306a36Sopenharmony_ci {0x18, 0x02811030}, 1072162306a36Sopenharmony_ci {0x1a, 0x04a1103f}, 1072262306a36Sopenharmony_ci {0x1b, 0x02011020}), 1072362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1072462306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1072562306a36Sopenharmony_ci {0x12, 0x99a30130}, 1072662306a36Sopenharmony_ci {0x19, 0x03a11020}, 1072762306a36Sopenharmony_ci {0x21, 0x0321101f}), 1072862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1072962306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1073062306a36Sopenharmony_ci {0x12, 0x99a30130}, 1073162306a36Sopenharmony_ci {0x19, 0x03a11020}, 1073262306a36Sopenharmony_ci {0x21, 0x03211040}), 1073362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1073462306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1073562306a36Sopenharmony_ci {0x12, 0x99a30130}, 1073662306a36Sopenharmony_ci {0x19, 0x03a11030}, 1073762306a36Sopenharmony_ci {0x21, 0x03211020}), 1073862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1073962306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1074062306a36Sopenharmony_ci {0x12, 0x99a30130}, 1074162306a36Sopenharmony_ci {0x19, 0x04a11020}, 1074262306a36Sopenharmony_ci {0x21, 0x0421101f}), 1074362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED, 1074462306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1074562306a36Sopenharmony_ci {0x12, 0x90a60140}, 1074662306a36Sopenharmony_ci {0x19, 0x04a11030}, 1074762306a36Sopenharmony_ci {0x21, 0x04211020}), 1074862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT, 1074962306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1075062306a36Sopenharmony_ci {0x12, 0x90a609c0}, 1075162306a36Sopenharmony_ci {0x18, 0x03a11830}, 1075262306a36Sopenharmony_ci {0x19, 0x04a19831}, 1075362306a36Sopenharmony_ci {0x1a, 0x0481303f}, 1075462306a36Sopenharmony_ci {0x1b, 0x04211020}, 1075562306a36Sopenharmony_ci {0x21, 0x0321101f}), 1075662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT, 1075762306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1075862306a36Sopenharmony_ci {0x12, 0x90a60940}, 1075962306a36Sopenharmony_ci {0x18, 0x03a11830}, 1076062306a36Sopenharmony_ci {0x19, 0x04a19831}, 1076162306a36Sopenharmony_ci {0x1a, 0x0481303f}, 1076262306a36Sopenharmony_ci {0x1b, 0x04211020}, 1076362306a36Sopenharmony_ci {0x21, 0x0321101f}), 1076462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, 1076562306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1076662306a36Sopenharmony_ci {0x12, 0x90a60130}, 1076762306a36Sopenharmony_ci {0x21, 0x0321101f}), 1076862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, 1076962306a36Sopenharmony_ci {0x12, 0x90a60160}, 1077062306a36Sopenharmony_ci {0x14, 0x90170120}, 1077162306a36Sopenharmony_ci {0x21, 0x02211030}), 1077262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, 1077362306a36Sopenharmony_ci ALC282_STANDARD_PINS, 1077462306a36Sopenharmony_ci {0x12, 0x90a60130}, 1077562306a36Sopenharmony_ci {0x19, 0x03a11020}, 1077662306a36Sopenharmony_ci {0x21, 0x0321101f}), 1077762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE, 1077862306a36Sopenharmony_ci {0x12, 0x90a60130}, 1077962306a36Sopenharmony_ci {0x14, 0x90170110}, 1078062306a36Sopenharmony_ci {0x19, 0x04a11040}, 1078162306a36Sopenharmony_ci {0x21, 0x04211020}), 1078262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE, 1078362306a36Sopenharmony_ci {0x14, 0x90170110}, 1078462306a36Sopenharmony_ci {0x19, 0x04a11040}, 1078562306a36Sopenharmony_ci {0x1d, 0x40600001}, 1078662306a36Sopenharmony_ci {0x21, 0x04211020}), 1078762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK, 1078862306a36Sopenharmony_ci {0x14, 0x90170110}, 1078962306a36Sopenharmony_ci {0x19, 0x04a11040}, 1079062306a36Sopenharmony_ci {0x21, 0x04211020}), 1079162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK, 1079262306a36Sopenharmony_ci {0x14, 0x90170110}, 1079362306a36Sopenharmony_ci {0x17, 0x90170111}, 1079462306a36Sopenharmony_ci {0x19, 0x03a11030}, 1079562306a36Sopenharmony_ci {0x21, 0x03211020}), 1079662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK, 1079762306a36Sopenharmony_ci {0x17, 0x90170110}, 1079862306a36Sopenharmony_ci {0x19, 0x03a11030}, 1079962306a36Sopenharmony_ci {0x21, 0x03211020}), 1080062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK, 1080162306a36Sopenharmony_ci {0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */ 1080262306a36Sopenharmony_ci {0x19, 0x04a11040}, 1080362306a36Sopenharmony_ci {0x21, 0x04211020}), 1080462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE, 1080562306a36Sopenharmony_ci {0x12, 0x90a60130}, 1080662306a36Sopenharmony_ci {0x17, 0x90170110}, 1080762306a36Sopenharmony_ci {0x21, 0x02211020}), 1080862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, 1080962306a36Sopenharmony_ci {0x12, 0x90a60120}, 1081062306a36Sopenharmony_ci {0x14, 0x90170110}, 1081162306a36Sopenharmony_ci {0x21, 0x0321101f}), 1081262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1081362306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1081462306a36Sopenharmony_ci {0x15, 0x04211040}, 1081562306a36Sopenharmony_ci {0x18, 0x90170112}, 1081662306a36Sopenharmony_ci {0x1a, 0x04a11020}), 1081762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1081862306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1081962306a36Sopenharmony_ci {0x15, 0x04211040}, 1082062306a36Sopenharmony_ci {0x18, 0x90170110}, 1082162306a36Sopenharmony_ci {0x1a, 0x04a11020}), 1082262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1082362306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1082462306a36Sopenharmony_ci {0x15, 0x0421101f}, 1082562306a36Sopenharmony_ci {0x1a, 0x04a11020}), 1082662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1082762306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1082862306a36Sopenharmony_ci {0x15, 0x04211020}, 1082962306a36Sopenharmony_ci {0x1a, 0x04a11040}), 1083062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1083162306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1083262306a36Sopenharmony_ci {0x14, 0x90170110}, 1083362306a36Sopenharmony_ci {0x15, 0x04211020}, 1083462306a36Sopenharmony_ci {0x1a, 0x04a11040}), 1083562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1083662306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1083762306a36Sopenharmony_ci {0x14, 0x90170110}, 1083862306a36Sopenharmony_ci {0x15, 0x04211020}, 1083962306a36Sopenharmony_ci {0x1a, 0x04a11020}), 1084062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, 1084162306a36Sopenharmony_ci ALC290_STANDARD_PINS, 1084262306a36Sopenharmony_ci {0x14, 0x90170110}, 1084362306a36Sopenharmony_ci {0x15, 0x0421101f}, 1084462306a36Sopenharmony_ci {0x1a, 0x04a11020}), 1084562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, 1084662306a36Sopenharmony_ci ALC292_STANDARD_PINS, 1084762306a36Sopenharmony_ci {0x12, 0x90a60140}, 1084862306a36Sopenharmony_ci {0x16, 0x01014020}, 1084962306a36Sopenharmony_ci {0x19, 0x01a19030}), 1085062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, 1085162306a36Sopenharmony_ci ALC292_STANDARD_PINS, 1085262306a36Sopenharmony_ci {0x12, 0x90a60140}, 1085362306a36Sopenharmony_ci {0x16, 0x01014020}, 1085462306a36Sopenharmony_ci {0x18, 0x02a19031}, 1085562306a36Sopenharmony_ci {0x19, 0x01a1903e}), 1085662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, 1085762306a36Sopenharmony_ci ALC292_STANDARD_PINS, 1085862306a36Sopenharmony_ci {0x12, 0x90a60140}), 1085962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, 1086062306a36Sopenharmony_ci ALC292_STANDARD_PINS, 1086162306a36Sopenharmony_ci {0x13, 0x90a60140}, 1086262306a36Sopenharmony_ci {0x16, 0x21014020}, 1086362306a36Sopenharmony_ci {0x19, 0x21a19030}), 1086462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, 1086562306a36Sopenharmony_ci ALC292_STANDARD_PINS, 1086662306a36Sopenharmony_ci {0x13, 0x90a60140}), 1086762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE, 1086862306a36Sopenharmony_ci {0x17, 0x90170110}, 1086962306a36Sopenharmony_ci {0x21, 0x04211020}), 1087062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC, 1087162306a36Sopenharmony_ci {0x14, 0x90170110}, 1087262306a36Sopenharmony_ci {0x1b, 0x90a70130}, 1087362306a36Sopenharmony_ci {0x21, 0x04211020}), 1087462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, 1087562306a36Sopenharmony_ci {0x12, 0x90a60130}, 1087662306a36Sopenharmony_ci {0x17, 0x90170110}, 1087762306a36Sopenharmony_ci {0x21, 0x03211020}), 1087862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, 1087962306a36Sopenharmony_ci {0x12, 0x90a60130}, 1088062306a36Sopenharmony_ci {0x17, 0x90170110}, 1088162306a36Sopenharmony_ci {0x21, 0x04211020}), 1088262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, 1088362306a36Sopenharmony_ci {0x12, 0x90a60130}, 1088462306a36Sopenharmony_ci {0x17, 0x90170110}, 1088562306a36Sopenharmony_ci {0x21, 0x03211020}), 1088662306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE, 1088762306a36Sopenharmony_ci {0x12, 0x90a60120}, 1088862306a36Sopenharmony_ci {0x17, 0x90170110}, 1088962306a36Sopenharmony_ci {0x21, 0x04211030}), 1089062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE, 1089162306a36Sopenharmony_ci {0x12, 0x90a60130}, 1089262306a36Sopenharmony_ci {0x17, 0x90170110}, 1089362306a36Sopenharmony_ci {0x21, 0x03211020}), 1089462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE, 1089562306a36Sopenharmony_ci {0x12, 0x90a60130}, 1089662306a36Sopenharmony_ci {0x17, 0x90170110}, 1089762306a36Sopenharmony_ci {0x21, 0x03211020}), 1089862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, 1089962306a36Sopenharmony_ci ALC298_STANDARD_PINS, 1090062306a36Sopenharmony_ci {0x17, 0x90170110}), 1090162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, 1090262306a36Sopenharmony_ci ALC298_STANDARD_PINS, 1090362306a36Sopenharmony_ci {0x17, 0x90170140}), 1090462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, 1090562306a36Sopenharmony_ci ALC298_STANDARD_PINS, 1090662306a36Sopenharmony_ci {0x17, 0x90170150}), 1090762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME, 1090862306a36Sopenharmony_ci {0x12, 0xb7a60140}, 1090962306a36Sopenharmony_ci {0x13, 0xb7a60150}, 1091062306a36Sopenharmony_ci {0x17, 0x90170110}, 1091162306a36Sopenharmony_ci {0x1a, 0x03011020}, 1091262306a36Sopenharmony_ci {0x21, 0x03211030}), 1091362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE, 1091462306a36Sopenharmony_ci {0x12, 0xb7a60140}, 1091562306a36Sopenharmony_ci {0x17, 0x90170110}, 1091662306a36Sopenharmony_ci {0x1a, 0x03a11030}, 1091762306a36Sopenharmony_ci {0x21, 0x03211020}), 1091862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, 1091962306a36Sopenharmony_ci ALC225_STANDARD_PINS, 1092062306a36Sopenharmony_ci {0x12, 0xb7a60130}, 1092162306a36Sopenharmony_ci {0x17, 0x90170110}), 1092262306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC, 1092362306a36Sopenharmony_ci {0x14, 0x01014010}, 1092462306a36Sopenharmony_ci {0x17, 0x90170120}, 1092562306a36Sopenharmony_ci {0x18, 0x02a11030}, 1092662306a36Sopenharmony_ci {0x19, 0x02a1103f}, 1092762306a36Sopenharmony_ci {0x21, 0x0221101f}), 1092862306a36Sopenharmony_ci {} 1092962306a36Sopenharmony_ci}; 1093062306a36Sopenharmony_ci 1093162306a36Sopenharmony_ci/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match 1093262306a36Sopenharmony_ci * more machines, don't need to match all valid pins, just need to match 1093362306a36Sopenharmony_ci * all the pins defined in the tbl. Just because of this reason, it is possible 1093462306a36Sopenharmony_ci * that a single machine matches multiple tbls, so there is one limitation: 1093562306a36Sopenharmony_ci * at most one tbl is allowed to define for the same vendor and same codec 1093662306a36Sopenharmony_ci */ 1093762306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = { 1093862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, 1093962306a36Sopenharmony_ci {0x19, 0x40000000}, 1094062306a36Sopenharmony_ci {0x1b, 0x40000000}), 1094162306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, 1094262306a36Sopenharmony_ci {0x19, 0x40000000}, 1094362306a36Sopenharmony_ci {0x1b, 0x40000000}), 1094462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1094562306a36Sopenharmony_ci {0x19, 0x40000000}, 1094662306a36Sopenharmony_ci {0x1a, 0x40000000}), 1094762306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 1094862306a36Sopenharmony_ci {0x19, 0x40000000}, 1094962306a36Sopenharmony_ci {0x1a, 0x40000000}), 1095062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, 1095162306a36Sopenharmony_ci {0x19, 0x40000000}, 1095262306a36Sopenharmony_ci {0x1a, 0x40000000}), 1095362306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC, 1095462306a36Sopenharmony_ci {0x19, 0x40000000}), 1095562306a36Sopenharmony_ci {} 1095662306a36Sopenharmony_ci}; 1095762306a36Sopenharmony_ci 1095862306a36Sopenharmony_cistatic void alc269_fill_coef(struct hda_codec *codec) 1095962306a36Sopenharmony_ci{ 1096062306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1096162306a36Sopenharmony_ci int val; 1096262306a36Sopenharmony_ci 1096362306a36Sopenharmony_ci if (spec->codec_variant != ALC269_TYPE_ALC269VB) 1096462306a36Sopenharmony_ci return; 1096562306a36Sopenharmony_ci 1096662306a36Sopenharmony_ci if ((alc_get_coef0(codec) & 0x00ff) < 0x015) { 1096762306a36Sopenharmony_ci alc_write_coef_idx(codec, 0xf, 0x960b); 1096862306a36Sopenharmony_ci alc_write_coef_idx(codec, 0xe, 0x8817); 1096962306a36Sopenharmony_ci } 1097062306a36Sopenharmony_ci 1097162306a36Sopenharmony_ci if ((alc_get_coef0(codec) & 0x00ff) == 0x016) { 1097262306a36Sopenharmony_ci alc_write_coef_idx(codec, 0xf, 0x960b); 1097362306a36Sopenharmony_ci alc_write_coef_idx(codec, 0xe, 0x8814); 1097462306a36Sopenharmony_ci } 1097562306a36Sopenharmony_ci 1097662306a36Sopenharmony_ci if ((alc_get_coef0(codec) & 0x00ff) == 0x017) { 1097762306a36Sopenharmony_ci /* Power up output pin */ 1097862306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x04, 0, 1<<11); 1097962306a36Sopenharmony_ci } 1098062306a36Sopenharmony_ci 1098162306a36Sopenharmony_ci if ((alc_get_coef0(codec) & 0x00ff) == 0x018) { 1098262306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0xd); 1098362306a36Sopenharmony_ci if (val != -1 && (val & 0x0c00) >> 10 != 0x1) { 1098462306a36Sopenharmony_ci /* Capless ramp up clock control */ 1098562306a36Sopenharmony_ci alc_write_coef_idx(codec, 0xd, val | (1<<10)); 1098662306a36Sopenharmony_ci } 1098762306a36Sopenharmony_ci val = alc_read_coef_idx(codec, 0x17); 1098862306a36Sopenharmony_ci if (val != -1 && (val & 0x01c0) >> 6 != 0x4) { 1098962306a36Sopenharmony_ci /* Class D power on reset */ 1099062306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x17, val | (1<<7)); 1099162306a36Sopenharmony_ci } 1099262306a36Sopenharmony_ci } 1099362306a36Sopenharmony_ci 1099462306a36Sopenharmony_ci /* HP */ 1099562306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4, 0, 1<<11); 1099662306a36Sopenharmony_ci} 1099762306a36Sopenharmony_ci 1099862306a36Sopenharmony_ci/* 1099962306a36Sopenharmony_ci */ 1100062306a36Sopenharmony_cistatic int patch_alc269(struct hda_codec *codec) 1100162306a36Sopenharmony_ci{ 1100262306a36Sopenharmony_ci struct alc_spec *spec; 1100362306a36Sopenharmony_ci int err; 1100462306a36Sopenharmony_ci 1100562306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x0b); 1100662306a36Sopenharmony_ci if (err < 0) 1100762306a36Sopenharmony_ci return err; 1100862306a36Sopenharmony_ci 1100962306a36Sopenharmony_ci spec = codec->spec; 1101062306a36Sopenharmony_ci spec->gen.shared_mic_vref_pin = 0x18; 1101162306a36Sopenharmony_ci codec->power_save_node = 0; 1101262306a36Sopenharmony_ci spec->en_3kpull_low = true; 1101362306a36Sopenharmony_ci 1101462306a36Sopenharmony_ci#ifdef CONFIG_PM 1101562306a36Sopenharmony_ci codec->patch_ops.suspend = alc269_suspend; 1101662306a36Sopenharmony_ci codec->patch_ops.resume = alc269_resume; 1101762306a36Sopenharmony_ci#endif 1101862306a36Sopenharmony_ci spec->shutup = alc_default_shutup; 1101962306a36Sopenharmony_ci spec->init_hook = alc_default_init; 1102062306a36Sopenharmony_ci 1102162306a36Sopenharmony_ci switch (codec->core.vendor_id) { 1102262306a36Sopenharmony_ci case 0x10ec0269: 1102362306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC269VA; 1102462306a36Sopenharmony_ci switch (alc_get_coef0(codec) & 0x00f0) { 1102562306a36Sopenharmony_ci case 0x0010: 1102662306a36Sopenharmony_ci if (codec->bus->pci && 1102762306a36Sopenharmony_ci codec->bus->pci->subsystem_vendor == 0x1025 && 1102862306a36Sopenharmony_ci spec->cdefine.platform_type == 1) 1102962306a36Sopenharmony_ci err = alc_codec_rename(codec, "ALC271X"); 1103062306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC269VB; 1103162306a36Sopenharmony_ci break; 1103262306a36Sopenharmony_ci case 0x0020: 1103362306a36Sopenharmony_ci if (codec->bus->pci && 1103462306a36Sopenharmony_ci codec->bus->pci->subsystem_vendor == 0x17aa && 1103562306a36Sopenharmony_ci codec->bus->pci->subsystem_device == 0x21f3) 1103662306a36Sopenharmony_ci err = alc_codec_rename(codec, "ALC3202"); 1103762306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC269VC; 1103862306a36Sopenharmony_ci break; 1103962306a36Sopenharmony_ci case 0x0030: 1104062306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC269VD; 1104162306a36Sopenharmony_ci break; 1104262306a36Sopenharmony_ci default: 1104362306a36Sopenharmony_ci alc_fix_pll_init(codec, 0x20, 0x04, 15); 1104462306a36Sopenharmony_ci } 1104562306a36Sopenharmony_ci if (err < 0) 1104662306a36Sopenharmony_ci goto error; 1104762306a36Sopenharmony_ci spec->shutup = alc269_shutup; 1104862306a36Sopenharmony_ci spec->init_hook = alc269_fill_coef; 1104962306a36Sopenharmony_ci alc269_fill_coef(codec); 1105062306a36Sopenharmony_ci break; 1105162306a36Sopenharmony_ci 1105262306a36Sopenharmony_ci case 0x10ec0280: 1105362306a36Sopenharmony_ci case 0x10ec0290: 1105462306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC280; 1105562306a36Sopenharmony_ci break; 1105662306a36Sopenharmony_ci case 0x10ec0282: 1105762306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC282; 1105862306a36Sopenharmony_ci spec->shutup = alc282_shutup; 1105962306a36Sopenharmony_ci spec->init_hook = alc282_init; 1106062306a36Sopenharmony_ci break; 1106162306a36Sopenharmony_ci case 0x10ec0233: 1106262306a36Sopenharmony_ci case 0x10ec0283: 1106362306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC283; 1106462306a36Sopenharmony_ci spec->shutup = alc283_shutup; 1106562306a36Sopenharmony_ci spec->init_hook = alc283_init; 1106662306a36Sopenharmony_ci break; 1106762306a36Sopenharmony_ci case 0x10ec0284: 1106862306a36Sopenharmony_ci case 0x10ec0292: 1106962306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC284; 1107062306a36Sopenharmony_ci break; 1107162306a36Sopenharmony_ci case 0x10ec0293: 1107262306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC293; 1107362306a36Sopenharmony_ci break; 1107462306a36Sopenharmony_ci case 0x10ec0286: 1107562306a36Sopenharmony_ci case 0x10ec0288: 1107662306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC286; 1107762306a36Sopenharmony_ci break; 1107862306a36Sopenharmony_ci case 0x10ec0298: 1107962306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC298; 1108062306a36Sopenharmony_ci break; 1108162306a36Sopenharmony_ci case 0x10ec0235: 1108262306a36Sopenharmony_ci case 0x10ec0255: 1108362306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC255; 1108462306a36Sopenharmony_ci spec->shutup = alc256_shutup; 1108562306a36Sopenharmony_ci spec->init_hook = alc256_init; 1108662306a36Sopenharmony_ci break; 1108762306a36Sopenharmony_ci case 0x10ec0230: 1108862306a36Sopenharmony_ci case 0x10ec0236: 1108962306a36Sopenharmony_ci case 0x10ec0256: 1109062306a36Sopenharmony_ci case 0x19e58326: 1109162306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC256; 1109262306a36Sopenharmony_ci spec->shutup = alc256_shutup; 1109362306a36Sopenharmony_ci spec->init_hook = alc256_init; 1109462306a36Sopenharmony_ci spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ 1109562306a36Sopenharmony_ci if (codec->core.vendor_id == 0x10ec0236 && 1109662306a36Sopenharmony_ci codec->bus->pci->vendor != PCI_VENDOR_ID_AMD) 1109762306a36Sopenharmony_ci spec->en_3kpull_low = false; 1109862306a36Sopenharmony_ci break; 1109962306a36Sopenharmony_ci case 0x10ec0257: 1110062306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC257; 1110162306a36Sopenharmony_ci spec->shutup = alc256_shutup; 1110262306a36Sopenharmony_ci spec->init_hook = alc256_init; 1110362306a36Sopenharmony_ci spec->gen.mixer_nid = 0; 1110462306a36Sopenharmony_ci spec->en_3kpull_low = false; 1110562306a36Sopenharmony_ci break; 1110662306a36Sopenharmony_ci case 0x10ec0215: 1110762306a36Sopenharmony_ci case 0x10ec0245: 1110862306a36Sopenharmony_ci case 0x10ec0285: 1110962306a36Sopenharmony_ci case 0x10ec0289: 1111062306a36Sopenharmony_ci if (alc_get_coef0(codec) & 0x0010) 1111162306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC245; 1111262306a36Sopenharmony_ci else 1111362306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC215; 1111462306a36Sopenharmony_ci spec->shutup = alc225_shutup; 1111562306a36Sopenharmony_ci spec->init_hook = alc225_init; 1111662306a36Sopenharmony_ci spec->gen.mixer_nid = 0; 1111762306a36Sopenharmony_ci break; 1111862306a36Sopenharmony_ci case 0x10ec0225: 1111962306a36Sopenharmony_ci case 0x10ec0295: 1112062306a36Sopenharmony_ci case 0x10ec0299: 1112162306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC225; 1112262306a36Sopenharmony_ci spec->shutup = alc225_shutup; 1112362306a36Sopenharmony_ci spec->init_hook = alc225_init; 1112462306a36Sopenharmony_ci spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */ 1112562306a36Sopenharmony_ci break; 1112662306a36Sopenharmony_ci case 0x10ec0287: 1112762306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC287; 1112862306a36Sopenharmony_ci spec->shutup = alc225_shutup; 1112962306a36Sopenharmony_ci spec->init_hook = alc225_init; 1113062306a36Sopenharmony_ci spec->gen.mixer_nid = 0; /* no loopback on ALC287 */ 1113162306a36Sopenharmony_ci break; 1113262306a36Sopenharmony_ci case 0x10ec0234: 1113362306a36Sopenharmony_ci case 0x10ec0274: 1113462306a36Sopenharmony_ci case 0x10ec0294: 1113562306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC294; 1113662306a36Sopenharmony_ci spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */ 1113762306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */ 1113862306a36Sopenharmony_ci spec->init_hook = alc294_init; 1113962306a36Sopenharmony_ci break; 1114062306a36Sopenharmony_ci case 0x10ec0300: 1114162306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC300; 1114262306a36Sopenharmony_ci spec->gen.mixer_nid = 0; /* no loopback on ALC300 */ 1114362306a36Sopenharmony_ci break; 1114462306a36Sopenharmony_ci case 0x10ec0623: 1114562306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC623; 1114662306a36Sopenharmony_ci break; 1114762306a36Sopenharmony_ci case 0x10ec0700: 1114862306a36Sopenharmony_ci case 0x10ec0701: 1114962306a36Sopenharmony_ci case 0x10ec0703: 1115062306a36Sopenharmony_ci case 0x10ec0711: 1115162306a36Sopenharmony_ci spec->codec_variant = ALC269_TYPE_ALC700; 1115262306a36Sopenharmony_ci spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */ 1115362306a36Sopenharmony_ci alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */ 1115462306a36Sopenharmony_ci spec->init_hook = alc294_init; 1115562306a36Sopenharmony_ci break; 1115662306a36Sopenharmony_ci 1115762306a36Sopenharmony_ci } 1115862306a36Sopenharmony_ci 1115962306a36Sopenharmony_ci if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) { 1116062306a36Sopenharmony_ci spec->has_alc5505_dsp = 1; 1116162306a36Sopenharmony_ci spec->init_hook = alc5505_dsp_init; 1116262306a36Sopenharmony_ci } 1116362306a36Sopenharmony_ci 1116462306a36Sopenharmony_ci alc_pre_init(codec); 1116562306a36Sopenharmony_ci 1116662306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc269_fixup_models, 1116762306a36Sopenharmony_ci alc269_fixup_tbl, alc269_fixups); 1116862306a36Sopenharmony_ci /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and 1116962306a36Sopenharmony_ci * the quirk breaks the latter (bko#214101). 1117062306a36Sopenharmony_ci * Clear the wrong entry. 1117162306a36Sopenharmony_ci */ 1117262306a36Sopenharmony_ci if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 && 1117362306a36Sopenharmony_ci codec->core.vendor_id == 0x10ec0294) { 1117462306a36Sopenharmony_ci codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n"); 1117562306a36Sopenharmony_ci codec->fixup_id = HDA_FIXUP_ID_NOT_SET; 1117662306a36Sopenharmony_ci } 1117762306a36Sopenharmony_ci 1117862306a36Sopenharmony_ci snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true); 1117962306a36Sopenharmony_ci snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false); 1118062306a36Sopenharmony_ci snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl, 1118162306a36Sopenharmony_ci alc269_fixups); 1118262306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 1118362306a36Sopenharmony_ci 1118462306a36Sopenharmony_ci alc_auto_parse_customize_define(codec); 1118562306a36Sopenharmony_ci 1118662306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 1118762306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 1118862306a36Sopenharmony_ci 1118962306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 1119062306a36Sopenharmony_ci err = alc269_parse_auto_config(codec); 1119162306a36Sopenharmony_ci if (err < 0) 1119262306a36Sopenharmony_ci goto error; 1119362306a36Sopenharmony_ci 1119462306a36Sopenharmony_ci if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) { 1119562306a36Sopenharmony_ci err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT); 1119662306a36Sopenharmony_ci if (err < 0) 1119762306a36Sopenharmony_ci goto error; 1119862306a36Sopenharmony_ci } 1119962306a36Sopenharmony_ci 1120062306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 1120162306a36Sopenharmony_ci 1120262306a36Sopenharmony_ci return 0; 1120362306a36Sopenharmony_ci 1120462306a36Sopenharmony_ci error: 1120562306a36Sopenharmony_ci alc_free(codec); 1120662306a36Sopenharmony_ci return err; 1120762306a36Sopenharmony_ci} 1120862306a36Sopenharmony_ci 1120962306a36Sopenharmony_ci/* 1121062306a36Sopenharmony_ci * ALC861 1121162306a36Sopenharmony_ci */ 1121262306a36Sopenharmony_ci 1121362306a36Sopenharmony_cistatic int alc861_parse_auto_config(struct hda_codec *codec) 1121462306a36Sopenharmony_ci{ 1121562306a36Sopenharmony_ci static const hda_nid_t alc861_ignore[] = { 0x1d, 0 }; 1121662306a36Sopenharmony_ci static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 }; 1121762306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids); 1121862306a36Sopenharmony_ci} 1121962306a36Sopenharmony_ci 1122062306a36Sopenharmony_ci/* Pin config fixes */ 1122162306a36Sopenharmony_cienum { 1122262306a36Sopenharmony_ci ALC861_FIXUP_FSC_AMILO_PI1505, 1122362306a36Sopenharmony_ci ALC861_FIXUP_AMP_VREF_0F, 1122462306a36Sopenharmony_ci ALC861_FIXUP_NO_JACK_DETECT, 1122562306a36Sopenharmony_ci ALC861_FIXUP_ASUS_A6RP, 1122662306a36Sopenharmony_ci ALC660_FIXUP_ASUS_W7J, 1122762306a36Sopenharmony_ci}; 1122862306a36Sopenharmony_ci 1122962306a36Sopenharmony_ci/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */ 1123062306a36Sopenharmony_cistatic void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec, 1123162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1123262306a36Sopenharmony_ci{ 1123362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1123462306a36Sopenharmony_ci unsigned int val; 1123562306a36Sopenharmony_ci 1123662306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_INIT) 1123762306a36Sopenharmony_ci return; 1123862306a36Sopenharmony_ci val = snd_hda_codec_get_pin_target(codec, 0x0f); 1123962306a36Sopenharmony_ci if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))) 1124062306a36Sopenharmony_ci val |= AC_PINCTL_IN_EN; 1124162306a36Sopenharmony_ci val |= AC_PINCTL_VREF_50; 1124262306a36Sopenharmony_ci snd_hda_set_pin_ctl(codec, 0x0f, val); 1124362306a36Sopenharmony_ci spec->gen.keep_vref_in_automute = 1; 1124462306a36Sopenharmony_ci} 1124562306a36Sopenharmony_ci 1124662306a36Sopenharmony_ci/* suppress the jack-detection */ 1124762306a36Sopenharmony_cistatic void alc_fixup_no_jack_detect(struct hda_codec *codec, 1124862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1124962306a36Sopenharmony_ci{ 1125062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 1125162306a36Sopenharmony_ci codec->no_jack_detect = 1; 1125262306a36Sopenharmony_ci} 1125362306a36Sopenharmony_ci 1125462306a36Sopenharmony_cistatic const struct hda_fixup alc861_fixups[] = { 1125562306a36Sopenharmony_ci [ALC861_FIXUP_FSC_AMILO_PI1505] = { 1125662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1125762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1125862306a36Sopenharmony_ci { 0x0b, 0x0221101f }, /* HP */ 1125962306a36Sopenharmony_ci { 0x0f, 0x90170310 }, /* speaker */ 1126062306a36Sopenharmony_ci { } 1126162306a36Sopenharmony_ci } 1126262306a36Sopenharmony_ci }, 1126362306a36Sopenharmony_ci [ALC861_FIXUP_AMP_VREF_0F] = { 1126462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1126562306a36Sopenharmony_ci .v.func = alc861_fixup_asus_amp_vref_0f, 1126662306a36Sopenharmony_ci }, 1126762306a36Sopenharmony_ci [ALC861_FIXUP_NO_JACK_DETECT] = { 1126862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1126962306a36Sopenharmony_ci .v.func = alc_fixup_no_jack_detect, 1127062306a36Sopenharmony_ci }, 1127162306a36Sopenharmony_ci [ALC861_FIXUP_ASUS_A6RP] = { 1127262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1127362306a36Sopenharmony_ci .v.func = alc861_fixup_asus_amp_vref_0f, 1127462306a36Sopenharmony_ci .chained = true, 1127562306a36Sopenharmony_ci .chain_id = ALC861_FIXUP_NO_JACK_DETECT, 1127662306a36Sopenharmony_ci }, 1127762306a36Sopenharmony_ci [ALC660_FIXUP_ASUS_W7J] = { 1127862306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 1127962306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 1128062306a36Sopenharmony_ci /* ASUS W7J needs a magic pin setup on unused NID 0x10 1128162306a36Sopenharmony_ci * for enabling outputs 1128262306a36Sopenharmony_ci */ 1128362306a36Sopenharmony_ci {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 1128462306a36Sopenharmony_ci { } 1128562306a36Sopenharmony_ci }, 1128662306a36Sopenharmony_ci } 1128762306a36Sopenharmony_ci}; 1128862306a36Sopenharmony_ci 1128962306a36Sopenharmony_cistatic const struct snd_pci_quirk alc861_fixup_tbl[] = { 1129062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J), 1129162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J), 1129262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP), 1129362306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F), 1129462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT), 1129562306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F), 1129662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505), 1129762306a36Sopenharmony_ci {} 1129862306a36Sopenharmony_ci}; 1129962306a36Sopenharmony_ci 1130062306a36Sopenharmony_ci/* 1130162306a36Sopenharmony_ci */ 1130262306a36Sopenharmony_cistatic int patch_alc861(struct hda_codec *codec) 1130362306a36Sopenharmony_ci{ 1130462306a36Sopenharmony_ci struct alc_spec *spec; 1130562306a36Sopenharmony_ci int err; 1130662306a36Sopenharmony_ci 1130762306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x15); 1130862306a36Sopenharmony_ci if (err < 0) 1130962306a36Sopenharmony_ci return err; 1131062306a36Sopenharmony_ci 1131162306a36Sopenharmony_ci spec = codec->spec; 1131262306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 1131362306a36Sopenharmony_ci spec->gen.beep_nid = 0x23; 1131462306a36Sopenharmony_ci 1131562306a36Sopenharmony_ci#ifdef CONFIG_PM 1131662306a36Sopenharmony_ci spec->power_hook = alc_power_eapd; 1131762306a36Sopenharmony_ci#endif 1131862306a36Sopenharmony_ci 1131962306a36Sopenharmony_ci alc_pre_init(codec); 1132062306a36Sopenharmony_ci 1132162306a36Sopenharmony_ci snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups); 1132262306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 1132362306a36Sopenharmony_ci 1132462306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 1132562306a36Sopenharmony_ci err = alc861_parse_auto_config(codec); 1132662306a36Sopenharmony_ci if (err < 0) 1132762306a36Sopenharmony_ci goto error; 1132862306a36Sopenharmony_ci 1132962306a36Sopenharmony_ci if (!spec->gen.no_analog) { 1133062306a36Sopenharmony_ci err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); 1133162306a36Sopenharmony_ci if (err < 0) 1133262306a36Sopenharmony_ci goto error; 1133362306a36Sopenharmony_ci } 1133462306a36Sopenharmony_ci 1133562306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 1133662306a36Sopenharmony_ci 1133762306a36Sopenharmony_ci return 0; 1133862306a36Sopenharmony_ci 1133962306a36Sopenharmony_ci error: 1134062306a36Sopenharmony_ci alc_free(codec); 1134162306a36Sopenharmony_ci return err; 1134262306a36Sopenharmony_ci} 1134362306a36Sopenharmony_ci 1134462306a36Sopenharmony_ci/* 1134562306a36Sopenharmony_ci * ALC861-VD support 1134662306a36Sopenharmony_ci * 1134762306a36Sopenharmony_ci * Based on ALC882 1134862306a36Sopenharmony_ci * 1134962306a36Sopenharmony_ci * In addition, an independent DAC 1135062306a36Sopenharmony_ci */ 1135162306a36Sopenharmony_cistatic int alc861vd_parse_auto_config(struct hda_codec *codec) 1135262306a36Sopenharmony_ci{ 1135362306a36Sopenharmony_ci static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 }; 1135462306a36Sopenharmony_ci static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 1135562306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids); 1135662306a36Sopenharmony_ci} 1135762306a36Sopenharmony_ci 1135862306a36Sopenharmony_cienum { 1135962306a36Sopenharmony_ci ALC660VD_FIX_ASUS_GPIO1, 1136062306a36Sopenharmony_ci ALC861VD_FIX_DALLAS, 1136162306a36Sopenharmony_ci}; 1136262306a36Sopenharmony_ci 1136362306a36Sopenharmony_ci/* exclude VREF80 */ 1136462306a36Sopenharmony_cistatic void alc861vd_fixup_dallas(struct hda_codec *codec, 1136562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1136662306a36Sopenharmony_ci{ 1136762306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 1136862306a36Sopenharmony_ci snd_hda_override_pin_caps(codec, 0x18, 0x00000734); 1136962306a36Sopenharmony_ci snd_hda_override_pin_caps(codec, 0x19, 0x0000073c); 1137062306a36Sopenharmony_ci } 1137162306a36Sopenharmony_ci} 1137262306a36Sopenharmony_ci 1137362306a36Sopenharmony_ci/* reset GPIO1 */ 1137462306a36Sopenharmony_cistatic void alc660vd_fixup_asus_gpio1(struct hda_codec *codec, 1137562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1137662306a36Sopenharmony_ci{ 1137762306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1137862306a36Sopenharmony_ci 1137962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 1138062306a36Sopenharmony_ci spec->gpio_mask |= 0x02; 1138162306a36Sopenharmony_ci alc_fixup_gpio(codec, action, 0x01); 1138262306a36Sopenharmony_ci} 1138362306a36Sopenharmony_ci 1138462306a36Sopenharmony_cistatic const struct hda_fixup alc861vd_fixups[] = { 1138562306a36Sopenharmony_ci [ALC660VD_FIX_ASUS_GPIO1] = { 1138662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1138762306a36Sopenharmony_ci .v.func = alc660vd_fixup_asus_gpio1, 1138862306a36Sopenharmony_ci }, 1138962306a36Sopenharmony_ci [ALC861VD_FIX_DALLAS] = { 1139062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1139162306a36Sopenharmony_ci .v.func = alc861vd_fixup_dallas, 1139262306a36Sopenharmony_ci }, 1139362306a36Sopenharmony_ci}; 1139462306a36Sopenharmony_ci 1139562306a36Sopenharmony_cistatic const struct snd_pci_quirk alc861vd_fixup_tbl[] = { 1139662306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS), 1139762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1), 1139862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS), 1139962306a36Sopenharmony_ci {} 1140062306a36Sopenharmony_ci}; 1140162306a36Sopenharmony_ci 1140262306a36Sopenharmony_ci/* 1140362306a36Sopenharmony_ci */ 1140462306a36Sopenharmony_cistatic int patch_alc861vd(struct hda_codec *codec) 1140562306a36Sopenharmony_ci{ 1140662306a36Sopenharmony_ci struct alc_spec *spec; 1140762306a36Sopenharmony_ci int err; 1140862306a36Sopenharmony_ci 1140962306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x0b); 1141062306a36Sopenharmony_ci if (err < 0) 1141162306a36Sopenharmony_ci return err; 1141262306a36Sopenharmony_ci 1141362306a36Sopenharmony_ci spec = codec->spec; 1141462306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 1141562306a36Sopenharmony_ci spec->gen.beep_nid = 0x23; 1141662306a36Sopenharmony_ci 1141762306a36Sopenharmony_ci spec->shutup = alc_eapd_shutup; 1141862306a36Sopenharmony_ci 1141962306a36Sopenharmony_ci alc_pre_init(codec); 1142062306a36Sopenharmony_ci 1142162306a36Sopenharmony_ci snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups); 1142262306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 1142362306a36Sopenharmony_ci 1142462306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 1142562306a36Sopenharmony_ci err = alc861vd_parse_auto_config(codec); 1142662306a36Sopenharmony_ci if (err < 0) 1142762306a36Sopenharmony_ci goto error; 1142862306a36Sopenharmony_ci 1142962306a36Sopenharmony_ci if (!spec->gen.no_analog) { 1143062306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 1143162306a36Sopenharmony_ci if (err < 0) 1143262306a36Sopenharmony_ci goto error; 1143362306a36Sopenharmony_ci } 1143462306a36Sopenharmony_ci 1143562306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 1143662306a36Sopenharmony_ci 1143762306a36Sopenharmony_ci return 0; 1143862306a36Sopenharmony_ci 1143962306a36Sopenharmony_ci error: 1144062306a36Sopenharmony_ci alc_free(codec); 1144162306a36Sopenharmony_ci return err; 1144262306a36Sopenharmony_ci} 1144362306a36Sopenharmony_ci 1144462306a36Sopenharmony_ci/* 1144562306a36Sopenharmony_ci * ALC662 support 1144662306a36Sopenharmony_ci * 1144762306a36Sopenharmony_ci * ALC662 is almost identical with ALC880 but has cleaner and more flexible 1144862306a36Sopenharmony_ci * configuration. Each pin widget can choose any input DACs and a mixer. 1144962306a36Sopenharmony_ci * Each ADC is connected from a mixer of all inputs. This makes possible 1145062306a36Sopenharmony_ci * 6-channel independent captures. 1145162306a36Sopenharmony_ci * 1145262306a36Sopenharmony_ci * In addition, an independent DAC for the multi-playback (not used in this 1145362306a36Sopenharmony_ci * driver yet). 1145462306a36Sopenharmony_ci */ 1145562306a36Sopenharmony_ci 1145662306a36Sopenharmony_ci/* 1145762306a36Sopenharmony_ci * BIOS auto configuration 1145862306a36Sopenharmony_ci */ 1145962306a36Sopenharmony_ci 1146062306a36Sopenharmony_cistatic int alc662_parse_auto_config(struct hda_codec *codec) 1146162306a36Sopenharmony_ci{ 1146262306a36Sopenharmony_ci static const hda_nid_t alc662_ignore[] = { 0x1d, 0 }; 1146362306a36Sopenharmony_ci static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 }; 1146462306a36Sopenharmony_ci static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 }; 1146562306a36Sopenharmony_ci const hda_nid_t *ssids; 1146662306a36Sopenharmony_ci 1146762306a36Sopenharmony_ci if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 || 1146862306a36Sopenharmony_ci codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 || 1146962306a36Sopenharmony_ci codec->core.vendor_id == 0x10ec0671) 1147062306a36Sopenharmony_ci ssids = alc663_ssids; 1147162306a36Sopenharmony_ci else 1147262306a36Sopenharmony_ci ssids = alc662_ssids; 1147362306a36Sopenharmony_ci return alc_parse_auto_config(codec, alc662_ignore, ssids); 1147462306a36Sopenharmony_ci} 1147562306a36Sopenharmony_ci 1147662306a36Sopenharmony_cistatic void alc272_fixup_mario(struct hda_codec *codec, 1147762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1147862306a36Sopenharmony_ci{ 1147962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 1148062306a36Sopenharmony_ci return; 1148162306a36Sopenharmony_ci if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, 1148262306a36Sopenharmony_ci (0x3b << AC_AMPCAP_OFFSET_SHIFT) | 1148362306a36Sopenharmony_ci (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) | 1148462306a36Sopenharmony_ci (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) | 1148562306a36Sopenharmony_ci (0 << AC_AMPCAP_MUTE_SHIFT))) 1148662306a36Sopenharmony_ci codec_warn(codec, "failed to override amp caps for NID 0x2\n"); 1148762306a36Sopenharmony_ci} 1148862306a36Sopenharmony_ci 1148962306a36Sopenharmony_cistatic const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = { 1149062306a36Sopenharmony_ci { .channels = 2, 1149162306a36Sopenharmony_ci .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } }, 1149262306a36Sopenharmony_ci { .channels = 4, 1149362306a36Sopenharmony_ci .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 1149462306a36Sopenharmony_ci SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */ 1149562306a36Sopenharmony_ci { } 1149662306a36Sopenharmony_ci}; 1149762306a36Sopenharmony_ci 1149862306a36Sopenharmony_ci/* override the 2.1 chmap */ 1149962306a36Sopenharmony_cistatic void alc_fixup_bass_chmap(struct hda_codec *codec, 1150062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1150162306a36Sopenharmony_ci{ 1150262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_BUILD) { 1150362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1150462306a36Sopenharmony_ci spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps; 1150562306a36Sopenharmony_ci } 1150662306a36Sopenharmony_ci} 1150762306a36Sopenharmony_ci 1150862306a36Sopenharmony_ci/* avoid D3 for keeping GPIO up */ 1150962306a36Sopenharmony_cistatic unsigned int gpio_led_power_filter(struct hda_codec *codec, 1151062306a36Sopenharmony_ci hda_nid_t nid, 1151162306a36Sopenharmony_ci unsigned int power_state) 1151262306a36Sopenharmony_ci{ 1151362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1151462306a36Sopenharmony_ci if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data) 1151562306a36Sopenharmony_ci return AC_PWRST_D0; 1151662306a36Sopenharmony_ci return power_state; 1151762306a36Sopenharmony_ci} 1151862306a36Sopenharmony_ci 1151962306a36Sopenharmony_cistatic void alc662_fixup_led_gpio1(struct hda_codec *codec, 1152062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1152162306a36Sopenharmony_ci{ 1152262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1152362306a36Sopenharmony_ci 1152462306a36Sopenharmony_ci alc_fixup_hp_gpio_led(codec, action, 0x01, 0); 1152562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 1152662306a36Sopenharmony_ci spec->mute_led_polarity = 1; 1152762306a36Sopenharmony_ci codec->power_filter = gpio_led_power_filter; 1152862306a36Sopenharmony_ci } 1152962306a36Sopenharmony_ci} 1153062306a36Sopenharmony_ci 1153162306a36Sopenharmony_cistatic void alc662_usi_automute_hook(struct hda_codec *codec, 1153262306a36Sopenharmony_ci struct hda_jack_callback *jack) 1153362306a36Sopenharmony_ci{ 1153462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1153562306a36Sopenharmony_ci int vref; 1153662306a36Sopenharmony_ci msleep(200); 1153762306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 1153862306a36Sopenharmony_ci 1153962306a36Sopenharmony_ci vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0; 1154062306a36Sopenharmony_ci msleep(100); 1154162306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 1154262306a36Sopenharmony_ci vref); 1154362306a36Sopenharmony_ci} 1154462306a36Sopenharmony_ci 1154562306a36Sopenharmony_cistatic void alc662_fixup_usi_headset_mic(struct hda_codec *codec, 1154662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1154762306a36Sopenharmony_ci{ 1154862306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1154962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 1155062306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 1155162306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc662_usi_automute_hook; 1155262306a36Sopenharmony_ci } 1155362306a36Sopenharmony_ci} 1155462306a36Sopenharmony_ci 1155562306a36Sopenharmony_cistatic void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec, 1155662306a36Sopenharmony_ci struct hda_jack_callback *cb) 1155762306a36Sopenharmony_ci{ 1155862306a36Sopenharmony_ci /* surround speakers at 0x1b already get muted automatically when 1155962306a36Sopenharmony_ci * headphones are plugged in, but we have to mute/unmute the remaining 1156062306a36Sopenharmony_ci * channels manually: 1156162306a36Sopenharmony_ci * 0x15 - front left/front right 1156262306a36Sopenharmony_ci * 0x18 - front center/ LFE 1156362306a36Sopenharmony_ci */ 1156462306a36Sopenharmony_ci if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) { 1156562306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, 0x15, 0); 1156662306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, 0x18, 0); 1156762306a36Sopenharmony_ci } else { 1156862306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT); 1156962306a36Sopenharmony_ci snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT); 1157062306a36Sopenharmony_ci } 1157162306a36Sopenharmony_ci} 1157262306a36Sopenharmony_ci 1157362306a36Sopenharmony_cistatic void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec, 1157462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1157562306a36Sopenharmony_ci{ 1157662306a36Sopenharmony_ci /* Pin 0x1b: shared headphones jack and surround speakers */ 1157762306a36Sopenharmony_ci if (!is_jack_detectable(codec, 0x1b)) 1157862306a36Sopenharmony_ci return; 1157962306a36Sopenharmony_ci 1158062306a36Sopenharmony_ci switch (action) { 1158162306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 1158262306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, 0x1b, 1158362306a36Sopenharmony_ci alc662_aspire_ethos_mute_speakers); 1158462306a36Sopenharmony_ci /* subwoofer needs an extra GPIO setting to become audible */ 1158562306a36Sopenharmony_ci alc_setup_gpio(codec, 0x02); 1158662306a36Sopenharmony_ci break; 1158762306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 1158862306a36Sopenharmony_ci /* Make sure to start in a correct state, i.e. if 1158962306a36Sopenharmony_ci * headphones have been plugged in before powering up the system 1159062306a36Sopenharmony_ci */ 1159162306a36Sopenharmony_ci alc662_aspire_ethos_mute_speakers(codec, NULL); 1159262306a36Sopenharmony_ci break; 1159362306a36Sopenharmony_ci } 1159462306a36Sopenharmony_ci} 1159562306a36Sopenharmony_ci 1159662306a36Sopenharmony_cistatic void alc671_fixup_hp_headset_mic2(struct hda_codec *codec, 1159762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1159862306a36Sopenharmony_ci{ 1159962306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1160062306a36Sopenharmony_ci 1160162306a36Sopenharmony_ci static const struct hda_pintbl pincfgs[] = { 1160262306a36Sopenharmony_ci { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */ 1160362306a36Sopenharmony_ci { 0x1b, 0x0181304f }, 1160462306a36Sopenharmony_ci { } 1160562306a36Sopenharmony_ci }; 1160662306a36Sopenharmony_ci 1160762306a36Sopenharmony_ci switch (action) { 1160862306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 1160962306a36Sopenharmony_ci spec->gen.mixer_nid = 0; 1161062306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 1161162306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, pincfgs); 1161262306a36Sopenharmony_ci break; 1161362306a36Sopenharmony_ci case HDA_FIXUP_ACT_INIT: 1161462306a36Sopenharmony_ci alc_write_coef_idx(codec, 0x19, 0xa054); 1161562306a36Sopenharmony_ci break; 1161662306a36Sopenharmony_ci } 1161762306a36Sopenharmony_ci} 1161862306a36Sopenharmony_ci 1161962306a36Sopenharmony_cistatic void alc897_hp_automute_hook(struct hda_codec *codec, 1162062306a36Sopenharmony_ci struct hda_jack_callback *jack) 1162162306a36Sopenharmony_ci{ 1162262306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1162362306a36Sopenharmony_ci int vref; 1162462306a36Sopenharmony_ci 1162562306a36Sopenharmony_ci snd_hda_gen_hp_automute(codec, jack); 1162662306a36Sopenharmony_ci vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP; 1162762306a36Sopenharmony_ci snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 1162862306a36Sopenharmony_ci vref); 1162962306a36Sopenharmony_ci} 1163062306a36Sopenharmony_ci 1163162306a36Sopenharmony_cistatic void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec, 1163262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1163362306a36Sopenharmony_ci{ 1163462306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1163562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 1163662306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc897_hp_automute_hook; 1163762306a36Sopenharmony_ci } 1163862306a36Sopenharmony_ci} 1163962306a36Sopenharmony_ci 1164062306a36Sopenharmony_cistatic void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec, 1164162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 1164262306a36Sopenharmony_ci{ 1164362306a36Sopenharmony_ci struct alc_spec *spec = codec->spec; 1164462306a36Sopenharmony_ci 1164562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 1164662306a36Sopenharmony_ci spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 1164762306a36Sopenharmony_ci spec->gen.hp_automute_hook = alc897_hp_automute_hook; 1164862306a36Sopenharmony_ci } 1164962306a36Sopenharmony_ci} 1165062306a36Sopenharmony_ci 1165162306a36Sopenharmony_cistatic const struct coef_fw alc668_coefs[] = { 1165262306a36Sopenharmony_ci WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0), 1165362306a36Sopenharmony_ci WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80), 1165462306a36Sopenharmony_ci WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0), 1165562306a36Sopenharmony_ci WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f), 1165662306a36Sopenharmony_ci WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001), 1165762306a36Sopenharmony_ci WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940), 1165862306a36Sopenharmony_ci WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0), 1165962306a36Sopenharmony_ci WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418), 1166062306a36Sopenharmony_ci WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468), 1166162306a36Sopenharmony_ci WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418), 1166262306a36Sopenharmony_ci WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00), 1166362306a36Sopenharmony_ci WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000), 1166462306a36Sopenharmony_ci WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0), 1166562306a36Sopenharmony_ci WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480), 1166662306a36Sopenharmony_ci WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0), 1166762306a36Sopenharmony_ci WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040), 1166862306a36Sopenharmony_ci WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697), 1166962306a36Sopenharmony_ci WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab), 1167062306a36Sopenharmony_ci WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02), 1167162306a36Sopenharmony_ci WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6), 1167262306a36Sopenharmony_ci {} 1167362306a36Sopenharmony_ci}; 1167462306a36Sopenharmony_ci 1167562306a36Sopenharmony_cistatic void alc668_restore_default_value(struct hda_codec *codec) 1167662306a36Sopenharmony_ci{ 1167762306a36Sopenharmony_ci alc_process_coef_fw(codec, alc668_coefs); 1167862306a36Sopenharmony_ci} 1167962306a36Sopenharmony_ci 1168062306a36Sopenharmony_cienum { 1168162306a36Sopenharmony_ci ALC662_FIXUP_ASPIRE, 1168262306a36Sopenharmony_ci ALC662_FIXUP_LED_GPIO1, 1168362306a36Sopenharmony_ci ALC662_FIXUP_IDEAPAD, 1168462306a36Sopenharmony_ci ALC272_FIXUP_MARIO, 1168562306a36Sopenharmony_ci ALC662_FIXUP_CZC_ET26, 1168662306a36Sopenharmony_ci ALC662_FIXUP_CZC_P10T, 1168762306a36Sopenharmony_ci ALC662_FIXUP_SKU_IGNORE, 1168862306a36Sopenharmony_ci ALC662_FIXUP_HP_RP5800, 1168962306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE1, 1169062306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE2, 1169162306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE3, 1169262306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE4, 1169362306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE5, 1169462306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE6, 1169562306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE7, 1169662306a36Sopenharmony_ci ALC662_FIXUP_ASUS_MODE8, 1169762306a36Sopenharmony_ci ALC662_FIXUP_NO_JACK_DETECT, 1169862306a36Sopenharmony_ci ALC662_FIXUP_ZOTAC_Z68, 1169962306a36Sopenharmony_ci ALC662_FIXUP_INV_DMIC, 1170062306a36Sopenharmony_ci ALC662_FIXUP_DELL_MIC_NO_PRESENCE, 1170162306a36Sopenharmony_ci ALC668_FIXUP_DELL_MIC_NO_PRESENCE, 1170262306a36Sopenharmony_ci ALC662_FIXUP_HEADSET_MODE, 1170362306a36Sopenharmony_ci ALC668_FIXUP_HEADSET_MODE, 1170462306a36Sopenharmony_ci ALC662_FIXUP_BASS_MODE4_CHMAP, 1170562306a36Sopenharmony_ci ALC662_FIXUP_BASS_16, 1170662306a36Sopenharmony_ci ALC662_FIXUP_BASS_1A, 1170762306a36Sopenharmony_ci ALC662_FIXUP_BASS_CHMAP, 1170862306a36Sopenharmony_ci ALC668_FIXUP_AUTO_MUTE, 1170962306a36Sopenharmony_ci ALC668_FIXUP_DELL_DISABLE_AAMIX, 1171062306a36Sopenharmony_ci ALC668_FIXUP_DELL_XPS13, 1171162306a36Sopenharmony_ci ALC662_FIXUP_ASUS_Nx50, 1171262306a36Sopenharmony_ci ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE, 1171362306a36Sopenharmony_ci ALC668_FIXUP_ASUS_Nx51, 1171462306a36Sopenharmony_ci ALC668_FIXUP_MIC_COEF, 1171562306a36Sopenharmony_ci ALC668_FIXUP_ASUS_G751, 1171662306a36Sopenharmony_ci ALC891_FIXUP_HEADSET_MODE, 1171762306a36Sopenharmony_ci ALC891_FIXUP_DELL_MIC_NO_PRESENCE, 1171862306a36Sopenharmony_ci ALC662_FIXUP_ACER_VERITON, 1171962306a36Sopenharmony_ci ALC892_FIXUP_ASROCK_MOBO, 1172062306a36Sopenharmony_ci ALC662_FIXUP_USI_FUNC, 1172162306a36Sopenharmony_ci ALC662_FIXUP_USI_HEADSET_MODE, 1172262306a36Sopenharmony_ci ALC662_FIXUP_LENOVO_MULTI_CODECS, 1172362306a36Sopenharmony_ci ALC669_FIXUP_ACER_ASPIRE_ETHOS, 1172462306a36Sopenharmony_ci ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET, 1172562306a36Sopenharmony_ci ALC671_FIXUP_HP_HEADSET_MIC2, 1172662306a36Sopenharmony_ci ALC662_FIXUP_ACER_X2660G_HEADSET_MODE, 1172762306a36Sopenharmony_ci ALC662_FIXUP_ACER_NITRO_HEADSET_MODE, 1172862306a36Sopenharmony_ci ALC668_FIXUP_ASUS_NO_HEADSET_MIC, 1172962306a36Sopenharmony_ci ALC668_FIXUP_HEADSET_MIC, 1173062306a36Sopenharmony_ci ALC668_FIXUP_MIC_DET_COEF, 1173162306a36Sopenharmony_ci ALC897_FIXUP_LENOVO_HEADSET_MIC, 1173262306a36Sopenharmony_ci ALC897_FIXUP_HEADSET_MIC_PIN, 1173362306a36Sopenharmony_ci ALC897_FIXUP_HP_HSMIC_VERB, 1173462306a36Sopenharmony_ci ALC897_FIXUP_LENOVO_HEADSET_MODE, 1173562306a36Sopenharmony_ci ALC897_FIXUP_HEADSET_MIC_PIN2, 1173662306a36Sopenharmony_ci ALC897_FIXUP_UNIS_H3C_X500S, 1173762306a36Sopenharmony_ci}; 1173862306a36Sopenharmony_ci 1173962306a36Sopenharmony_cistatic const struct hda_fixup alc662_fixups[] = { 1174062306a36Sopenharmony_ci [ALC662_FIXUP_ASPIRE] = { 1174162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1174262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1174362306a36Sopenharmony_ci { 0x15, 0x99130112 }, /* subwoofer */ 1174462306a36Sopenharmony_ci { } 1174562306a36Sopenharmony_ci } 1174662306a36Sopenharmony_ci }, 1174762306a36Sopenharmony_ci [ALC662_FIXUP_LED_GPIO1] = { 1174862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1174962306a36Sopenharmony_ci .v.func = alc662_fixup_led_gpio1, 1175062306a36Sopenharmony_ci }, 1175162306a36Sopenharmony_ci [ALC662_FIXUP_IDEAPAD] = { 1175262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1175362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1175462306a36Sopenharmony_ci { 0x17, 0x99130112 }, /* subwoofer */ 1175562306a36Sopenharmony_ci { } 1175662306a36Sopenharmony_ci }, 1175762306a36Sopenharmony_ci .chained = true, 1175862306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_LED_GPIO1, 1175962306a36Sopenharmony_ci }, 1176062306a36Sopenharmony_ci [ALC272_FIXUP_MARIO] = { 1176162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1176262306a36Sopenharmony_ci .v.func = alc272_fixup_mario, 1176362306a36Sopenharmony_ci }, 1176462306a36Sopenharmony_ci [ALC662_FIXUP_CZC_ET26] = { 1176562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1176662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1176762306a36Sopenharmony_ci {0x12, 0x403cc000}, 1176862306a36Sopenharmony_ci {0x14, 0x90170110}, /* speaker */ 1176962306a36Sopenharmony_ci {0x15, 0x411111f0}, 1177062306a36Sopenharmony_ci {0x16, 0x411111f0}, 1177162306a36Sopenharmony_ci {0x18, 0x01a19030}, /* mic */ 1177262306a36Sopenharmony_ci {0x19, 0x90a7013f}, /* int-mic */ 1177362306a36Sopenharmony_ci {0x1a, 0x01014020}, 1177462306a36Sopenharmony_ci {0x1b, 0x0121401f}, 1177562306a36Sopenharmony_ci {0x1c, 0x411111f0}, 1177662306a36Sopenharmony_ci {0x1d, 0x411111f0}, 1177762306a36Sopenharmony_ci {0x1e, 0x40478e35}, 1177862306a36Sopenharmony_ci {} 1177962306a36Sopenharmony_ci }, 1178062306a36Sopenharmony_ci .chained = true, 1178162306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1178262306a36Sopenharmony_ci }, 1178362306a36Sopenharmony_ci [ALC662_FIXUP_CZC_P10T] = { 1178462306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 1178562306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 1178662306a36Sopenharmony_ci {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, 1178762306a36Sopenharmony_ci {} 1178862306a36Sopenharmony_ci } 1178962306a36Sopenharmony_ci }, 1179062306a36Sopenharmony_ci [ALC662_FIXUP_SKU_IGNORE] = { 1179162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1179262306a36Sopenharmony_ci .v.func = alc_fixup_sku_ignore, 1179362306a36Sopenharmony_ci }, 1179462306a36Sopenharmony_ci [ALC662_FIXUP_HP_RP5800] = { 1179562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1179662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1179762306a36Sopenharmony_ci { 0x14, 0x0221201f }, /* HP out */ 1179862306a36Sopenharmony_ci { } 1179962306a36Sopenharmony_ci }, 1180062306a36Sopenharmony_ci .chained = true, 1180162306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1180262306a36Sopenharmony_ci }, 1180362306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE1] = { 1180462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1180562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1180662306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1180762306a36Sopenharmony_ci { 0x18, 0x01a19c20 }, /* mic */ 1180862306a36Sopenharmony_ci { 0x19, 0x99a3092f }, /* int-mic */ 1180962306a36Sopenharmony_ci { 0x21, 0x0121401f }, /* HP out */ 1181062306a36Sopenharmony_ci { } 1181162306a36Sopenharmony_ci }, 1181262306a36Sopenharmony_ci .chained = true, 1181362306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1181462306a36Sopenharmony_ci }, 1181562306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE2] = { 1181662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1181762306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1181862306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1181962306a36Sopenharmony_ci { 0x18, 0x01a19820 }, /* mic */ 1182062306a36Sopenharmony_ci { 0x19, 0x99a3092f }, /* int-mic */ 1182162306a36Sopenharmony_ci { 0x1b, 0x0121401f }, /* HP out */ 1182262306a36Sopenharmony_ci { } 1182362306a36Sopenharmony_ci }, 1182462306a36Sopenharmony_ci .chained = true, 1182562306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1182662306a36Sopenharmony_ci }, 1182762306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE3] = { 1182862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1182962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1183062306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1183162306a36Sopenharmony_ci { 0x15, 0x0121441f }, /* HP */ 1183262306a36Sopenharmony_ci { 0x18, 0x01a19840 }, /* mic */ 1183362306a36Sopenharmony_ci { 0x19, 0x99a3094f }, /* int-mic */ 1183462306a36Sopenharmony_ci { 0x21, 0x01211420 }, /* HP2 */ 1183562306a36Sopenharmony_ci { } 1183662306a36Sopenharmony_ci }, 1183762306a36Sopenharmony_ci .chained = true, 1183862306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1183962306a36Sopenharmony_ci }, 1184062306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE4] = { 1184162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1184262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1184362306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1184462306a36Sopenharmony_ci { 0x16, 0x99130111 }, /* speaker */ 1184562306a36Sopenharmony_ci { 0x18, 0x01a19840 }, /* mic */ 1184662306a36Sopenharmony_ci { 0x19, 0x99a3094f }, /* int-mic */ 1184762306a36Sopenharmony_ci { 0x21, 0x0121441f }, /* HP */ 1184862306a36Sopenharmony_ci { } 1184962306a36Sopenharmony_ci }, 1185062306a36Sopenharmony_ci .chained = true, 1185162306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1185262306a36Sopenharmony_ci }, 1185362306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE5] = { 1185462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1185562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1185662306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1185762306a36Sopenharmony_ci { 0x15, 0x0121441f }, /* HP */ 1185862306a36Sopenharmony_ci { 0x16, 0x99130111 }, /* speaker */ 1185962306a36Sopenharmony_ci { 0x18, 0x01a19840 }, /* mic */ 1186062306a36Sopenharmony_ci { 0x19, 0x99a3094f }, /* int-mic */ 1186162306a36Sopenharmony_ci { } 1186262306a36Sopenharmony_ci }, 1186362306a36Sopenharmony_ci .chained = true, 1186462306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1186562306a36Sopenharmony_ci }, 1186662306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE6] = { 1186762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1186862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1186962306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1187062306a36Sopenharmony_ci { 0x15, 0x01211420 }, /* HP2 */ 1187162306a36Sopenharmony_ci { 0x18, 0x01a19840 }, /* mic */ 1187262306a36Sopenharmony_ci { 0x19, 0x99a3094f }, /* int-mic */ 1187362306a36Sopenharmony_ci { 0x1b, 0x0121441f }, /* HP */ 1187462306a36Sopenharmony_ci { } 1187562306a36Sopenharmony_ci }, 1187662306a36Sopenharmony_ci .chained = true, 1187762306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1187862306a36Sopenharmony_ci }, 1187962306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE7] = { 1188062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1188162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1188262306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1188362306a36Sopenharmony_ci { 0x17, 0x99130111 }, /* speaker */ 1188462306a36Sopenharmony_ci { 0x18, 0x01a19840 }, /* mic */ 1188562306a36Sopenharmony_ci { 0x19, 0x99a3094f }, /* int-mic */ 1188662306a36Sopenharmony_ci { 0x1b, 0x01214020 }, /* HP */ 1188762306a36Sopenharmony_ci { 0x21, 0x0121401f }, /* HP */ 1188862306a36Sopenharmony_ci { } 1188962306a36Sopenharmony_ci }, 1189062306a36Sopenharmony_ci .chained = true, 1189162306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1189262306a36Sopenharmony_ci }, 1189362306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_MODE8] = { 1189462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1189562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1189662306a36Sopenharmony_ci { 0x14, 0x99130110 }, /* speaker */ 1189762306a36Sopenharmony_ci { 0x12, 0x99a30970 }, /* int-mic */ 1189862306a36Sopenharmony_ci { 0x15, 0x01214020 }, /* HP */ 1189962306a36Sopenharmony_ci { 0x17, 0x99130111 }, /* speaker */ 1190062306a36Sopenharmony_ci { 0x18, 0x01a19840 }, /* mic */ 1190162306a36Sopenharmony_ci { 0x21, 0x0121401f }, /* HP */ 1190262306a36Sopenharmony_ci { } 1190362306a36Sopenharmony_ci }, 1190462306a36Sopenharmony_ci .chained = true, 1190562306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_SKU_IGNORE 1190662306a36Sopenharmony_ci }, 1190762306a36Sopenharmony_ci [ALC662_FIXUP_NO_JACK_DETECT] = { 1190862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1190962306a36Sopenharmony_ci .v.func = alc_fixup_no_jack_detect, 1191062306a36Sopenharmony_ci }, 1191162306a36Sopenharmony_ci [ALC662_FIXUP_ZOTAC_Z68] = { 1191262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1191362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1191462306a36Sopenharmony_ci { 0x1b, 0x02214020 }, /* Front HP */ 1191562306a36Sopenharmony_ci { } 1191662306a36Sopenharmony_ci } 1191762306a36Sopenharmony_ci }, 1191862306a36Sopenharmony_ci [ALC662_FIXUP_INV_DMIC] = { 1191962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1192062306a36Sopenharmony_ci .v.func = alc_fixup_inv_dmic, 1192162306a36Sopenharmony_ci }, 1192262306a36Sopenharmony_ci [ALC668_FIXUP_DELL_XPS13] = { 1192362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1192462306a36Sopenharmony_ci .v.func = alc_fixup_dell_xps13, 1192562306a36Sopenharmony_ci .chained = true, 1192662306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX 1192762306a36Sopenharmony_ci }, 1192862306a36Sopenharmony_ci [ALC668_FIXUP_DELL_DISABLE_AAMIX] = { 1192962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1193062306a36Sopenharmony_ci .v.func = alc_fixup_disable_aamix, 1193162306a36Sopenharmony_ci .chained = true, 1193262306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE 1193362306a36Sopenharmony_ci }, 1193462306a36Sopenharmony_ci [ALC668_FIXUP_AUTO_MUTE] = { 1193562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1193662306a36Sopenharmony_ci .v.func = alc_fixup_auto_mute_via_amp, 1193762306a36Sopenharmony_ci .chained = true, 1193862306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE 1193962306a36Sopenharmony_ci }, 1194062306a36Sopenharmony_ci [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = { 1194162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1194262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1194362306a36Sopenharmony_ci { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */ 1194462306a36Sopenharmony_ci /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */ 1194562306a36Sopenharmony_ci { } 1194662306a36Sopenharmony_ci }, 1194762306a36Sopenharmony_ci .chained = true, 1194862306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_HEADSET_MODE 1194962306a36Sopenharmony_ci }, 1195062306a36Sopenharmony_ci [ALC662_FIXUP_HEADSET_MODE] = { 1195162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1195262306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_alc662, 1195362306a36Sopenharmony_ci }, 1195462306a36Sopenharmony_ci [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = { 1195562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1195662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1195762306a36Sopenharmony_ci { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */ 1195862306a36Sopenharmony_ci { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */ 1195962306a36Sopenharmony_ci { } 1196062306a36Sopenharmony_ci }, 1196162306a36Sopenharmony_ci .chained = true, 1196262306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_HEADSET_MODE 1196362306a36Sopenharmony_ci }, 1196462306a36Sopenharmony_ci [ALC668_FIXUP_HEADSET_MODE] = { 1196562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1196662306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_alc668, 1196762306a36Sopenharmony_ci }, 1196862306a36Sopenharmony_ci [ALC662_FIXUP_BASS_MODE4_CHMAP] = { 1196962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1197062306a36Sopenharmony_ci .v.func = alc_fixup_bass_chmap, 1197162306a36Sopenharmony_ci .chained = true, 1197262306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_ASUS_MODE4 1197362306a36Sopenharmony_ci }, 1197462306a36Sopenharmony_ci [ALC662_FIXUP_BASS_16] = { 1197562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1197662306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1197762306a36Sopenharmony_ci {0x16, 0x80106111}, /* bass speaker */ 1197862306a36Sopenharmony_ci {} 1197962306a36Sopenharmony_ci }, 1198062306a36Sopenharmony_ci .chained = true, 1198162306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_BASS_CHMAP, 1198262306a36Sopenharmony_ci }, 1198362306a36Sopenharmony_ci [ALC662_FIXUP_BASS_1A] = { 1198462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1198562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1198662306a36Sopenharmony_ci {0x1a, 0x80106111}, /* bass speaker */ 1198762306a36Sopenharmony_ci {} 1198862306a36Sopenharmony_ci }, 1198962306a36Sopenharmony_ci .chained = true, 1199062306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_BASS_CHMAP, 1199162306a36Sopenharmony_ci }, 1199262306a36Sopenharmony_ci [ALC662_FIXUP_BASS_CHMAP] = { 1199362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1199462306a36Sopenharmony_ci .v.func = alc_fixup_bass_chmap, 1199562306a36Sopenharmony_ci }, 1199662306a36Sopenharmony_ci [ALC662_FIXUP_ASUS_Nx50] = { 1199762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1199862306a36Sopenharmony_ci .v.func = alc_fixup_auto_mute_via_amp, 1199962306a36Sopenharmony_ci .chained = true, 1200062306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_BASS_1A 1200162306a36Sopenharmony_ci }, 1200262306a36Sopenharmony_ci [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = { 1200362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1200462306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode_alc668, 1200562306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_BASS_CHMAP 1200662306a36Sopenharmony_ci }, 1200762306a36Sopenharmony_ci [ALC668_FIXUP_ASUS_Nx51] = { 1200862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1200962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1201062306a36Sopenharmony_ci { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */ 1201162306a36Sopenharmony_ci { 0x1a, 0x90170151 }, /* bass speaker */ 1201262306a36Sopenharmony_ci { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */ 1201362306a36Sopenharmony_ci {} 1201462306a36Sopenharmony_ci }, 1201562306a36Sopenharmony_ci .chained = true, 1201662306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE, 1201762306a36Sopenharmony_ci }, 1201862306a36Sopenharmony_ci [ALC668_FIXUP_MIC_COEF] = { 1201962306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 1202062306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 1202162306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 }, 1202262306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 }, 1202362306a36Sopenharmony_ci {} 1202462306a36Sopenharmony_ci }, 1202562306a36Sopenharmony_ci }, 1202662306a36Sopenharmony_ci [ALC668_FIXUP_ASUS_G751] = { 1202762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1202862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1202962306a36Sopenharmony_ci { 0x16, 0x0421101f }, /* HP */ 1203062306a36Sopenharmony_ci {} 1203162306a36Sopenharmony_ci }, 1203262306a36Sopenharmony_ci .chained = true, 1203362306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_MIC_COEF 1203462306a36Sopenharmony_ci }, 1203562306a36Sopenharmony_ci [ALC891_FIXUP_HEADSET_MODE] = { 1203662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1203762306a36Sopenharmony_ci .v.func = alc_fixup_headset_mode, 1203862306a36Sopenharmony_ci }, 1203962306a36Sopenharmony_ci [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = { 1204062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1204162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1204262306a36Sopenharmony_ci { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */ 1204362306a36Sopenharmony_ci { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */ 1204462306a36Sopenharmony_ci { } 1204562306a36Sopenharmony_ci }, 1204662306a36Sopenharmony_ci .chained = true, 1204762306a36Sopenharmony_ci .chain_id = ALC891_FIXUP_HEADSET_MODE 1204862306a36Sopenharmony_ci }, 1204962306a36Sopenharmony_ci [ALC662_FIXUP_ACER_VERITON] = { 1205062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1205162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1205262306a36Sopenharmony_ci { 0x15, 0x50170120 }, /* no internal speaker */ 1205362306a36Sopenharmony_ci { } 1205462306a36Sopenharmony_ci } 1205562306a36Sopenharmony_ci }, 1205662306a36Sopenharmony_ci [ALC892_FIXUP_ASROCK_MOBO] = { 1205762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1205862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1205962306a36Sopenharmony_ci { 0x15, 0x40f000f0 }, /* disabled */ 1206062306a36Sopenharmony_ci { 0x16, 0x40f000f0 }, /* disabled */ 1206162306a36Sopenharmony_ci { } 1206262306a36Sopenharmony_ci } 1206362306a36Sopenharmony_ci }, 1206462306a36Sopenharmony_ci [ALC662_FIXUP_USI_FUNC] = { 1206562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1206662306a36Sopenharmony_ci .v.func = alc662_fixup_usi_headset_mic, 1206762306a36Sopenharmony_ci }, 1206862306a36Sopenharmony_ci [ALC662_FIXUP_USI_HEADSET_MODE] = { 1206962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1207062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1207162306a36Sopenharmony_ci { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */ 1207262306a36Sopenharmony_ci { 0x18, 0x01a1903d }, 1207362306a36Sopenharmony_ci { } 1207462306a36Sopenharmony_ci }, 1207562306a36Sopenharmony_ci .chained = true, 1207662306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_USI_FUNC 1207762306a36Sopenharmony_ci }, 1207862306a36Sopenharmony_ci [ALC662_FIXUP_LENOVO_MULTI_CODECS] = { 1207962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1208062306a36Sopenharmony_ci .v.func = alc233_alc662_fixup_lenovo_dual_codecs, 1208162306a36Sopenharmony_ci }, 1208262306a36Sopenharmony_ci [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = { 1208362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1208462306a36Sopenharmony_ci .v.func = alc662_fixup_aspire_ethos_hp, 1208562306a36Sopenharmony_ci }, 1208662306a36Sopenharmony_ci [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = { 1208762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1208862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1208962306a36Sopenharmony_ci { 0x15, 0x92130110 }, /* front speakers */ 1209062306a36Sopenharmony_ci { 0x18, 0x99130111 }, /* center/subwoofer */ 1209162306a36Sopenharmony_ci { 0x1b, 0x11130012 }, /* surround plus jack for HP */ 1209262306a36Sopenharmony_ci { } 1209362306a36Sopenharmony_ci }, 1209462306a36Sopenharmony_ci .chained = true, 1209562306a36Sopenharmony_ci .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET 1209662306a36Sopenharmony_ci }, 1209762306a36Sopenharmony_ci [ALC671_FIXUP_HP_HEADSET_MIC2] = { 1209862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1209962306a36Sopenharmony_ci .v.func = alc671_fixup_hp_headset_mic2, 1210062306a36Sopenharmony_ci }, 1210162306a36Sopenharmony_ci [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = { 1210262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1210362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1210462306a36Sopenharmony_ci { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */ 1210562306a36Sopenharmony_ci { } 1210662306a36Sopenharmony_ci }, 1210762306a36Sopenharmony_ci .chained = true, 1210862306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_USI_FUNC 1210962306a36Sopenharmony_ci }, 1211062306a36Sopenharmony_ci [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = { 1211162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1211262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1211362306a36Sopenharmony_ci { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */ 1211462306a36Sopenharmony_ci { 0x1b, 0x0221144f }, 1211562306a36Sopenharmony_ci { } 1211662306a36Sopenharmony_ci }, 1211762306a36Sopenharmony_ci .chained = true, 1211862306a36Sopenharmony_ci .chain_id = ALC662_FIXUP_USI_FUNC 1211962306a36Sopenharmony_ci }, 1212062306a36Sopenharmony_ci [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = { 1212162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1212262306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1212362306a36Sopenharmony_ci { 0x1b, 0x04a1112c }, 1212462306a36Sopenharmony_ci { } 1212562306a36Sopenharmony_ci }, 1212662306a36Sopenharmony_ci .chained = true, 1212762306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_HEADSET_MIC 1212862306a36Sopenharmony_ci }, 1212962306a36Sopenharmony_ci [ALC668_FIXUP_HEADSET_MIC] = { 1213062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1213162306a36Sopenharmony_ci .v.func = alc269_fixup_headset_mic, 1213262306a36Sopenharmony_ci .chained = true, 1213362306a36Sopenharmony_ci .chain_id = ALC668_FIXUP_MIC_DET_COEF 1213462306a36Sopenharmony_ci }, 1213562306a36Sopenharmony_ci [ALC668_FIXUP_MIC_DET_COEF] = { 1213662306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 1213762306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 1213862306a36Sopenharmony_ci { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 }, 1213962306a36Sopenharmony_ci { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 }, 1214062306a36Sopenharmony_ci {} 1214162306a36Sopenharmony_ci }, 1214262306a36Sopenharmony_ci }, 1214362306a36Sopenharmony_ci [ALC897_FIXUP_LENOVO_HEADSET_MIC] = { 1214462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1214562306a36Sopenharmony_ci .v.func = alc897_fixup_lenovo_headset_mic, 1214662306a36Sopenharmony_ci }, 1214762306a36Sopenharmony_ci [ALC897_FIXUP_HEADSET_MIC_PIN] = { 1214862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1214962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1215062306a36Sopenharmony_ci { 0x1a, 0x03a11050 }, 1215162306a36Sopenharmony_ci { } 1215262306a36Sopenharmony_ci }, 1215362306a36Sopenharmony_ci .chained = true, 1215462306a36Sopenharmony_ci .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC 1215562306a36Sopenharmony_ci }, 1215662306a36Sopenharmony_ci [ALC897_FIXUP_HP_HSMIC_VERB] = { 1215762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1215862306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1215962306a36Sopenharmony_ci { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ 1216062306a36Sopenharmony_ci { } 1216162306a36Sopenharmony_ci }, 1216262306a36Sopenharmony_ci }, 1216362306a36Sopenharmony_ci [ALC897_FIXUP_LENOVO_HEADSET_MODE] = { 1216462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 1216562306a36Sopenharmony_ci .v.func = alc897_fixup_lenovo_headset_mode, 1216662306a36Sopenharmony_ci }, 1216762306a36Sopenharmony_ci [ALC897_FIXUP_HEADSET_MIC_PIN2] = { 1216862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 1216962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 1217062306a36Sopenharmony_ci { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */ 1217162306a36Sopenharmony_ci { } 1217262306a36Sopenharmony_ci }, 1217362306a36Sopenharmony_ci .chained = true, 1217462306a36Sopenharmony_ci .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE 1217562306a36Sopenharmony_ci }, 1217662306a36Sopenharmony_ci [ALC897_FIXUP_UNIS_H3C_X500S] = { 1217762306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 1217862306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 1217962306a36Sopenharmony_ci { 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 }, 1218062306a36Sopenharmony_ci {} 1218162306a36Sopenharmony_ci }, 1218262306a36Sopenharmony_ci }, 1218362306a36Sopenharmony_ci}; 1218462306a36Sopenharmony_ci 1218562306a36Sopenharmony_cistatic const struct snd_pci_quirk alc662_fixup_tbl[] = { 1218662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2), 1218762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC), 1218862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC), 1218962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), 1219062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE), 1219162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC), 1219262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC), 1219362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), 1219462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS), 1219562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE), 1219662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE), 1219762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1219862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1219962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13), 1220062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13), 1220162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13), 1220262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1220362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1220462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1220562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1220662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), 1220762306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), 1220862306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB), 1220962306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB), 1221062306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB), 1221162306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2), 1221262306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2), 1221362306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2), 1221462306a36Sopenharmony_ci SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2), 1221562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE), 1221662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50), 1221762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50), 1221862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751), 1221962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A), 1222062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), 1222162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16), 1222262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51), 1222362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51), 1222462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC), 1222562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8), 1222662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16), 1222762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), 1222862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT), 1222962306a36Sopenharmony_ci SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2), 1223062306a36Sopenharmony_ci SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), 1223162306a36Sopenharmony_ci SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE), 1223262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS), 1223362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN), 1223462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN), 1223562306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN), 1223662306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN), 1223762306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN), 1223862306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN), 1223962306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN), 1224062306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN), 1224162306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN), 1224262306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2), 1224362306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), 1224462306a36Sopenharmony_ci SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), 1224562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO), 1224662306a36Sopenharmony_ci SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68), 1224762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON), 1224862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26), 1224962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T), 1225062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB), 1225162306a36Sopenharmony_ci 1225262306a36Sopenharmony_ci#if 0 1225362306a36Sopenharmony_ci /* Below is a quirk table taken from the old code. 1225462306a36Sopenharmony_ci * Basically the device should work as is without the fixup table. 1225562306a36Sopenharmony_ci * If BIOS doesn't give a proper info, enable the corresponding 1225662306a36Sopenharmony_ci * fixup entry. 1225762306a36Sopenharmony_ci */ 1225862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1), 1225962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3), 1226062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1), 1226162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3), 1226262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1), 1226362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1226462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1), 1226562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1), 1226662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1), 1226762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1226862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7), 1226962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7), 1227062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8), 1227162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3), 1227262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1), 1227362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1227462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2), 1227562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1), 1227662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1227762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6), 1227862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6), 1227962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1228062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1), 1228162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3), 1228262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2), 1228362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1228462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5), 1228562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6), 1228662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1228762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1), 1228862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1228962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1229062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3), 1229162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3), 1229262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1), 1229362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1), 1229462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1), 1229562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1), 1229662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1), 1229762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2), 1229862306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2), 1229962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1), 1230062306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1), 1230162306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3), 1230262306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1), 1230362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1), 1230462306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1), 1230562306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2), 1230662306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1), 1230762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4), 1230862306a36Sopenharmony_ci#endif 1230962306a36Sopenharmony_ci {} 1231062306a36Sopenharmony_ci}; 1231162306a36Sopenharmony_ci 1231262306a36Sopenharmony_cistatic const struct hda_model_fixup alc662_fixup_models[] = { 1231362306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"}, 1231462306a36Sopenharmony_ci {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"}, 1231562306a36Sopenharmony_ci {.id = ALC272_FIXUP_MARIO, .name = "mario"}, 1231662306a36Sopenharmony_ci {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"}, 1231762306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"}, 1231862306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"}, 1231962306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"}, 1232062306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"}, 1232162306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"}, 1232262306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"}, 1232362306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"}, 1232462306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"}, 1232562306a36Sopenharmony_ci {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"}, 1232662306a36Sopenharmony_ci {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"}, 1232762306a36Sopenharmony_ci {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"}, 1232862306a36Sopenharmony_ci {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"}, 1232962306a36Sopenharmony_ci {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"}, 1233062306a36Sopenharmony_ci {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"}, 1233162306a36Sopenharmony_ci {.id = ALC662_FIXUP_BASS_16, .name = "bass16"}, 1233262306a36Sopenharmony_ci {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"}, 1233362306a36Sopenharmony_ci {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"}, 1233462306a36Sopenharmony_ci {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"}, 1233562306a36Sopenharmony_ci {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"}, 1233662306a36Sopenharmony_ci {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"}, 1233762306a36Sopenharmony_ci {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"}, 1233862306a36Sopenharmony_ci {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"}, 1233962306a36Sopenharmony_ci {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"}, 1234062306a36Sopenharmony_ci {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"}, 1234162306a36Sopenharmony_ci {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"}, 1234262306a36Sopenharmony_ci {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"}, 1234362306a36Sopenharmony_ci {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"}, 1234462306a36Sopenharmony_ci {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"}, 1234562306a36Sopenharmony_ci {.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"}, 1234662306a36Sopenharmony_ci {} 1234762306a36Sopenharmony_ci}; 1234862306a36Sopenharmony_ci 1234962306a36Sopenharmony_cistatic const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = { 1235062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE, 1235162306a36Sopenharmony_ci {0x17, 0x02211010}, 1235262306a36Sopenharmony_ci {0x18, 0x01a19030}, 1235362306a36Sopenharmony_ci {0x1a, 0x01813040}, 1235462306a36Sopenharmony_ci {0x21, 0x01014020}), 1235562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE, 1235662306a36Sopenharmony_ci {0x16, 0x01813030}, 1235762306a36Sopenharmony_ci {0x17, 0x02211010}, 1235862306a36Sopenharmony_ci {0x18, 0x01a19040}, 1235962306a36Sopenharmony_ci {0x21, 0x01014020}), 1236062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE, 1236162306a36Sopenharmony_ci {0x14, 0x01014010}, 1236262306a36Sopenharmony_ci {0x18, 0x01a19020}, 1236362306a36Sopenharmony_ci {0x1a, 0x0181302f}, 1236462306a36Sopenharmony_ci {0x1b, 0x0221401f}), 1236562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE, 1236662306a36Sopenharmony_ci {0x12, 0x99a30130}, 1236762306a36Sopenharmony_ci {0x14, 0x90170110}, 1236862306a36Sopenharmony_ci {0x15, 0x0321101f}, 1236962306a36Sopenharmony_ci {0x16, 0x03011020}), 1237062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE, 1237162306a36Sopenharmony_ci {0x12, 0x99a30140}, 1237262306a36Sopenharmony_ci {0x14, 0x90170110}, 1237362306a36Sopenharmony_ci {0x15, 0x0321101f}, 1237462306a36Sopenharmony_ci {0x16, 0x03011020}), 1237562306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE, 1237662306a36Sopenharmony_ci {0x12, 0x99a30150}, 1237762306a36Sopenharmony_ci {0x14, 0x90170110}, 1237862306a36Sopenharmony_ci {0x15, 0x0321101f}, 1237962306a36Sopenharmony_ci {0x16, 0x03011020}), 1238062306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE, 1238162306a36Sopenharmony_ci {0x14, 0x90170110}, 1238262306a36Sopenharmony_ci {0x15, 0x0321101f}, 1238362306a36Sopenharmony_ci {0x16, 0x03011020}), 1238462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE, 1238562306a36Sopenharmony_ci {0x12, 0x90a60130}, 1238662306a36Sopenharmony_ci {0x14, 0x90170110}, 1238762306a36Sopenharmony_ci {0x15, 0x0321101f}), 1238862306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2, 1238962306a36Sopenharmony_ci {0x14, 0x01014010}, 1239062306a36Sopenharmony_ci {0x17, 0x90170150}, 1239162306a36Sopenharmony_ci {0x19, 0x02a11060}, 1239262306a36Sopenharmony_ci {0x1b, 0x01813030}, 1239362306a36Sopenharmony_ci {0x21, 0x02211020}), 1239462306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2, 1239562306a36Sopenharmony_ci {0x14, 0x01014010}, 1239662306a36Sopenharmony_ci {0x18, 0x01a19040}, 1239762306a36Sopenharmony_ci {0x1b, 0x01813030}, 1239862306a36Sopenharmony_ci {0x21, 0x02211020}), 1239962306a36Sopenharmony_ci SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2, 1240062306a36Sopenharmony_ci {0x14, 0x01014020}, 1240162306a36Sopenharmony_ci {0x17, 0x90170110}, 1240262306a36Sopenharmony_ci {0x18, 0x01a19050}, 1240362306a36Sopenharmony_ci {0x1b, 0x01813040}, 1240462306a36Sopenharmony_ci {0x21, 0x02211030}), 1240562306a36Sopenharmony_ci {} 1240662306a36Sopenharmony_ci}; 1240762306a36Sopenharmony_ci 1240862306a36Sopenharmony_ci/* 1240962306a36Sopenharmony_ci */ 1241062306a36Sopenharmony_cistatic int patch_alc662(struct hda_codec *codec) 1241162306a36Sopenharmony_ci{ 1241262306a36Sopenharmony_ci struct alc_spec *spec; 1241362306a36Sopenharmony_ci int err; 1241462306a36Sopenharmony_ci 1241562306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0x0b); 1241662306a36Sopenharmony_ci if (err < 0) 1241762306a36Sopenharmony_ci return err; 1241862306a36Sopenharmony_ci 1241962306a36Sopenharmony_ci spec = codec->spec; 1242062306a36Sopenharmony_ci 1242162306a36Sopenharmony_ci spec->shutup = alc_eapd_shutup; 1242262306a36Sopenharmony_ci 1242362306a36Sopenharmony_ci /* handle multiple HPs as is */ 1242462306a36Sopenharmony_ci spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; 1242562306a36Sopenharmony_ci 1242662306a36Sopenharmony_ci alc_fix_pll_init(codec, 0x20, 0x04, 15); 1242762306a36Sopenharmony_ci 1242862306a36Sopenharmony_ci switch (codec->core.vendor_id) { 1242962306a36Sopenharmony_ci case 0x10ec0668: 1243062306a36Sopenharmony_ci spec->init_hook = alc668_restore_default_value; 1243162306a36Sopenharmony_ci break; 1243262306a36Sopenharmony_ci } 1243362306a36Sopenharmony_ci 1243462306a36Sopenharmony_ci alc_pre_init(codec); 1243562306a36Sopenharmony_ci 1243662306a36Sopenharmony_ci snd_hda_pick_fixup(codec, alc662_fixup_models, 1243762306a36Sopenharmony_ci alc662_fixup_tbl, alc662_fixups); 1243862306a36Sopenharmony_ci snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true); 1243962306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 1244062306a36Sopenharmony_ci 1244162306a36Sopenharmony_ci alc_auto_parse_customize_define(codec); 1244262306a36Sopenharmony_ci 1244362306a36Sopenharmony_ci if (has_cdefine_beep(codec)) 1244462306a36Sopenharmony_ci spec->gen.beep_nid = 0x01; 1244562306a36Sopenharmony_ci 1244662306a36Sopenharmony_ci if ((alc_get_coef0(codec) & (1 << 14)) && 1244762306a36Sopenharmony_ci codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 && 1244862306a36Sopenharmony_ci spec->cdefine.platform_type == 1) { 1244962306a36Sopenharmony_ci err = alc_codec_rename(codec, "ALC272X"); 1245062306a36Sopenharmony_ci if (err < 0) 1245162306a36Sopenharmony_ci goto error; 1245262306a36Sopenharmony_ci } 1245362306a36Sopenharmony_ci 1245462306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 1245562306a36Sopenharmony_ci err = alc662_parse_auto_config(codec); 1245662306a36Sopenharmony_ci if (err < 0) 1245762306a36Sopenharmony_ci goto error; 1245862306a36Sopenharmony_ci 1245962306a36Sopenharmony_ci if (!spec->gen.no_analog && spec->gen.beep_nid) { 1246062306a36Sopenharmony_ci switch (codec->core.vendor_id) { 1246162306a36Sopenharmony_ci case 0x10ec0662: 1246262306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 1246362306a36Sopenharmony_ci break; 1246462306a36Sopenharmony_ci case 0x10ec0272: 1246562306a36Sopenharmony_ci case 0x10ec0663: 1246662306a36Sopenharmony_ci case 0x10ec0665: 1246762306a36Sopenharmony_ci case 0x10ec0668: 1246862306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 1246962306a36Sopenharmony_ci break; 1247062306a36Sopenharmony_ci case 0x10ec0273: 1247162306a36Sopenharmony_ci err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT); 1247262306a36Sopenharmony_ci break; 1247362306a36Sopenharmony_ci } 1247462306a36Sopenharmony_ci if (err < 0) 1247562306a36Sopenharmony_ci goto error; 1247662306a36Sopenharmony_ci } 1247762306a36Sopenharmony_ci 1247862306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 1247962306a36Sopenharmony_ci 1248062306a36Sopenharmony_ci return 0; 1248162306a36Sopenharmony_ci 1248262306a36Sopenharmony_ci error: 1248362306a36Sopenharmony_ci alc_free(codec); 1248462306a36Sopenharmony_ci return err; 1248562306a36Sopenharmony_ci} 1248662306a36Sopenharmony_ci 1248762306a36Sopenharmony_ci/* 1248862306a36Sopenharmony_ci * ALC680 support 1248962306a36Sopenharmony_ci */ 1249062306a36Sopenharmony_ci 1249162306a36Sopenharmony_cistatic int alc680_parse_auto_config(struct hda_codec *codec) 1249262306a36Sopenharmony_ci{ 1249362306a36Sopenharmony_ci return alc_parse_auto_config(codec, NULL, NULL); 1249462306a36Sopenharmony_ci} 1249562306a36Sopenharmony_ci 1249662306a36Sopenharmony_ci/* 1249762306a36Sopenharmony_ci */ 1249862306a36Sopenharmony_cistatic int patch_alc680(struct hda_codec *codec) 1249962306a36Sopenharmony_ci{ 1250062306a36Sopenharmony_ci int err; 1250162306a36Sopenharmony_ci 1250262306a36Sopenharmony_ci /* ALC680 has no aa-loopback mixer */ 1250362306a36Sopenharmony_ci err = alc_alloc_spec(codec, 0); 1250462306a36Sopenharmony_ci if (err < 0) 1250562306a36Sopenharmony_ci return err; 1250662306a36Sopenharmony_ci 1250762306a36Sopenharmony_ci /* automatic parse from the BIOS config */ 1250862306a36Sopenharmony_ci err = alc680_parse_auto_config(codec); 1250962306a36Sopenharmony_ci if (err < 0) { 1251062306a36Sopenharmony_ci alc_free(codec); 1251162306a36Sopenharmony_ci return err; 1251262306a36Sopenharmony_ci } 1251362306a36Sopenharmony_ci 1251462306a36Sopenharmony_ci return 0; 1251562306a36Sopenharmony_ci} 1251662306a36Sopenharmony_ci 1251762306a36Sopenharmony_ci/* 1251862306a36Sopenharmony_ci * patch entries 1251962306a36Sopenharmony_ci */ 1252062306a36Sopenharmony_cistatic const struct hda_device_id snd_hda_id_realtek[] = { 1252162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269), 1252262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269), 1252362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269), 1252462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269), 1252562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269), 1252662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269), 1252762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269), 1252862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269), 1252962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269), 1253062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269), 1253162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269), 1253262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269), 1253362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269), 1253462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269), 1253562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260), 1253662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262), 1253762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268), 1253862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268), 1253962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269), 1254062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269), 1254162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662), 1254262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269), 1254362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269), 1254462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269), 1254562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269), 1254662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269), 1254762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269), 1254862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269), 1254962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269), 1255062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269), 1255162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269), 1255262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269), 1255362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269), 1255462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269), 1255562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269), 1255662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269), 1255762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269), 1255862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269), 1255962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269), 1256062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269), 1256162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269), 1256262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269), 1256362306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861), 1256462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd), 1256562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861), 1256662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd), 1256762306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882), 1256862306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662), 1256962306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662), 1257062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662), 1257162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662), 1257262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662), 1257362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662), 1257462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662), 1257562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662), 1257662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680), 1257762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269), 1257862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269), 1257962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269), 1258062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269), 1258162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662), 1258262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880), 1258362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882), 1258462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882), 1258562306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882), 1258662306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882), 1258762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882), 1258862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882), 1258962306a36Sopenharmony_ci HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882), 1259062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882), 1259162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882), 1259262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662), 1259362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662), 1259462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882), 1259562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882), 1259662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882), 1259762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882), 1259862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882), 1259962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269), 1260062306a36Sopenharmony_ci {} /* terminator */ 1260162306a36Sopenharmony_ci}; 1260262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek); 1260362306a36Sopenharmony_ci 1260462306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 1260562306a36Sopenharmony_ciMODULE_DESCRIPTION("Realtek HD-audio codec"); 1260662306a36Sopenharmony_ci 1260762306a36Sopenharmony_cistatic struct hda_codec_driver realtek_driver = { 1260862306a36Sopenharmony_ci .id = snd_hda_id_realtek, 1260962306a36Sopenharmony_ci}; 1261062306a36Sopenharmony_ci 1261162306a36Sopenharmony_cimodule_hda_codec_driver(realtek_driver); 12612