^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Universal Interface for Intel High Definition Audio Codec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * HD audio interface patch for Realtek ALC codecs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * PeiSen Hou <pshou@realtek.com.tw>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Takashi Iwai <tiwai@suse.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Jonathan Woithe <jwoithe@just42.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/leds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <sound/core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <sound/jack.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <sound/hda_codec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "hda_local.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "hda_auto_parser.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include "hda_jack.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "hda_generic.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* keep halting ALC5505 DSP, for power saving */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define HALT_REALTEK_ALC5505
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* extra amp-initialization sequence types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ALC_INIT_UNDEFINED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ALC_INIT_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ALC_INIT_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ALC_HEADSET_MODE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ALC_HEADSET_MODE_UNPLUGGED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ALC_HEADSET_MODE_HEADSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ALC_HEADSET_MODE_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ALC_HEADSET_MODE_HEADPHONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ALC_HEADSET_TYPE_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ALC_HEADSET_TYPE_CTIA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ALC_HEADSET_TYPE_OMTP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ALC_KEY_MICMUTE_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct alc_customize_define {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) unsigned int sku_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned char port_connectivity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) unsigned char check_sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) unsigned char customization;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned char external_amp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) unsigned int enable_pcbeep:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned int platform_type:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) unsigned int swap:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) unsigned int override:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct alc_coef_led {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) unsigned int idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned int on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) unsigned int off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct alc_spec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct hda_gen_spec gen; /* must be at head */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* codec parameterization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct alc_customize_define cdefine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* GPIO bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) unsigned int gpio_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) unsigned int gpio_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned int gpio_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) bool gpio_write_delay; /* add a delay before writing gpio_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* mute LED for HP laptops, see vref_mute_led_set() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int mute_led_polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) int micmute_led_polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) hda_nid_t mute_led_nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) hda_nid_t cap_mute_led_nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) unsigned int gpio_mute_led_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) unsigned int gpio_mic_led_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct alc_coef_led mute_led_coef;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct alc_coef_led mic_led_coef;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct mutex coef_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) hda_nid_t headset_mic_pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) hda_nid_t headphone_mic_pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) int current_headset_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) int current_headset_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* hooks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) void (*init_hook)(struct hda_codec *codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) void (*power_hook)(struct hda_codec *codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) void (*shutup)(struct hda_codec *codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) void (*reboot_notify)(struct hda_codec *codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) int init_amp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) int codec_variant; /* flag for other variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) unsigned int has_alc5505_dsp:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) unsigned int no_depop_delay:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned int done_hp_init:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) unsigned int no_shutup_pins:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) unsigned int ultra_low_power:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) unsigned int has_hs_key:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) unsigned int no_internal_mic_pin:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* for PLL fix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) hda_nid_t pll_nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) unsigned int pll_coef_idx, pll_coef_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) unsigned int coef0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct input_dev *kb_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u8 alc_mute_keycode_map[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * COEF access helper functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) static void coef_mutex_lock(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) snd_hda_power_up_pm(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) mutex_lock(&spec->coef_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) static void coef_mutex_unlock(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) mutex_unlock(&spec->coef_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) snd_hda_power_down_pm(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) unsigned int coef_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) unsigned int coef_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) coef_mutex_lock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) val = __alc_read_coefex_idx(codec, nid, coef_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) coef_mutex_unlock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define alc_read_coef_idx(codec, coef_idx) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) alc_read_coefex_idx(codec, 0x20, coef_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) unsigned int coef_idx, unsigned int coef_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) unsigned int coef_idx, unsigned int coef_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) coef_mutex_lock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) __alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) coef_mutex_unlock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define alc_write_coef_idx(codec, coef_idx, coef_val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) unsigned int coef_idx, unsigned int mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) unsigned int bits_set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (val != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __alc_write_coefex_idx(codec, nid, coef_idx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) (val & ~mask) | bits_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) unsigned int coef_idx, unsigned int mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) unsigned int bits_set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) coef_mutex_lock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) coef_mutex_unlock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* a special bypass for COEF 0; read the cached value at the second time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) static unsigned int alc_get_coef0(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (!spec->coef0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) spec->coef0 = alc_read_coef_idx(codec, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) return spec->coef0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* coef writes/updates batch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct coef_fw {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) unsigned char nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) unsigned char idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) unsigned short mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) unsigned short val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) static void alc_process_coef_fw(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) const struct coef_fw *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) coef_mutex_lock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) for (; fw->nid; fw++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (fw->mask == (unsigned short)-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) __alc_update_coefex_idx(codec, fw->nid, fw->idx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) fw->mask, fw->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) coef_mutex_unlock(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * GPIO setup tables, used in initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* Enable GPIO mask and set output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) spec->gpio_mask |= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) spec->gpio_dir |= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) spec->gpio_data |= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static void alc_write_gpio_data(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) spec->gpio_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) unsigned int oldval = spec->gpio_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) spec->gpio_data |= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) spec->gpio_data &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) if (oldval != spec->gpio_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) alc_write_gpio_data(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) static void alc_write_gpio(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) if (!spec->gpio_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) snd_hda_codec_write(codec, codec->core.afg, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) snd_hda_codec_write(codec, codec->core.afg, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (spec->gpio_write_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) alc_write_gpio_data(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static void alc_fixup_gpio(struct hda_codec *codec, int action,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) unsigned int mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) alc_setup_gpio(codec, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) static void alc_fixup_gpio1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) alc_fixup_gpio(codec, action, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static void alc_fixup_gpio2(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) alc_fixup_gpio(codec, action, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) static void alc_fixup_gpio3(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) alc_fixup_gpio(codec, action, 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) static void alc_fixup_gpio4(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) alc_fixup_gpio(codec, action, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) static void alc_fixup_micmute_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if (action == HDA_FIXUP_ACT_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) snd_hda_gen_add_micmute_led_cdev(codec, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) * Fix hardware PLL issue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) * On some codecs, the analog PLL gating control must be off while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * the default value is 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) static void alc_fix_pll(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (spec->pll_nid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 1 << spec->pll_coef_bit, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) unsigned int coef_idx, unsigned int coef_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) spec->pll_nid = nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) spec->pll_coef_idx = coef_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) spec->pll_coef_bit = coef_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) alc_fix_pll(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /* update the master volume per volume-knob's unsol event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) static void alc_update_knob_master(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) struct snd_kcontrol *kctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) struct snd_ctl_elem_value *uctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (!kctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (!uctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) val = snd_hda_codec_read(codec, jack->nid, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) val &= HDA_AMP_VOLMASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) uctl->value.integer.value[0] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) uctl->value.integer.value[1] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) kctl->put(kctl, uctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) kfree(uctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /* For some reason, the res given from ALC880 is broken.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) Here we adjust it properly. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) snd_hda_jack_unsol_event(codec, res >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) /* Change EAPD to verb control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) static void alc_fill_eapd_coef(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) int coef;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) coef = alc_get_coef0(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) case 0x10ec0262:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) alc_update_coef_idx(codec, 0x7, 0, 1<<5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) case 0x10ec0267:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) case 0x10ec0268:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) alc_update_coef_idx(codec, 0x7, 0, 1<<13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) case 0x10ec0269:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if ((coef & 0x00f0) == 0x0010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) alc_update_coef_idx(codec, 0xd, 0, 1<<14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if ((coef & 0x00f0) == 0x0020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) alc_update_coef_idx(codec, 0x4, 1<<15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if ((coef & 0x00f0) == 0x0030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) alc_update_coef_idx(codec, 0x10, 1<<9, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) case 0x10ec0280:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) case 0x10ec0284:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) case 0x10ec0290:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) alc_update_coef_idx(codec, 0x4, 1<<15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) case 0x10ec0235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) case 0x10ec0245:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) case 0x10ec0257:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) case 0x10ec0282:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) case 0x10ec0300:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) alc_update_coef_idx(codec, 0x10, 1<<9, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) case 0x10ec0275:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) alc_update_coef_idx(codec, 0xe, 0, 1<<0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) case 0x10ec0287:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) alc_update_coef_idx(codec, 0x10, 1<<9, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) alc_write_coef_idx(codec, 0x8, 0x4ab7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) alc_update_coef_idx(codec, 0xa, 1<<13, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) case 0x10ec0700:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) case 0x10ec0701:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) case 0x10ec0703:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) case 0x10ec0711:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) alc_update_coef_idx(codec, 0x10, 1<<15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) case 0x10ec0662:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if ((coef & 0x00f0) == 0x0030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) case 0x10ec0272:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) case 0x10ec0273:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) case 0x10ec0663:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) case 0x10ec0665:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) case 0x10ec0670:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) case 0x10ec0671:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) case 0x10ec0672:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) case 0x10ec0222:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) case 0x10ec0623:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) alc_update_coef_idx(codec, 0x19, 1<<13, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) alc_update_coef_idx(codec, 0x7, 3<<13, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) case 0x10ec0867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) alc_update_coef_idx(codec, 0x4, 1<<10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) case 0x10ec0888:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) alc_update_coef_idx(codec, 0x7, 1<<5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) case 0x10ec0892:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) case 0x10ec0897:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) alc_update_coef_idx(codec, 0x7, 1<<5, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) case 0x10ec0899:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) case 0x10ec0900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) case 0x10ec0b00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) case 0x10ec1168:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) case 0x10ec1220:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) alc_update_coef_idx(codec, 0x7, 1<<1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /* additional initialization for ALC888 variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static void alc888_coef_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) switch (alc_get_coef0(codec) & 0x00f0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /* alc888-VA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) case 0x00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) /* alc888-VB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) case 0x10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) /* turn on/off EAPD control (only if available) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) on ? 2 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /* turn on/off EAPD controls of the codec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) /* We currently only handle front, HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) static const hda_nid_t pins[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 0x0f, 0x10, 0x14, 0x15, 0x17, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) const hda_nid_t *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) for (p = pins; *p; p++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) set_eapd(codec, *p, on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) static int find_ext_mic_pin(struct hda_codec *codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) static void alc_headset_mic_no_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) const struct hda_pincfg *pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) int mic_pin = find_ext_mic_pin(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) /* don't shut up pins when unloading the driver; otherwise it breaks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) * the default pin setup at the next load of the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) if (codec->bus->shutdown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) snd_array_for_each(&codec->init_pins, i, pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) /* use read here for syncing after issuing each verb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) if (pin->nid != mic_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) snd_hda_codec_read(codec, pin->nid, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) codec->pins_shutup = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) static void alc_shutup_pins(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) alc_headset_mic_no_shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) if (!spec->no_shutup_pins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) snd_hda_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) /* generic shutup callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) * just turning off EAPD and a little pause for avoiding pop-noise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) static void alc_eapd_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) if (!spec->no_depop_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /* generic EAPD initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) static void alc_auto_init_amp(struct hda_codec *codec, int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) alc_auto_setup_eapd(codec, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) alc_write_gpio(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) case ALC_INIT_DEFAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) case 0x10ec0260:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) case 0x10ec0880:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) case 0x10ec0882:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) case 0x10ec0883:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) case 0x10ec0885:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) alc_update_coef_idx(codec, 7, 0, 0x2030);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) case 0x10ec0888:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) alc888_coef_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) /* get a primary headphone pin if available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) if (spec->gen.autocfg.hp_pins[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) return spec->gen.autocfg.hp_pins[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return spec->gen.autocfg.line_out_pins[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * Realtek SSID verification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /* Could be any non-zero and even value. When used as fixup, tells
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * the driver to ignore any present sku defines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) #define ALC_FIXUP_SKU_IGNORE (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) static void alc_fixup_sku_ignore(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) spec->cdefine.fixup = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) static void alc_fixup_no_depop_delay(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) if (action == HDA_FIXUP_ACT_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) spec->no_depop_delay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) codec->depop_delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) static int alc_auto_parse_customize_define(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) unsigned int ass, tmp, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) unsigned nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) if (spec->cdefine.fixup) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) ass = spec->cdefine.sku_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) if (ass == ALC_FIXUP_SKU_IGNORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) goto do_sku;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) if (!codec->bus->pci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) ass = codec->core.subsystem_id & 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) if (ass != codec->bus->pci->subsystem_device && (ass & 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) goto do_sku;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) nid = 0x1d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) if (codec->core.vendor_id == 0x10ec0260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) nid = 0x17;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) ass = snd_hda_codec_get_pincfg(codec, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (!(ass & 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) codec_info(codec, "%s: SKU not ready 0x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) codec->core.chip_name, ass);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) /* check sum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) tmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) for (i = 1; i < 16; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) if ((ass >> i) & 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) tmp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (((ass >> 16) & 0xf) != tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) spec->cdefine.port_connectivity = ass >> 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) spec->cdefine.check_sum = (ass >> 16) & 0xf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) spec->cdefine.customization = ass >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) do_sku:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) spec->cdefine.sku_cfg = ass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) spec->cdefine.external_amp = (ass & 0x38) >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) spec->cdefine.platform_type = (ass & 0x4) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) spec->cdefine.swap = (ass & 0x2) >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) spec->cdefine.override = ass & 0x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) nid, spec->cdefine.sku_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) spec->cdefine.port_connectivity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) /* return the position of NID in the list, or -1 if not found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) for (i = 0; i < nums; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) if (list[i] == nid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /* return true if the given NID is found in the list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) return find_idx_in_nid_list(nid, list, nums) >= 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) /* check subsystem ID and set up device-specific initialization;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) * return 1 if initialized, 0 if invalid SSID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) * 31 ~ 16 : Manufacture ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * 15 ~ 8 : SKU ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * 7 ~ 0 : Assembly ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) unsigned int ass, tmp, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) unsigned nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) if (spec->cdefine.fixup) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) ass = spec->cdefine.sku_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) if (ass == ALC_FIXUP_SKU_IGNORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) goto do_sku;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) ass = codec->core.subsystem_id & 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) if (codec->bus->pci &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) ass != codec->bus->pci->subsystem_device && (ass & 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) goto do_sku;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) /* invalid SSID, check the special NID pin defcfg instead */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * 31~30 : port connectivity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) * 29~21 : reserve
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) * 20 : PCBEEP input
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) * 19~16 : Check sum (15:1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) * 15~1 : Custom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) * 0 : override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) nid = 0x1d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) if (codec->core.vendor_id == 0x10ec0260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) nid = 0x17;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) ass = snd_hda_codec_get_pincfg(codec, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) codec_dbg(codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) ass, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) if (!(ass & 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) if ((ass >> 30) != 1) /* no physical connection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) /* check sum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) tmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) for (i = 1; i < 16; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if ((ass >> i) & 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) tmp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) if (((ass >> 16) & 0xf) != tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) do_sku:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) ass & 0xffff, codec->core.vendor_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) * 0 : override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) * 1 : Swap Jack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) * 2 : 0 --> Desktop, 1 --> Laptop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * 3~5 : External Amplifier control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) * 7~6 : Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) tmp = (ass & 0x38) >> 3; /* external Amp control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) if (spec->init_amp == ALC_INIT_UNDEFINED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) switch (tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) alc_setup_gpio(codec, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) alc_setup_gpio(codec, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) alc_setup_gpio(codec, 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) spec->init_amp = ALC_INIT_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) /* is laptop or Desktop and enable the function "Mute internal speaker
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) * when the external headphone out jack is plugged"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) if (!(ass & 0x8000))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) * 10~8 : Jack location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) * 14~13: Resvered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) * 15 : 1 --> enable the function "Mute internal speaker
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) * when the external headphone out jack is plugged"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (!alc_get_hp_pin(spec)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) hda_nid_t nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) tmp = (ass >> 11) & 0x3; /* HP to chassis */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) nid = ports[tmp];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) spec->gen.autocfg.line_outs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) spec->gen.autocfg.hp_pins[0] = nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) /* Check the validity of ALC subsystem-id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) * ports contains an array of 4 pin NIDs for port-A, E, D and I */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) if (!alc_subsystem_id(codec, ports)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (spec->init_amp == ALC_INIT_UNDEFINED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) codec_dbg(codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) "realtek: Enable default setup for auto mode as fallback\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) spec->init_amp = ALC_INIT_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) static void alc_fixup_inv_dmic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) spec->gen.inv_dmic_split = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) static int alc_build_controls(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) err = snd_hda_gen_build_controls(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) * Common callbacks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) static void alc_pre_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) alc_fill_eapd_coef(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) #define is_s3_resume(codec) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) #define is_s4_resume(codec) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) static int alc_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) /* hibernation resume needs the full chip initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) if (is_s4_resume(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (spec->init_hook)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) spec->init_hook(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) spec->gen.skip_verbs = 1; /* applied in below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) snd_hda_gen_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) alc_fix_pll(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) alc_auto_init_amp(codec, spec->init_amp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) snd_hda_apply_verbs(codec); /* apply verbs here after own init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) static inline void alc_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) if (!snd_hda_get_bool_hint(codec, "shutup"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) return; /* disabled explicitly by hints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) if (spec && spec->shutup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) spec->shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) static void alc_reboot_notify(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) if (spec && spec->reboot_notify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) spec->reboot_notify(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) alc_shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) #define alc_free snd_hda_gen_free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) static void alc_power_eapd(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static int alc_suspend(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) alc_shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) if (spec && spec->power_hook)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) spec->power_hook(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) static int alc_resume(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if (!spec->no_depop_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) msleep(150); /* to avoid pop noise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) codec->patch_ops.init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) snd_hda_regmap_sync(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) hda_call_check_power_status(codec, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) static const struct hda_codec_ops alc_patch_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) .build_controls = alc_build_controls,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) .build_pcms = snd_hda_gen_build_pcms,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) .init = alc_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) .free = alc_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) .unsol_event = snd_hda_jack_unsol_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) .resume = alc_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) .suspend = alc_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) .check_power_status = snd_hda_gen_check_power_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) .reboot_notify = alc_reboot_notify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) * Rename codecs appropriately from COEF value or subvendor id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) struct alc_codec_rename_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) unsigned int vendor_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) unsigned short coef_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) unsigned short coef_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) struct alc_codec_rename_pci_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) unsigned int codec_vendor_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) unsigned short pci_subvendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) unsigned short pci_subdevice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) static const struct alc_codec_rename_table rename_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) { } /* terminator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) { 0x10ec0280, 0x1028, 0, "ALC3220" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) { 0x10ec0282, 0x1028, 0, "ALC3221" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) { 0x10ec0283, 0x1028, 0, "ALC3223" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) { 0x10ec0288, 0x1028, 0, "ALC3263" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) { 0x10ec0292, 0x1028, 0, "ALC3226" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) { 0x10ec0293, 0x1028, 0, "ALC3235" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) { 0x10ec0255, 0x1028, 0, "ALC3234" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) { 0x10ec0668, 0x1028, 0, "ALC3661" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) { 0x10ec0275, 0x1028, 0, "ALC3260" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) { 0x10ec0899, 0x1028, 0, "ALC3861" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) { 0x10ec0298, 0x1028, 0, "ALC3266" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) { 0x10ec0236, 0x1028, 0, "ALC3204" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) { 0x10ec0256, 0x1028, 0, "ALC3246" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) { 0x10ec0225, 0x1028, 0, "ALC3253" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) { 0x10ec0295, 0x1028, 0, "ALC3254" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) { 0x10ec0299, 0x1028, 0, "ALC3271" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) { 0x10ec0670, 0x1025, 0, "ALC669X" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) { 0x10ec0676, 0x1025, 0, "ALC679X" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) { 0x10ec0282, 0x1043, 0, "ALC3229" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) { 0x10ec0233, 0x1043, 0, "ALC3236" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) { 0x10ec0280, 0x103c, 0, "ALC3228" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) { 0x10ec0282, 0x103c, 0, "ALC3227" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) { 0x10ec0286, 0x103c, 0, "ALC3242" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) { 0x10ec0290, 0x103c, 0, "ALC3241" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) { 0x10ec0668, 0x103c, 0, "ALC3662" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) { 0x10ec0283, 0x17aa, 0, "ALC3239" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) { 0x10ec0292, 0x17aa, 0, "ALC3232" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) { } /* terminator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) static int alc_codec_rename_from_preset(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) const struct alc_codec_rename_table *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) const struct alc_codec_rename_pci_table *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) for (p = rename_tbl; p->vendor_id; p++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) if (p->vendor_id != codec->core.vendor_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) return alc_codec_rename(codec, p->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) if (!codec->bus->pci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) if (q->codec_vendor_id != codec->core.vendor_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) if (!q->pci_subdevice ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) q->pci_subdevice == codec->bus->pci->subsystem_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) return alc_codec_rename(codec, q->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) * Digital-beep handlers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) #ifdef CONFIG_SND_HDA_INPUT_BEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) /* additional beep mixers; private_value will be overwritten */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) static const struct snd_kcontrol_new alc_beep_mixer[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) /* set up and create beep controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) int idx, int dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) struct snd_kcontrol_new *knew;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) &alc_beep_mixer[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (!knew)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) knew->private_value = beep_amp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) static const struct snd_pci_quirk beep_allow_list[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) /* denylist -- no beep available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) static inline int has_cdefine_beep(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) const struct snd_pci_quirk *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) if (q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) return q->value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return spec->cdefine.enable_pcbeep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) #define set_beep_amp(spec, nid, idx, dir) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) #define has_cdefine_beep(codec) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) /* parse the BIOS configuration and set up the alc_spec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) /* return 1 if successful, 0 if the proper config is not found,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * or a negative error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) static int alc_parse_auto_config(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) const hda_nid_t *ignore_nids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) const hda_nid_t *ssid_nids)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) struct auto_pin_cfg *cfg = &spec->gen.autocfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) spec->parse_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) if (ssid_nids)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) alc_ssid_check(codec, ssid_nids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) err = snd_hda_gen_parse_auto_config(codec, cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) /* common preparation job for alc_spec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) if (!spec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) codec->spec = spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) snd_hda_gen_spec_init(&spec->gen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) spec->gen.mixer_nid = mixer_nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) spec->gen.own_eapd_ctl = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) codec->single_adc_amp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /* FIXME: do we need this for all Realtek codec models? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) codec->spdif_status_reset = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) codec->forced_resume = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) codec->patch_ops = alc_patch_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) mutex_init(&spec->coef_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) err = alc_codec_rename_from_preset(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) kfree(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) static int alc880_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * ALC880 fix-ups
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) ALC880_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) ALC880_FIXUP_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) ALC880_FIXUP_MEDION_RIM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) ALC880_FIXUP_LG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) ALC880_FIXUP_LG_LW25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) ALC880_FIXUP_W810,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) ALC880_FIXUP_EAPD_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) ALC880_FIXUP_TCL_S700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) ALC880_FIXUP_VOL_KNOB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) ALC880_FIXUP_FUJITSU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) ALC880_FIXUP_F1734,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) ALC880_FIXUP_UNIWILL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) ALC880_FIXUP_UNIWILL_DIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) ALC880_FIXUP_Z71V,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) ALC880_FIXUP_ASUS_W5A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) ALC880_FIXUP_3ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) ALC880_FIXUP_3ST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) ALC880_FIXUP_3ST_DIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) ALC880_FIXUP_5ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) ALC880_FIXUP_5ST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) ALC880_FIXUP_5ST_DIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) ALC880_FIXUP_6ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) ALC880_FIXUP_6ST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) ALC880_FIXUP_6ST_DIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) ALC880_FIXUP_6ST_AUTOMUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) /* enable the volume-knob widget support on NID 0x21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) static void alc880_fixup_vol_knob(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) if (action == HDA_FIXUP_ACT_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) snd_hda_jack_detect_enable_callback(codec, 0x21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) alc_update_knob_master);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) static const struct hda_fixup alc880_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) [ALC880_FIXUP_GPIO1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) .v.func = alc_fixup_gpio1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) [ALC880_FIXUP_GPIO2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) .v.func = alc_fixup_gpio2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) [ALC880_FIXUP_MEDION_RIM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) .chain_id = ALC880_FIXUP_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) [ALC880_FIXUP_LG] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) /* disable bogus unused pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) { 0x16, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) { 0x18, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) { 0x1a, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) [ALC880_FIXUP_LG_LW25] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) { 0x1a, 0x0181344f }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) { 0x1b, 0x0321403f }, /* headphone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) [ALC880_FIXUP_W810] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) /* disable bogus unused pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) .chain_id = ALC880_FIXUP_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) [ALC880_FIXUP_EAPD_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) /* change to EAPD mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) [ALC880_FIXUP_TCL_S700] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) /* change to EAPD mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) .chain_id = ALC880_FIXUP_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) [ALC880_FIXUP_VOL_KNOB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) .v.func = alc880_fixup_vol_knob,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) [ALC880_FIXUP_FUJITSU] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) /* override all pins as BIOS on old Amilo is broken */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) { 0x14, 0x0121401f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) { 0x15, 0x99030120 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) { 0x16, 0x99030130 }, /* bass speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) { 0x17, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) { 0x18, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) { 0x19, 0x01a19950 }, /* mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) { 0x1a, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) { 0x1b, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) { 0x1e, 0x01454140 }, /* SPDIF out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) .chain_id = ALC880_FIXUP_VOL_KNOB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) [ALC880_FIXUP_F1734] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) /* almost compatible with FUJITSU, but no bass and SPDIF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) { 0x14, 0x0121401f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) { 0x15, 0x99030120 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) { 0x16, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) { 0x17, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) { 0x18, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) { 0x19, 0x01a19950 }, /* mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) { 0x1a, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) { 0x1b, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) { 0x1e, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) .chain_id = ALC880_FIXUP_VOL_KNOB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) [ALC880_FIXUP_UNIWILL] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) /* need to fix HP and speaker pins to be parsed correctly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) { 0x14, 0x0121411f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) { 0x15, 0x99030120 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) { 0x16, 0x99030130 }, /* bass speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) [ALC880_FIXUP_UNIWILL_DIG] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) /* disable bogus unused pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) { 0x19, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) { 0x1b, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) { 0x1f, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) [ALC880_FIXUP_Z71V] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) /* set up the whole pins as BIOS is utterly broken */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) { 0x14, 0x99030120 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) { 0x15, 0x0121411f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) { 0x16, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) { 0x17, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) { 0x18, 0x01a19950 }, /* mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) { 0x19, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) { 0x1a, 0x01813031 }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) { 0x1b, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) { 0x1e, 0x0144111e }, /* SPDIF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) [ALC880_FIXUP_ASUS_W5A] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) /* set up the whole pins as BIOS is utterly broken */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) { 0x14, 0x0121411f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) { 0x15, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) { 0x16, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) { 0x17, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) { 0x18, 0x90a60160 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) { 0x19, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) { 0x1a, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) { 0x1b, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) { 0x1e, 0xb743111e }, /* SPDIF out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) .chain_id = ALC880_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) [ALC880_FIXUP_3ST_BASE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) { 0x14, 0x01014010 }, /* line-out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) { 0x15, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) { 0x16, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) { 0x17, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) { 0x18, 0x01a19c30 }, /* mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) { 0x19, 0x0121411f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) { 0x1a, 0x01813031 }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) { 0x1b, 0x02a19c40 }, /* front-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) /* 0x1e is filled in below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) { 0x1f, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) [ALC880_FIXUP_3ST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) { 0x1e, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) .chain_id = ALC880_FIXUP_3ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) [ALC880_FIXUP_3ST_DIG] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) { 0x1e, 0x0144111e }, /* SPDIF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) .chain_id = ALC880_FIXUP_3ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) [ALC880_FIXUP_5ST_BASE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) { 0x14, 0x01014010 }, /* front */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) { 0x15, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) { 0x16, 0x01011411 }, /* CLFE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) { 0x17, 0x01016412 }, /* surr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) { 0x18, 0x01a19c30 }, /* mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) { 0x19, 0x0121411f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) { 0x1a, 0x01813031 }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) { 0x1b, 0x02a19c40 }, /* front-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) /* 0x1e is filled in below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) { 0x1f, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) [ALC880_FIXUP_5ST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) { 0x1e, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) .chain_id = ALC880_FIXUP_5ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) [ALC880_FIXUP_5ST_DIG] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) { 0x1e, 0x0144111e }, /* SPDIF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) .chain_id = ALC880_FIXUP_5ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) [ALC880_FIXUP_6ST_BASE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) { 0x14, 0x01014010 }, /* front */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) { 0x15, 0x01016412 }, /* surr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) { 0x16, 0x01011411 }, /* CLFE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) { 0x17, 0x01012414 }, /* side */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) { 0x18, 0x01a19c30 }, /* mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) { 0x19, 0x02a19c40 }, /* front-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) { 0x1a, 0x01813031 }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) { 0x1b, 0x0121411f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) { 0x1c, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) { 0x1d, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) /* 0x1e is filled in below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) { 0x1f, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) [ALC880_FIXUP_6ST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) { 0x1e, 0x411111f0 }, /* N/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) .chain_id = ALC880_FIXUP_6ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) [ALC880_FIXUP_6ST_DIG] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) { 0x1e, 0x0144111e }, /* SPDIF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) .chain_id = ALC880_FIXUP_6ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) [ALC880_FIXUP_6ST_AUTOMUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) { 0x1b, 0x0121401f }, /* HP with jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) .chained_before = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) .chain_id = ALC880_FIXUP_6ST_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) static const struct snd_pci_quirk alc880_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) /* Below is the copied entries from alc880_quirks.c.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) * It's not quite sure whether BIOS sets the correct pin-config table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) * on these machines, thus they are kept to be compatible with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) * the old static quirks. Once when it's confirmed to work without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) * these overrides, it'd be better to remove.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) /* default Intel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) static const struct hda_model_fixup alc880_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) {.id = ALC880_FIXUP_3ST, .name = "3stack"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) {.id = ALC880_FIXUP_5ST, .name = "5stack"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) {.id = ALC880_FIXUP_6ST, .name = "6stack"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) * OK, here we have finally the patch for ALC880
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) static int patch_alc880(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) err = alc_alloc_spec(codec, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) spec->gen.need_dac_fix = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) codec->patch_ops.unsol_event = alc880_unsol_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) alc880_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) err = alc880_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) if (!spec->gen.no_analog) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) * ALC260 support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) static int alc260_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) * Pin config fixes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) ALC260_FIXUP_HP_DC5750,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) ALC260_FIXUP_HP_PIN_0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) ALC260_FIXUP_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) ALC260_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) ALC260_FIXUP_GPIO1_TOGGLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) ALC260_FIXUP_REPLACER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) ALC260_FIXUP_HP_B1900,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) ALC260_FIXUP_KN1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) ALC260_FIXUP_FSC_S7020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) ALC260_FIXUP_FSC_S7020_JWSE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) ALC260_FIXUP_VAIO_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) static void alc260_gpio1_automute(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) if (action == HDA_FIXUP_ACT_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) /* although the machine has only one output pin, we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) * toggle GPIO1 according to the jack state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) spec->gen.automute_hook = alc260_gpio1_automute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) spec->gen.detect_hp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) spec->gen.automute_speaker = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) snd_hda_jack_detect_enable_callback(codec, 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) snd_hda_gen_hp_automute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) alc_setup_gpio(codec, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) static void alc260_fixup_kn1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) static const struct hda_pintbl pincfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) { 0x0f, 0x02214000 }, /* HP/speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) { 0x12, 0x90a60160 }, /* int mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) { 0x13, 0x02a19000 }, /* ext mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) { 0x18, 0x01446000 }, /* SPDIF out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) /* disable bogus I/O pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) { 0x10, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) { 0x11, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) { 0x14, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) { 0x15, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) { 0x16, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) { 0x19, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) snd_hda_apply_pincfgs(codec, pincfgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) spec->init_amp = ALC_INIT_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) spec->init_amp = ALC_INIT_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) spec->gen.add_jack_modes = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) spec->gen.hp_mic = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) static const struct hda_fixup alc260_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) [ALC260_FIXUP_HP_DC5750] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) { 0x11, 0x90130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) [ALC260_FIXUP_HP_PIN_0F] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) { 0x0f, 0x01214000 }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) [ALC260_FIXUP_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) [ALC260_FIXUP_GPIO1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) .v.func = alc_fixup_gpio1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) [ALC260_FIXUP_GPIO1_TOGGLE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) .v.func = alc260_fixup_gpio1_toggle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) .chain_id = ALC260_FIXUP_HP_PIN_0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) [ALC260_FIXUP_REPLACER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) [ALC260_FIXUP_HP_B1900] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) .v.func = alc260_fixup_gpio1_toggle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) .chain_id = ALC260_FIXUP_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) [ALC260_FIXUP_KN1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) .v.func = alc260_fixup_kn1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) [ALC260_FIXUP_FSC_S7020] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) .v.func = alc260_fixup_fsc_s7020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) [ALC260_FIXUP_FSC_S7020_JWSE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) .v.func = alc260_fixup_fsc_s7020_jwse,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) .chain_id = ALC260_FIXUP_FSC_S7020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) [ALC260_FIXUP_VAIO_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) /* Pin configs are missing completely on some VAIOs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) { 0x0f, 0x01211020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) { 0x10, 0x0001003f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) { 0x11, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) { 0x12, 0x01a15930 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) { 0x13, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) { 0x14, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) { 0x15, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) { 0x16, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) { 0x18, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) { 0x19, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) static const struct snd_pci_quirk alc260_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) static const struct hda_model_fixup alc260_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) {.id = ALC260_FIXUP_COEF, .name = "coef"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) static int patch_alc260(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) err = alc_alloc_spec(codec, 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) /* as quite a few machines require HP amp for speaker outputs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) * it's easier to enable it unconditionally; even if it's unneeded,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) * it's almost harmless.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) spec->gen.prefer_hp_amp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) spec->shutup = alc_eapd_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) alc260_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) err = alc260_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) if (!spec->gen.no_analog) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) * ALC882/883/885/888/889 support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) * ALC882 is almost identical with ALC880 but has cleaner and more flexible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) * configuration. Each pin widget can choose any input DACs and a mixer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) * Each ADC is connected from a mixer of all inputs. This makes possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) * 6-channel independent captures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) * In addition, an independent DAC for the multi-playback (not used in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) * driver yet).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) * Pin config fixes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) ALC882_FIXUP_ABIT_AW9D_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) ALC882_FIXUP_LENOVO_Y530,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) ALC882_FIXUP_PB_M5210,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) ALC882_FIXUP_ACER_ASPIRE_7736,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) ALC882_FIXUP_ASUS_W90V,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) ALC889_FIXUP_CD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) ALC889_FIXUP_VAIO_TT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) ALC888_FIXUP_EEE1601,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) ALC886_FIXUP_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) ALC882_FIXUP_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) ALC883_FIXUP_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) ALC883_FIXUP_ACER_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) ALC882_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) ALC882_FIXUP_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) ALC882_FIXUP_GPIO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) ALC889_FIXUP_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) ALC882_FIXUP_ASUS_W2JC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) ALC882_FIXUP_ACER_ASPIRE_4930G,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) ALC882_FIXUP_ACER_ASPIRE_8930G,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) ALC882_FIXUP_ASPIRE_8930G_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) ALC885_FIXUP_MACPRO_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) ALC889_FIXUP_DAC_ROUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) ALC889_FIXUP_MBP_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) ALC889_FIXUP_IMAC91_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) ALC889_FIXUP_MBA11_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) ALC889_FIXUP_MBA21_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) ALC889_FIXUP_MP11_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) ALC889_FIXUP_MP41_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) ALC882_FIXUP_INV_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) ALC882_FIXUP_NO_PRIMARY_HP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) ALC887_FIXUP_ASUS_BASS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) ALC887_FIXUP_BASS_CHMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) ALC1220_FIXUP_GB_DUAL_CODECS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) ALC1220_FIXUP_GB_X570,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) ALC1220_FIXUP_CLEVO_P950,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) ALC1220_FIXUP_CLEVO_PB51ED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) ALC1220_FIXUP_CLEVO_PB51ED_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) ALC887_FIXUP_ASUS_AUDIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) ALC887_FIXUP_ASUS_HMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) static void alc889_fixup_coef(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) if (action != HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) alc_update_coef_idx(codec, 7, 0, 0x2030);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) /* set up GPIO at initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) spec->gpio_write_delay = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) alc_fixup_gpio3(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) /* Fix the connection of some pins for ALC889:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) * work correctly (bko#42740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) static void alc889_fixup_dac_route(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) /* fake the connections during parsing the tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) static const hda_nid_t conn1[] = { 0x0c, 0x0d };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) static const hda_nid_t conn2[] = { 0x0e, 0x0f };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) } else if (action == HDA_FIXUP_ACT_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) /* restore the connections */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) /* Set VREF on HP pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) static void alc889_fixup_mbp_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) if (action != HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) for (i = 0; i < ARRAY_SIZE(nids); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) if (get_defcfg_device(val) != AC_JACK_HP_OUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) val = snd_hda_codec_get_pin_target(codec, nids[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) val |= AC_PINCTL_VREF_80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) snd_hda_set_pin_ctl(codec, nids[i], val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) spec->gen.keep_vref_in_automute = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) static void alc889_fixup_mac_pins(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) const hda_nid_t *nids, int num_nids)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) for (i = 0; i < num_nids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) val = snd_hda_codec_get_pin_target(codec, nids[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) val |= AC_PINCTL_VREF_50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) snd_hda_set_pin_ctl(codec, nids[i], val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) spec->gen.keep_vref_in_automute = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) /* Set VREF on speaker pins on imac91 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) static void alc889_fixup_imac91_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) static const hda_nid_t nids[] = { 0x18, 0x1a };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) if (action == HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) /* Set VREF on speaker pins on mba11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) static void alc889_fixup_mba11_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) static const hda_nid_t nids[] = { 0x18 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) if (action == HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) /* Set VREF on speaker pins on mba21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) static void alc889_fixup_mba21_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) static const hda_nid_t nids[] = { 0x18, 0x19 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) if (action == HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) /* Don't take HP output as primary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) spec->gen.no_primary_hp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) spec->gen.no_multi_io = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) static void alc_fixup_bass_chmap(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) const struct hda_fixup *fix, int action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) /* For dual-codec configuration, we need to disable some features to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) * conflicts of kctls and PCM streams
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) static void alc_fixup_dual_codecs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) /* disable vmaster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) spec->gen.suppress_vmaster = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) /* auto-mute and auto-mic switch don't work with multiple codecs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) spec->gen.suppress_auto_mute = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) spec->gen.suppress_auto_mic = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) /* disable aamix as well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) spec->gen.mixer_nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) /* add location prefix to avoid conflicts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) codec->force_pin_prefix = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) static void rename_ctl(struct hda_codec *codec, const char *oldname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) const char *newname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) struct snd_kcontrol *kctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) kctl = snd_hda_find_mixer_ctl(codec, oldname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) if (kctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) strcpy(kctl->id.name, newname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) alc_fixup_dual_codecs(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) /* override card longname to provide a unique UCM profile */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) case HDA_FIXUP_ACT_BUILD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) /* rename Capture controls depending on the codec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) rename_ctl(codec, "Capture Volume",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) codec->addr == 0 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) "Rear-Panel Capture Volume" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) "Front-Panel Capture Volume");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) rename_ctl(codec, "Capture Switch",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) codec->addr == 0 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) "Rear-Panel Capture Switch" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) "Front-Panel Capture Switch");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) static void alc1220_fixup_gb_x570(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) static const hda_nid_t conn1[] = { 0x0c };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) static const struct coef_fw gb_x570_coefs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) WRITE_COEF(0x07, 0x03c0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) WRITE_COEF(0x1a, 0x01c1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) WRITE_COEF(0x1b, 0x0202),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) WRITE_COEF(0x43, 0x3005),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) alc_process_coef_fw(codec, gb_x570_coefs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) static const hda_nid_t conn1[] = { 0x0c };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) /* We therefore want to make sure 0x14 (front headphone) and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) * 0x1b (speakers) use the stereo DAC 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) const struct hda_fixup *fix, int action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) alc1220_fixup_clevo_p950(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) unsigned int vref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) if (spec->gen.hp_jack_present)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) vref = AC_PINCTL_VREF_80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) vref = AC_PINCTL_VREF_HIZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) static void alc887_fixup_asus_jack(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) if (action != HDA_FIXUP_ACT_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) static const struct hda_fixup alc882_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) [ALC882_FIXUP_ABIT_AW9D_MAX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) { 0x15, 0x01080104 }, /* side */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) { 0x16, 0x01011012 }, /* rear */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) { 0x17, 0x01016011 }, /* clfe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) [ALC882_FIXUP_LENOVO_Y530] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) { 0x15, 0x99130112 }, /* rear int speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) { 0x16, 0x99130111 }, /* subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) [ALC882_FIXUP_PB_M5210] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) .type = HDA_FIXUP_PINCTLS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) { 0x19, PIN_VREF50 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) [ALC882_FIXUP_ACER_ASPIRE_7736] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) .v.func = alc_fixup_sku_ignore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) [ALC882_FIXUP_ASUS_W90V] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) { 0x16, 0x99130110 }, /* fix sequence for CLFE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) [ALC889_FIXUP_CD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) { 0x1c, 0x993301f0 }, /* CD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) .chain_id = ALC889_FIXUP_CD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) [ALC889_FIXUP_VAIO_TT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) { 0x17, 0x90170111 }, /* hidden surround speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) [ALC888_FIXUP_EEE1601] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) [ALC886_FIXUP_EAPD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) /* change to EAPD mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) [ALC882_FIXUP_EAPD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) /* change to EAPD mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) [ALC883_FIXUP_EAPD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) /* change to EAPD mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) [ALC883_FIXUP_ACER_EAPD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) /* eanable EAPD on Acer laptops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) [ALC882_FIXUP_GPIO1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) .v.func = alc_fixup_gpio1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) [ALC882_FIXUP_GPIO2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) .v.func = alc_fixup_gpio2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) [ALC882_FIXUP_GPIO3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) .v.func = alc_fixup_gpio3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) [ALC882_FIXUP_ASUS_W2JC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) .v.func = alc_fixup_gpio1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) .chain_id = ALC882_FIXUP_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) [ALC889_FIXUP_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) .v.func = alc889_fixup_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) { 0x16, 0x99130111 }, /* CLFE speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) { 0x17, 0x99130112 }, /* surround speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) .chain_id = ALC882_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) { 0x16, 0x99130111 }, /* CLFE speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) { 0x1b, 0x99130112 }, /* surround speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) /* additional init verbs for Acer Aspire 8930G */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) /* Enable all DACs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) /* DAC DISABLE/MUTE 1? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) /* setting bits 1-5 disables DAC nids 0x02-0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) * apparently. Init=0x38 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) /* DAC DISABLE/MUTE 2? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) /* some bit here disables the other DACs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) * Init=0x4900 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) /* DMIC fix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) * This laptop has a stereo digital microphone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) * The mics are only 1cm apart which makes the stereo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) * useless. However, either the mic or the ALC889
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) * makes the signal become a difference/sum signal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) * instead of standard stereo, which is annoying.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) * So instead we flip this bit which makes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) * codec replicate the sum signal to both channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) * turning it into a normal mono mic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) /* DMIC_CONTROL? Init value = 0x0001 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) .chain_id = ALC882_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) [ALC885_FIXUP_MACPRO_GPIO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) .v.func = alc885_fixup_macpro_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) [ALC889_FIXUP_DAC_ROUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) .v.func = alc889_fixup_dac_route,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) [ALC889_FIXUP_MBP_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) .v.func = alc889_fixup_mbp_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) .chain_id = ALC882_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) [ALC889_FIXUP_IMAC91_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) .v.func = alc889_fixup_imac91_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) .chain_id = ALC882_FIXUP_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) [ALC889_FIXUP_MBA11_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) .v.func = alc889_fixup_mba11_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) .chain_id = ALC889_FIXUP_MBP_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) [ALC889_FIXUP_MBA21_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) .v.func = alc889_fixup_mba21_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) .chain_id = ALC889_FIXUP_MBP_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) [ALC889_FIXUP_MP11_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) .v.func = alc889_fixup_mba11_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) .chain_id = ALC885_FIXUP_MACPRO_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) [ALC889_FIXUP_MP41_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) .v.func = alc889_fixup_mbp_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) .chain_id = ALC885_FIXUP_MACPRO_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) [ALC882_FIXUP_INV_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) [ALC882_FIXUP_NO_PRIMARY_HP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) .v.func = alc882_fixup_no_primary_hp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) [ALC887_FIXUP_ASUS_BASS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) {0x16, 0x99130130}, /* bass speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) .chain_id = ALC887_FIXUP_BASS_CHMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) [ALC887_FIXUP_BASS_CHMAP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) .v.func = alc_fixup_bass_chmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) [ALC1220_FIXUP_GB_DUAL_CODECS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) .v.func = alc1220_fixup_gb_dual_codecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) [ALC1220_FIXUP_GB_X570] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) .v.func = alc1220_fixup_gb_x570,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) [ALC1220_FIXUP_CLEVO_P950] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) .v.func = alc1220_fixup_clevo_p950,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) [ALC1220_FIXUP_CLEVO_PB51ED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) .v.func = alc1220_fixup_clevo_pb51ed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) [ALC887_FIXUP_ASUS_AUDIO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) { 0x19, 0x22219420 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) [ALC887_FIXUP_ASUS_HMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) .v.func = alc887_fixup_asus_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) .chain_id = ALC887_FIXUP_ASUS_AUDIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) static const struct snd_pci_quirk alc882_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) ALC882_FIXUP_ACER_ASPIRE_4930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) ALC882_FIXUP_ACER_ASPIRE_4930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) ALC882_FIXUP_ACER_ASPIRE_8930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) ALC882_FIXUP_ACER_ASPIRE_8930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) ALC882_FIXUP_ACER_ASPIRE_4930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) ALC882_FIXUP_ACER_ASPIRE_4930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) ALC882_FIXUP_ACER_ASPIRE_4930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) ALC882_FIXUP_ACER_ASPIRE_4930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) /* All Apple entries are in codec SSIDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) static const struct hda_model_fixup alc882_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) {.id = ALC889_FIXUP_CD, .name = "cd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) {0x14, 0x01014010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) {0x15, 0x01011012},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) {0x16, 0x01016011},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) {0x18, 0x01a19040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) {0x19, 0x02a19050},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) {0x1a, 0x0181304f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) {0x1b, 0x0221401f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) {0x1e, 0x01456130}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) {0x14, 0x01015010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) {0x15, 0x01011012},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) {0x16, 0x01011011},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) {0x18, 0x01a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) {0x19, 0x02a19050},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) {0x1a, 0x0181104f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) {0x1b, 0x0221401f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) {0x1e, 0x01451130}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) * BIOS auto configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) /* almost identical with ALC880 parser... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) static int alc882_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) static int patch_alc882(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) err = alc_alloc_spec(codec, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) case 0x10ec0882:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) case 0x10ec0885:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) case 0x10ec0900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) case 0x10ec0b00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) case 0x10ec1220:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) /* ALC883 and variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) alc_fix_pll_init(codec, 0x20, 0x0a, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) alc882_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) alc_auto_parse_customize_define(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) err = alc882_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) if (!spec->gen.no_analog && spec->gen.beep_nid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) * ALC262 support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) static int alc262_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) * Pin config fixes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) ALC262_FIXUP_FSC_H270,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) ALC262_FIXUP_FSC_S7110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) ALC262_FIXUP_HP_Z200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) ALC262_FIXUP_TYAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) ALC262_FIXUP_LENOVO_3000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) ALC262_FIXUP_BENQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) ALC262_FIXUP_BENQ_T31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) ALC262_FIXUP_INV_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) ALC262_FIXUP_INTEL_BAYLEYBAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) static const struct hda_fixup alc262_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) [ALC262_FIXUP_FSC_H270] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) { 0x15, 0x0221142f }, /* front HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) { 0x1b, 0x0121141f }, /* rear HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) [ALC262_FIXUP_FSC_S7110] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) { 0x15, 0x90170110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) .chain_id = ALC262_FIXUP_BENQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) [ALC262_FIXUP_HP_Z200] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) { 0x16, 0x99130120 }, /* internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) [ALC262_FIXUP_TYAN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) { 0x14, 0x1993e1f0 }, /* int AUX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) [ALC262_FIXUP_LENOVO_3000] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) .type = HDA_FIXUP_PINCTLS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) { 0x19, PIN_VREF50 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) .chain_id = ALC262_FIXUP_BENQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) [ALC262_FIXUP_BENQ] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) [ALC262_FIXUP_BENQ_T31] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) [ALC262_FIXUP_INV_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) .v.func = alc_fixup_no_depop_delay,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) static const struct snd_pci_quirk alc262_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) static const struct hda_model_fixup alc262_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) {.id = ALC262_FIXUP_BENQ, .name = "benq"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) static int patch_alc262(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) err = alc_alloc_spec(codec, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) spec->gen.shared_mic_vref_pin = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) spec->shutup = alc_eapd_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) * under-run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) alc_fix_pll_init(codec, 0x20, 0x0a, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) alc262_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) alc_auto_parse_customize_define(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) err = alc262_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) if (!spec->gen.no_analog && spec->gen.beep_nid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) * ALC268
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) /* bind Beep switches of both NID 0x0f and 0x10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) unsigned long pval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) mutex_lock(&codec->control_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) pval = kcontrol->private_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) kcontrol->private_value = (pval & ~0xff) | 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) if (err >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) kcontrol->private_value = (pval & ~0xff) | 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) kcontrol->private_value = pval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) mutex_unlock(&codec->control_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) static const struct snd_kcontrol_new alc268_beep_mixer[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) .name = "Beep Playback Switch",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) .subdevice = HDA_SUBDEV_AMP_FLAG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) .info = snd_hda_mixer_amp_switch_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) .get = snd_hda_mixer_amp_switch_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) .put = alc268_beep_switch_put,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) /* set PCBEEP vol = 0, mute connections */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) static const struct hda_verb alc268_beep_init_verbs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) ALC268_FIXUP_INV_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) ALC268_FIXUP_HP_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) ALC268_FIXUP_SPDIF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) static const struct hda_fixup alc268_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) [ALC268_FIXUP_INV_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) [ALC268_FIXUP_HP_EAPD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) [ALC268_FIXUP_SPDIF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) { 0x1e, 0x014b1180 }, /* enable SPDIF out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) static const struct hda_model_fixup alc268_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) static const struct snd_pci_quirk alc268_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) /* below is codec SSID since multiple Toshiba laptops have the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) * same PCI SSID 1179:ff00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) * BIOS auto configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) static int alc268_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) return alc_parse_auto_config(codec, NULL, alc268_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) static int patch_alc268(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) /* ALC268 has no aa-loopback mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) err = alc_alloc_spec(codec, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) spec->shutup = alc_eapd_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) err = alc268_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) if (err > 0 && !spec->gen.no_analog &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) spec->gen.autocfg.speaker_pins[0] != 0x1d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) &alc268_beep_mixer[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) snd_hda_add_verbs(codec, alc268_beep_init_verbs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) /* override the amp caps for beep generator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) (0 << AC_AMPCAP_MUTE_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) * ALC269
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) /* different alc269-variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) ALC269_TYPE_ALC269VA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) ALC269_TYPE_ALC269VB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) ALC269_TYPE_ALC269VC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) ALC269_TYPE_ALC269VD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) ALC269_TYPE_ALC280,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) ALC269_TYPE_ALC282,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) ALC269_TYPE_ALC283,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) ALC269_TYPE_ALC284,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) ALC269_TYPE_ALC293,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) ALC269_TYPE_ALC286,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) ALC269_TYPE_ALC298,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) ALC269_TYPE_ALC255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) ALC269_TYPE_ALC256,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) ALC269_TYPE_ALC257,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) ALC269_TYPE_ALC215,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) ALC269_TYPE_ALC225,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) ALC269_TYPE_ALC294,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) ALC269_TYPE_ALC300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) ALC269_TYPE_ALC623,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) ALC269_TYPE_ALC700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) * BIOS auto configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) static int alc269_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) const hda_nid_t *ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) switch (spec->codec_variant) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) case ALC269_TYPE_ALC269VA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) case ALC269_TYPE_ALC269VC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) case ALC269_TYPE_ALC280:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) case ALC269_TYPE_ALC284:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) case ALC269_TYPE_ALC293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) ssids = alc269va_ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) case ALC269_TYPE_ALC269VB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) case ALC269_TYPE_ALC269VD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) case ALC269_TYPE_ALC282:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) case ALC269_TYPE_ALC283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) case ALC269_TYPE_ALC286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) case ALC269_TYPE_ALC298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) case ALC269_TYPE_ALC255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) case ALC269_TYPE_ALC256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) case ALC269_TYPE_ALC257:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) case ALC269_TYPE_ALC215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) case ALC269_TYPE_ALC225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) case ALC269_TYPE_ALC294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) case ALC269_TYPE_ALC300:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) case ALC269_TYPE_ALC623:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) case ALC269_TYPE_ALC700:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) ssids = alc269_ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) ssids = alc269_ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) return alc_parse_auto_config(codec, alc269_ignore, ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) { SND_JACK_BTN_0, KEY_PLAYPAUSE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) { SND_JACK_BTN_1, KEY_VOICECOMMAND },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) { SND_JACK_BTN_2, KEY_VOLUMEUP },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) static void alc_headset_btn_callback(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) int report = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) if (jack->unsol_res & (7 << 13))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) report |= SND_JACK_BTN_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) if (jack->unsol_res & (1 << 16 | 3 << 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) report |= SND_JACK_BTN_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) /* Volume up key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) if (jack->unsol_res & (7 << 23))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) report |= SND_JACK_BTN_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) /* Volume down key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) if (jack->unsol_res & (7 << 10))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) report |= SND_JACK_BTN_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) jack->jack->button_state = report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) static void alc_disable_headset_jack_key(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) if (!spec->has_hs_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) case 0x10ec0287:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) alc_write_coef_idx(codec, 0x48, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) alc_write_coef_idx(codec, 0x48, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) static void alc_enable_headset_jack_key(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) if (!spec->has_hs_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) case 0x10ec0287:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) alc_write_coef_idx(codec, 0x48, 0xd011);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) alc_write_coef_idx(codec, 0x48, 0xd011);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) static void alc_fixup_headset_jack(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) spec->has_hs_key = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) snd_hda_jack_detect_enable_callback(codec, 0x55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) alc_headset_btn_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) SND_JACK_HEADSET, alc_headset_btn_keymap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) alc_enable_headset_jack_key(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) static void alc269_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) if (spec->codec_variant == ALC269_TYPE_ALC269VB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) alc269vb_toggle_power_output(codec, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) (alc_get_coef0(codec) & 0x00ff) == 0x018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) msleep(150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) static const struct coef_fw alc282_coefs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) WRITE_COEF(0x03, 0x0002), /* Power Down Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) WRITE_COEF(0x07, 0x0200), /* DMIC control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) WRITE_COEF(0x34, 0xa0c0), /* ANC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) WRITE_COEF(0x63, 0x2902), /* PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) WRITE_COEF(0x68, 0xa080), /* capless control 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) WRITE_COEF(0x69, 0x3400), /* capless control 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) WRITE_COEF(0x6b, 0x0), /* capless control 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) WRITE_COEF(0x71, 0x0014), /* class D test 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) static void alc282_restore_default_value(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) alc_process_coef_fw(codec, alc282_coefs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) static void alc282_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) int coef78;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) alc282_restore_default_value(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) coef78 = alc_read_coef_idx(codec, 0x78);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) /* Headphone capless set to high power mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) alc_write_coef_idx(codec, 0x78, 0x9004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) /* Headphone capless set to normal mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) alc_write_coef_idx(codec, 0x78, coef78);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) static void alc282_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) int coef78;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) if (!hp_pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) alc269_shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) coef78 = alc_read_coef_idx(codec, 0x78);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) alc_write_coef_idx(codec, 0x78, 0x9004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) if (!spec->no_shutup_pins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) alc_write_coef_idx(codec, 0x78, coef78);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) static const struct coef_fw alc283_coefs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) WRITE_COEF(0x03, 0x0002), /* Power Down Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) WRITE_COEF(0x07, 0x0200), /* DMIC control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) WRITE_COEF(0x22, 0xa0c0), /* ANC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) WRITE_COEF(0x2e, 0x2902), /* PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) WRITE_COEF(0x33, 0xa080), /* capless control 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) WRITE_COEF(0x34, 0x3400), /* capless control 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) WRITE_COEF(0x36, 0x0), /* capless control 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) WRITE_COEF(0x39, 0x110a), /* class D test 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) WRITE_COEF(0x49, 0x0), /* test mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) static void alc283_restore_default_value(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) alc_process_coef_fw(codec, alc283_coefs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) static void alc283_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) alc283_restore_default_value(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) /* Headphone capless set to high power mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) alc_write_coef_idx(codec, 0x43, 0x9004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) /* Index 0x46 Combo jack auto switch control 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) /* 3k pull low control for Headset jack. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) /* Headphone capless set to normal mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) alc_write_coef_idx(codec, 0x43, 0x9614);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) static void alc283_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) if (!hp_pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) alc269_shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) alc_write_coef_idx(codec, 0x43, 0x9004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) /*depop hp during suspend*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) alc_write_coef_idx(codec, 0x06, 0x2100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) if (!spec->no_shutup_pins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) alc_write_coef_idx(codec, 0x43, 0x9614);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) static void alc256_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) hp_pin = 0x21;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) if (spec->ultra_low_power) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) alc_update_coef_idx(codec, 0x08, 7<<4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) if (hp_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) if (hp_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) * Expose headphone mic (or possibly Line In on some machines) instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) * this register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) alc_write_coef_idx(codec, 0x36, 0x5757);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) static void alc256_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) hp_pin = 0x21;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) if (hp_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) /* 3k pull low control for Headset jack. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) /* NOTE: call this before clearing the pin, otherwise codec stalls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) * when booting with headset plugged. So skip setting it for the codec alc257
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) if (codec->core.vendor_id != 0x10ec0236 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) codec->core.vendor_id != 0x10ec0257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) if (!spec->no_shutup_pins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) if (hp_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) if (spec->ultra_low_power) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) alc_update_coef_idx(codec, 0x03, 1<<1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) alc_update_coef_idx(codec, 0x08, 3<<2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) static void alc225_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) bool hp1_pin_sense, hp2_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) hp_pin = 0x21;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) if (hp1_pin_sense || hp2_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) if (spec->ultra_low_power) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) alc_update_coef_idx(codec, 0x33, 1<<11, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) if (hp1_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) if (hp2_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) snd_hda_codec_write(codec, 0x16, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) if (hp1_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) if (hp2_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) snd_hda_codec_write(codec, 0x16, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) static void alc225_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) bool hp1_pin_sense, hp2_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) hp_pin = 0x21;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) alc_disable_headset_jack_key(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) /* 3k pull low control for Headset jack. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) if (hp1_pin_sense || hp2_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) if (hp1_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) if (hp2_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) snd_hda_codec_write(codec, 0x16, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) if (hp1_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) if (hp2_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) snd_hda_codec_write(codec, 0x16, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) if (spec->ultra_low_power) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) alc_enable_headset_jack_key(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) static void alc_default_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) static void alc_default_shutup(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) bool hp_pin_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) if (!hp_pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) alc269_shutup(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) msleep(85);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) if (!spec->no_shutup_pins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) if (hp_pin_sense)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) alc_auto_setup_eapd(codec, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) alc_shutup_pins(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) static void alc294_hp_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) int i, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) if (!hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) if (!spec->no_shutup_pins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) /* Wait for depop procedure finish */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) val = alc_read_coefex_idx(codec, 0x58, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) for (i = 0; i < 20 && val & 0x0080; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) val = alc_read_coefex_idx(codec, 0x58, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) /* Set HP depop to auto mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) static void alc294_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) /* required only at boot or S4 resume time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) if (!spec->done_hp_init ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) alc294_hp_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) spec->done_hp_init = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) alc_default_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) unsigned int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) & 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) static void alc5505_dsp_halt(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) val = alc5505_coef_get(codec, 0x6220);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) alc5505_coef_set(codec, 0x61b8, 0x04133302);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) alc5505_coef_set(codec, 0x61b0, 0x00005b16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) alc5505_coef_set(codec, 0x6230, 0xf80d4011);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) alc5505_coef_set(codec, 0x6220, 0x2002010f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) alc5505_coef_set(codec, 0x880c, 0x00000004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) static void alc5505_dsp_init(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) alc5505_dsp_halt(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) alc5505_dsp_back_from_halt(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) alc5505_coef_set(codec, 0x61b0, 0x5b16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) alc5505_coef_set(codec, 0x61b4, 0x04132b02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) alc5505_coef_set(codec, 0x61b8, 0x041f3302);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) alc5505_coef_set(codec, 0x61b8, 0x041b3302);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) alc5505_coef_set(codec, 0x61b8, 0x04173302);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) alc5505_coef_set(codec, 0x61b8, 0x04163302);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) if (val <= 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) alc5505_coef_set(codec, 0x6220, 0x6002018f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) alc5505_coef_set(codec, 0x880c, 0x00000003);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) alc5505_coef_set(codec, 0x880c, 0x00000010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) #ifdef HALT_REALTEK_ALC5505
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) alc5505_dsp_halt(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) #ifdef HALT_REALTEK_ALC5505
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) #define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) #define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) #define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) #define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) static int alc269_suspend(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) if (spec->has_alc5505_dsp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) alc5505_dsp_suspend(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) return alc_suspend(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) static int alc269_resume(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) if (spec->codec_variant == ALC269_TYPE_ALC269VB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) alc269vb_toggle_power_output(codec, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) (alc_get_coef0(codec) & 0x00ff) == 0x018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) msleep(150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) codec->patch_ops.init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) if (spec->codec_variant == ALC269_TYPE_ALC269VB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) alc269vb_toggle_power_output(codec, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) (alc_get_coef0(codec) & 0x00ff) == 0x017) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) snd_hda_regmap_sync(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) hda_call_check_power_status(codec, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) /* on some machine, the BIOS will clear the codec gpio data when enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) * suspend, and won't restore the data after resume, so we restore it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) * in the driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) if (spec->gpio_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) alc_write_gpio_data(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) if (spec->has_alc5505_dsp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) alc5505_dsp_resume(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) #endif /* CONFIG_PM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) if (cfg_headphone && cfg_headset_mic == 0x411111f0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) snd_hda_codec_set_pincfg(codec, 0x19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) (cfg_headphone & ~AC_DEFCFG_DEVICE) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) static void alc269_fixup_hweq(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) if (action == HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) alc_update_coef_idx(codec, 0x1e, 0, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) static void alc269_fixup_headset_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) static void alc271_fixup_dmic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) static const struct hda_verb verbs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) unsigned int cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) if (strcmp(codec->core.chip_name, "ALC271X") &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) strcmp(codec->core.chip_name, "ALC269VB"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) cfg = snd_hda_codec_get_pincfg(codec, 0x12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) snd_hda_sequence_write(codec, verbs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) /* Fix the speaker amp after resume, etc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) if (action == HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) static void alc269_fixup_pcm_44k(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) if (action != HDA_FIXUP_ACT_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) /* Due to a hardware problem on Lenovo Ideadpad, we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) * fix the sample rate of analog I/O to 44.1kHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) /* The digital-mic unit sends PDM (differential signal) instead of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) * the standard PCM, thus you can't record a valid mono stream as is.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) * Below is a workaround specific to ALC269 to control the dmic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) * signal source as mono.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) if (action == HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) alc_update_coef_idx(codec, 0x07, 0, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) static void alc269_quanta_automute(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) snd_hda_gen_update_outputs(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) alc_write_coef_idx(codec, 0x0c, 0x680);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) alc_write_coef_idx(codec, 0x0c, 0x480);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) static void alc269_fixup_quanta_mute(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) if (action != HDA_FIXUP_ACT_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) spec->gen.automute_hook = alc269_quanta_automute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) int vref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) vref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) msleep(500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) vref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) struct hda_alc298_mbxinit {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) unsigned char value_0x23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) unsigned char value_0x25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) const struct hda_alc298_mbxinit *initval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) bool first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) alc_write_coef_idx(codec, 0x26, 0xb000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) if (first)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) alc_write_coef_idx(codec, 0x26, 0xf000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) alc_write_coef_idx(codec, 0x23, initval->value_0x23);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) if (initval->value_0x23 != 0x1e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) alc_write_coef_idx(codec, 0x25, initval->value_0x25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141) snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145) static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) /* Initialization magic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150) static const struct hda_alc298_mbxinit dac_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156) {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157) {0x2f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160) {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) const struct hda_alc298_mbxinit *seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165) if (action != HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168) /* Start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) alc_write_coef_idx(codec, 0x26, 0xf000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) alc_write_coef_idx(codec, 0x22, 0x31);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173) alc_write_coef_idx(codec, 0x23, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) alc_write_coef_idx(codec, 0x25, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176) snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) for (seq = dac_init; seq->value_0x23; seq++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179) alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182) static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) bool polarity, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) unsigned int pinval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197) if (!pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) if (polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) on = !on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) pinval = snd_hda_codec_get_pin_target(codec, pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) pinval &= ~AC_PINCTL_VREFEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204) /* temporarily power up/down for setting VREF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) snd_hda_power_up_pm(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) snd_hda_set_pin_ctl_cache(codec, pin, pinval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207) snd_hda_power_down_pm(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) /* update mute-LED according to the speaker mute state via mic VREF pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) static int vref_mute_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212) enum led_brightness brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) alc_update_vref_led(codec, spec->mute_led_nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) spec->mute_led_polarity, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) /* Make sure the led works even in runtime suspend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) static unsigned int led_power_filter(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) unsigned int power_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) if (power_state != AC_PWRST_D3 || nid == 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230) (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) return power_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) /* Set pin ctl again, it might have just been set to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234) snd_hda_set_pin_ctl(codec, nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) snd_hda_codec_get_pin_target(codec, nid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) return snd_hda_gen_path_power_filter(codec, nid, power_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244) const struct dmi_device *dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) int pol, pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) if (pin < 0x0a || pin >= 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) spec->mute_led_polarity = pol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) spec->mute_led_nid = pin - 0x0a + 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) codec->power_filter = led_power_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) codec_dbg(codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) "Detected mute LED for %x:%d\n", spec->mute_led_nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) spec->mute_led_polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) int action, hda_nid_t pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273) spec->mute_led_polarity = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) spec->mute_led_nid = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) codec->power_filter = led_power_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) /* update LED status via GPIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) int polarity, bool enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) if (polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) enabled = !enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304) alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) /* turn on/off mute LED via GPIO per vmaster hook */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) static int gpio_mute_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) enum led_brightness brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311) struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) spec->mute_led_polarity, !brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) /* turn on/off mic-mute LED via GPIO per capture hook */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) static int micmute_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) enum led_brightness brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323) struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) spec->micmute_led_polarity, !brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) /* setup mute and mic-mute GPIO bits, add hooks appropriately */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) int action,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) unsigned int mute_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) unsigned int micmute_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) if (mute_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) spec->gpio_mute_led_mask = mute_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) if (micmute_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) spec->gpio_mic_led_mask = micmute_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365) static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377) static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) spec->micmute_led_polarity = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) /* turn on/off mic-mute LED per capture hook via VREF change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) static int vref_micmute_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) enum led_brightness brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400) alc_update_vref_led(codec, spec->cap_mute_led_nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) spec->micmute_led_polarity, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405) static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) * enable headphone amp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415) spec->gpio_mask |= 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) spec->gpio_dir |= 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) spec->cap_mute_led_nid = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) codec->power_filter = led_power_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) spec->cap_mute_led_nid = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432) codec->power_filter = led_power_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436) /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) spec->gpio_mask |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) spec->gpio_dir |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) /* need to toggle GPIO to enable the amp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) alc_update_gpio_data(codec, 0x01, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) alc_update_gpio_data(codec, 0x01, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458) /* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) case HDA_GEN_PCM_ACT_PREPARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466) alc_update_gpio_data(codec, 0x04, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) case HDA_GEN_PCM_ACT_CLEANUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) alc_update_gpio_data(codec, 0x04, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474) static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) if (action == HDA_FIXUP_ACT_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) spec->gpio_mask |= 0x04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) spec->gpio_dir |= 0x04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) static void alc_update_coef_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) struct alc_coef_led *led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) bool polarity, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) if (polarity)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) on = !on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) /* temporarily power up/down for setting COEF bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) alc_update_coef_idx(codec, led->idx, led->mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) on ? led->on : led->off);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) /* update mute-LED according to the speaker mute state via COEF bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) static int coef_mute_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) enum led_brightness brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) alc_update_coef_led(codec, &spec->mute_led_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506) spec->mute_led_polarity, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) spec->mute_led_polarity = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) spec->mute_led_coef.idx = 0x0b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) spec->mute_led_coef.mask = 1 << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) spec->mute_led_coef.on = 1 << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) spec->mute_led_coef.off = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) spec->mute_led_polarity = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) spec->mute_led_coef.idx = 0x34;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) spec->mute_led_coef.mask = 1 << 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) spec->mute_led_coef.on = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) spec->mute_led_coef.off = 1 << 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) /* turn on/off mic-mute LED per capture hook by coef bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543) static int coef_micmute_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) enum led_brightness brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546) struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) alc_update_coef_led(codec, &spec->mic_led_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) spec->micmute_led_polarity, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) spec->mic_led_coef.idx = 0x19;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) spec->mic_led_coef.mask = 1 << 13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562) spec->mic_led_coef.on = 1 << 13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) spec->mic_led_coef.off = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) spec->mic_led_coef.idx = 0x35;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) spec->mic_led_coef.mask = 3 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576) spec->mic_led_coef.on = 2 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) spec->mic_led_coef.off = 1 << 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) alc285_fixup_hp_coef_micmute_led(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592) alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) alc236_fixup_hp_coef_micmute_led(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602) spec->cap_mute_led_nid = 0x1a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) codec->power_filter = led_power_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) alc236_fixup_hp_micmute_led_vref(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) #if IS_REACHABLE(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) static void gpio2_mic_hotkey_event(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) struct hda_jack_callback *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) send both key on and key off event for every interrupt. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) input_sync(spec->kb_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) input_sync(spec->kb_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) static int alc_register_micmute_input_device(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) spec->kb_dev = input_allocate_device();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) if (!spec->kb_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636) codec_err(codec, "Out of memory (input_allocate_device)\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) spec->kb_dev->name = "Microphone Mute Button";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) spec->kb_dev->keycode = spec->alc_mute_keycode_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) if (input_register_device(spec->kb_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) codec_err(codec, "input_register_device failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652) input_free_device(spec->kb_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) spec->kb_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660) /* GPIO1 = set according to SKU external amp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) * GPIO2 = mic mute hotkey
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) * GPIO3 = mute LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) * GPIO4 = mic mute LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) spec->init_amp = ALC_INIT_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) if (alc_register_micmute_input_device(codec) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) spec->gpio_mask |= 0x06;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) spec->gpio_dir |= 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) spec->gpio_data |= 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) snd_hda_codec_write_cache(codec, codec->core.afg, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) gpio2_mic_hotkey_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) if (!spec->kb_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) case HDA_FIXUP_ACT_FREE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) input_unregister_device(spec->kb_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) spec->kb_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) /* Line2 = mic mute hotkey
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) * GPIO2 = mic mute LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704) alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) spec->init_amp = ALC_INIT_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) if (alc_register_micmute_input_device(codec) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) snd_hda_jack_detect_enable_callback(codec, 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) gpio2_mic_hotkey_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) if (!spec->kb_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) case HDA_FIXUP_ACT_FREE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720) input_unregister_device(spec->kb_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) spec->kb_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724) #else /* INPUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) #define alc280_fixup_hp_gpio2_mic_hotkey NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) #define alc233_fixup_lenovo_line2_mic_hotkey NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727) #endif /* INPUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736) spec->cap_mute_led_nid = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737) snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741) static const struct coef_fw alc225_pre_hsmode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742) UPDATE_COEF(0x4a, 1<<8, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743) UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744) UPDATE_COEF(0x63, 3<<14, 3<<14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) UPDATE_COEF(0x4a, 3<<4, 2<<4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746) UPDATE_COEF(0x4a, 3<<10, 3<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747) UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748) UPDATE_COEF(0x4a, 3<<10, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752) static void alc_headset_mode_unplugged(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755) static const struct coef_fw coef0255[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756) WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759) WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) static const struct coef_fw coef0256[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764) WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765) WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768) UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771) static const struct coef_fw coef0233[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772) WRITE_COEF(0x1b, 0x0c0b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773) WRITE_COEF(0x45, 0xc429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774) UPDATE_COEF(0x35, 0x4000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) WRITE_COEF(0x06, 0x2104),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776) WRITE_COEF(0x1a, 0x0001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777) WRITE_COEF(0x26, 0x0004),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778) WRITE_COEF(0x32, 0x42a3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781) static const struct coef_fw coef0288[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) UPDATE_COEF(0x50, 0x2000, 0x2000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784) UPDATE_COEF(0x56, 0x0006, 0x0006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) UPDATE_COEF(0x66, 0x0008, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786) UPDATE_COEF(0x67, 0x2000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) static const struct coef_fw coef0298[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790) UPDATE_COEF(0x19, 0x1300, 0x0300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793) static const struct coef_fw coef0292[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794) WRITE_COEF(0x76, 0x000e),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) WRITE_COEF(0x6c, 0x2400),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) WRITE_COEF(0x18, 0x7308),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) WRITE_COEF(0x6b, 0xc429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) static const struct coef_fw coef0293[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802) UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806) UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809) static const struct coef_fw coef0668[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) WRITE_COEF(0x15, 0x0d40),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) WRITE_COEF(0xb7, 0x802b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814) static const struct coef_fw coef0225[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) UPDATE_COEF(0x63, 3<<14, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) static const struct coef_fw coef0274[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819) UPDATE_COEF(0x4a, 0x0100, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) UPDATE_COEF(0x6b, 0xf000, 0x5000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) UPDATE_COEF(0x4a, 0x0010, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824) WRITE_COEF(0x45, 0x5289),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) UPDATE_COEF(0x4a, 0x0c00, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829) if (spec->no_internal_mic_pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830) alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4838) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4839) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4840) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4841) alc_process_coef_fw(codec, coef0256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4842) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4843) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4844) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4845) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4846) alc_process_coef_fw(codec, coef0274);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4847) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4848) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4849) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4850) alc_process_coef_fw(codec, coef0233);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4851) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4852) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4853) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4854) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4855) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4856) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4857) alc_process_coef_fw(codec, coef0298);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4858) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4859) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4860) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4861) alc_process_coef_fw(codec, coef0292);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4862) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4863) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4864) alc_process_coef_fw(codec, coef0293);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4865) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4866) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4867) alc_process_coef_fw(codec, coef0668);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4868) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4869) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4870) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4871) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4872) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4873) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4874) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4875) alc_process_coef_fw(codec, alc225_pre_hsmode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4876) alc_process_coef_fw(codec, coef0225);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4877) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4878) case 0x10ec0867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4879) alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4880) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4882) codec_dbg(codec, "Headset jack set to unplugged mode.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4886) static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4887) hda_nid_t mic_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4889) static const struct coef_fw coef0255[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4890) WRITE_COEFEX(0x57, 0x03, 0x8aa6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4891) WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4892) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4893) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4894) static const struct coef_fw coef0256[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4895) UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4896) WRITE_COEFEX(0x57, 0x03, 0x09a3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4897) WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4898) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4899) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4900) static const struct coef_fw coef0233[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4901) UPDATE_COEF(0x35, 0, 1<<14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4902) WRITE_COEF(0x06, 0x2100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4903) WRITE_COEF(0x1a, 0x0021),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4904) WRITE_COEF(0x26, 0x008c),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4905) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4906) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4907) static const struct coef_fw coef0288[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4908) UPDATE_COEF(0x4f, 0x00c0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4909) UPDATE_COEF(0x50, 0x2000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4910) UPDATE_COEF(0x56, 0x0006, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4911) UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4912) UPDATE_COEF(0x66, 0x0008, 0x0008),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4913) UPDATE_COEF(0x67, 0x2000, 0x2000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4914) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4915) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4916) static const struct coef_fw coef0292[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4917) WRITE_COEF(0x19, 0xa208),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4918) WRITE_COEF(0x2e, 0xacf0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4919) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4920) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4921) static const struct coef_fw coef0293[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4922) UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4923) UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4924) UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4925) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4926) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4927) static const struct coef_fw coef0688[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4928) WRITE_COEF(0xb7, 0x802b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4929) WRITE_COEF(0xb5, 0x1040),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4930) UPDATE_COEF(0xc3, 0, 1<<12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4931) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4932) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4933) static const struct coef_fw coef0225[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4934) UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4935) UPDATE_COEF(0x4a, 3<<4, 2<<4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4936) UPDATE_COEF(0x63, 3<<14, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4937) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4938) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4939) static const struct coef_fw coef0274[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4940) UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4941) UPDATE_COEF(0x4a, 0x0010, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4942) UPDATE_COEF(0x6b, 0xf000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4943) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4944) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4946) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4947) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4948) alc_write_coef_idx(codec, 0x45, 0xc489);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4949) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4950) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4951) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4952) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4953) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4954) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4955) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4956) alc_write_coef_idx(codec, 0x45, 0xc489);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4957) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4958) alc_process_coef_fw(codec, coef0256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4959) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4960) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4961) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4962) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4963) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4964) alc_write_coef_idx(codec, 0x45, 0x4689);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4965) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4966) alc_process_coef_fw(codec, coef0274);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4967) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4968) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4969) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4970) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4971) alc_write_coef_idx(codec, 0x45, 0xc429);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4972) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4973) alc_process_coef_fw(codec, coef0233);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4974) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4975) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4976) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4977) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4978) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4979) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4980) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4981) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4982) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4983) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4984) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4985) alc_process_coef_fw(codec, coef0292);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4986) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4987) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4988) /* Set to TRS mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4989) alc_write_coef_idx(codec, 0x45, 0xc429);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4990) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4991) alc_process_coef_fw(codec, coef0293);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4992) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4993) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4994) case 0x10ec0867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4995) alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4996) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4997) case 0x10ec0221:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4998) case 0x10ec0662:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4999) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5000) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5001) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5002) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5003) alc_write_coef_idx(codec, 0x11, 0x0001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5004) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5005) alc_process_coef_fw(codec, coef0688);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5006) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5007) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5008) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5009) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5010) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5011) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5012) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5013) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5014) alc_process_coef_fw(codec, alc225_pre_hsmode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5015) alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5016) snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5017) alc_process_coef_fw(codec, coef0225);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5018) snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5019) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5021) codec_dbg(codec, "Headset jack set to mic-in mode.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5024) static void alc_headset_mode_default(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5026) static const struct coef_fw coef0225[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5027) UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5028) UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5029) UPDATE_COEF(0x49, 3<<8, 0<<8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5030) UPDATE_COEF(0x4a, 3<<4, 3<<4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5031) UPDATE_COEF(0x63, 3<<14, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5032) UPDATE_COEF(0x67, 0xf000, 0x3000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5033) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5034) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5035) static const struct coef_fw coef0255[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5036) WRITE_COEF(0x45, 0xc089),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5037) WRITE_COEF(0x45, 0xc489),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5038) WRITE_COEFEX(0x57, 0x03, 0x8ea6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5039) WRITE_COEF(0x49, 0x0049),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5040) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5041) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5042) static const struct coef_fw coef0256[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5043) WRITE_COEF(0x45, 0xc489),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5044) WRITE_COEFEX(0x57, 0x03, 0x0da3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5045) WRITE_COEF(0x49, 0x0049),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5046) UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5047) WRITE_COEF(0x06, 0x6100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5048) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5049) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5050) static const struct coef_fw coef0233[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5051) WRITE_COEF(0x06, 0x2100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5052) WRITE_COEF(0x32, 0x4ea3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5053) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5054) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5055) static const struct coef_fw coef0288[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5056) UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5057) UPDATE_COEF(0x50, 0x2000, 0x2000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5058) UPDATE_COEF(0x56, 0x0006, 0x0006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5059) UPDATE_COEF(0x66, 0x0008, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5060) UPDATE_COEF(0x67, 0x2000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5061) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5062) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5063) static const struct coef_fw coef0292[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5064) WRITE_COEF(0x76, 0x000e),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5065) WRITE_COEF(0x6c, 0x2400),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5066) WRITE_COEF(0x6b, 0xc429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5067) WRITE_COEF(0x18, 0x7308),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5068) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5069) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5070) static const struct coef_fw coef0293[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5071) UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5072) WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5073) UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5074) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5075) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5076) static const struct coef_fw coef0688[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5077) WRITE_COEF(0x11, 0x0041),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5078) WRITE_COEF(0x15, 0x0d40),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5079) WRITE_COEF(0xb7, 0x802b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5080) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5081) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5082) static const struct coef_fw coef0274[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5083) WRITE_COEF(0x45, 0x4289),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5084) UPDATE_COEF(0x4a, 0x0010, 0x0010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5085) UPDATE_COEF(0x6b, 0x0f00, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5086) UPDATE_COEF(0x49, 0x0300, 0x0300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5087) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5088) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5090) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5091) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5092) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5093) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5094) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5095) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5096) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5097) alc_process_coef_fw(codec, alc225_pre_hsmode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5098) alc_process_coef_fw(codec, coef0225);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5099) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5100) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5101) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5102) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5103) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5104) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5105) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5106) alc_write_coef_idx(codec, 0x1b, 0x0e4b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5107) alc_write_coef_idx(codec, 0x45, 0xc089);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5108) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5109) alc_process_coef_fw(codec, coef0256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5110) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5111) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5112) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5113) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5114) alc_process_coef_fw(codec, coef0274);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5115) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5116) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5117) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5118) alc_process_coef_fw(codec, coef0233);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5119) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5120) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5121) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5122) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5123) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5124) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5125) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5126) alc_process_coef_fw(codec, coef0292);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5127) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5128) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5129) alc_process_coef_fw(codec, coef0293);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5130) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5131) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5132) alc_process_coef_fw(codec, coef0688);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5133) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5134) case 0x10ec0867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5135) alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5136) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5138) codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5141) /* Iphone type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5142) static void alc_headset_mode_ctia(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5144) int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5146) static const struct coef_fw coef0255[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5147) WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5148) WRITE_COEF(0x1b, 0x0c2b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5149) WRITE_COEFEX(0x57, 0x03, 0x8ea6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5150) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5151) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5152) static const struct coef_fw coef0256[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5153) WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5154) WRITE_COEF(0x1b, 0x0e6b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5155) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5156) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5157) static const struct coef_fw coef0233[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5158) WRITE_COEF(0x45, 0xd429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5159) WRITE_COEF(0x1b, 0x0c2b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5160) WRITE_COEF(0x32, 0x4ea3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5161) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5163) static const struct coef_fw coef0288[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5164) UPDATE_COEF(0x50, 0x2000, 0x2000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5165) UPDATE_COEF(0x56, 0x0006, 0x0006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5166) UPDATE_COEF(0x66, 0x0008, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5167) UPDATE_COEF(0x67, 0x2000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5168) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5170) static const struct coef_fw coef0292[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5171) WRITE_COEF(0x6b, 0xd429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5172) WRITE_COEF(0x76, 0x0008),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5173) WRITE_COEF(0x18, 0x7388),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5174) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5175) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5176) static const struct coef_fw coef0293[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5177) WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5178) UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5179) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5181) static const struct coef_fw coef0688[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5182) WRITE_COEF(0x11, 0x0001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5183) WRITE_COEF(0x15, 0x0d60),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5184) WRITE_COEF(0xc3, 0x0000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5185) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5186) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5187) static const struct coef_fw coef0225_1[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5188) UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5189) UPDATE_COEF(0x63, 3<<14, 2<<14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5190) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5191) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5192) static const struct coef_fw coef0225_2[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5193) UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5194) UPDATE_COEF(0x63, 3<<14, 1<<14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5195) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5196) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5198) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5199) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5200) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5201) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5202) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5203) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5204) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5205) alc_process_coef_fw(codec, coef0256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5206) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5207) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5208) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5209) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5210) alc_write_coef_idx(codec, 0x45, 0xd689);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5211) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5212) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5213) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5214) alc_process_coef_fw(codec, coef0233);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5215) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5216) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5217) val = alc_read_coef_idx(codec, 0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5218) if (val & (1 << 12)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5219) alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5220) alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5221) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5222) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5223) alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5224) alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5225) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5227) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5228) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5229) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5230) alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5231) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5232) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5233) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5234) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5235) alc_process_coef_fw(codec, coef0292);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5236) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5237) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5238) alc_process_coef_fw(codec, coef0293);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5239) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5240) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5241) alc_process_coef_fw(codec, coef0688);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5242) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5243) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5244) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5245) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5246) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5247) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5248) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5249) val = alc_read_coef_idx(codec, 0x45);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5250) if (val & (1 << 9))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5251) alc_process_coef_fw(codec, coef0225_2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5252) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5253) alc_process_coef_fw(codec, coef0225_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5254) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5255) case 0x10ec0867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5256) alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5259) codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5262) /* Nokia type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5263) static void alc_headset_mode_omtp(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5265) static const struct coef_fw coef0255[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5266) WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5267) WRITE_COEF(0x1b, 0x0c2b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5268) WRITE_COEFEX(0x57, 0x03, 0x8ea6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5269) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5270) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5271) static const struct coef_fw coef0256[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5272) WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5273) WRITE_COEF(0x1b, 0x0e6b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5274) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5275) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5276) static const struct coef_fw coef0233[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5277) WRITE_COEF(0x45, 0xe429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5278) WRITE_COEF(0x1b, 0x0c2b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5279) WRITE_COEF(0x32, 0x4ea3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5280) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5281) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5282) static const struct coef_fw coef0288[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5283) UPDATE_COEF(0x50, 0x2000, 0x2000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5284) UPDATE_COEF(0x56, 0x0006, 0x0006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5285) UPDATE_COEF(0x66, 0x0008, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5286) UPDATE_COEF(0x67, 0x2000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5287) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5288) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5289) static const struct coef_fw coef0292[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5290) WRITE_COEF(0x6b, 0xe429),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5291) WRITE_COEF(0x76, 0x0008),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5292) WRITE_COEF(0x18, 0x7388),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5293) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5294) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5295) static const struct coef_fw coef0293[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5296) WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5297) UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5298) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5299) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5300) static const struct coef_fw coef0688[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5301) WRITE_COEF(0x11, 0x0001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5302) WRITE_COEF(0x15, 0x0d50),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5303) WRITE_COEF(0xc3, 0x0000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5304) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5305) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5306) static const struct coef_fw coef0225[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5307) UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5308) UPDATE_COEF(0x63, 3<<14, 2<<14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5309) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5310) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5312) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5313) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5314) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5315) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5316) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5317) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5318) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5319) alc_process_coef_fw(codec, coef0256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5320) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5321) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5322) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5323) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5324) alc_write_coef_idx(codec, 0x45, 0xe689);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5325) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5326) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5327) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5328) alc_process_coef_fw(codec, coef0233);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5330) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5331) alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5332) alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5333) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5334) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5335) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5336) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5337) alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5338) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5339) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5341) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5342) alc_process_coef_fw(codec, coef0292);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5343) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5344) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5345) alc_process_coef_fw(codec, coef0293);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5346) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5347) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5348) alc_process_coef_fw(codec, coef0688);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5350) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5351) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5352) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5353) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5354) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5355) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5356) alc_process_coef_fw(codec, coef0225);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5357) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5359) codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5362) static void alc_determine_headset_type(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5364) int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5365) bool is_ctia = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5366) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5367) static const struct coef_fw coef0255[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5368) WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5369) WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5370) conteol) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5371) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5372) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5373) static const struct coef_fw coef0288[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5374) UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5375) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5376) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5377) static const struct coef_fw coef0298[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5378) UPDATE_COEF(0x50, 0x2000, 0x2000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5379) UPDATE_COEF(0x56, 0x0006, 0x0006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5380) UPDATE_COEF(0x66, 0x0008, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5381) UPDATE_COEF(0x67, 0x2000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5382) UPDATE_COEF(0x19, 0x1300, 0x1300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5383) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5384) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5385) static const struct coef_fw coef0293[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5386) UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5387) WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5388) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5389) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5390) static const struct coef_fw coef0688[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5391) WRITE_COEF(0x11, 0x0001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5392) WRITE_COEF(0xb7, 0x802b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5393) WRITE_COEF(0x15, 0x0d60),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5394) WRITE_COEF(0xc3, 0x0c00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5395) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5396) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5397) static const struct coef_fw coef0274[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5398) UPDATE_COEF(0x4a, 0x0010, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5399) UPDATE_COEF(0x4a, 0x8000, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5400) WRITE_COEF(0x45, 0xd289),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5401) UPDATE_COEF(0x49, 0x0300, 0x0300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5402) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5403) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5405) if (spec->no_internal_mic_pin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5406) alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5407) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5410) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5411) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5412) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5413) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5414) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5415) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5416) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5417) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5418) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5419) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5420) alc_write_coef_idx(codec, 0x1b, 0x0e4b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5421) alc_write_coef_idx(codec, 0x06, 0x6104);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5422) alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5424) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5425) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5426) msleep(80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5427) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5428) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5430) alc_process_coef_fw(codec, coef0255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5431) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5432) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5433) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5435) alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5436) alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5438) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5439) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5440) msleep(80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5441) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5442) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5443) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5444) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5445) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5446) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5447) alc_process_coef_fw(codec, coef0274);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5448) msleep(850);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5449) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5450) is_ctia = (val & 0x00f0) == 0x00f0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5451) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5452) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5453) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5454) alc_write_coef_idx(codec, 0x45, 0xd029);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5455) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5456) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5457) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5458) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5459) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5460) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5461) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5462) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5463) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5464) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5465) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5467) val = alc_read_coef_idx(codec, 0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5468) if (val & (1 << 12)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5469) alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5470) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5471) msleep(350);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5472) val = alc_read_coef_idx(codec, 0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5473) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5474) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5475) alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5476) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5477) msleep(350);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5478) val = alc_read_coef_idx(codec, 0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5479) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5481) alc_process_coef_fw(codec, coef0298);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5482) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5483) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5484) msleep(75);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5485) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5486) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5487) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5488) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5489) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5490) alc_process_coef_fw(codec, coef0288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5491) msleep(350);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5492) val = alc_read_coef_idx(codec, 0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5493) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5495) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5496) alc_write_coef_idx(codec, 0x6b, 0xd429);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5497) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5498) val = alc_read_coef_idx(codec, 0x6c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5499) is_ctia = (val & 0x001c) == 0x001c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5500) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5501) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5502) alc_process_coef_fw(codec, coef0293);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5503) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5504) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5505) is_ctia = (val & 0x0070) == 0x0070;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5506) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5507) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5508) alc_process_coef_fw(codec, coef0688);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5509) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5510) val = alc_read_coef_idx(codec, 0xbe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5511) is_ctia = (val & 0x1c02) == 0x1c02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5512) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5513) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5514) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5515) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5516) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5517) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5518) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5519) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5520) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5521) msleep(80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5522) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5523) AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5525) alc_process_coef_fw(codec, alc225_pre_hsmode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5526) alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5527) val = alc_read_coef_idx(codec, 0x45);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5528) if (val & (1 << 9)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5529) alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5530) alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5531) msleep(800);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5532) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5533) is_ctia = (val & 0x00f0) == 0x00f0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5534) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5535) alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5536) alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5537) msleep(800);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5538) val = alc_read_coef_idx(codec, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5539) is_ctia = (val & 0x00f0) == 0x00f0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5541) alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5542) alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5543) alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5545) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5546) AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5547) msleep(80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5548) snd_hda_codec_write(codec, 0x21, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5549) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5550) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5551) case 0x10ec0867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5552) is_ctia = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5553) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5556) codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5557) is_ctia ? "yes" : "no");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5558) spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5561) static void alc_update_headset_mode(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5562) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5563) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5565) hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5566) hda_nid_t hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5568) int new_headset_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5570) if (!snd_hda_jack_detect(codec, hp_pin))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5571) new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5572) else if (mux_pin == spec->headset_mic_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5573) new_headset_mode = ALC_HEADSET_MODE_HEADSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5574) else if (mux_pin == spec->headphone_mic_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5575) new_headset_mode = ALC_HEADSET_MODE_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5576) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5577) new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5579) if (new_headset_mode == spec->current_headset_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5580) snd_hda_gen_update_outputs(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5581) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5584) switch (new_headset_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5585) case ALC_HEADSET_MODE_UNPLUGGED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5586) alc_headset_mode_unplugged(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5587) spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5588) spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5589) spec->gen.hp_jack_present = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5591) case ALC_HEADSET_MODE_HEADSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5592) if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5593) alc_determine_headset_type(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5594) if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5595) alc_headset_mode_ctia(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5596) else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5597) alc_headset_mode_omtp(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5598) spec->gen.hp_jack_present = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5599) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5600) case ALC_HEADSET_MODE_MIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5601) alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5602) spec->gen.hp_jack_present = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5603) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5604) case ALC_HEADSET_MODE_HEADPHONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5605) alc_headset_mode_default(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5606) spec->gen.hp_jack_present = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5607) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5609) if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5610) snd_hda_set_pin_ctl_cache(codec, hp_pin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5611) AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5612) if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5613) snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5614) PIN_VREFHIZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5616) spec->current_headset_mode = new_headset_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5618) snd_hda_gen_update_outputs(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5621) static void alc_update_headset_mode_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5622) struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5623) struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5625) alc_update_headset_mode(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5628) static void alc_update_headset_jack_cb(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5629) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5631) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5632) alc_update_headset_mode(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5635) static void alc_probe_headset_mode(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5636) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5637) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5638) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5639) struct auto_pin_cfg *cfg = &spec->gen.autocfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5641) /* Find mic pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5642) for (i = 0; i < cfg->num_inputs; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5643) if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5644) spec->headset_mic_pin = cfg->inputs[i].pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5645) if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5646) spec->headphone_mic_pin = cfg->inputs[i].pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5649) WARN_ON(spec->gen.cap_sync_hook);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5650) spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5651) spec->gen.automute_hook = alc_update_headset_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5652) spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5655) static void alc_fixup_headset_mode(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5656) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5658) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5660) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5661) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5662) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5663) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5664) case HDA_FIXUP_ACT_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5665) alc_probe_headset_mode(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5666) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5667) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5668) if (is_s3_resume(codec) || is_s4_resume(codec)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5669) spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5670) spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5672) alc_update_headset_mode(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5673) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5677) static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5678) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5680) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5681) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5682) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5684) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5685) alc_fixup_headset_mode(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5688) static void alc255_set_default_jack_type(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5690) /* Set to iphone type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5691) static const struct coef_fw alc255fw[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5692) WRITE_COEF(0x1b, 0x880b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5693) WRITE_COEF(0x45, 0xd089),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5694) WRITE_COEF(0x1b, 0x080b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5695) WRITE_COEF(0x46, 0x0004),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5696) WRITE_COEF(0x1b, 0x0c0b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5697) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5698) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5699) static const struct coef_fw alc256fw[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5700) WRITE_COEF(0x1b, 0x884b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5701) WRITE_COEF(0x45, 0xd089),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5702) WRITE_COEF(0x1b, 0x084b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5703) WRITE_COEF(0x46, 0x0004),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5704) WRITE_COEF(0x1b, 0x0c4b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5705) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5706) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5707) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5708) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5709) alc_process_coef_fw(codec, alc255fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5710) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5711) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5712) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5713) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5714) alc_process_coef_fw(codec, alc256fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5715) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5717) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5720) static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5721) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5722) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5723) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5724) alc255_set_default_jack_type(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5725) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5726) alc_fixup_headset_mode(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5729) static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5730) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5731) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5732) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5733) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5734) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5735) alc255_set_default_jack_type(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5737) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5738) alc_fixup_headset_mode(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5741) static void alc288_update_headset_jack_cb(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5742) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5743) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5744) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5746) alc_update_headset_jack_cb(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5747) /* Headset Mic enable or disable, only for Dell Dino */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5748) alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5751) static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5752) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5753) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5754) alc_fixup_headset_mode(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5755) if (action == HDA_FIXUP_ACT_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5756) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5757) /* toggled via hp_automute_hook */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5758) spec->gpio_mask |= 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5759) spec->gpio_dir |= 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5760) spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5764) static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5765) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5767) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5768) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5769) spec->gen.auto_mute_via_amp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5773) static void alc_fixup_no_shutup(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5774) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5775) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5776) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5777) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5778) spec->no_shutup_pins = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5782) static void alc_fixup_disable_aamix(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5783) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5785) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5786) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5787) /* Disable AA-loopback as it causes white noise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5788) spec->gen.mixer_nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5792) /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5793) static void alc_fixup_tpt440_dock(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5794) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5795) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5796) static const struct hda_pintbl pincfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5797) { 0x16, 0x21211010 }, /* dock headphone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5798) { 0x19, 0x21a11010 }, /* dock mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5799) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5800) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5801) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5803) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5804) spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5805) spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5806) codec->power_save_node = 0; /* avoid click noises */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5807) snd_hda_apply_pincfgs(codec, pincfgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5811) static void alc_fixup_tpt470_dock(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5812) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5813) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5814) static const struct hda_pintbl pincfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5815) { 0x17, 0x21211010 }, /* dock headphone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5816) { 0x19, 0x21a11010 }, /* dock mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5817) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5818) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5819) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5821) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5822) spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5823) snd_hda_apply_pincfgs(codec, pincfgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5824) } else if (action == HDA_FIXUP_ACT_INIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5825) /* Enable DOCK device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5826) snd_hda_codec_write(codec, 0x17, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5827) AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5828) /* Enable DOCK device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5829) snd_hda_codec_write(codec, 0x19, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5830) AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5834) static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5835) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5836) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5837) /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5838) * the speaker output becomes too low by some reason on Thinkpads with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5839) * ALC298 codec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5840) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5841) static const hda_nid_t preferred_pairs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5842) 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5843) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5844) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5845) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5847) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5848) spec->gen.preferred_dacs = preferred_pairs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5851) static void alc295_fixup_asus_dacs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5852) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5853) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5854) static const hda_nid_t preferred_pairs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5855) 0x17, 0x02, 0x21, 0x03, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5856) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5857) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5859) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5860) spec->gen.preferred_dacs = preferred_pairs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5863) static void alc_shutup_dell_xps13(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5864) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5865) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5866) int hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5868) /* Prevent pop noises when headphones are plugged in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5869) snd_hda_codec_write(codec, hp_pin, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5870) AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5871) msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5874) static void alc_fixup_dell_xps13(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5875) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5876) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5877) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5878) struct hda_input_mux *imux = &spec->gen.input_mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5879) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5881) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5882) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5883) /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5884) * it causes a click noise at start up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5885) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5886) snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5887) spec->shutup = alc_shutup_dell_xps13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5888) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5889) case HDA_FIXUP_ACT_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5890) /* Make the internal mic the default input source. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5891) for (i = 0; i < imux->num_items; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5892) if (spec->gen.imux_pins[i] == 0x12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5893) spec->gen.cur_mux[0] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5894) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5897) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5901) static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5902) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5904) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5906) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5907) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5908) spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5910) /* Disable boost for mic-in permanently. (This code is only called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5911) from quirks that guarantee that the headphone is at NID 0x1b.) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5912) snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5913) snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5914) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5915) alc_fixup_headset_mode(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5918) static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5919) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5921) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5922) alc_write_coef_idx(codec, 0xc4, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5923) alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5924) snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5926) alc_fixup_headset_mode(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5929) /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5930) static int find_ext_mic_pin(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5932) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5933) struct auto_pin_cfg *cfg = &spec->gen.autocfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5934) hda_nid_t nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5935) unsigned int defcfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5936) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5938) for (i = 0; i < cfg->num_inputs; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5939) if (cfg->inputs[i].type != AUTO_PIN_MIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5940) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5941) nid = cfg->inputs[i].pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5942) defcfg = snd_hda_codec_get_pincfg(codec, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5943) if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5944) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5945) return nid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5948) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5951) static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5952) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5953) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5954) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5955) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5957) if (action == HDA_FIXUP_ACT_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5958) int mic_pin = find_ext_mic_pin(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5959) int hp_pin = alc_get_hp_pin(spec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5961) if (snd_BUG_ON(!mic_pin || !hp_pin))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5962) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5963) snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5967) static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5968) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5969) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5971) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5972) struct auto_pin_cfg *cfg = &spec->gen.autocfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5973) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5975) /* The mic boosts on level 2 and 3 are too noisy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5976) on the internal mic input.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5977) Therefore limit the boost to 0 or 1. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5979) if (action != HDA_FIXUP_ACT_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5980) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5982) for (i = 0; i < cfg->num_inputs; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5983) hda_nid_t nid = cfg->inputs[i].pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5984) unsigned int defcfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5985) if (cfg->inputs[i].type != AUTO_PIN_MIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5986) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5987) defcfg = snd_hda_codec_get_pincfg(codec, nid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5988) if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5989) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5991) snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5992) (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5993) (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5994) (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5995) (0 << AC_AMPCAP_MUTE_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5999) static void alc283_hp_automute_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6000) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6001) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6002) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6003) int vref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6005) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6006) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6008) vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6010) msleep(600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6011) snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6012) vref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6013) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6015) static void alc283_fixup_chromebook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6016) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6017) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6018) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6020) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6021) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6022) snd_hda_override_wcaps(codec, 0x03, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6023) /* Disable AA-loopback as it causes white noise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6024) spec->gen.mixer_nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6025) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6026) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6027) /* MIC2-VREF control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6028) /* Set to manual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6029) alc_update_coef_idx(codec, 0x06, 0x000c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6030) /* Enable Line1 input control by verb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6031) alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6032) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6036) static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6037) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6039) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6041) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6042) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6043) spec->gen.hp_automute_hook = alc283_hp_automute_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6044) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6045) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6046) /* MIC2-VREF control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6047) /* Set to manual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6048) alc_update_coef_idx(codec, 0x06, 0x000c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6049) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6051) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6053) /* mute tablet speaker pin (0x14) via dock plugging in addition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6054) static void asus_tx300_automute(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6055) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6056) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6057) snd_hda_gen_update_outputs(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6058) if (snd_hda_jack_detect(codec, 0x1b))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6059) spec->gen.mute_bits |= (1ULL << 0x14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6062) static void alc282_fixup_asus_tx300(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6063) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6065) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6066) static const struct hda_pintbl dock_pins[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6067) { 0x1b, 0x21114000 }, /* dock speaker pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6068) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6069) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6071) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6072) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6073) spec->init_amp = ALC_INIT_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6074) /* TX300 needs to set up GPIO2 for the speaker amp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6075) alc_setup_gpio(codec, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6076) snd_hda_apply_pincfgs(codec, dock_pins);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6077) spec->gen.auto_mute_via_amp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6078) spec->gen.automute_hook = asus_tx300_automute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6079) snd_hda_jack_detect_enable_callback(codec, 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6080) snd_hda_gen_hp_automute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6081) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6082) case HDA_FIXUP_ACT_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6083) spec->init_amp = ALC_INIT_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6084) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6085) case HDA_FIXUP_ACT_BUILD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6086) /* this is a bit tricky; give more sane names for the main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6087) * (tablet) speaker and the dock speaker, respectively
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6088) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6089) rename_ctl(codec, "Speaker Playback Switch",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6090) "Dock Speaker Playback Switch");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6091) rename_ctl(codec, "Bass Speaker Playback Switch",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6092) "Speaker Playback Switch");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6093) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6094) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6097) static void alc290_fixup_mono_speakers(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6098) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6099) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6100) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6101) /* DAC node 0x03 is giving mono output. We therefore want to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6102) make sure 0x14 (front speaker) and 0x15 (headphones) use the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6103) stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6104) static const hda_nid_t conn1[] = { 0x0c };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6105) snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6106) snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6110) static void alc298_fixup_speaker_volume(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6111) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6113) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6114) /* The speaker is routed to the Node 0x06 by a mistake, as a result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6115) we can't adjust the speaker's volume since this node does not has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6116) Amp-out capability. we change the speaker's route to:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6117) Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6118) Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6119) speaker's volume now. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6121) static const hda_nid_t conn1[] = { 0x0c };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6122) snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6126) /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6127) static void alc295_fixup_disable_dac3(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6128) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6130) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6131) static const hda_nid_t conn[] = { 0x02, 0x03 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6132) snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6136) /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6137) static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6138) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6140) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6141) static const hda_nid_t conn[] = { 0x02 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6142) snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6146) /* Hook to update amp GPIO4 for automute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6147) static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6148) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6150) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6152) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6153) /* mute_led_polarity is set to 0, so we pass inverted value here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6154) alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6155) !spec->gen.hp_jack_present);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6158) /* Manage GPIOs for HP EliteBook Folio 9480m.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6159) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6160) * GPIO4 is the headphone amplifier power control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6161) * GPIO3 is the audio output mute indicator LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6162) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6164) static void alc280_fixup_hp_9480m(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6165) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6166) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6168) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6170) alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6171) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6172) /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6173) spec->gpio_mask |= 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6174) spec->gpio_dir |= 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6175) spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6179) static void alc275_fixup_gpio4_off(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6180) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6181) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6183) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6185) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6186) spec->gpio_mask |= 0x04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6187) spec->gpio_dir |= 0x04;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6188) /* set data bit low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6192) /* Quirk for Thinkpad X1 7th and 8th Gen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6193) * The following fixed routing needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6194) * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6195) * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6196) * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6198) static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6199) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6201) static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6202) static const hda_nid_t preferred_pairs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6203) 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6205) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6207) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6208) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6209) snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6210) spec->gen.preferred_dacs = preferred_pairs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6211) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6212) case HDA_FIXUP_ACT_BUILD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6213) /* The generic parser creates somewhat unintuitive volume ctls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6214) * with the fixed routing above, and the shared DAC2 may be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6215) * confusing for PA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6216) * Rename those to unique names so that PA doesn't touch them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6217) * and use only Master volume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6218) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6219) rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6220) rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6221) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6225) static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6226) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6227) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6229) alc_fixup_dual_codecs(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6230) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6231) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6232) /* override card longname to provide a unique UCM profile */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6233) strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6234) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6235) case HDA_FIXUP_ACT_BUILD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6236) /* rename Capture controls depending on the codec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6237) rename_ctl(codec, "Capture Volume",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6238) codec->addr == 0 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6239) "Rear-Panel Capture Volume" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6240) "Front-Panel Capture Volume");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6241) rename_ctl(codec, "Capture Switch",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6242) codec->addr == 0 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6243) "Rear-Panel Capture Switch" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6244) "Front-Panel Capture Switch");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6245) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6249) static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6250) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6252) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6253) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6255) codec->power_save_node = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6258) /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6259) static void alc274_fixup_bind_dacs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6260) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6262) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6263) static const hda_nid_t preferred_pairs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6264) 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6265) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6266) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6268) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6269) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6271) spec->gen.preferred_dacs = preferred_pairs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6272) spec->gen.auto_mute_via_amp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6273) codec->power_save_node = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6276) /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6277) static void alc289_fixup_asus_ga401(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6278) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6279) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6280) static const hda_nid_t preferred_pairs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6281) 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6282) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6283) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6285) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6286) spec->gen.preferred_dacs = preferred_pairs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6287) spec->gen.obey_preferred_dacs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6291) /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6292) static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6293) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6295) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6296) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6298) snd_hda_override_wcaps(codec, 0x03, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6301) static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6303) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6304) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6305) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6306) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6307) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6308) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6309) alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6310) alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6311) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6312) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6313) case 0x10ec0235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6314) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6315) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6316) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6317) alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6318) alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6319) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6323) static void alc295_fixup_chromebook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6324) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6326) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6328) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6329) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6330) spec->ultra_low_power = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6331) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6332) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6333) alc_combo_jack_hp_jd_restart(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6334) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6338) static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6339) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6341) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6342) snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6346) static void alc294_gx502_toggle_output(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6347) struct hda_jack_callback *cb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6349) /* The Windows driver sets the codec up in a very different way where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6350) * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6351) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6352) if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6353) alc_write_coef_idx(codec, 0x10, 0x8a20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6354) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6355) alc_write_coef_idx(codec, 0x10, 0x0a20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6358) static void alc294_fixup_gx502_hp(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6359) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6361) /* Pin 0x21: headphones/headset mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6362) if (!is_jack_detectable(codec, 0x21))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6363) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6365) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6366) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6367) snd_hda_jack_detect_enable_callback(codec, 0x21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6368) alc294_gx502_toggle_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6369) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6370) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6371) /* Make sure to start in a correct state, i.e. if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6372) * headphones have been plugged in before powering up the system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6373) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6374) alc294_gx502_toggle_output(codec, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6379) static void alc294_gu502_toggle_output(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6380) struct hda_jack_callback *cb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6382) /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6383) * responsible from changes between speakers and headphones
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6384) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6385) if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6386) alc_write_coef_idx(codec, 0x10, 0x8420);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6387) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6388) alc_write_coef_idx(codec, 0x10, 0x0a20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6391) static void alc294_fixup_gu502_hp(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6392) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6393) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6394) if (!is_jack_detectable(codec, 0x21))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6395) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6397) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6398) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6399) snd_hda_jack_detect_enable_callback(codec, 0x21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6400) alc294_gu502_toggle_output);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6401) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6402) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6403) alc294_gu502_toggle_output(codec, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6404) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6408) static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6409) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6411) if (action != HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6412) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6414) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6415) alc_write_coef_idx(codec, 0x65, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6418) static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6419) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6421) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6422) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6423) alc_combo_jack_hp_jd_restart(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6424) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6428) static void alc_fixup_no_int_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6429) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6431) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6433) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6434) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6435) /* Mic RING SLEEVE swap for combo jack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6436) alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6437) spec->no_internal_mic_pin = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6438) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6439) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6440) alc_combo_jack_hp_jd_restart(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6441) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6445) /* GPIO1 = amplifier on/off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6446) * GPIO3 = mic mute LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6447) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6448) static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6449) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6451) static const hda_nid_t conn[] = { 0x02 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6453) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6454) static const struct hda_pintbl pincfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6455) { 0x14, 0x90170110 }, /* front/high speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6456) { 0x17, 0x90170130 }, /* back/bass speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6457) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6458) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6460) //enable micmute led
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6461) alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6463) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6464) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6465) spec->micmute_led_polarity = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6466) /* needed for amp of back speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6467) spec->gpio_mask |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6468) spec->gpio_dir |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6469) snd_hda_apply_pincfgs(codec, pincfgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6470) /* share DAC to have unified volume control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6471) snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6472) snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6473) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6474) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6475) /* need to toggle GPIO to enable the amp of back speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6476) alc_update_gpio_data(codec, 0x01, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6477) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6478) alc_update_gpio_data(codec, 0x01, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6479) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6483) static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6484) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6486) static const hda_nid_t conn[] = { 0x02 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6487) static const struct hda_pintbl pincfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6488) { 0x14, 0x90170110 }, /* rear speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6489) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6490) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6492) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6493) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6494) snd_hda_apply_pincfgs(codec, pincfgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6495) /* force front speaker to DAC1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6496) snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6497) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6501) /* for hda_fixup_thinkpad_acpi() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6502) #include "thinkpad_helper.c"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6504) static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6505) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6507) alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6508) hda_fixup_thinkpad_acpi(codec, fix, action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6511) /* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6512) static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6513) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6514) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6516) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6518) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6519) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6520) spec->gen.suppress_auto_mute = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6521) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6525) /* for alc295_fixup_hp_top_speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6526) #include "hp_x360_helper.c"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6528) /* for alc285_fixup_ideapad_s740_coef() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6529) #include "ideapad_s740_helper.c"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6531) static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6532) WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6533) WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6534) WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6535) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6536) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6538) static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6539) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6540) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6542) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6543) * A certain other OS sets these coeffs to different values. On at least
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6544) * one TongFang barebone these settings might survive even a cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6545) * reboot. So to restore a clean slate the values are explicitly reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6546) * to default here. Without this, the external microphone is always in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6547) * plugged-in state, while the internal microphone is always in an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6548) * unplugged state, breaking the ability to use the internal microphone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6549) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6550) alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6553) static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6554) WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6555) WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6556) WRITE_COEF(0x49, 0x0149),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6557) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6558) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6560) static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6561) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6562) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6564) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6565) * The audio jack input and output is not detected on the ASRock NUC Box
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6566) * 1100 series when cold booting without this fix. Warm rebooting from a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6567) * certain other OS makes the audio functional, as COEF settings are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6568) * preserved in this case. This fix sets these altered COEF values as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6569) * the default.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6570) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6571) alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6574) static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6575) const struct hda_fixup *fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6576) int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6578) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6579) * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6580) * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6581) * needs an additional quirk for sound working after suspend and resume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6582) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6583) if (codec->core.vendor_id == 0x10ec0256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6584) alc_update_coef_idx(codec, 0x10, 1<<9, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6585) snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6586) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6587) snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6591) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6592) ALC269_FIXUP_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6593) ALC269_FIXUP_SONY_VAIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6594) ALC275_FIXUP_SONY_VAIO_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6595) ALC269_FIXUP_DELL_M101Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6596) ALC269_FIXUP_SKU_IGNORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6597) ALC269_FIXUP_ASUS_G73JW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6598) ALC269_FIXUP_LENOVO_EAPD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6599) ALC275_FIXUP_SONY_HWEQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6600) ALC275_FIXUP_SONY_DISABLE_AAMIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6601) ALC271_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6602) ALC269_FIXUP_PCM_44K,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6603) ALC269_FIXUP_STEREO_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6604) ALC269_FIXUP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6605) ALC269_FIXUP_QUANTA_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6606) ALC269_FIXUP_LIFEBOOK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6607) ALC269_FIXUP_LIFEBOOK_EXTMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6608) ALC269_FIXUP_LIFEBOOK_HP_PIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6609) ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6610) ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6611) ALC269_FIXUP_AMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6612) ALC269_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6613) ALC269VB_FIXUP_AMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6614) ALC269VB_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6615) ALC269_FIXUP_HP_MUTE_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6616) ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6617) ALC269_FIXUP_HP_MUTE_LED_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6618) ALC269_FIXUP_HP_MUTE_LED_MIC3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6619) ALC269_FIXUP_HP_GPIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6620) ALC269_FIXUP_HP_GPIO_MIC1_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6621) ALC269_FIXUP_HP_LINE1_MIC1_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6622) ALC269_FIXUP_INV_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6623) ALC269_FIXUP_LENOVO_DOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6624) ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6625) ALC269_FIXUP_NO_SHUTUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6626) ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6627) ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6628) ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6629) ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6630) ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6631) ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6632) ALC269_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6633) ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6634) ALC269_FIXUP_ASPIRE_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6635) ALC269_FIXUP_ASUS_X101_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6636) ALC269_FIXUP_ASUS_X101_VERB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6637) ALC269_FIXUP_ASUS_X101,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6638) ALC271_FIXUP_AMIC_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6639) ALC271_FIXUP_HP_GATE_MIC_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6640) ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6641) ALC269_FIXUP_ACER_AC700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6642) ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6643) ALC269VB_FIXUP_ASUS_ZENBOOK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6644) ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6645) ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6646) ALC269VB_FIXUP_ORDISSIMO_EVE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6647) ALC283_FIXUP_CHROME_BOOK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6648) ALC283_FIXUP_SENSE_COMBO_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6649) ALC282_FIXUP_ASUS_TX300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6650) ALC283_FIXUP_INT_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6651) ALC290_FIXUP_MONO_SPEAKERS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6652) ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6653) ALC290_FIXUP_SUBWOOFER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6654) ALC290_FIXUP_SUBWOOFER_HSJACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6655) ALC269_FIXUP_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6656) ALC269_FIXUP_DMIC_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6657) ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6658) ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6659) ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6660) ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6661) ALC255_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6662) ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6663) ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6664) ALC292_FIXUP_TPT440_DOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6665) ALC292_FIXUP_TPT440,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6666) ALC283_FIXUP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6667) ALC255_FIXUP_MIC_MUTE_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6668) ALC282_FIXUP_ASPIRE_V5_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6669) ALC269VB_FIXUP_ASPIRE_E1_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6670) ALC280_FIXUP_HP_GPIO4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6671) ALC286_FIXUP_HP_GPIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6672) ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6673) ALC280_FIXUP_HP_DOCK_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6674) ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6675) ALC280_FIXUP_HP_9480M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6676) ALC245_FIXUP_HP_X360_AMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6677) ALC285_FIXUP_HP_SPECTRE_X360_EB1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6678) ALC288_FIXUP_DELL_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6679) ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6680) ALC288_FIXUP_DELL_XPS_13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6681) ALC288_FIXUP_DISABLE_AAMIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6682) ALC292_FIXUP_DELL_E7X_AAMIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6683) ALC292_FIXUP_DELL_E7X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6684) ALC292_FIXUP_DISABLE_AAMIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6685) ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6686) ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6687) ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6688) ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6689) ALC275_FIXUP_DELL_XPS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6690) ALC293_FIXUP_LENOVO_SPK_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6691) ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6692) ALC255_FIXUP_DELL_SPK_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6693) ALC225_FIXUP_DISABLE_MIC_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6694) ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6695) ALC295_FIXUP_DISABLE_DAC3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6696) ALC285_FIXUP_SPEAKER2_TO_DAC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6697) ALC280_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6698) ALC221_FIXUP_HP_FRONT_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6699) ALC292_FIXUP_TPT460,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6700) ALC298_FIXUP_SPK_VOLUME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6701) ALC298_FIXUP_LENOVO_SPK_VOLUME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6702) ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6703) ALC269_FIXUP_ATIV_BOOK_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6704) ALC221_FIXUP_HP_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6705) ALC256_FIXUP_ASUS_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6706) ALC256_FIXUP_ASUS_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6707) ALC256_FIXUP_ASUS_AIO_GPIO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6708) ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6709) ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6710) ALC233_FIXUP_LENOVO_MULTI_CODECS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6711) ALC233_FIXUP_ACER_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6712) ALC294_FIXUP_LENOVO_MIC_LOCATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6713) ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6714) ALC225_FIXUP_S3_POP_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6715) ALC700_FIXUP_INTEL_REFERENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6716) ALC274_FIXUP_DELL_BIND_DACS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6717) ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6718) ALC298_FIXUP_TPT470_DOCK_FIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6719) ALC298_FIXUP_TPT470_DOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6720) ALC255_FIXUP_DUMMY_LINEOUT_VERB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6721) ALC255_FIXUP_DELL_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6722) ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6723) ALC298_FIXUP_HUAWEI_MBX_STEREO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6724) ALC295_FIXUP_HP_X360,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6725) ALC221_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6726) ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6727) ALC295_FIXUP_HP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6728) ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6729) ALC294_FIXUP_ASUS_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6730) ALC294_FIXUP_ASUS_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6731) ALC294_FIXUP_ASUS_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6732) ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6733) ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6734) ALC255_FIXUP_ACER_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6735) ALC295_FIXUP_CHROME_BOOK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6736) ALC225_FIXUP_HEADSET_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6737) ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6738) ALC225_FIXUP_WYSE_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6739) ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6740) ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6741) ALC256_FIXUP_ASUS_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6742) ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6743) ALC299_FIXUP_PREDATOR_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6744) ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6745) ALC289_FIXUP_DELL_SPK2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6746) ALC289_FIXUP_DUAL_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6747) ALC294_FIXUP_SPK2_TO_DAC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6748) ALC294_FIXUP_ASUS_DUAL_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6749) ALC285_FIXUP_THINKPAD_X1_GEN7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6750) ALC285_FIXUP_THINKPAD_HEADSET_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6751) ALC294_FIXUP_ASUS_HPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6752) ALC294_FIXUP_ASUS_COEF_1B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6753) ALC294_FIXUP_ASUS_GX502_HP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6754) ALC294_FIXUP_ASUS_GX502_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6755) ALC294_FIXUP_ASUS_GX502_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6756) ALC294_FIXUP_ASUS_GU502_HP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6757) ALC294_FIXUP_ASUS_GU502_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6758) ALC294_FIXUP_ASUS_GU502_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6759) ALC285_FIXUP_HP_GPIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6760) ALC285_FIXUP_HP_MUTE_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6761) ALC236_FIXUP_HP_GPIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6762) ALC236_FIXUP_HP_MUTE_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6763) ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6764) ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6765) ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6766) ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6767) ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6768) ALC269VC_FIXUP_ACER_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6769) ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6770) ALC289_FIXUP_ASUS_GA401,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6771) ALC289_FIXUP_ASUS_GA502,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6772) ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6773) ALC285_FIXUP_HP_GPIO_AMP_INIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6774) ALC269_FIXUP_CZC_B20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6775) ALC269_FIXUP_CZC_TMI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6776) ALC269_FIXUP_CZC_L101,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6777) ALC269_FIXUP_LEMOTE_A1802,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6778) ALC269_FIXUP_LEMOTE_A190X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6779) ALC256_FIXUP_INTEL_NUC8_RUGGED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6780) ALC233_FIXUP_INTEL_NUC8_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6781) ALC233_FIXUP_INTEL_NUC8_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6782) ALC256_FIXUP_INTEL_NUC10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6783) ALC255_FIXUP_XIAOMI_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6784) ALC274_FIXUP_HP_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6785) ALC274_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6786) ALC274_FIXUP_HP_ENVY_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6787) ALC256_FIXUP_ASUS_HPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6788) ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6789) ALC287_FIXUP_HP_GPIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6790) ALC256_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6791) ALC245_FIXUP_HP_GPIO_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6792) ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6793) ALC282_FIXUP_ACER_DISABLE_LINEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6794) ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6795) ALC256_FIXUP_ACER_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6796) ALC285_FIXUP_IDEAPAD_S740_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6797) ALC295_FIXUP_ASUS_DACS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6798) ALC295_FIXUP_HP_OMEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6799) ALC285_FIXUP_HP_SPECTRE_X360,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6800) ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6801) ALC623_FIXUP_LENOVO_THINKSTATION_P340,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6802) ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6803) ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6804) ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6805) ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6806) ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6807) ALC287_FIXUP_13S_GEN2_SPEAKERS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6808) ALC256_FIXUP_SET_COEF_DEFAULTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6809) ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6810) ALC233_FIXUP_NO_AUDIO_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6811) ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6812) ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6813) ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6814) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6816) static const struct hda_fixup alc269_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6817) [ALC269_FIXUP_GPIO2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6818) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6819) .v.func = alc_fixup_gpio2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6820) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6821) [ALC269_FIXUP_SONY_VAIO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6822) .type = HDA_FIXUP_PINCTLS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6823) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6824) {0x19, PIN_VREFGRD},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6825) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6827) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6828) [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6829) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6830) .v.func = alc275_fixup_gpio4_off,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6831) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6832) .chain_id = ALC269_FIXUP_SONY_VAIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6833) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6834) [ALC269_FIXUP_DELL_M101Z] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6835) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6836) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6837) /* Enables internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6838) {0x20, AC_VERB_SET_COEF_INDEX, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6839) {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6840) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6842) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6843) [ALC269_FIXUP_SKU_IGNORE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6844) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6845) .v.func = alc_fixup_sku_ignore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6846) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6847) [ALC269_FIXUP_ASUS_G73JW] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6848) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6849) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6850) { 0x17, 0x99130111 }, /* subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6851) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6853) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6854) [ALC269_FIXUP_LENOVO_EAPD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6855) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6856) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6857) {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6858) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6860) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6861) [ALC275_FIXUP_SONY_HWEQ] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6862) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6863) .v.func = alc269_fixup_hweq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6864) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6865) .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6866) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6867) [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6868) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6869) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6870) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6871) .chain_id = ALC269_FIXUP_SONY_VAIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6872) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6873) [ALC271_FIXUP_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6874) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6875) .v.func = alc271_fixup_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6876) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6877) [ALC269_FIXUP_PCM_44K] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6878) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6879) .v.func = alc269_fixup_pcm_44k,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6880) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6881) .chain_id = ALC269_FIXUP_QUANTA_MUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6882) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6883) [ALC269_FIXUP_STEREO_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6884) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6885) .v.func = alc269_fixup_stereo_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6886) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6887) [ALC269_FIXUP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6888) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6889) .v.func = alc269_fixup_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6890) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6891) [ALC269_FIXUP_QUANTA_MUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6892) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6893) .v.func = alc269_fixup_quanta_mute,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6894) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6895) [ALC269_FIXUP_LIFEBOOK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6896) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6897) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6898) { 0x1a, 0x2101103f }, /* dock line-out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6899) { 0x1b, 0x23a11040 }, /* dock mic-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6900) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6901) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6902) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6903) .chain_id = ALC269_FIXUP_QUANTA_MUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6904) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6905) [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6906) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6907) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6908) { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6909) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6910) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6911) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6912) [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6913) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6914) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6915) { 0x21, 0x0221102f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6916) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6917) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6918) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6919) [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6920) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6921) .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6922) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6923) [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6924) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6925) .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6926) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6927) [ALC269_FIXUP_AMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6928) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6929) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6930) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6931) { 0x15, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6932) { 0x18, 0x01a19c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6933) { 0x19, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6934) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6935) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6936) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6937) [ALC269_FIXUP_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6938) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6939) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6940) { 0x12, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6941) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6942) { 0x15, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6943) { 0x18, 0x01a19c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6944) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6945) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6946) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6947) [ALC269VB_FIXUP_AMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6948) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6949) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6950) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6951) { 0x18, 0x01a19c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6952) { 0x19, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6953) { 0x21, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6954) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6955) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6956) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6957) [ALC269VB_FIXUP_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6958) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6959) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6960) { 0x12, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6961) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6962) { 0x18, 0x01a19c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6963) { 0x21, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6964) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6965) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6966) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6967) [ALC269_FIXUP_HP_MUTE_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6968) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6969) .v.func = alc269_fixup_hp_mute_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6970) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6971) [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6972) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6973) .v.func = alc269_fixup_hp_mute_led_mic1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6974) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6975) [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6976) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6977) .v.func = alc269_fixup_hp_mute_led_mic2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6978) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6979) [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6980) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6981) .v.func = alc269_fixup_hp_mute_led_mic3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6982) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6983) .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6984) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6985) [ALC269_FIXUP_HP_GPIO_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6986) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6987) .v.func = alc269_fixup_hp_gpio_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6988) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6989) [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6990) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6991) .v.func = alc269_fixup_hp_gpio_mic1_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6992) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6993) [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6994) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6995) .v.func = alc269_fixup_hp_line1_mic1_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6996) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6997) [ALC269_FIXUP_INV_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6998) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6999) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7000) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7001) [ALC269_FIXUP_NO_SHUTUP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7002) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7003) .v.func = alc_fixup_no_shutup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7004) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7005) [ALC269_FIXUP_LENOVO_DOCK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7006) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7007) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7008) { 0x19, 0x23a11040 }, /* dock mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7009) { 0x1b, 0x2121103f }, /* dock headphone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7010) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7011) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7012) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7013) .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7014) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7015) [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7016) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7017) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7018) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7019) .chain_id = ALC269_FIXUP_LENOVO_DOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7020) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7021) [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7022) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7023) .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7024) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7025) .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7026) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7027) [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7028) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7029) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7030) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7031) { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7032) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7033) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7034) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7035) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7036) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7037) [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7038) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7039) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7040) { 0x16, 0x21014020 }, /* dock line out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7041) { 0x19, 0x21a19030 }, /* dock mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7042) { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7043) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7044) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7045) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7046) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7047) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7048) [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7049) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7050) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7051) { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7052) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7053) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7054) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7055) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7056) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7057) [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7058) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7059) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7060) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7061) { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7062) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7063) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7064) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7065) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7066) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7067) [ALC269_FIXUP_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7068) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7069) .v.func = alc_fixup_headset_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7070) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7071) .chain_id = ALC255_FIXUP_MIC_MUTE_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7072) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7073) [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7074) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7075) .v.func = alc_fixup_headset_mode_no_hp_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7076) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7077) [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7078) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7079) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7080) { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7081) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7082) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7083) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7084) .chain_id = ALC269_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7085) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7086) [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7087) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7088) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7089) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7090) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7091) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7092) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7093) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7094) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7095) [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7096) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7097) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7098) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7099) {0x13, 0x40000000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7100) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7101) {0x18, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7102) {0x19, 0x04a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7103) {0x1a, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7104) {0x1b, 0x90170112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7105) {0x1d, 0x40759a05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7106) {0x1e, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7107) {0x21, 0x04211020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7108) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7109) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7110) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7111) .chain_id = ALC255_FIXUP_MIC_MUTE_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7112) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7113) [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7114) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7115) .v.func = alc298_fixup_huawei_mbx_stereo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7116) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7117) .chain_id = ALC255_FIXUP_MIC_MUTE_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7118) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7119) [ALC269_FIXUP_ASUS_X101_FUNC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7120) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7121) .v.func = alc269_fixup_x101_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7122) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7123) [ALC269_FIXUP_ASUS_X101_VERB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7124) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7125) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7126) {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7127) {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7128) {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7129) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7130) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7131) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7132) .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7133) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7134) [ALC269_FIXUP_ASUS_X101] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7135) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7136) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7137) { 0x18, 0x04a1182c }, /* Headset mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7138) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7139) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7140) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7141) .chain_id = ALC269_FIXUP_ASUS_X101_VERB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7142) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7143) [ALC271_FIXUP_AMIC_MIC2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7144) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7145) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7146) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7147) { 0x19, 0x01a19c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7148) { 0x1b, 0x99a7012f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7149) { 0x21, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7150) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7151) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7152) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7153) [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7154) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7155) .v.func = alc271_hp_gate_mic_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7156) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7157) .chain_id = ALC271_FIXUP_AMIC_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7158) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7159) [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7160) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7161) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7162) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7163) .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7164) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7165) [ALC269_FIXUP_ACER_AC700] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7166) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7167) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7168) { 0x12, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7169) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7170) { 0x18, 0x03a11c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7171) { 0x1e, 0x0346101e }, /* SPDIF1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7172) { 0x21, 0x0321101f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7173) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7174) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7175) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7176) .chain_id = ALC271_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7177) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7178) [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7179) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7180) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7181) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7182) .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7183) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7184) [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7185) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7186) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7187) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7188) .chain_id = ALC269VB_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7189) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7190) [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7191) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7192) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7193) /* class-D output amp +5dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7194) { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7195) { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7196) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7197) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7198) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7199) .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7200) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7201) [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7202) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7203) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7204) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7205) .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7206) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7207) [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7208) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7209) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7210) { 0x12, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7211) { 0x18, 0x03a11d20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7212) { 0x19, 0x411111f0 }, /* Unused bogus pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7213) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7214) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7215) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7216) [ALC283_FIXUP_CHROME_BOOK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7217) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7218) .v.func = alc283_fixup_chromebook,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7219) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7220) [ALC283_FIXUP_SENSE_COMBO_JACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7221) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7222) .v.func = alc283_fixup_sense_combo_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7223) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7224) .chain_id = ALC283_FIXUP_CHROME_BOOK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7225) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7226) [ALC282_FIXUP_ASUS_TX300] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7227) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7228) .v.func = alc282_fixup_asus_tx300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7229) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7230) [ALC283_FIXUP_INT_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7231) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7232) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7233) {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7234) {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7235) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7236) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7237) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7238) .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7239) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7240) [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7241) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7242) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7243) { 0x17, 0x90170112 }, /* subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7244) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7245) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7246) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7247) .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7248) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7249) [ALC290_FIXUP_SUBWOOFER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7250) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7251) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7252) { 0x17, 0x90170112 }, /* subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7253) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7254) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7255) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7256) .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7257) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7258) [ALC290_FIXUP_MONO_SPEAKERS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7259) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7260) .v.func = alc290_fixup_mono_speakers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7261) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7262) [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7263) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7264) .v.func = alc290_fixup_mono_speakers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7265) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7266) .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7267) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7268) [ALC269_FIXUP_THINKPAD_ACPI] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7269) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7270) .v.func = alc_fixup_thinkpad_acpi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7271) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7272) .chain_id = ALC269_FIXUP_SKU_IGNORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7273) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7274) [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7275) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7276) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7277) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7278) .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7279) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7280) [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7281) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7282) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7283) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7284) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7285) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7286) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7287) .chain_id = ALC255_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7288) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7289) [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7290) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7291) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7292) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7293) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7294) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7295) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7296) .chain_id = ALC255_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7297) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7298) [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7299) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7300) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7301) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7302) { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7303) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7304) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7305) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7306) .chain_id = ALC255_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7307) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7308) [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7309) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7310) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7311) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7312) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7313) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7314) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7315) .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7316) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7317) [ALC255_FIXUP_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7318) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7319) .v.func = alc_fixup_headset_mode_alc255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7320) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7321) .chain_id = ALC255_FIXUP_MIC_MUTE_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7322) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7323) [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7324) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7325) .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7326) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7327) [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7328) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7329) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7330) { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7331) { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7332) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7333) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7334) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7335) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7336) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7337) [ALC292_FIXUP_TPT440_DOCK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7338) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7339) .v.func = alc_fixup_tpt440_dock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7340) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7341) .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7342) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7343) [ALC292_FIXUP_TPT440] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7344) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7345) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7346) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7347) .chain_id = ALC292_FIXUP_TPT440_DOCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7348) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7349) [ALC283_FIXUP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7350) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7351) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7352) { 0x19, 0x04a110f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7353) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7354) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7355) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7356) [ALC255_FIXUP_MIC_MUTE_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7357) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7358) .v.func = alc_fixup_micmute_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7359) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7360) [ALC282_FIXUP_ASPIRE_V5_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7361) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7362) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7363) { 0x12, 0x90a60130 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7364) { 0x14, 0x90170110 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7365) { 0x17, 0x40000008 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7366) { 0x18, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7367) { 0x19, 0x01a1913c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7368) { 0x1a, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7369) { 0x1b, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7370) { 0x1d, 0x40f89b2d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7371) { 0x1e, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7372) { 0x21, 0x0321101f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7373) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7374) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7375) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7376) [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7377) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7378) .v.func = alc269vb_fixup_aspire_e1_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7379) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7380) [ALC280_FIXUP_HP_GPIO4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7381) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7382) .v.func = alc280_fixup_hp_gpio4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7383) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7384) [ALC286_FIXUP_HP_GPIO_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7385) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7386) .v.func = alc286_fixup_hp_gpio_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7387) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7388) [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7389) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7390) .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7391) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7392) [ALC280_FIXUP_HP_DOCK_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7393) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7394) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7395) { 0x1b, 0x21011020 }, /* line-out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7396) { 0x1a, 0x01a1903c }, /* headset mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7397) { 0x18, 0x2181103f }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7398) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7399) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7400) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7401) .chain_id = ALC280_FIXUP_HP_GPIO4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7402) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7403) [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7404) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7405) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7406) { 0x1b, 0x21011020 }, /* line-out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7407) { 0x18, 0x2181103f }, /* line-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7408) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7409) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7410) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7411) .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7412) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7413) [ALC280_FIXUP_HP_9480M] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7414) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7415) .v.func = alc280_fixup_hp_9480m,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7416) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7417) [ALC245_FIXUP_HP_X360_AMP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7418) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7419) .v.func = alc245_fixup_hp_x360_amp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7420) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7421) .chain_id = ALC245_FIXUP_HP_GPIO_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7422) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7423) [ALC288_FIXUP_DELL_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7424) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7425) .v.func = alc_fixup_headset_mode_dell_alc288,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7426) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7427) .chain_id = ALC255_FIXUP_MIC_MUTE_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7428) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7429) [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7430) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7431) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7432) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7433) { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7434) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7435) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7436) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7437) .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7438) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7439) [ALC288_FIXUP_DISABLE_AAMIX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7440) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7441) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7442) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7443) .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7444) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7445) [ALC288_FIXUP_DELL_XPS_13] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7446) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7447) .v.func = alc_fixup_dell_xps13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7448) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7449) .chain_id = ALC288_FIXUP_DISABLE_AAMIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7450) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7451) [ALC292_FIXUP_DISABLE_AAMIX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7452) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7453) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7454) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7455) .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7456) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7457) [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7458) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7459) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7460) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7461) .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7462) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7463) [ALC292_FIXUP_DELL_E7X_AAMIX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7464) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7465) .v.func = alc_fixup_dell_xps13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7466) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7467) .chain_id = ALC292_FIXUP_DISABLE_AAMIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7468) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7469) [ALC292_FIXUP_DELL_E7X] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7470) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7471) .v.func = alc_fixup_micmute_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7472) /* micmute fixup must be applied at last */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7473) .chained_before = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7474) .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7475) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7476) [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7477) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7478) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7479) { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7480) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7481) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7482) .chained_before = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7483) .chain_id = ALC269_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7484) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7485) [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7486) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7487) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7488) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7489) { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7490) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7491) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7492) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7493) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7494) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7495) [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7496) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7497) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7498) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7499) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7500) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7501) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7502) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7503) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7504) [ALC275_FIXUP_DELL_XPS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7505) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7506) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7507) /* Enables internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7508) {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7509) {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7510) {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7511) {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7512) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7514) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7515) [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7516) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7517) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7518) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7519) .chain_id = ALC269_FIXUP_THINKPAD_ACPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7520) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7521) [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7522) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7523) .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7524) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7525) [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7526) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7527) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7528) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7529) .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7530) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7531) [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7532) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7533) .v.func = alc269_fixup_limit_int_mic_boost
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7534) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7535) [ALC255_FIXUP_DELL_SPK_NOISE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7536) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7537) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7538) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7539) .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7540) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7541) [ALC225_FIXUP_DISABLE_MIC_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7542) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7543) .v.func = alc_fixup_disable_mic_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7544) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7545) .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7546) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7547) [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7548) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7549) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7550) /* Disable pass-through path for FRONT 14h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7551) { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7552) { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7553) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7554) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7555) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7556) .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7557) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7558) [ALC280_FIXUP_HP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7559) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7560) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7561) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7562) .chain_id = ALC269_FIXUP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7563) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7564) [ALC221_FIXUP_HP_FRONT_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7565) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7566) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7567) { 0x19, 0x02a19020 }, /* Front Mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7568) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7569) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7570) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7571) [ALC292_FIXUP_TPT460] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7572) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7573) .v.func = alc_fixup_tpt440_dock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7574) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7575) .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7576) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7577) [ALC298_FIXUP_SPK_VOLUME] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7578) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7579) .v.func = alc298_fixup_speaker_volume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7580) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7581) .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7582) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7583) [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7584) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7585) .v.func = alc298_fixup_speaker_volume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7586) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7587) [ALC295_FIXUP_DISABLE_DAC3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7588) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7589) .v.func = alc295_fixup_disable_dac3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7590) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7591) [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7592) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7593) .v.func = alc285_fixup_speaker2_to_dac1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7594) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7595) .chain_id = ALC269_FIXUP_THINKPAD_ACPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7596) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7597) [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7598) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7599) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7600) { 0x1b, 0x90170151 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7601) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7602) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7603) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7604) .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7605) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7606) [ALC269_FIXUP_ATIV_BOOK_8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7607) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7608) .v.func = alc_fixup_auto_mute_via_amp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7609) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7610) .chain_id = ALC269_FIXUP_NO_SHUTUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7611) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7612) [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7613) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7614) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7615) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7616) { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7617) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7618) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7619) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7620) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7621) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7622) [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7623) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7624) .v.func = alc_fixup_headset_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7625) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7626) [ALC256_FIXUP_ASUS_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7627) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7628) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7629) { 0x13, 0x90a60160 }, /* use as internal mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7630) { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7631) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7632) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7633) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7634) .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7635) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7636) [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7637) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7638) /* Set up GPIO2 for the speaker amp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7639) .v.func = alc_fixup_gpio4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7640) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7641) [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7642) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7643) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7644) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7645) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7646) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7647) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7648) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7649) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7650) [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7651) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7652) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7653) /* Enables internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7654) {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7655) {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7656) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7657) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7658) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7659) .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7660) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7661) [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7662) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7663) .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7664) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7665) .chain_id = ALC269_FIXUP_GPIO2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7666) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7667) [ALC233_FIXUP_ACER_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7668) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7669) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7670) { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7671) { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7672) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7673) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7674) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7675) .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7676) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7677) [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7678) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7679) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7680) /* Change the mic location from front to right, otherwise there are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7681) two front mics with the same name, pulseaudio can't handle them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7682) This is just a temporary workaround, after applying this fixup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7683) there will be one "Front Mic" and one "Mic" in this machine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7684) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7685) { 0x1a, 0x04a19040 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7686) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7687) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7688) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7689) [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7690) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7691) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7692) { 0x16, 0x0101102f }, /* Rear Headset HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7693) { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7694) { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7695) { 0x1b, 0x02011020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7696) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7697) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7698) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7699) .chain_id = ALC225_FIXUP_S3_POP_NOISE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7700) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7701) [ALC225_FIXUP_S3_POP_NOISE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7702) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7703) .v.func = alc225_fixup_s3_pop_noise,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7704) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7705) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7706) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7707) [ALC700_FIXUP_INTEL_REFERENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7708) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7709) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7710) /* Enables internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7711) {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7712) {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7713) {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7714) {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7715) {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7716) {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7717) {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7718) {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7719) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7721) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7722) [ALC274_FIXUP_DELL_BIND_DACS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7723) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7724) .v.func = alc274_fixup_bind_dacs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7725) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7726) .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7727) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7728) [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7729) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7730) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7731) { 0x1b, 0x0401102f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7732) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7733) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7734) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7735) .chain_id = ALC274_FIXUP_DELL_BIND_DACS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7736) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7737) [ALC298_FIXUP_TPT470_DOCK_FIX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7738) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7739) .v.func = alc_fixup_tpt470_dock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7740) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7741) .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7742) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7743) [ALC298_FIXUP_TPT470_DOCK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7744) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7745) .v.func = alc_fixup_tpt470_dacs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7746) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7747) .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7748) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7749) [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7750) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7751) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7752) { 0x14, 0x0201101f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7753) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7754) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7755) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7756) .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7757) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7758) [ALC255_FIXUP_DELL_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7759) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7760) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7761) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7762) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7763) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7764) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7765) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7766) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7767) [ALC295_FIXUP_HP_X360] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7768) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7769) .v.func = alc295_fixup_hp_top_speakers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7770) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7771) .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7772) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7773) [ALC221_FIXUP_HP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7774) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7775) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7776) { 0x19, 0x0181313f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7777) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7778) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7779) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7780) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7781) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7782) [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7783) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7784) .v.func = alc285_fixup_invalidate_dacs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7785) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7786) .chain_id = ALC269_FIXUP_THINKPAD_ACPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7787) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7788) [ALC295_FIXUP_HP_AUTO_MUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7789) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7790) .v.func = alc_fixup_auto_mute_via_amp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7791) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7792) [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7793) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7794) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7795) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7796) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7797) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7798) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7799) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7800) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7801) [ALC294_FIXUP_ASUS_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7802) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7803) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7804) { 0x13, 0x90a60160 }, /* use as internal mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7805) { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7806) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7807) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7808) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7809) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7810) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7811) [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7812) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7813) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7814) { 0x19, 0x01a1103c }, /* use as headset mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7815) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7816) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7817) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7818) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7819) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7820) [ALC294_FIXUP_ASUS_SPK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7821) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7822) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7823) /* Set EAPD high */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7824) { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7825) { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7826) { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7827) { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7828) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7829) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7830) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7831) .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7832) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7833) [ALC295_FIXUP_CHROME_BOOK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7834) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7835) .v.func = alc295_fixup_chromebook,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7836) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7837) .chain_id = ALC225_FIXUP_HEADSET_JACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7838) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7839) [ALC225_FIXUP_HEADSET_JACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7840) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7841) .v.func = alc_fixup_headset_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7842) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7843) [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7844) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7845) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7846) { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7847) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7848) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7849) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7850) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7851) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7852) [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7853) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7854) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7855) /* Disable PCBEEP-IN passthrough */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7856) { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7857) { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7858) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7859) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7860) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7861) .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7862) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7863) [ALC255_FIXUP_ACER_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7864) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7865) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7866) { 0x19, 0x03a11130 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7867) { 0x1a, 0x90a60140 }, /* use as internal mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7868) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7869) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7870) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7871) .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7872) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7873) [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7874) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7875) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7876) { 0x16, 0x01011020 }, /* Rear Line out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7877) { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7878) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7879) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7880) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7881) .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7882) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7883) [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7884) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7885) .v.func = alc_fixup_auto_mute_via_amp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7886) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7887) .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7888) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7889) [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7890) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7891) .v.func = alc_fixup_disable_mic_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7892) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7893) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7894) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7895) [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7896) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7897) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7898) { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7899) { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7900) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7901) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7902) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7903) .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7904) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7905) [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7906) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7907) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7908) { 0x19, 0x03a11020 }, /* headset mic with jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7909) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7910) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7911) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7912) .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7913) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7914) [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7915) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7916) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7917) { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7918) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7919) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7920) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7921) .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7922) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7923) [ALC299_FIXUP_PREDATOR_SPK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7924) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7925) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7926) { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7927) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7929) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7930) [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7931) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7932) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7933) { 0x19, 0x04a11040 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7934) { 0x21, 0x04211020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7935) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7936) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7937) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7938) .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7939) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7940) [ALC289_FIXUP_DELL_SPK2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7941) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7942) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7943) { 0x17, 0x90170130 }, /* bass spk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7944) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7945) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7946) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7947) .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7948) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7949) [ALC289_FIXUP_DUAL_SPK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7950) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7951) .v.func = alc285_fixup_speaker2_to_dac1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7952) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7953) .chain_id = ALC289_FIXUP_DELL_SPK2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7954) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7955) [ALC294_FIXUP_SPK2_TO_DAC1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7956) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7957) .v.func = alc285_fixup_speaker2_to_dac1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7958) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7959) .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7960) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7961) [ALC294_FIXUP_ASUS_DUAL_SPK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7962) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7963) /* The GPIO must be pulled to initialize the AMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7964) .v.func = alc_fixup_gpio4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7965) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7966) .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7967) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7968) [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7969) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7970) .v.func = alc285_fixup_thinkpad_x1_gen7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7971) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7972) .chain_id = ALC269_FIXUP_THINKPAD_ACPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7973) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7974) [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7975) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7976) .v.func = alc_fixup_headset_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7977) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7978) .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7979) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7980) [ALC294_FIXUP_ASUS_HPE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7981) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7982) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7983) /* Set EAPD high */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7984) { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7985) { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7986) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7987) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7988) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7989) .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7990) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7991) [ALC294_FIXUP_ASUS_GX502_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7992) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7993) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7994) { 0x19, 0x03a11050 }, /* front HP mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7995) { 0x1a, 0x01a11830 }, /* rear external mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7996) { 0x21, 0x03211020 }, /* front HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7997) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7998) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7999) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8000) .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8001) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8002) [ALC294_FIXUP_ASUS_GX502_VERBS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8003) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8004) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8005) /* set 0x15 to HP-OUT ctrl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8006) { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8007) /* unmute the 0x15 amp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8008) { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8009) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8010) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8011) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8012) .chain_id = ALC294_FIXUP_ASUS_GX502_HP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8013) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8014) [ALC294_FIXUP_ASUS_GX502_HP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8015) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8016) .v.func = alc294_fixup_gx502_hp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8017) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8018) [ALC294_FIXUP_ASUS_GU502_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8019) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8020) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8021) { 0x19, 0x01a11050 }, /* rear HP mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8022) { 0x1a, 0x01a11830 }, /* rear external mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8023) { 0x21, 0x012110f0 }, /* rear HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8024) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8025) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8026) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8027) .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8028) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8029) [ALC294_FIXUP_ASUS_GU502_VERBS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8030) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8031) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8032) /* set 0x15 to HP-OUT ctrl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8033) { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8034) /* unmute the 0x15 amp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8035) { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8036) /* set 0x1b to HP-OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8037) { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8038) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8039) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8040) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8041) .chain_id = ALC294_FIXUP_ASUS_GU502_HP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8042) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8043) [ALC294_FIXUP_ASUS_GU502_HP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8044) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8045) .v.func = alc294_fixup_gu502_hp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8046) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8047) [ALC294_FIXUP_ASUS_COEF_1B] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8048) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8049) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8050) /* Set bit 10 to correct noisy output after reboot from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8051) * Windows 10 (due to pop noise reduction?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8052) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8053) { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8054) { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8055) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8056) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8057) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8058) .chain_id = ALC289_FIXUP_ASUS_GA401,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8059) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8060) [ALC285_FIXUP_HP_GPIO_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8061) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8062) .v.func = alc285_fixup_hp_gpio_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8063) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8064) [ALC285_FIXUP_HP_MUTE_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8065) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8066) .v.func = alc285_fixup_hp_mute_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8067) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8068) [ALC236_FIXUP_HP_GPIO_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8069) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8070) .v.func = alc236_fixup_hp_gpio_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8071) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8072) [ALC236_FIXUP_HP_MUTE_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8073) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8074) .v.func = alc236_fixup_hp_mute_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8075) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8076) [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8077) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8078) .v.func = alc236_fixup_hp_mute_led_micmute_vref,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8079) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8080) [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8081) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8082) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8083) { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8084) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8085) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8086) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8087) [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8088) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8089) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8090) { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8091) { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8092) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8093) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8094) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8095) [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8096) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8097) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8098) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8099) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8100) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8101) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8102) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8103) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8104) [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8105) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8106) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8107) { 0x14, 0x90100120 }, /* use as internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8108) { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8109) { 0x1a, 0x01011020 }, /* use as line out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8110) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8111) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8112) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8113) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8114) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8115) [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8116) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8117) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8118) { 0x18, 0x02a11030 }, /* use as headset mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8119) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8120) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8121) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8122) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8123) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8124) [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8125) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8126) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8127) { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8128) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8129) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8130) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8131) .chain_id = ALC269_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8132) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8133) [ALC289_FIXUP_ASUS_GA401] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8134) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8135) .v.func = alc289_fixup_asus_ga401,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8136) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8137) .chain_id = ALC289_FIXUP_ASUS_GA502,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8138) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8139) [ALC289_FIXUP_ASUS_GA502] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8140) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8141) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8142) { 0x19, 0x03a11020 }, /* headset mic with jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8143) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8144) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8145) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8146) [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8147) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8148) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8149) { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8150) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8151) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8152) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8153) .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8154) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8155) [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8156) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8157) .v.func = alc285_fixup_hp_gpio_amp_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8158) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8159) .chain_id = ALC285_FIXUP_HP_GPIO_LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8160) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8161) [ALC269_FIXUP_CZC_B20] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8162) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8163) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8164) { 0x12, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8165) { 0x14, 0x90170110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8166) { 0x15, 0x032f1020 }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8167) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8168) { 0x18, 0x03ab1040 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8169) { 0x19, 0xb7a7013f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8170) { 0x1a, 0x0181305f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8171) { 0x1b, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8172) { 0x1d, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8173) { 0x1e, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8174) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8175) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8176) .chain_id = ALC269_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8177) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8178) [ALC269_FIXUP_CZC_TMI] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8179) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8180) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8181) { 0x12, 0x4000c000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8182) { 0x14, 0x90170110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8183) { 0x15, 0x0421401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8184) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8185) { 0x18, 0x04a19020 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8186) { 0x19, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8187) { 0x1a, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8188) { 0x1b, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8189) { 0x1d, 0x40448505 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8190) { 0x1e, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8191) { 0x20, 0x8000ffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8192) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8193) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8194) .chain_id = ALC269_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8195) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8196) [ALC269_FIXUP_CZC_L101] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8197) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8198) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8199) { 0x12, 0x40000000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8200) { 0x14, 0x01014010 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8201) { 0x15, 0x411111f0 }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8202) { 0x16, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8203) { 0x18, 0x01a19020 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8204) { 0x19, 0x02a19021 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8205) { 0x1a, 0x0181302f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8206) { 0x1b, 0x0221401f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8207) { 0x1c, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8208) { 0x1d, 0x4044c601 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8209) { 0x1e, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8210) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8211) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8212) .chain_id = ALC269_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8213) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8214) [ALC269_FIXUP_LEMOTE_A1802] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8215) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8216) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8217) { 0x12, 0x40000000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8218) { 0x14, 0x90170110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8219) { 0x17, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8220) { 0x18, 0x03a19040 }, /* mic1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8221) { 0x19, 0x90a70130 }, /* mic2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8222) { 0x1a, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8223) { 0x1b, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8224) { 0x1d, 0x40489d2d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8225) { 0x1e, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8226) { 0x20, 0x0003ffff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8227) { 0x21, 0x03214020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8228) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8229) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8230) .chain_id = ALC269_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8231) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8232) [ALC269_FIXUP_LEMOTE_A190X] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8233) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8234) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8235) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8236) { 0x15, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8237) { 0x18, 0x01a19c20 }, /* rear mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8238) { 0x19, 0x99a3092f }, /* front mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8239) { 0x1b, 0x0201401f }, /* front lineout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8240) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8241) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8242) .chain_id = ALC269_FIXUP_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8243) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8244) [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8245) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8246) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8247) { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8248) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8249) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8250) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8251) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8252) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8253) [ALC256_FIXUP_INTEL_NUC10] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8254) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8255) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8256) { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8257) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8258) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8259) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8260) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8261) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8262) [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8263) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8264) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8265) { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8266) { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8267) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8268) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8269) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8270) .chain_id = ALC289_FIXUP_ASUS_GA502
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8271) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8272) [ALC274_FIXUP_HP_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8273) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8274) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8275) { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8276) { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8277) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8278) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8279) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8280) [ALC274_FIXUP_HP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8281) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8282) .v.func = alc274_fixup_hp_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8283) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8284) .chain_id = ALC274_FIXUP_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8285) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8286) [ALC274_FIXUP_HP_ENVY_GPIO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8287) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8288) .v.func = alc274_fixup_hp_envy_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8289) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8290) [ALC256_FIXUP_ASUS_HPE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8291) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8292) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8293) /* Set EAPD high */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8294) { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8295) { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8296) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8297) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8298) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8299) .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8300) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8301) [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8302) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8303) .v.func = alc_fixup_headset_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8304) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8305) .chain_id = ALC269_FIXUP_THINKPAD_ACPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8306) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8307) [ALC287_FIXUP_HP_GPIO_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8308) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8309) .v.func = alc287_fixup_hp_gpio_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8310) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8311) [ALC256_FIXUP_HP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8312) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8313) .v.func = alc274_fixup_hp_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8314) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8315) [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8316) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8317) .v.func = alc_fixup_no_int_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8318) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8319) .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8320) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8321) [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8322) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8323) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8324) { 0x1b, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8325) { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8326) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8327) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8328) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8329) .chain_id = ALC269_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8330) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8331) [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8332) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8333) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8334) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8335) .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8336) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8337) [ALC256_FIXUP_ACER_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8338) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8339) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8340) { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8341) { 0x1a, 0x90a1092f }, /* use as internal mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8342) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8343) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8344) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8345) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8346) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8347) [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8348) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8349) .v.func = alc285_fixup_ideapad_s740_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8350) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8351) .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8352) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8353) [ALC295_FIXUP_ASUS_DACS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8354) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8355) .v.func = alc295_fixup_asus_dacs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8356) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8357) [ALC295_FIXUP_HP_OMEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8358) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8359) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8360) { 0x12, 0xb7a60130 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8361) { 0x13, 0x40000000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8362) { 0x14, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8363) { 0x16, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8364) { 0x17, 0x90170110 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8365) { 0x18, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8366) { 0x19, 0x02a11030 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8367) { 0x1a, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8368) { 0x1b, 0x04a19030 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8369) { 0x1d, 0x40600001 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8370) { 0x1e, 0x411111f0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8371) { 0x21, 0x03211020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8372) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8373) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8374) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8375) .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8376) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8377) [ALC285_FIXUP_HP_SPECTRE_X360] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8378) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8379) .v.func = alc285_fixup_hp_spectre_x360,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8380) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8381) [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8382) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8383) .v.func = alc285_fixup_hp_spectre_x360_eb1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8384) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8385) [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8386) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8387) .v.func = alc285_fixup_ideapad_s740_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8388) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8389) .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8390) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8391) [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8392) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8393) .v.func = alc_fixup_no_shutup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8394) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8395) .chain_id = ALC283_FIXUP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8396) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8397) [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8398) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8399) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8400) { 0x21, 0x03211030 }, /* Change the Headphone location to Left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8401) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8402) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8403) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8404) .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8405) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8406) [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8407) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8408) .v.func = alc269_fixup_limit_int_mic_boost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8409) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8410) .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8411) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8412) [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8413) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8414) .v.func = alc285_fixup_ideapad_s740_coef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8415) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8416) .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8417) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8418) [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8419) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8420) .v.func = alc287_fixup_legion_15imhg05_speakers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8421) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8422) .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8423) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8424) [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8425) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8426) //.v.verbs = legion_15imhg05_coefs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8427) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8428) // set left speaker Legion 7i.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8429) { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8430) { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8432) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8433) { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8434) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8435) { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8436) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8438) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8439) { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8440) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8441) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8442) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8444) // set right speaker Legion 7i.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8445) { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8446) { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8448) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8449) { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8450) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8451) { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8452) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8454) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8455) { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8456) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8457) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8458) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8459) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8460) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8461) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8462) .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8463) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8464) [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8465) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8466) .v.func = alc287_fixup_legion_15imhg05_speakers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8467) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8468) .chain_id = ALC269_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8469) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8470) [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8471) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8472) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8473) // set left speaker Yoga 7i.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8474) { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8475) { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8477) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8478) { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8479) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8480) { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8481) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8483) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8484) { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8485) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8486) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8487) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8489) // set right speaker Yoga 7i.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8490) { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8491) { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8493) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8494) { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8495) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8496) { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8497) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8499) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8500) { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8501) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8502) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8503) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8504) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8505) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8506) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8507) .chain_id = ALC269_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8508) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8509) [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8510) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8511) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8512) { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8513) { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8514) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8515) { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8516) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8517) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8518) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8519) { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8520) { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8521) { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8522) { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8523) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8524) { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8525) { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8526) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8527) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8528) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8529) .chain_id = ALC269_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8530) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8531) [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8532) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8533) .v.func = alc256_fixup_set_coef_defaults,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8534) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8535) [ALC245_FIXUP_HP_GPIO_LED] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8536) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8537) .v.func = alc245_fixup_hp_gpio_led,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8538) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8539) [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8540) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8541) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8542) { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8543) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8544) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8545) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8546) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8547) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8548) [ALC233_FIXUP_NO_AUDIO_JACK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8549) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8550) .v.func = alc233_fixup_no_audio_jack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8551) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8552) [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8553) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8554) .v.func = alc256_fixup_mic_no_presence_and_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8555) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8556) .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8557) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8558) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8560) static const struct snd_pci_quirk alc269_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8561) SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8562) SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8563) SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8564) SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8565) SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8566) SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8567) SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8568) SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8569) SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8570) SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8571) SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8572) SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8573) SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8574) SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8575) SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8576) SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8577) SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8578) SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8579) SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8580) SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8581) SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8582) SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8583) SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8584) SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8585) SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8586) SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8587) SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8588) SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8589) SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8590) SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8591) SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8592) SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8593) SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8594) SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8595) SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8596) SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8597) SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8598) SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8599) SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8600) SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8601) SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8602) SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8603) SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8604) SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8605) SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8606) SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8607) SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8608) SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8609) SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8610) SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8611) SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8612) SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8613) SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8614) SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8615) SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8616) SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8617) SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8618) SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8619) SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8620) SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8621) SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8622) SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8623) SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8624) SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8625) SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8626) SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8627) SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8628) SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8629) SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8630) SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8631) SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8632) SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8633) SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8634) SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8635) SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8636) SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8637) SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8638) SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8639) SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8640) SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8641) SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8642) SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8643) SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8644) SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8645) SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8646) SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8647) SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8648) SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8649) SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8650) SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8651) SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8652) SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8653) SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8654) SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8655) SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8656) SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8657) SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8658) SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8659) SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8660) SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8661) SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8662) SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8663) SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8664) SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8665) SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8666) SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8667) SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8668) SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8669) SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8670) SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8671) SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8672) SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8673) SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8674) SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8675) SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8676) SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8677) SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8678) SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8679) SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8680) SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8681) SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8682) SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8683) SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8684) SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8685) SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8686) SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8687) SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8688) SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8689) SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8690) SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8691) SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8692) SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8693) SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8694) SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8695) SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8696) SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8697) SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8698) SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8699) SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8700) SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8701) SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8702) SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8703) SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8704) SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8705) SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8706) SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8707) SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8708) SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8709) SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8710) SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8711) SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8712) SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8713) SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8714) SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8715) SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8716) SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8717) SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8718) SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8719) SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8720) SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8721) SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8722) SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8723) SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8724) SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8725) SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8726) SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8727) SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8728) SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8729) SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8730) SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8731) SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8732) SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8733) SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8734) SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8735) SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8736) SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8737) SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8738) SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8739) SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8740) SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8741) SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8742) SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8743) SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8744) ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8745) SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8746) ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8747) SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8748) SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8749) SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8750) SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8751) SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8752) SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8753) SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8754) SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8755) SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8756) SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8757) SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8758) SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8759) SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8760) SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8761) SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8762) SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8763) SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8764) SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8765) SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8766) SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8767) SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8768) SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8769) SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8770) SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8771) SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8772) SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8773) SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8774) SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8775) SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8776) SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8777) SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8778) SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8779) SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8780) SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8781) SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8782) SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8783) SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8784) SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8785) SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8786) SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8787) SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8788) SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8789) SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8790) SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8791) SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8792) SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8793) SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8794) SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8795) SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8796) SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8797) SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8798) SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8799) SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8800) SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8801) SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8802) SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8803) SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8804) SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8805) SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8806) SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8807) SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8808) SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8809) SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8810) SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8811) SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8812) SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8813) SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8814) SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8815) SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8816) SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8817) SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8818) SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8819) SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8820) SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8821) SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8822) SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8823) SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8824) SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8825) SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8826) SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8827) SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8828) SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8829) SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8830) SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8831) SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8832) SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8833) SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8834) SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8835) SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8836) SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8837) SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8838) SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8839) SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8840) SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8841) SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8842) SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8843) SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8844) SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8845) SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8846) SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8847) SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8848) SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8849) SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8850) SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8851) SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8852) SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8853) SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8854) SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8855) SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8856) SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8857) SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8858) SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8859) SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8860) SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8861) SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8862) SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8863) SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8864) SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8865) SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8866) SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8867) SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8868) SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8869) SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8870) SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8871) SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8872) SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8873) SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8874) SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8875) SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8876) SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8877) SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8878) SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8879) SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8880) SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8881) SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8882) SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8883) SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8884) SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8885) SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8886) SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8887) SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8888) SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8889) SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8890) SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8891) SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8892) SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8893) SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8894) SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8895) SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8896) SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[5|7][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8897) SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8898) SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8899) SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8900) SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8901) SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8902) SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8903) SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8904) SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8905) SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8906) SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8907) SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8908) SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8909) SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8910) SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL5XNU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8911) SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8912) SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8913) SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8914) SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8915) SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8916) SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8917) SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8918) SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8919) SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8920) SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8921) SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8922) SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8923) SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8924) SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8925) SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8926) SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8927) SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8928) SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8929) SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8930) SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8931) SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8932) SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8933) SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8934) SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8935) SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8936) SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8937) SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8938) SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8939) SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8940) SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8941) SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8942) SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8943) SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8944) SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8945) SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8946) SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8947) SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8948) SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8949) SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8950) SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8951) SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8952) SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8953) SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8954) SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8955) SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8956) SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8957) SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8958) SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8959) SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8960) SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8961) SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8962) SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8963) SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8964) SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8965) SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8966) SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8967) SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8968) SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8969) SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8970) SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8971) SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8972) SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8973) SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8974) SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8975) SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8976) SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8977) SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8978) SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8979) SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8980) SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8981) SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8982) SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8983) SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8984) SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8985) SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8986) SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8987) SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8988) SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8989) SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8990) SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8991) SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8992) SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8993) SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8994) SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8995) SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8996) SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8997) SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8998) SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8999) SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9000) SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9001) SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9002) SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9003) SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9004) SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9005) SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9006) SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9007) SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9008) SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9009) SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9010) SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9011) SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9012) SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9013) SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9014) SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9015) SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9016) SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9018) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9019) /* Below is a quirk table taken from the old code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9020) * Basically the device should work as is without the fixup table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9021) * If BIOS doesn't give a proper info, enable the corresponding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9022) * fixup entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9023) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9024) SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9025) ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9026) SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9027) SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9028) SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9029) SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9030) SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9031) SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9032) SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9033) SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9034) SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9035) SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9036) SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9037) SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9038) SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9039) SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9040) SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9041) SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9042) SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9043) SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9044) SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9045) SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9046) SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9047) SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9048) SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9049) SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9050) SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9051) SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9052) SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9053) SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9054) SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9055) SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9056) SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9057) SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9058) SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9059) SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9060) SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9061) SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9062) SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9063) SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9064) SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9065) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9066) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9067) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9069) static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9070) SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9071) SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9072) SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9073) SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9074) SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9075) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9076) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9078) static const struct hda_model_fixup alc269_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9079) {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9080) {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9081) {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9082) {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9083) {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9084) {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9085) {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9086) {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9087) {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9088) {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9089) {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9090) {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9091) {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9092) {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9093) {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9094) {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9095) {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9096) {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9097) {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9098) {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9099) {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9100) {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9101) {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9102) {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9103) {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9104) {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9105) {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9106) {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9107) {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9108) {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9109) {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9110) {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9111) {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9112) {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9113) {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9114) {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9115) {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9116) {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9117) {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9118) {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9119) {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9120) {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9121) {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9122) {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9123) {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9124) {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9125) {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9126) {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9127) {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9128) {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9129) {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9130) {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9131) {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9132) {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9133) {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9134) {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9135) {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9136) {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9137) {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9138) {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9139) {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9140) {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9141) {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9142) {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9143) {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9144) {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9145) {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9146) {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9147) {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9148) {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9149) {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9150) {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9151) {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9152) {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9153) {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9154) {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9155) {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9156) {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9157) {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9158) {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9159) {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9160) {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9161) {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9162) {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9163) {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9164) {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9165) {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9166) {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9167) {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9168) {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9169) {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9170) {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9171) {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9172) {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9173) {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9174) {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9175) {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9176) {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9177) {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9178) {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9179) {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9180) {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9181) {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9182) {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9183) {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9184) {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9185) {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9186) {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9187) {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9188) {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9189) {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9190) {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9191) {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9192) {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9193) {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9194) {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9195) {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9196) {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9197) {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9198) {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9199) {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9200) {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9201) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9202) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9203) #define ALC225_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9204) {0x21, 0x04211020}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9206) #define ALC256_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9207) {0x12, 0x90a60140}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9208) {0x14, 0x90170110}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9209) {0x21, 0x02211020}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9211) #define ALC282_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9212) {0x14, 0x90170110}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9214) #define ALC290_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9215) {0x12, 0x99a30130}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9217) #define ALC292_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9218) {0x14, 0x90170110}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9219) {0x15, 0x0221401f}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9221) #define ALC295_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9222) {0x12, 0xb7a60130}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9223) {0x14, 0x90170110}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9224) {0x21, 0x04211020}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9226) #define ALC298_STANDARD_PINS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9227) {0x12, 0x90a60130}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9228) {0x21, 0x03211020}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9230) static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9231) SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9232) {0x14, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9233) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9234) {0x18, 0x02a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9235) {0x19, 0x0181303F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9236) {0x21, 0x0221102f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9237) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9238) {0x12, 0x90a601c0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9239) {0x14, 0x90171120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9240) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9241) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9242) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9243) {0x1b, 0x90a70130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9244) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9245) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9246) {0x1a, 0x90a70130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9247) {0x1b, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9248) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9249) SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9250) ALC225_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9251) {0x12, 0xb7a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9252) {0x14, 0x901701a0}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9253) SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9254) ALC225_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9255) {0x12, 0xb7a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9256) {0x14, 0x901701b0}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9257) SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9258) ALC225_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9259) {0x12, 0xb7a60150},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9260) {0x14, 0x901701a0}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9261) SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9262) ALC225_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9263) {0x12, 0xb7a60150},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9264) {0x14, 0x901701b0}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9265) SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9266) ALC225_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9267) {0x12, 0xb7a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9268) {0x1b, 0x90170110}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9269) SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9270) {0x1b, 0x01111010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9271) {0x1e, 0x01451130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9272) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9273) SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9274) {0x12, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9275) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9276) {0x19, 0x02a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9277) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9278) SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9279) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9280) {0x19, 0x02a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9281) {0x1a, 0x02a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9282) {0x1b, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9283) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9284) SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9285) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9286) {0x19, 0x02a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9287) {0x1a, 0x02a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9288) {0x1b, 0x01011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9289) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9290) SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9291) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9292) {0x19, 0x02a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9293) {0x1a, 0x02a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9294) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9295) SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9296) {0x21, 0x02211010}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9297) SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9298) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9299) {0x19, 0x02a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9300) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9301) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9302) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9303) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9304) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9305) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9306) {0x21, 0x02211040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9307) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9308) {0x12, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9309) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9310) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9311) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9312) {0x12, 0x90a60160},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9313) {0x14, 0x90170120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9314) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9315) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9316) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9317) {0x1b, 0x02011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9318) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9319) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9320) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9321) {0x1b, 0x01011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9322) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9323) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9324) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9325) {0x1b, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9326) {0x21, 0x0221103f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9327) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9328) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9329) {0x1b, 0x01011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9330) {0x21, 0x0221103f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9331) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9332) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9333) {0x1b, 0x02011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9334) {0x21, 0x0221103f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9335) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9336) {0x14, 0x90170150},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9337) {0x1b, 0x02011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9338) {0x21, 0x0221105f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9339) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9340) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9341) {0x1b, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9342) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9343) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9344) {0x12, 0x90a60160},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9345) {0x14, 0x90170120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9346) {0x17, 0x90170140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9347) {0x21, 0x0321102f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9348) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9349) {0x12, 0x90a60160},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9350) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9351) {0x21, 0x02211040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9352) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9353) {0x12, 0x90a60160},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9354) {0x14, 0x90170140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9355) {0x21, 0x02211050}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9356) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9357) {0x12, 0x90a60170},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9358) {0x14, 0x90170120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9359) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9360) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9361) {0x12, 0x90a60170},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9362) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9363) {0x21, 0x02211040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9364) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9365) {0x12, 0x90a60170},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9366) {0x14, 0x90171130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9367) {0x21, 0x02211040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9368) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9369) {0x12, 0x90a60170},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9370) {0x14, 0x90170140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9371) {0x21, 0x02211050}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9372) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9373) {0x12, 0x90a60180},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9374) {0x14, 0x90170130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9375) {0x21, 0x02211040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9376) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9377) {0x12, 0x90a60180},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9378) {0x14, 0x90170120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9379) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9380) SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9381) {0x1b, 0x01011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9382) {0x21, 0x02211010}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9383) SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9384) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9385) {0x1b, 0x90a70130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9386) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9387) SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9388) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9389) {0x1b, 0x90a70130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9390) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9391) SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9392) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9393) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9394) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9395) SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9396) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9397) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9398) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9399) SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9400) {0x1a, 0x90a70130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9401) {0x1b, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9402) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9403) SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9404) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9405) {0x19, 0x02a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9406) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9407) SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9408) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9409) {0x19, 0x03a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9410) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9411) SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9412) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9413) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9414) {0x15, 0x0421101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9415) {0x1a, 0x04a11020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9416) SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9417) {0x12, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9418) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9419) {0x15, 0x0421101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9420) {0x18, 0x02811030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9421) {0x1a, 0x04a1103f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9422) {0x1b, 0x02011020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9423) SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9424) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9425) {0x12, 0x99a30130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9426) {0x19, 0x03a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9427) {0x21, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9428) SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9429) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9430) {0x12, 0x99a30130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9431) {0x19, 0x03a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9432) {0x21, 0x03211040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9433) SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9434) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9435) {0x12, 0x99a30130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9436) {0x19, 0x03a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9437) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9438) SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9439) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9440) {0x12, 0x99a30130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9441) {0x19, 0x04a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9442) {0x21, 0x0421101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9443) SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9444) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9445) {0x12, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9446) {0x19, 0x04a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9447) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9448) SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9449) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9450) {0x12, 0x90a609c0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9451) {0x18, 0x03a11830},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9452) {0x19, 0x04a19831},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9453) {0x1a, 0x0481303f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9454) {0x1b, 0x04211020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9455) {0x21, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9456) SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9457) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9458) {0x12, 0x90a60940},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9459) {0x18, 0x03a11830},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9460) {0x19, 0x04a19831},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9461) {0x1a, 0x0481303f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9462) {0x1b, 0x04211020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9463) {0x21, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9464) SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9465) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9466) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9467) {0x21, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9468) SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9469) {0x12, 0x90a60160},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9470) {0x14, 0x90170120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9471) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9472) SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9473) ALC282_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9474) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9475) {0x19, 0x03a11020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9476) {0x21, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9477) SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9478) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9479) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9480) {0x19, 0x04a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9481) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9482) SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9483) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9484) {0x19, 0x04a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9485) {0x1d, 0x40600001},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9486) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9487) SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9488) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9489) {0x19, 0x04a11040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9490) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9491) SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9492) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9493) {0x17, 0x90170111},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9494) {0x19, 0x03a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9495) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9496) SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9497) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9498) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9499) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9500) SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9501) {0x12, 0x90a60120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9502) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9503) {0x21, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9504) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9505) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9506) {0x15, 0x04211040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9507) {0x18, 0x90170112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9508) {0x1a, 0x04a11020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9509) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9510) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9511) {0x15, 0x04211040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9512) {0x18, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9513) {0x1a, 0x04a11020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9514) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9515) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9516) {0x15, 0x0421101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9517) {0x1a, 0x04a11020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9518) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9519) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9520) {0x15, 0x04211020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9521) {0x1a, 0x04a11040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9522) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9523) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9524) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9525) {0x15, 0x04211020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9526) {0x1a, 0x04a11040}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9527) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9528) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9529) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9530) {0x15, 0x04211020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9531) {0x1a, 0x04a11020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9532) SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9533) ALC290_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9534) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9535) {0x15, 0x0421101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9536) {0x1a, 0x04a11020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9537) SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9538) ALC292_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9539) {0x12, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9540) {0x16, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9541) {0x19, 0x01a19030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9542) SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9543) ALC292_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9544) {0x12, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9545) {0x16, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9546) {0x18, 0x02a19031},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9547) {0x19, 0x01a1903e}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9548) SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9549) ALC292_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9550) {0x12, 0x90a60140}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9551) SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9552) ALC292_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9553) {0x13, 0x90a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9554) {0x16, 0x21014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9555) {0x19, 0x21a19030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9556) SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9557) ALC292_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9558) {0x13, 0x90a60140}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9559) SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9560) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9561) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9562) SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9563) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9564) {0x1b, 0x90a70130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9565) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9566) SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9567) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9568) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9569) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9570) SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9571) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9572) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9573) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9574) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9575) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9576) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9577) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9578) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9579) {0x12, 0x90a60120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9580) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9581) {0x21, 0x04211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9582) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9583) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9584) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9585) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9586) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9587) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9588) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9589) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9590) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9591) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9592) {0x21, 0x04211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9593) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9594) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9595) {0x21, 0x04211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9596) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9597) ALC295_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9598) {0x17, 0x21014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9599) {0x18, 0x21a19030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9600) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9601) ALC295_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9602) {0x17, 0x21014040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9603) {0x18, 0x21a19050}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9604) SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9605) ALC295_STANDARD_PINS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9606) SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9607) ALC298_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9608) {0x17, 0x90170110}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9609) SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9610) ALC298_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9611) {0x17, 0x90170140}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9612) SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9613) ALC298_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9614) {0x17, 0x90170150}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9615) SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9616) {0x12, 0xb7a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9617) {0x13, 0xb7a60150},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9618) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9619) {0x1a, 0x03011020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9620) {0x21, 0x03211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9621) SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9622) {0x12, 0xb7a60140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9623) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9624) {0x1a, 0x03a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9625) {0x21, 0x03211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9626) SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9627) ALC225_STANDARD_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9628) {0x12, 0xb7a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9629) {0x17, 0x90170110}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9630) SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9631) {0x14, 0x01014010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9632) {0x17, 0x90170120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9633) {0x18, 0x02a11030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9634) {0x19, 0x02a1103f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9635) {0x21, 0x0221101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9636) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9637) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9639) /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9640) * more machines, don't need to match all valid pins, just need to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9641) * all the pins defined in the tbl. Just because of this reason, it is possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9642) * that a single machine matches multiple tbls, so there is one limitation:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9643) * at most one tbl is allowed to define for the same vendor and same codec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9644) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9645) static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9646) SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9647) {0x19, 0x40000000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9648) {0x1b, 0x40000000}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9649) SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9650) {0x19, 0x40000000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9651) {0x1a, 0x40000000}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9652) SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9653) {0x19, 0x40000000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9654) {0x1a, 0x40000000}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9655) SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9656) {0x19, 0x40000000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9657) {0x1a, 0x40000000}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9658) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9659) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9661) static void alc269_fill_coef(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9663) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9664) int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9666) if (spec->codec_variant != ALC269_TYPE_ALC269VB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9667) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9669) if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9670) alc_write_coef_idx(codec, 0xf, 0x960b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9671) alc_write_coef_idx(codec, 0xe, 0x8817);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9674) if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9675) alc_write_coef_idx(codec, 0xf, 0x960b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9676) alc_write_coef_idx(codec, 0xe, 0x8814);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9679) if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9680) /* Power up output pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9681) alc_update_coef_idx(codec, 0x04, 0, 1<<11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9684) if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9685) val = alc_read_coef_idx(codec, 0xd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9686) if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9687) /* Capless ramp up clock control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9688) alc_write_coef_idx(codec, 0xd, val | (1<<10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9690) val = alc_read_coef_idx(codec, 0x17);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9691) if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9692) /* Class D power on reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9693) alc_write_coef_idx(codec, 0x17, val | (1<<7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9697) /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9698) alc_update_coef_idx(codec, 0x4, 0, 1<<11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9701) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9702) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9703) static int patch_alc269(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9705) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9706) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9708) err = alc_alloc_spec(codec, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9709) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9710) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9712) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9713) spec->gen.shared_mic_vref_pin = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9714) codec->power_save_node = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9716) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9717) codec->patch_ops.suspend = alc269_suspend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9718) codec->patch_ops.resume = alc269_resume;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9719) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9720) spec->shutup = alc_default_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9721) spec->init_hook = alc_default_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9723) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9724) case 0x10ec0269:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9725) spec->codec_variant = ALC269_TYPE_ALC269VA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9726) switch (alc_get_coef0(codec) & 0x00f0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9727) case 0x0010:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9728) if (codec->bus->pci &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9729) codec->bus->pci->subsystem_vendor == 0x1025 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9730) spec->cdefine.platform_type == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9731) err = alc_codec_rename(codec, "ALC271X");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9732) spec->codec_variant = ALC269_TYPE_ALC269VB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9733) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9734) case 0x0020:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9735) if (codec->bus->pci &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9736) codec->bus->pci->subsystem_vendor == 0x17aa &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9737) codec->bus->pci->subsystem_device == 0x21f3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9738) err = alc_codec_rename(codec, "ALC3202");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9739) spec->codec_variant = ALC269_TYPE_ALC269VC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9740) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9741) case 0x0030:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9742) spec->codec_variant = ALC269_TYPE_ALC269VD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9743) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9744) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9745) alc_fix_pll_init(codec, 0x20, 0x04, 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9747) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9748) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9749) spec->shutup = alc269_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9750) spec->init_hook = alc269_fill_coef;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9751) alc269_fill_coef(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9752) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9754) case 0x10ec0280:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9755) case 0x10ec0290:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9756) spec->codec_variant = ALC269_TYPE_ALC280;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9757) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9758) case 0x10ec0282:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9759) spec->codec_variant = ALC269_TYPE_ALC282;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9760) spec->shutup = alc282_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9761) spec->init_hook = alc282_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9762) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9763) case 0x10ec0233:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9764) case 0x10ec0283:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9765) spec->codec_variant = ALC269_TYPE_ALC283;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9766) spec->shutup = alc283_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9767) spec->init_hook = alc283_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9768) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9769) case 0x10ec0284:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9770) case 0x10ec0292:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9771) spec->codec_variant = ALC269_TYPE_ALC284;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9772) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9773) case 0x10ec0293:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9774) spec->codec_variant = ALC269_TYPE_ALC293;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9775) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9776) case 0x10ec0286:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9777) case 0x10ec0288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9778) spec->codec_variant = ALC269_TYPE_ALC286;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9779) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9780) case 0x10ec0298:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9781) spec->codec_variant = ALC269_TYPE_ALC298;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9782) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9783) case 0x10ec0235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9784) case 0x10ec0255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9785) spec->codec_variant = ALC269_TYPE_ALC255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9786) spec->shutup = alc256_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9787) spec->init_hook = alc256_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9788) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9789) case 0x10ec0230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9790) case 0x10ec0236:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9791) case 0x10ec0256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9792) spec->codec_variant = ALC269_TYPE_ALC256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9793) spec->shutup = alc256_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9794) spec->init_hook = alc256_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9795) spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9796) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9797) case 0x10ec0257:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9798) spec->codec_variant = ALC269_TYPE_ALC257;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9799) spec->shutup = alc256_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9800) spec->init_hook = alc256_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9801) spec->gen.mixer_nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9802) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9803) case 0x10ec0215:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9804) case 0x10ec0245:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9805) case 0x10ec0285:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9806) case 0x10ec0287:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9807) case 0x10ec0289:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9808) spec->codec_variant = ALC269_TYPE_ALC215;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9809) spec->shutup = alc225_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9810) spec->init_hook = alc225_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9811) spec->gen.mixer_nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9812) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9813) case 0x10ec0225:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9814) case 0x10ec0295:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9815) case 0x10ec0299:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9816) spec->codec_variant = ALC269_TYPE_ALC225;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9817) spec->shutup = alc225_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9818) spec->init_hook = alc225_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9819) spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9820) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9821) case 0x10ec0234:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9822) case 0x10ec0274:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9823) case 0x10ec0294:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9824) spec->codec_variant = ALC269_TYPE_ALC294;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9825) spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9826) alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9827) spec->init_hook = alc294_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9828) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9829) case 0x10ec0300:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9830) spec->codec_variant = ALC269_TYPE_ALC300;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9831) spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9832) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9833) case 0x10ec0623:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9834) spec->codec_variant = ALC269_TYPE_ALC623;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9835) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9836) case 0x10ec0700:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9837) case 0x10ec0701:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9838) case 0x10ec0703:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9839) case 0x10ec0711:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9840) spec->codec_variant = ALC269_TYPE_ALC700;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9841) spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9842) alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9843) spec->init_hook = alc294_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9844) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9848) if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9849) spec->has_alc5505_dsp = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9850) spec->init_hook = alc5505_dsp_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9853) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9855) snd_hda_pick_fixup(codec, alc269_fixup_models,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9856) alc269_fixup_tbl, alc269_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9857) /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9858) * the quirk breaks the latter (bko#214101).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9859) * Clear the wrong entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9860) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9861) if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9862) codec->core.vendor_id == 0x10ec0294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9863) codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9864) codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9867) snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9868) snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9869) snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9870) alc269_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9871) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9873) alc_auto_parse_customize_define(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9875) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9876) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9878) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9879) err = alc269_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9880) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9881) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9883) if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9884) err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9885) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9886) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9889) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9891) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9893) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9894) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9895) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9898) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9899) * ALC861
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9900) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9902) static int alc861_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9904) static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9905) static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9906) return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9909) /* Pin config fixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9910) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9911) ALC861_FIXUP_FSC_AMILO_PI1505,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9912) ALC861_FIXUP_AMP_VREF_0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9913) ALC861_FIXUP_NO_JACK_DETECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9914) ALC861_FIXUP_ASUS_A6RP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9915) ALC660_FIXUP_ASUS_W7J,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9916) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9918) /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9919) static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9920) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9921) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9922) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9923) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9925) if (action != HDA_FIXUP_ACT_INIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9926) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9927) val = snd_hda_codec_get_pin_target(codec, 0x0f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9928) if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9929) val |= AC_PINCTL_IN_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9930) val |= AC_PINCTL_VREF_50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9931) snd_hda_set_pin_ctl(codec, 0x0f, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9932) spec->gen.keep_vref_in_automute = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9935) /* suppress the jack-detection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9936) static void alc_fixup_no_jack_detect(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9937) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9938) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9939) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9940) codec->no_jack_detect = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9943) static const struct hda_fixup alc861_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9944) [ALC861_FIXUP_FSC_AMILO_PI1505] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9945) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9946) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9947) { 0x0b, 0x0221101f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9948) { 0x0f, 0x90170310 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9949) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9951) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9952) [ALC861_FIXUP_AMP_VREF_0F] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9953) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9954) .v.func = alc861_fixup_asus_amp_vref_0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9955) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9956) [ALC861_FIXUP_NO_JACK_DETECT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9957) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9958) .v.func = alc_fixup_no_jack_detect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9959) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9960) [ALC861_FIXUP_ASUS_A6RP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9961) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9962) .v.func = alc861_fixup_asus_amp_vref_0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9963) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9964) .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9965) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9966) [ALC660_FIXUP_ASUS_W7J] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9967) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9968) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9969) /* ASUS W7J needs a magic pin setup on unused NID 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9970) * for enabling outputs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9971) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9972) {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9973) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9974) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9976) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9978) static const struct snd_pci_quirk alc861_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9979) SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9980) SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9981) SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9982) SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9983) SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9984) SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9985) SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9986) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9987) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9989) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9990) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9991) static int patch_alc861(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9992) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9993) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9994) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9996) err = alc_alloc_spec(codec, 0x15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9997) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9998) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10000) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10001) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10002) spec->gen.beep_nid = 0x23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10004) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10005) spec->power_hook = alc_power_eapd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10006) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10008) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10010) snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10011) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10013) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10014) err = alc861_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10015) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10016) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10018) if (!spec->gen.no_analog) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10019) err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10020) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10021) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10024) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10026) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10028) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10029) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10030) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10033) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10034) * ALC861-VD support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10035) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10036) * Based on ALC882
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10037) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10038) * In addition, an independent DAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10039) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10040) static int alc861vd_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10042) static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10043) static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10044) return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10047) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10048) ALC660VD_FIX_ASUS_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10049) ALC861VD_FIX_DALLAS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10050) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10052) /* exclude VREF80 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10053) static void alc861vd_fixup_dallas(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10054) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10055) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10056) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10057) snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10058) snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10062) /* reset GPIO1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10063) static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10064) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10065) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10066) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10068) if (action == HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10069) spec->gpio_mask |= 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10070) alc_fixup_gpio(codec, action, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10073) static const struct hda_fixup alc861vd_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10074) [ALC660VD_FIX_ASUS_GPIO1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10075) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10076) .v.func = alc660vd_fixup_asus_gpio1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10077) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10078) [ALC861VD_FIX_DALLAS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10079) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10080) .v.func = alc861vd_fixup_dallas,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10081) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10082) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10084) static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10085) SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10086) SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10087) SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10088) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10089) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10091) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10092) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10093) static int patch_alc861vd(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10094) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10095) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10096) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10098) err = alc_alloc_spec(codec, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10099) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10100) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10102) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10103) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10104) spec->gen.beep_nid = 0x23;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10106) spec->shutup = alc_eapd_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10108) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10110) snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10111) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10113) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10114) err = alc861vd_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10115) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10116) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10118) if (!spec->gen.no_analog) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10119) err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10120) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10121) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10124) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10126) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10128) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10129) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10130) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10133) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10134) * ALC662 support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10135) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10136) * ALC662 is almost identical with ALC880 but has cleaner and more flexible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10137) * configuration. Each pin widget can choose any input DACs and a mixer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10138) * Each ADC is connected from a mixer of all inputs. This makes possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10139) * 6-channel independent captures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10140) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10141) * In addition, an independent DAC for the multi-playback (not used in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10142) * driver yet).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10143) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10145) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10146) * BIOS auto configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10147) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10149) static int alc662_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10151) static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10152) static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10153) static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10154) const hda_nid_t *ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10156) if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10157) codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10158) codec->core.vendor_id == 0x10ec0671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10159) ssids = alc663_ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10160) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10161) ssids = alc662_ssids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10162) return alc_parse_auto_config(codec, alc662_ignore, ssids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10165) static void alc272_fixup_mario(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10166) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10168) if (action != HDA_FIXUP_ACT_PRE_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10169) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10170) if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10171) (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10172) (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10173) (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10174) (0 << AC_AMPCAP_MUTE_SHIFT)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10175) codec_warn(codec, "failed to override amp caps for NID 0x2\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10178) static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10179) { .channels = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10180) .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10181) { .channels = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10182) .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10183) SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10184) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10187) /* override the 2.1 chmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10188) static void alc_fixup_bass_chmap(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10189) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10191) if (action == HDA_FIXUP_ACT_BUILD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10192) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10193) spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10197) /* avoid D3 for keeping GPIO up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10198) static unsigned int gpio_led_power_filter(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10199) hda_nid_t nid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10200) unsigned int power_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10202) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10203) if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10204) return AC_PWRST_D0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10205) return power_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10208) static void alc662_fixup_led_gpio1(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10209) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10211) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10213) alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10214) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10215) spec->mute_led_polarity = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10216) codec->power_filter = gpio_led_power_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10220) static void alc662_usi_automute_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10221) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10223) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10224) int vref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10225) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10226) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10228) vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10229) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10230) snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10231) vref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10234) static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10235) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10237) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10238) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10239) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10240) spec->gen.hp_automute_hook = alc662_usi_automute_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10244) static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10245) struct hda_jack_callback *cb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10247) /* surround speakers at 0x1b already get muted automatically when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10248) * headphones are plugged in, but we have to mute/unmute the remaining
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10249) * channels manually:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10250) * 0x15 - front left/front right
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10251) * 0x18 - front center/ LFE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10252) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10253) if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10254) snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10255) snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10256) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10257) snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10258) snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10262) static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10263) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10265) /* Pin 0x1b: shared headphones jack and surround speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10266) if (!is_jack_detectable(codec, 0x1b))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10267) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10269) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10270) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10271) snd_hda_jack_detect_enable_callback(codec, 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10272) alc662_aspire_ethos_mute_speakers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10273) /* subwoofer needs an extra GPIO setting to become audible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10274) alc_setup_gpio(codec, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10275) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10276) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10277) /* Make sure to start in a correct state, i.e. if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10278) * headphones have been plugged in before powering up the system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10279) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10280) alc662_aspire_ethos_mute_speakers(codec, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10281) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10285) static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10286) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10288) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10290) static const struct hda_pintbl pincfgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10291) { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10292) { 0x1b, 0x0181304f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10293) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10294) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10296) switch (action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10297) case HDA_FIXUP_ACT_PRE_PROBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10298) spec->gen.mixer_nid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10299) spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10300) snd_hda_apply_pincfgs(codec, pincfgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10301) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10302) case HDA_FIXUP_ACT_INIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10303) alc_write_coef_idx(codec, 0x19, 0xa054);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10304) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10308) static void alc897_hp_automute_hook(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10309) struct hda_jack_callback *jack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10311) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10312) int vref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10314) snd_hda_gen_hp_automute(codec, jack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10315) vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10316) snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10317) vref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10320) static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10321) const struct hda_fixup *fix, int action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10323) struct alc_spec *spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10324) if (action == HDA_FIXUP_ACT_PRE_PROBE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10325) spec->gen.hp_automute_hook = alc897_hp_automute_hook;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10329) static const struct coef_fw alc668_coefs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10330) WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10331) WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10332) WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10333) WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10334) WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10335) WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10336) WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10337) WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10338) WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10339) WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10340) WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10341) WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10342) WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10343) WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10344) WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10345) WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10346) WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10347) WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10348) WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10349) WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10350) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10351) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10353) static void alc668_restore_default_value(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10355) alc_process_coef_fw(codec, alc668_coefs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10358) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10359) ALC662_FIXUP_ASPIRE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10360) ALC662_FIXUP_LED_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10361) ALC662_FIXUP_IDEAPAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10362) ALC272_FIXUP_MARIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10363) ALC662_FIXUP_CZC_ET26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10364) ALC662_FIXUP_CZC_P10T,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10365) ALC662_FIXUP_SKU_IGNORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10366) ALC662_FIXUP_HP_RP5800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10367) ALC662_FIXUP_ASUS_MODE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10368) ALC662_FIXUP_ASUS_MODE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10369) ALC662_FIXUP_ASUS_MODE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10370) ALC662_FIXUP_ASUS_MODE4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10371) ALC662_FIXUP_ASUS_MODE5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10372) ALC662_FIXUP_ASUS_MODE6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10373) ALC662_FIXUP_ASUS_MODE7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10374) ALC662_FIXUP_ASUS_MODE8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10375) ALC662_FIXUP_NO_JACK_DETECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10376) ALC662_FIXUP_ZOTAC_Z68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10377) ALC662_FIXUP_INV_DMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10378) ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10379) ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10380) ALC662_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10381) ALC668_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10382) ALC662_FIXUP_BASS_MODE4_CHMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10383) ALC662_FIXUP_BASS_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10384) ALC662_FIXUP_BASS_1A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10385) ALC662_FIXUP_BASS_CHMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10386) ALC668_FIXUP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10387) ALC668_FIXUP_DELL_DISABLE_AAMIX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10388) ALC668_FIXUP_DELL_XPS13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10389) ALC662_FIXUP_ASUS_Nx50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10390) ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10391) ALC668_FIXUP_ASUS_Nx51,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10392) ALC668_FIXUP_MIC_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10393) ALC668_FIXUP_ASUS_G751,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10394) ALC891_FIXUP_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10395) ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10396) ALC662_FIXUP_ACER_VERITON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10397) ALC892_FIXUP_ASROCK_MOBO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10398) ALC662_FIXUP_USI_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10399) ALC662_FIXUP_USI_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10400) ALC662_FIXUP_LENOVO_MULTI_CODECS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10401) ALC669_FIXUP_ACER_ASPIRE_ETHOS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10402) ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10403) ALC671_FIXUP_HP_HEADSET_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10404) ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10405) ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10406) ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10407) ALC668_FIXUP_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10408) ALC668_FIXUP_MIC_DET_COEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10409) ALC897_FIXUP_LENOVO_HEADSET_MIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10410) ALC897_FIXUP_HEADSET_MIC_PIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10411) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10413) static const struct hda_fixup alc662_fixups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10414) [ALC662_FIXUP_ASPIRE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10415) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10416) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10417) { 0x15, 0x99130112 }, /* subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10418) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10420) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10421) [ALC662_FIXUP_LED_GPIO1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10422) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10423) .v.func = alc662_fixup_led_gpio1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10424) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10425) [ALC662_FIXUP_IDEAPAD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10426) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10427) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10428) { 0x17, 0x99130112 }, /* subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10429) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10430) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10431) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10432) .chain_id = ALC662_FIXUP_LED_GPIO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10433) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10434) [ALC272_FIXUP_MARIO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10435) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10436) .v.func = alc272_fixup_mario,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10437) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10438) [ALC662_FIXUP_CZC_ET26] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10439) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10440) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10441) {0x12, 0x403cc000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10442) {0x14, 0x90170110}, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10443) {0x15, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10444) {0x16, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10445) {0x18, 0x01a19030}, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10446) {0x19, 0x90a7013f}, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10447) {0x1a, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10448) {0x1b, 0x0121401f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10449) {0x1c, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10450) {0x1d, 0x411111f0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10451) {0x1e, 0x40478e35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10452) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10453) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10454) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10455) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10456) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10457) [ALC662_FIXUP_CZC_P10T] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10458) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10459) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10460) {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10461) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10463) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10464) [ALC662_FIXUP_SKU_IGNORE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10465) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10466) .v.func = alc_fixup_sku_ignore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10467) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10468) [ALC662_FIXUP_HP_RP5800] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10469) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10470) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10471) { 0x14, 0x0221201f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10472) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10473) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10474) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10475) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10476) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10477) [ALC662_FIXUP_ASUS_MODE1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10478) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10479) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10480) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10481) { 0x18, 0x01a19c20 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10482) { 0x19, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10483) { 0x21, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10484) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10485) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10486) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10487) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10488) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10489) [ALC662_FIXUP_ASUS_MODE2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10490) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10491) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10492) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10493) { 0x18, 0x01a19820 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10494) { 0x19, 0x99a3092f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10495) { 0x1b, 0x0121401f }, /* HP out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10496) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10497) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10498) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10499) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10500) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10501) [ALC662_FIXUP_ASUS_MODE3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10502) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10503) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10504) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10505) { 0x15, 0x0121441f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10506) { 0x18, 0x01a19840 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10507) { 0x19, 0x99a3094f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10508) { 0x21, 0x01211420 }, /* HP2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10509) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10510) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10511) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10512) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10513) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10514) [ALC662_FIXUP_ASUS_MODE4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10515) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10516) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10517) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10518) { 0x16, 0x99130111 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10519) { 0x18, 0x01a19840 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10520) { 0x19, 0x99a3094f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10521) { 0x21, 0x0121441f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10522) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10523) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10524) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10525) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10526) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10527) [ALC662_FIXUP_ASUS_MODE5] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10528) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10529) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10530) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10531) { 0x15, 0x0121441f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10532) { 0x16, 0x99130111 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10533) { 0x18, 0x01a19840 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10534) { 0x19, 0x99a3094f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10535) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10536) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10537) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10538) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10539) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10540) [ALC662_FIXUP_ASUS_MODE6] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10541) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10542) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10543) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10544) { 0x15, 0x01211420 }, /* HP2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10545) { 0x18, 0x01a19840 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10546) { 0x19, 0x99a3094f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10547) { 0x1b, 0x0121441f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10548) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10549) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10550) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10551) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10552) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10553) [ALC662_FIXUP_ASUS_MODE7] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10554) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10555) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10556) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10557) { 0x17, 0x99130111 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10558) { 0x18, 0x01a19840 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10559) { 0x19, 0x99a3094f }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10560) { 0x1b, 0x01214020 }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10561) { 0x21, 0x0121401f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10562) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10563) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10564) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10565) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10566) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10567) [ALC662_FIXUP_ASUS_MODE8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10568) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10569) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10570) { 0x14, 0x99130110 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10571) { 0x12, 0x99a30970 }, /* int-mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10572) { 0x15, 0x01214020 }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10573) { 0x17, 0x99130111 }, /* speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10574) { 0x18, 0x01a19840 }, /* mic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10575) { 0x21, 0x0121401f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10576) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10577) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10578) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10579) .chain_id = ALC662_FIXUP_SKU_IGNORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10580) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10581) [ALC662_FIXUP_NO_JACK_DETECT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10582) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10583) .v.func = alc_fixup_no_jack_detect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10584) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10585) [ALC662_FIXUP_ZOTAC_Z68] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10586) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10587) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10588) { 0x1b, 0x02214020 }, /* Front HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10589) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10591) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10592) [ALC662_FIXUP_INV_DMIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10593) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10594) .v.func = alc_fixup_inv_dmic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10595) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10596) [ALC668_FIXUP_DELL_XPS13] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10597) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10598) .v.func = alc_fixup_dell_xps13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10599) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10600) .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10601) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10602) [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10603) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10604) .v.func = alc_fixup_disable_aamix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10605) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10606) .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10607) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10608) [ALC668_FIXUP_AUTO_MUTE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10609) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10610) .v.func = alc_fixup_auto_mute_via_amp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10611) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10612) .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10613) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10614) [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10615) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10616) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10617) { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10618) /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10619) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10620) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10621) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10622) .chain_id = ALC662_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10623) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10624) [ALC662_FIXUP_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10625) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10626) .v.func = alc_fixup_headset_mode_alc662,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10627) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10628) [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10629) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10630) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10631) { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10632) { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10633) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10634) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10635) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10636) .chain_id = ALC668_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10637) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10638) [ALC668_FIXUP_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10639) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10640) .v.func = alc_fixup_headset_mode_alc668,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10641) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10642) [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10643) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10644) .v.func = alc_fixup_bass_chmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10645) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10646) .chain_id = ALC662_FIXUP_ASUS_MODE4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10647) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10648) [ALC662_FIXUP_BASS_16] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10649) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10650) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10651) {0x16, 0x80106111}, /* bass speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10652) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10653) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10654) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10655) .chain_id = ALC662_FIXUP_BASS_CHMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10656) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10657) [ALC662_FIXUP_BASS_1A] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10658) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10659) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10660) {0x1a, 0x80106111}, /* bass speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10661) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10662) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10663) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10664) .chain_id = ALC662_FIXUP_BASS_CHMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10665) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10666) [ALC662_FIXUP_BASS_CHMAP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10667) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10668) .v.func = alc_fixup_bass_chmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10669) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10670) [ALC662_FIXUP_ASUS_Nx50] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10671) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10672) .v.func = alc_fixup_auto_mute_via_amp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10673) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10674) .chain_id = ALC662_FIXUP_BASS_1A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10675) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10676) [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10677) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10678) .v.func = alc_fixup_headset_mode_alc668,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10679) .chain_id = ALC662_FIXUP_BASS_CHMAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10680) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10681) [ALC668_FIXUP_ASUS_Nx51] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10682) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10683) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10684) { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10685) { 0x1a, 0x90170151 }, /* bass speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10686) { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10687) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10688) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10689) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10690) .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10691) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10692) [ALC668_FIXUP_MIC_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10693) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10694) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10695) { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10696) { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10697) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10698) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10699) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10700) [ALC668_FIXUP_ASUS_G751] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10701) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10702) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10703) { 0x16, 0x0421101f }, /* HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10704) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10705) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10706) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10707) .chain_id = ALC668_FIXUP_MIC_COEF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10708) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10709) [ALC891_FIXUP_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10710) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10711) .v.func = alc_fixup_headset_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10712) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10713) [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10714) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10715) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10716) { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10717) { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10718) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10719) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10720) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10721) .chain_id = ALC891_FIXUP_HEADSET_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10722) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10723) [ALC662_FIXUP_ACER_VERITON] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10724) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10725) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10726) { 0x15, 0x50170120 }, /* no internal speaker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10727) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10729) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10730) [ALC892_FIXUP_ASROCK_MOBO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10731) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10732) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10733) { 0x15, 0x40f000f0 }, /* disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10734) { 0x16, 0x40f000f0 }, /* disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10735) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10737) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10738) [ALC662_FIXUP_USI_FUNC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10739) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10740) .v.func = alc662_fixup_usi_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10741) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10742) [ALC662_FIXUP_USI_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10743) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10744) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10745) { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10746) { 0x18, 0x01a1903d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10747) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10748) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10749) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10750) .chain_id = ALC662_FIXUP_USI_FUNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10751) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10752) [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10753) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10754) .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10755) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10756) [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10757) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10758) .v.func = alc662_fixup_aspire_ethos_hp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10759) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10760) [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10761) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10762) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10763) { 0x15, 0x92130110 }, /* front speakers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10764) { 0x18, 0x99130111 }, /* center/subwoofer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10765) { 0x1b, 0x11130012 }, /* surround plus jack for HP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10766) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10767) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10768) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10769) .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10770) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10771) [ALC671_FIXUP_HP_HEADSET_MIC2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10772) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10773) .v.func = alc671_fixup_hp_headset_mic2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10774) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10775) [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10776) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10777) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10778) { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10779) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10780) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10781) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10782) .chain_id = ALC662_FIXUP_USI_FUNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10783) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10784) [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10785) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10786) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10787) { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10788) { 0x1b, 0x0221144f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10789) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10790) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10791) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10792) .chain_id = ALC662_FIXUP_USI_FUNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10793) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10794) [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10795) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10796) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10797) { 0x1b, 0x04a1112c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10798) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10799) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10800) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10801) .chain_id = ALC668_FIXUP_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10802) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10803) [ALC668_FIXUP_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10804) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10805) .v.func = alc269_fixup_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10806) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10807) .chain_id = ALC668_FIXUP_MIC_DET_COEF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10808) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10809) [ALC668_FIXUP_MIC_DET_COEF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10810) .type = HDA_FIXUP_VERBS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10811) .v.verbs = (const struct hda_verb[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10812) { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10813) { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10814) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10815) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10816) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10817) [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10818) .type = HDA_FIXUP_FUNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10819) .v.func = alc897_fixup_lenovo_headset_mic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10820) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10821) [ALC897_FIXUP_HEADSET_MIC_PIN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10822) .type = HDA_FIXUP_PINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10823) .v.pins = (const struct hda_pintbl[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10824) { 0x1a, 0x03a11050 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10825) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10826) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10827) .chained = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10828) .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10829) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10830) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10832) static const struct snd_pci_quirk alc662_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10833) SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10834) SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10835) SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10836) SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10837) SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10838) SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10839) SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10840) SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10841) SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10842) SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10843) SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10844) SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10845) SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10846) SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10847) SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10848) SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10849) SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10850) SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10851) SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10852) SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10853) SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10854) SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10855) SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10856) SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10857) SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10858) SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10859) SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10860) SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10861) SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10862) SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10863) SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10864) SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10865) SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10866) SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10867) SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10868) SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10869) SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10870) SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10871) SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10872) SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10873) SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10874) SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10875) SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10876) SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10877) SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10878) SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10879) SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10880) SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10881) SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10882) SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10883) SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10884) SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10885) SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10887) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10888) /* Below is a quirk table taken from the old code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10889) * Basically the device should work as is without the fixup table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10890) * If BIOS doesn't give a proper info, enable the corresponding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10891) * fixup entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10892) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10893) SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10894) SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10895) SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10896) SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10897) SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10898) SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10899) SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10900) SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10901) SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10902) SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10903) SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10904) SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10905) SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10906) SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10907) SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10908) SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10909) SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10910) SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10911) SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10912) SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10913) SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10914) SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10915) SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10916) SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10917) SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10918) SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10919) SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10920) SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10921) SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10922) SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10923) SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10924) SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10925) SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10926) SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10927) SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10928) SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10929) SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10930) SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10931) SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10932) SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10933) SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10934) SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10935) SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10936) SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10937) SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10938) SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10939) SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10940) SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10941) SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10942) SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10943) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10944) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10945) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10947) static const struct hda_model_fixup alc662_fixup_models[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10948) {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10949) {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10950) {.id = ALC272_FIXUP_MARIO, .name = "mario"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10951) {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10952) {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10953) {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10954) {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10955) {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10956) {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10957) {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10958) {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10959) {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10960) {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10961) {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10962) {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10963) {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10964) {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10965) {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10966) {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10967) {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10968) {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10969) {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10970) {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10971) {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10972) {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10973) {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10974) {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10975) {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10976) {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10977) {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10978) {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10979) {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10980) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10981) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10983) static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10984) SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10985) {0x17, 0x02211010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10986) {0x18, 0x01a19030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10987) {0x1a, 0x01813040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10988) {0x21, 0x01014020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10989) SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10990) {0x16, 0x01813030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10991) {0x17, 0x02211010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10992) {0x18, 0x01a19040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10993) {0x21, 0x01014020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10994) SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10995) {0x14, 0x01014010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10996) {0x18, 0x01a19020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10997) {0x1a, 0x0181302f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10998) {0x1b, 0x0221401f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10999) SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11000) {0x12, 0x99a30130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11001) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11002) {0x15, 0x0321101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11003) {0x16, 0x03011020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11004) SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11005) {0x12, 0x99a30140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11006) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11007) {0x15, 0x0321101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11008) {0x16, 0x03011020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11009) SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11010) {0x12, 0x99a30150},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11011) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11012) {0x15, 0x0321101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11013) {0x16, 0x03011020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11014) SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11015) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11016) {0x15, 0x0321101f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11017) {0x16, 0x03011020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11018) SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11019) {0x12, 0x90a60130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11020) {0x14, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11021) {0x15, 0x0321101f}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11022) SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11023) {0x14, 0x01014010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11024) {0x17, 0x90170150},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11025) {0x19, 0x02a11060},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11026) {0x1b, 0x01813030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11027) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11028) SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11029) {0x14, 0x01014010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11030) {0x18, 0x01a19040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11031) {0x1b, 0x01813030},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11032) {0x21, 0x02211020}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11033) SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11034) {0x14, 0x01014020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11035) {0x17, 0x90170110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11036) {0x18, 0x01a19050},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11037) {0x1b, 0x01813040},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11038) {0x21, 0x02211030}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11039) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11040) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11042) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11043) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11044) static int patch_alc662(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11045) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11046) struct alc_spec *spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11047) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11049) err = alc_alloc_spec(codec, 0x0b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11050) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11051) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11053) spec = codec->spec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11055) spec->shutup = alc_eapd_shutup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11057) /* handle multiple HPs as is */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11058) spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11060) alc_fix_pll_init(codec, 0x20, 0x04, 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11062) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11063) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11064) spec->init_hook = alc668_restore_default_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11065) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11068) alc_pre_init(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11070) snd_hda_pick_fixup(codec, alc662_fixup_models,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11071) alc662_fixup_tbl, alc662_fixups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11072) snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11073) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11075) alc_auto_parse_customize_define(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11077) if (has_cdefine_beep(codec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11078) spec->gen.beep_nid = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11080) if ((alc_get_coef0(codec) & (1 << 14)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11081) codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11082) spec->cdefine.platform_type == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11083) err = alc_codec_rename(codec, "ALC272X");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11084) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11085) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11088) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11089) err = alc662_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11090) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11091) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11093) if (!spec->gen.no_analog && spec->gen.beep_nid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11094) switch (codec->core.vendor_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11095) case 0x10ec0662:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11096) err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11097) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11098) case 0x10ec0272:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11099) case 0x10ec0663:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11100) case 0x10ec0665:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11101) case 0x10ec0668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11102) err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11103) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11104) case 0x10ec0273:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11105) err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11106) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11108) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11109) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11112) snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11114) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11116) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11117) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11118) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11121) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11122) * ALC680 support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11123) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11125) static int alc680_parse_auto_config(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11127) return alc_parse_auto_config(codec, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11131) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11132) static int patch_alc680(struct hda_codec *codec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11134) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11136) /* ALC680 has no aa-loopback mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11137) err = alc_alloc_spec(codec, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11138) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11139) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11141) /* automatic parse from the BIOS config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11142) err = alc680_parse_auto_config(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11143) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11144) alc_free(codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11145) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11148) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11151) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11152) * patch entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11154) static const struct hda_device_id snd_hda_id_realtek[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11155) HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11156) HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11157) HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11158) HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11159) HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11160) HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11161) HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11162) HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11163) HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11164) HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11165) HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11166) HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11167) HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11168) HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11169) HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11170) HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11171) HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11172) HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11173) HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11174) HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11175) HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11176) HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11177) HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11178) HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11179) HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11180) HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11181) HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11182) HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11183) HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11184) HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11185) HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11186) HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11187) HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11188) HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11189) HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11190) HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11191) HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11192) HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11193) HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11194) HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11195) HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11196) HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11197) HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11198) HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11199) HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11200) HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11201) HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11202) HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11203) HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11204) HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11205) HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11206) HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11207) HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11208) HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11209) HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11210) HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11211) HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11212) HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11213) HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11214) HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11215) HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11216) HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11217) HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11218) HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11219) HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11220) HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11221) HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11222) HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11223) HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11224) HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11225) HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11226) HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11227) HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11228) HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11229) HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11230) HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11231) HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11232) HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11233) {} /* terminator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11234) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11235) MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11237) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11238) MODULE_DESCRIPTION("Realtek HD-audio codec");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11240) static struct hda_codec_driver realtek_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11241) .id = snd_hda_id_realtek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11242) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11244) module_hda_codec_driver(realtek_driver);