162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Universal Interface for Intel High Definition Audio Codec 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * HD audio interface patch for SigmaTel STAC92xx 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2005 Embedded Alley Solutions, Inc. 862306a36Sopenharmony_ci * Matt Porter <mporter@embeddedalley.com> 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Based on patch_cmedia.c and patch_realtek.c 1162306a36Sopenharmony_ci * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de> 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/init.h> 1562306a36Sopenharmony_ci#include <linux/delay.h> 1662306a36Sopenharmony_ci#include <linux/slab.h> 1762306a36Sopenharmony_ci#include <linux/pci.h> 1862306a36Sopenharmony_ci#include <linux/dmi.h> 1962306a36Sopenharmony_ci#include <linux/module.h> 2062306a36Sopenharmony_ci#include <sound/core.h> 2162306a36Sopenharmony_ci#include <sound/jack.h> 2262306a36Sopenharmony_ci#include <sound/hda_codec.h> 2362306a36Sopenharmony_ci#include "hda_local.h" 2462306a36Sopenharmony_ci#include "hda_auto_parser.h" 2562306a36Sopenharmony_ci#include "hda_beep.h" 2662306a36Sopenharmony_ci#include "hda_jack.h" 2762306a36Sopenharmony_ci#include "hda_generic.h" 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cienum { 3062306a36Sopenharmony_ci STAC_REF, 3162306a36Sopenharmony_ci STAC_9200_OQO, 3262306a36Sopenharmony_ci STAC_9200_DELL_D21, 3362306a36Sopenharmony_ci STAC_9200_DELL_D22, 3462306a36Sopenharmony_ci STAC_9200_DELL_D23, 3562306a36Sopenharmony_ci STAC_9200_DELL_M21, 3662306a36Sopenharmony_ci STAC_9200_DELL_M22, 3762306a36Sopenharmony_ci STAC_9200_DELL_M23, 3862306a36Sopenharmony_ci STAC_9200_DELL_M24, 3962306a36Sopenharmony_ci STAC_9200_DELL_M25, 4062306a36Sopenharmony_ci STAC_9200_DELL_M26, 4162306a36Sopenharmony_ci STAC_9200_DELL_M27, 4262306a36Sopenharmony_ci STAC_9200_M4, 4362306a36Sopenharmony_ci STAC_9200_M4_2, 4462306a36Sopenharmony_ci STAC_9200_PANASONIC, 4562306a36Sopenharmony_ci STAC_9200_EAPD_INIT, 4662306a36Sopenharmony_ci STAC_9200_MODELS 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum { 5062306a36Sopenharmony_ci STAC_9205_REF, 5162306a36Sopenharmony_ci STAC_9205_DELL_M42, 5262306a36Sopenharmony_ci STAC_9205_DELL_M43, 5362306a36Sopenharmony_ci STAC_9205_DELL_M44, 5462306a36Sopenharmony_ci STAC_9205_EAPD, 5562306a36Sopenharmony_ci STAC_9205_MODELS 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cienum { 5962306a36Sopenharmony_ci STAC_92HD73XX_NO_JD, /* no jack-detection */ 6062306a36Sopenharmony_ci STAC_92HD73XX_REF, 6162306a36Sopenharmony_ci STAC_92HD73XX_INTEL, 6262306a36Sopenharmony_ci STAC_DELL_M6_AMIC, 6362306a36Sopenharmony_ci STAC_DELL_M6_DMIC, 6462306a36Sopenharmony_ci STAC_DELL_M6_BOTH, 6562306a36Sopenharmony_ci STAC_DELL_EQ, 6662306a36Sopenharmony_ci STAC_ALIENWARE_M17X, 6762306a36Sopenharmony_ci STAC_ELO_VUPOINT_15MX, 6862306a36Sopenharmony_ci STAC_92HD89XX_HP_FRONT_JACK, 6962306a36Sopenharmony_ci STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK, 7062306a36Sopenharmony_ci STAC_92HD73XX_ASUS_MOBO, 7162306a36Sopenharmony_ci STAC_92HD73XX_MODELS 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cienum { 7562306a36Sopenharmony_ci STAC_92HD83XXX_REF, 7662306a36Sopenharmony_ci STAC_92HD83XXX_PWR_REF, 7762306a36Sopenharmony_ci STAC_DELL_S14, 7862306a36Sopenharmony_ci STAC_DELL_VOSTRO_3500, 7962306a36Sopenharmony_ci STAC_92HD83XXX_HP_cNB11_INTQUAD, 8062306a36Sopenharmony_ci STAC_HP_DV7_4000, 8162306a36Sopenharmony_ci STAC_HP_ZEPHYR, 8262306a36Sopenharmony_ci STAC_92HD83XXX_HP_LED, 8362306a36Sopenharmony_ci STAC_92HD83XXX_HP_INV_LED, 8462306a36Sopenharmony_ci STAC_92HD83XXX_HP_MIC_LED, 8562306a36Sopenharmony_ci STAC_HP_LED_GPIO10, 8662306a36Sopenharmony_ci STAC_92HD83XXX_HEADSET_JACK, 8762306a36Sopenharmony_ci STAC_92HD83XXX_HP, 8862306a36Sopenharmony_ci STAC_HP_ENVY_BASS, 8962306a36Sopenharmony_ci STAC_HP_BNB13_EQ, 9062306a36Sopenharmony_ci STAC_HP_ENVY_TS_BASS, 9162306a36Sopenharmony_ci STAC_HP_ENVY_TS_DAC_BIND, 9262306a36Sopenharmony_ci STAC_92HD83XXX_GPIO10_EAPD, 9362306a36Sopenharmony_ci STAC_92HD83XXX_MODELS 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cienum { 9762306a36Sopenharmony_ci STAC_92HD71BXX_REF, 9862306a36Sopenharmony_ci STAC_DELL_M4_1, 9962306a36Sopenharmony_ci STAC_DELL_M4_2, 10062306a36Sopenharmony_ci STAC_DELL_M4_3, 10162306a36Sopenharmony_ci STAC_HP_M4, 10262306a36Sopenharmony_ci STAC_HP_DV4, 10362306a36Sopenharmony_ci STAC_HP_DV5, 10462306a36Sopenharmony_ci STAC_HP_HDX, 10562306a36Sopenharmony_ci STAC_92HD71BXX_HP, 10662306a36Sopenharmony_ci STAC_92HD71BXX_NO_DMIC, 10762306a36Sopenharmony_ci STAC_92HD71BXX_NO_SMUX, 10862306a36Sopenharmony_ci STAC_92HD71BXX_MODELS 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cienum { 11262306a36Sopenharmony_ci STAC_92HD95_HP_LED, 11362306a36Sopenharmony_ci STAC_92HD95_HP_BASS, 11462306a36Sopenharmony_ci STAC_92HD95_MODELS 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cienum { 11862306a36Sopenharmony_ci STAC_925x_REF, 11962306a36Sopenharmony_ci STAC_M1, 12062306a36Sopenharmony_ci STAC_M1_2, 12162306a36Sopenharmony_ci STAC_M2, 12262306a36Sopenharmony_ci STAC_M2_2, 12362306a36Sopenharmony_ci STAC_M3, 12462306a36Sopenharmony_ci STAC_M5, 12562306a36Sopenharmony_ci STAC_M6, 12662306a36Sopenharmony_ci STAC_925x_MODELS 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cienum { 13062306a36Sopenharmony_ci STAC_D945_REF, 13162306a36Sopenharmony_ci STAC_D945GTP3, 13262306a36Sopenharmony_ci STAC_D945GTP5, 13362306a36Sopenharmony_ci STAC_INTEL_MAC_V1, 13462306a36Sopenharmony_ci STAC_INTEL_MAC_V2, 13562306a36Sopenharmony_ci STAC_INTEL_MAC_V3, 13662306a36Sopenharmony_ci STAC_INTEL_MAC_V4, 13762306a36Sopenharmony_ci STAC_INTEL_MAC_V5, 13862306a36Sopenharmony_ci STAC_INTEL_MAC_AUTO, 13962306a36Sopenharmony_ci STAC_ECS_202, 14062306a36Sopenharmony_ci STAC_922X_DELL_D81, 14162306a36Sopenharmony_ci STAC_922X_DELL_D82, 14262306a36Sopenharmony_ci STAC_922X_DELL_M81, 14362306a36Sopenharmony_ci STAC_922X_DELL_M82, 14462306a36Sopenharmony_ci STAC_922X_INTEL_MAC_GPIO, 14562306a36Sopenharmony_ci STAC_922X_MODELS 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cienum { 14962306a36Sopenharmony_ci STAC_D965_REF_NO_JD, /* no jack-detection */ 15062306a36Sopenharmony_ci STAC_D965_REF, 15162306a36Sopenharmony_ci STAC_D965_3ST, 15262306a36Sopenharmony_ci STAC_D965_5ST, 15362306a36Sopenharmony_ci STAC_D965_5ST_NO_FP, 15462306a36Sopenharmony_ci STAC_D965_VERBS, 15562306a36Sopenharmony_ci STAC_DELL_3ST, 15662306a36Sopenharmony_ci STAC_DELL_BIOS, 15762306a36Sopenharmony_ci STAC_NEMO_DEFAULT, 15862306a36Sopenharmony_ci STAC_DELL_BIOS_AMIC, 15962306a36Sopenharmony_ci STAC_DELL_BIOS_SPDIF, 16062306a36Sopenharmony_ci STAC_927X_DELL_DMIC, 16162306a36Sopenharmony_ci STAC_927X_VOLKNOB, 16262306a36Sopenharmony_ci STAC_927X_MODELS 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cienum { 16662306a36Sopenharmony_ci STAC_9872_VAIO, 16762306a36Sopenharmony_ci STAC_9872_MODELS 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistruct sigmatel_spec { 17162306a36Sopenharmony_ci struct hda_gen_spec gen; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci unsigned int eapd_switch: 1; 17462306a36Sopenharmony_ci unsigned int linear_tone_beep:1; 17562306a36Sopenharmony_ci unsigned int headset_jack:1; /* 4-pin headset jack (hp + mono mic) */ 17662306a36Sopenharmony_ci unsigned int volknob_init:1; /* special volume-knob initialization */ 17762306a36Sopenharmony_ci unsigned int powerdown_adcs:1; 17862306a36Sopenharmony_ci unsigned int have_spdif_mux:1; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* gpio lines */ 18162306a36Sopenharmony_ci unsigned int eapd_mask; 18262306a36Sopenharmony_ci unsigned int gpio_mask; 18362306a36Sopenharmony_ci unsigned int gpio_dir; 18462306a36Sopenharmony_ci unsigned int gpio_data; 18562306a36Sopenharmony_ci unsigned int gpio_mute; 18662306a36Sopenharmony_ci unsigned int gpio_led; 18762306a36Sopenharmony_ci unsigned int gpio_led_polarity; 18862306a36Sopenharmony_ci unsigned int vref_mute_led_nid; /* pin NID for mute-LED vref control */ 18962306a36Sopenharmony_ci unsigned int vref_led; 19062306a36Sopenharmony_ci int default_polarity; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci unsigned int mic_mute_led_gpio; /* capture mute LED GPIO */ 19362306a36Sopenharmony_ci unsigned int mic_enabled; /* current mic mute state (bitmask) */ 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci /* stream */ 19662306a36Sopenharmony_ci unsigned int stream_delay; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci /* analog loopback */ 19962306a36Sopenharmony_ci const struct snd_kcontrol_new *aloopback_ctl; 20062306a36Sopenharmony_ci unsigned int aloopback; 20162306a36Sopenharmony_ci unsigned char aloopback_mask; 20262306a36Sopenharmony_ci unsigned char aloopback_shift; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci /* power management */ 20562306a36Sopenharmony_ci unsigned int power_map_bits; 20662306a36Sopenharmony_ci unsigned int num_pwrs; 20762306a36Sopenharmony_ci const hda_nid_t *pwr_nids; 20862306a36Sopenharmony_ci unsigned int active_adcs; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci /* beep widgets */ 21162306a36Sopenharmony_ci hda_nid_t anabeep_nid; 21262306a36Sopenharmony_ci bool beep_power_on; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci /* SPDIF-out mux */ 21562306a36Sopenharmony_ci const char * const *spdif_labels; 21662306a36Sopenharmony_ci struct hda_input_mux spdif_mux; 21762306a36Sopenharmony_ci unsigned int cur_smux[2]; 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci#define AC_VERB_IDT_SET_POWER_MAP 0x7ec 22162306a36Sopenharmony_ci#define AC_VERB_IDT_GET_POWER_MAP 0xfec 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistatic const hda_nid_t stac92hd73xx_pwr_nids[8] = { 22462306a36Sopenharmony_ci 0x0a, 0x0b, 0x0c, 0xd, 0x0e, 22562306a36Sopenharmony_ci 0x0f, 0x10, 0x11 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic const hda_nid_t stac92hd83xxx_pwr_nids[7] = { 22962306a36Sopenharmony_ci 0x0a, 0x0b, 0x0c, 0xd, 0x0e, 23062306a36Sopenharmony_ci 0x0f, 0x10 23162306a36Sopenharmony_ci}; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic const hda_nid_t stac92hd71bxx_pwr_nids[3] = { 23462306a36Sopenharmony_ci 0x0a, 0x0d, 0x0f 23562306a36Sopenharmony_ci}; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* 23962306a36Sopenharmony_ci * PCM hooks 24062306a36Sopenharmony_ci */ 24162306a36Sopenharmony_cistatic void stac_playback_pcm_hook(struct hda_pcm_stream *hinfo, 24262306a36Sopenharmony_ci struct hda_codec *codec, 24362306a36Sopenharmony_ci struct snd_pcm_substream *substream, 24462306a36Sopenharmony_ci int action) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 24762306a36Sopenharmony_ci if (action == HDA_GEN_PCM_ACT_OPEN && spec->stream_delay) 24862306a36Sopenharmony_ci msleep(spec->stream_delay); 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic void stac_capture_pcm_hook(struct hda_pcm_stream *hinfo, 25262306a36Sopenharmony_ci struct hda_codec *codec, 25362306a36Sopenharmony_ci struct snd_pcm_substream *substream, 25462306a36Sopenharmony_ci int action) 25562306a36Sopenharmony_ci{ 25662306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 25762306a36Sopenharmony_ci int i, idx = 0; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci if (!spec->powerdown_adcs) 26062306a36Sopenharmony_ci return; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci for (i = 0; i < spec->gen.num_all_adcs; i++) { 26362306a36Sopenharmony_ci if (spec->gen.all_adcs[i] == hinfo->nid) { 26462306a36Sopenharmony_ci idx = i; 26562306a36Sopenharmony_ci break; 26662306a36Sopenharmony_ci } 26762306a36Sopenharmony_ci } 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci switch (action) { 27062306a36Sopenharmony_ci case HDA_GEN_PCM_ACT_OPEN: 27162306a36Sopenharmony_ci msleep(40); 27262306a36Sopenharmony_ci snd_hda_codec_write(codec, hinfo->nid, 0, 27362306a36Sopenharmony_ci AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 27462306a36Sopenharmony_ci spec->active_adcs |= (1 << idx); 27562306a36Sopenharmony_ci break; 27662306a36Sopenharmony_ci case HDA_GEN_PCM_ACT_CLOSE: 27762306a36Sopenharmony_ci snd_hda_codec_write(codec, hinfo->nid, 0, 27862306a36Sopenharmony_ci AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 27962306a36Sopenharmony_ci spec->active_adcs &= ~(1 << idx); 28062306a36Sopenharmony_ci break; 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci/* 28562306a36Sopenharmony_ci * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a 28662306a36Sopenharmony_ci * funky external mute control using GPIO pins. 28762306a36Sopenharmony_ci */ 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic void stac_gpio_set(struct hda_codec *codec, unsigned int mask, 29062306a36Sopenharmony_ci unsigned int dir_mask, unsigned int data) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci unsigned int gpiostate, gpiomask, gpiodir; 29362306a36Sopenharmony_ci hda_nid_t fg = codec->core.afg; 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci codec_dbg(codec, "%s msk %x dir %x gpio %x\n", __func__, mask, dir_mask, data); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci gpiostate = snd_hda_codec_read(codec, fg, 0, 29862306a36Sopenharmony_ci AC_VERB_GET_GPIO_DATA, 0); 29962306a36Sopenharmony_ci gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci gpiomask = snd_hda_codec_read(codec, fg, 0, 30262306a36Sopenharmony_ci AC_VERB_GET_GPIO_MASK, 0); 30362306a36Sopenharmony_ci gpiomask |= mask; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci gpiodir = snd_hda_codec_read(codec, fg, 0, 30662306a36Sopenharmony_ci AC_VERB_GET_GPIO_DIRECTION, 0); 30762306a36Sopenharmony_ci gpiodir |= dir_mask; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci /* Configure GPIOx as CMOS */ 31062306a36Sopenharmony_ci snd_hda_codec_write(codec, fg, 0, 0x7e7, 0); 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci snd_hda_codec_write(codec, fg, 0, 31362306a36Sopenharmony_ci AC_VERB_SET_GPIO_MASK, gpiomask); 31462306a36Sopenharmony_ci snd_hda_codec_read(codec, fg, 0, 31562306a36Sopenharmony_ci AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */ 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci msleep(1); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci snd_hda_codec_read(codec, fg, 0, 32062306a36Sopenharmony_ci AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci/* hook for controlling mic-mute LED GPIO */ 32462306a36Sopenharmony_cistatic int stac_capture_led_update(struct led_classdev *led_cdev, 32562306a36Sopenharmony_ci enum led_brightness brightness) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 32862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci if (brightness) 33162306a36Sopenharmony_ci spec->gpio_data |= spec->mic_mute_led_gpio; 33262306a36Sopenharmony_ci else 33362306a36Sopenharmony_ci spec->gpio_data &= ~spec->mic_mute_led_gpio; 33462306a36Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 33562306a36Sopenharmony_ci return 0; 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic int stac_vrefout_set(struct hda_codec *codec, 33962306a36Sopenharmony_ci hda_nid_t nid, unsigned int new_vref) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci int error, pinctl; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci codec_dbg(codec, "%s, nid %x ctl %x\n", __func__, nid, new_vref); 34462306a36Sopenharmony_ci pinctl = snd_hda_codec_read(codec, nid, 0, 34562306a36Sopenharmony_ci AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci if (pinctl < 0) 34862306a36Sopenharmony_ci return pinctl; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci pinctl &= 0xff; 35162306a36Sopenharmony_ci pinctl &= ~AC_PINCTL_VREFEN; 35262306a36Sopenharmony_ci pinctl |= (new_vref & AC_PINCTL_VREFEN); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci error = snd_hda_set_pin_ctl_cache(codec, nid, pinctl); 35562306a36Sopenharmony_ci if (error < 0) 35662306a36Sopenharmony_ci return error; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci return 1; 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci/* prevent codec AFG to D3 state when vref-out pin is used for mute LED */ 36262306a36Sopenharmony_ci/* this hook is set in stac_setup_gpio() */ 36362306a36Sopenharmony_cistatic unsigned int stac_vref_led_power_filter(struct hda_codec *codec, 36462306a36Sopenharmony_ci hda_nid_t nid, 36562306a36Sopenharmony_ci unsigned int power_state) 36662306a36Sopenharmony_ci{ 36762306a36Sopenharmony_ci if (nid == codec->core.afg && power_state == AC_PWRST_D3) 36862306a36Sopenharmony_ci return AC_PWRST_D1; 36962306a36Sopenharmony_ci return snd_hda_gen_path_power_filter(codec, nid, power_state); 37062306a36Sopenharmony_ci} 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci/* update mute-LED accoring to the master switch */ 37362306a36Sopenharmony_cistatic void stac_update_led_status(struct hda_codec *codec, bool muted) 37462306a36Sopenharmony_ci{ 37562306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci if (!spec->gpio_led) 37862306a36Sopenharmony_ci return; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci /* LED state is inverted on these systems */ 38162306a36Sopenharmony_ci if (spec->gpio_led_polarity) 38262306a36Sopenharmony_ci muted = !muted; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci if (!spec->vref_mute_led_nid) { 38562306a36Sopenharmony_ci if (muted) 38662306a36Sopenharmony_ci spec->gpio_data |= spec->gpio_led; 38762306a36Sopenharmony_ci else 38862306a36Sopenharmony_ci spec->gpio_data &= ~spec->gpio_led; 38962306a36Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, 39062306a36Sopenharmony_ci spec->gpio_dir, spec->gpio_data); 39162306a36Sopenharmony_ci } else { 39262306a36Sopenharmony_ci spec->vref_led = muted ? AC_PINCTL_VREF_50 : AC_PINCTL_VREF_GRD; 39362306a36Sopenharmony_ci stac_vrefout_set(codec, spec->vref_mute_led_nid, 39462306a36Sopenharmony_ci spec->vref_led); 39562306a36Sopenharmony_ci } 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci/* vmaster hook to update mute LED */ 39962306a36Sopenharmony_cistatic int stac_vmaster_hook(struct led_classdev *led_cdev, 40062306a36Sopenharmony_ci enum led_brightness brightness) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci stac_update_led_status(codec, brightness); 40562306a36Sopenharmony_ci return 0; 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* automute hook to handle GPIO mute and EAPD updates */ 40962306a36Sopenharmony_cistatic void stac_update_outputs(struct hda_codec *codec) 41062306a36Sopenharmony_ci{ 41162306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci if (spec->gpio_mute) 41462306a36Sopenharmony_ci spec->gen.master_mute = 41562306a36Sopenharmony_ci !(snd_hda_codec_read(codec, codec->core.afg, 0, 41662306a36Sopenharmony_ci AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute); 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci snd_hda_gen_update_outputs(codec); 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci if (spec->eapd_mask && spec->eapd_switch) { 42162306a36Sopenharmony_ci unsigned int val = spec->gpio_data; 42262306a36Sopenharmony_ci if (spec->gen.speaker_muted) 42362306a36Sopenharmony_ci val &= ~spec->eapd_mask; 42462306a36Sopenharmony_ci else 42562306a36Sopenharmony_ci val |= spec->eapd_mask; 42662306a36Sopenharmony_ci if (spec->gpio_data != val) { 42762306a36Sopenharmony_ci spec->gpio_data = val; 42862306a36Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, 42962306a36Sopenharmony_ci val); 43062306a36Sopenharmony_ci } 43162306a36Sopenharmony_ci } 43262306a36Sopenharmony_ci} 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_cistatic void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, 43562306a36Sopenharmony_ci bool enable, bool do_write) 43662306a36Sopenharmony_ci{ 43762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 43862306a36Sopenharmony_ci unsigned int idx, val; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci for (idx = 0; idx < spec->num_pwrs; idx++) { 44162306a36Sopenharmony_ci if (spec->pwr_nids[idx] == nid) 44262306a36Sopenharmony_ci break; 44362306a36Sopenharmony_ci } 44462306a36Sopenharmony_ci if (idx >= spec->num_pwrs) 44562306a36Sopenharmony_ci return; 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci idx = 1 << idx; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci val = spec->power_map_bits; 45062306a36Sopenharmony_ci if (enable) 45162306a36Sopenharmony_ci val &= ~idx; 45262306a36Sopenharmony_ci else 45362306a36Sopenharmony_ci val |= idx; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci /* power down unused output ports */ 45662306a36Sopenharmony_ci if (val != spec->power_map_bits) { 45762306a36Sopenharmony_ci spec->power_map_bits = val; 45862306a36Sopenharmony_ci if (do_write) 45962306a36Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 46062306a36Sopenharmony_ci AC_VERB_IDT_SET_POWER_MAP, val); 46162306a36Sopenharmony_ci } 46262306a36Sopenharmony_ci} 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci/* update power bit per jack plug/unplug */ 46562306a36Sopenharmony_cistatic void jack_update_power(struct hda_codec *codec, 46662306a36Sopenharmony_ci struct hda_jack_callback *jack) 46762306a36Sopenharmony_ci{ 46862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 46962306a36Sopenharmony_ci int i; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci if (!spec->num_pwrs) 47262306a36Sopenharmony_ci return; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci if (jack && jack->nid) { 47562306a36Sopenharmony_ci stac_toggle_power_map(codec, jack->nid, 47662306a36Sopenharmony_ci snd_hda_jack_detect(codec, jack->nid), 47762306a36Sopenharmony_ci true); 47862306a36Sopenharmony_ci return; 47962306a36Sopenharmony_ci } 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci /* update all jacks */ 48262306a36Sopenharmony_ci for (i = 0; i < spec->num_pwrs; i++) { 48362306a36Sopenharmony_ci hda_nid_t nid = spec->pwr_nids[i]; 48462306a36Sopenharmony_ci if (!snd_hda_jack_tbl_get(codec, nid)) 48562306a36Sopenharmony_ci continue; 48662306a36Sopenharmony_ci stac_toggle_power_map(codec, nid, 48762306a36Sopenharmony_ci snd_hda_jack_detect(codec, nid), 48862306a36Sopenharmony_ci false); 48962306a36Sopenharmony_ci } 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 49262306a36Sopenharmony_ci AC_VERB_IDT_SET_POWER_MAP, 49362306a36Sopenharmony_ci spec->power_map_bits); 49462306a36Sopenharmony_ci} 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistatic void stac_vref_event(struct hda_codec *codec, 49762306a36Sopenharmony_ci struct hda_jack_callback *event) 49862306a36Sopenharmony_ci{ 49962306a36Sopenharmony_ci unsigned int data; 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci data = snd_hda_codec_read(codec, codec->core.afg, 0, 50262306a36Sopenharmony_ci AC_VERB_GET_GPIO_DATA, 0); 50362306a36Sopenharmony_ci /* toggle VREF state based on GPIOx status */ 50462306a36Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 0x7e0, 50562306a36Sopenharmony_ci !!(data & (1 << event->private_data))); 50662306a36Sopenharmony_ci} 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci/* initialize the power map and enable the power event to jacks that 50962306a36Sopenharmony_ci * haven't been assigned to automute 51062306a36Sopenharmony_ci */ 51162306a36Sopenharmony_cistatic void stac_init_power_map(struct hda_codec *codec) 51262306a36Sopenharmony_ci{ 51362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 51462306a36Sopenharmony_ci int i; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci for (i = 0; i < spec->num_pwrs; i++) { 51762306a36Sopenharmony_ci hda_nid_t nid = spec->pwr_nids[i]; 51862306a36Sopenharmony_ci unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); 51962306a36Sopenharmony_ci def_conf = get_defcfg_connect(def_conf); 52062306a36Sopenharmony_ci if (def_conf == AC_JACK_PORT_COMPLEX && 52162306a36Sopenharmony_ci spec->vref_mute_led_nid != nid && 52262306a36Sopenharmony_ci is_jack_detectable(codec, nid)) { 52362306a36Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, nid, 52462306a36Sopenharmony_ci jack_update_power); 52562306a36Sopenharmony_ci } else { 52662306a36Sopenharmony_ci if (def_conf == AC_JACK_PORT_NONE) 52762306a36Sopenharmony_ci stac_toggle_power_map(codec, nid, false, false); 52862306a36Sopenharmony_ci else 52962306a36Sopenharmony_ci stac_toggle_power_map(codec, nid, true, false); 53062306a36Sopenharmony_ci } 53162306a36Sopenharmony_ci } 53262306a36Sopenharmony_ci} 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci/* 53562306a36Sopenharmony_ci */ 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_cistatic inline bool get_int_hint(struct hda_codec *codec, const char *key, 53862306a36Sopenharmony_ci int *valp) 53962306a36Sopenharmony_ci{ 54062306a36Sopenharmony_ci return !snd_hda_get_int_hint(codec, key, valp); 54162306a36Sopenharmony_ci} 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci/* override some hints from the hwdep entry */ 54462306a36Sopenharmony_cistatic void stac_store_hints(struct hda_codec *codec) 54562306a36Sopenharmony_ci{ 54662306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 54762306a36Sopenharmony_ci int val; 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci if (get_int_hint(codec, "gpio_mask", &spec->gpio_mask)) { 55062306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_dir = spec->gpio_data = 55162306a36Sopenharmony_ci spec->gpio_mask; 55262306a36Sopenharmony_ci } 55362306a36Sopenharmony_ci if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir)) 55462306a36Sopenharmony_ci spec->gpio_dir &= spec->gpio_mask; 55562306a36Sopenharmony_ci if (get_int_hint(codec, "gpio_data", &spec->gpio_data)) 55662306a36Sopenharmony_ci spec->gpio_data &= spec->gpio_mask; 55762306a36Sopenharmony_ci if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask)) 55862306a36Sopenharmony_ci spec->eapd_mask &= spec->gpio_mask; 55962306a36Sopenharmony_ci if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute)) 56062306a36Sopenharmony_ci spec->gpio_mute &= spec->gpio_mask; 56162306a36Sopenharmony_ci val = snd_hda_get_bool_hint(codec, "eapd_switch"); 56262306a36Sopenharmony_ci if (val >= 0) 56362306a36Sopenharmony_ci spec->eapd_switch = val; 56462306a36Sopenharmony_ci} 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci/* 56762306a36Sopenharmony_ci * loopback controls 56862306a36Sopenharmony_ci */ 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci#define stac_aloopback_info snd_ctl_boolean_mono_info 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_cistatic int stac_aloopback_get(struct snd_kcontrol *kcontrol, 57362306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 57462306a36Sopenharmony_ci{ 57562306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 57662306a36Sopenharmony_ci unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 57762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci ucontrol->value.integer.value[0] = !!(spec->aloopback & 58062306a36Sopenharmony_ci (spec->aloopback_mask << idx)); 58162306a36Sopenharmony_ci return 0; 58262306a36Sopenharmony_ci} 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_cistatic int stac_aloopback_put(struct snd_kcontrol *kcontrol, 58562306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 58662306a36Sopenharmony_ci{ 58762306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 58862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 58962306a36Sopenharmony_ci unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 59062306a36Sopenharmony_ci unsigned int dac_mode; 59162306a36Sopenharmony_ci unsigned int val, idx_val; 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_ci idx_val = spec->aloopback_mask << idx; 59462306a36Sopenharmony_ci if (ucontrol->value.integer.value[0]) 59562306a36Sopenharmony_ci val = spec->aloopback | idx_val; 59662306a36Sopenharmony_ci else 59762306a36Sopenharmony_ci val = spec->aloopback & ~idx_val; 59862306a36Sopenharmony_ci if (spec->aloopback == val) 59962306a36Sopenharmony_ci return 0; 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci spec->aloopback = val; 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci /* Only return the bits defined by the shift value of the 60462306a36Sopenharmony_ci * first two bytes of the mask 60562306a36Sopenharmony_ci */ 60662306a36Sopenharmony_ci dac_mode = snd_hda_codec_read(codec, codec->core.afg, 0, 60762306a36Sopenharmony_ci kcontrol->private_value & 0xFFFF, 0x0); 60862306a36Sopenharmony_ci dac_mode >>= spec->aloopback_shift; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci if (spec->aloopback & idx_val) { 61162306a36Sopenharmony_ci snd_hda_power_up(codec); 61262306a36Sopenharmony_ci dac_mode |= idx_val; 61362306a36Sopenharmony_ci } else { 61462306a36Sopenharmony_ci snd_hda_power_down(codec); 61562306a36Sopenharmony_ci dac_mode &= ~idx_val; 61662306a36Sopenharmony_ci } 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 61962306a36Sopenharmony_ci kcontrol->private_value >> 16, dac_mode); 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci return 1; 62262306a36Sopenharmony_ci} 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_ci#define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \ 62562306a36Sopenharmony_ci { \ 62662306a36Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 62762306a36Sopenharmony_ci .name = "Analog Loopback", \ 62862306a36Sopenharmony_ci .count = cnt, \ 62962306a36Sopenharmony_ci .info = stac_aloopback_info, \ 63062306a36Sopenharmony_ci .get = stac_aloopback_get, \ 63162306a36Sopenharmony_ci .put = stac_aloopback_put, \ 63262306a36Sopenharmony_ci .private_value = verb_read | (verb_write << 16), \ 63362306a36Sopenharmony_ci } 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci/* 63662306a36Sopenharmony_ci * Mute LED handling on HP laptops 63762306a36Sopenharmony_ci */ 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_ci/* check whether it's a HP laptop with a docking port */ 64062306a36Sopenharmony_cistatic bool hp_bnb2011_with_dock(struct hda_codec *codec) 64162306a36Sopenharmony_ci{ 64262306a36Sopenharmony_ci if (codec->core.vendor_id != 0x111d7605 && 64362306a36Sopenharmony_ci codec->core.vendor_id != 0x111d76d1) 64462306a36Sopenharmony_ci return false; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci switch (codec->core.subsystem_id) { 64762306a36Sopenharmony_ci case 0x103c1618: 64862306a36Sopenharmony_ci case 0x103c1619: 64962306a36Sopenharmony_ci case 0x103c161a: 65062306a36Sopenharmony_ci case 0x103c161b: 65162306a36Sopenharmony_ci case 0x103c161c: 65262306a36Sopenharmony_ci case 0x103c161d: 65362306a36Sopenharmony_ci case 0x103c161e: 65462306a36Sopenharmony_ci case 0x103c161f: 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci case 0x103c162a: 65762306a36Sopenharmony_ci case 0x103c162b: 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ci case 0x103c1630: 66062306a36Sopenharmony_ci case 0x103c1631: 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci case 0x103c1633: 66362306a36Sopenharmony_ci case 0x103c1634: 66462306a36Sopenharmony_ci case 0x103c1635: 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci case 0x103c3587: 66762306a36Sopenharmony_ci case 0x103c3588: 66862306a36Sopenharmony_ci case 0x103c3589: 66962306a36Sopenharmony_ci case 0x103c358a: 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci case 0x103c3667: 67262306a36Sopenharmony_ci case 0x103c3668: 67362306a36Sopenharmony_ci case 0x103c3669: 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci return true; 67662306a36Sopenharmony_ci } 67762306a36Sopenharmony_ci return false; 67862306a36Sopenharmony_ci} 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_cistatic bool hp_blike_system(u32 subsystem_id) 68162306a36Sopenharmony_ci{ 68262306a36Sopenharmony_ci switch (subsystem_id) { 68362306a36Sopenharmony_ci case 0x103c1473: /* HP ProBook 6550b */ 68462306a36Sopenharmony_ci case 0x103c1520: 68562306a36Sopenharmony_ci case 0x103c1521: 68662306a36Sopenharmony_ci case 0x103c1523: 68762306a36Sopenharmony_ci case 0x103c1524: 68862306a36Sopenharmony_ci case 0x103c1525: 68962306a36Sopenharmony_ci case 0x103c1722: 69062306a36Sopenharmony_ci case 0x103c1723: 69162306a36Sopenharmony_ci case 0x103c1724: 69262306a36Sopenharmony_ci case 0x103c1725: 69362306a36Sopenharmony_ci case 0x103c1726: 69462306a36Sopenharmony_ci case 0x103c1727: 69562306a36Sopenharmony_ci case 0x103c1728: 69662306a36Sopenharmony_ci case 0x103c1729: 69762306a36Sopenharmony_ci case 0x103c172a: 69862306a36Sopenharmony_ci case 0x103c172b: 69962306a36Sopenharmony_ci case 0x103c307e: 70062306a36Sopenharmony_ci case 0x103c307f: 70162306a36Sopenharmony_ci case 0x103c3080: 70262306a36Sopenharmony_ci case 0x103c3081: 70362306a36Sopenharmony_ci case 0x103c7007: 70462306a36Sopenharmony_ci case 0x103c7008: 70562306a36Sopenharmony_ci return true; 70662306a36Sopenharmony_ci } 70762306a36Sopenharmony_ci return false; 70862306a36Sopenharmony_ci} 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_cistatic void set_hp_led_gpio(struct hda_codec *codec) 71162306a36Sopenharmony_ci{ 71262306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 71362306a36Sopenharmony_ci unsigned int gpio; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci if (spec->gpio_led) 71662306a36Sopenharmony_ci return; 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci gpio = snd_hda_param_read(codec, codec->core.afg, AC_PAR_GPIO_CAP); 71962306a36Sopenharmony_ci gpio &= AC_GPIO_IO_COUNT; 72062306a36Sopenharmony_ci if (gpio > 3) 72162306a36Sopenharmony_ci spec->gpio_led = 0x08; /* GPIO 3 */ 72262306a36Sopenharmony_ci else 72362306a36Sopenharmony_ci spec->gpio_led = 0x01; /* GPIO 0 */ 72462306a36Sopenharmony_ci} 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci/* 72762306a36Sopenharmony_ci * This method searches for the mute LED GPIO configuration 72862306a36Sopenharmony_ci * provided as OEM string in SMBIOS. The format of that string 72962306a36Sopenharmony_ci * is HP_Mute_LED_P_G or HP_Mute_LED_P 73062306a36Sopenharmony_ci * where P can be 0 or 1 and defines mute LED GPIO control state (low/high) 73162306a36Sopenharmony_ci * that corresponds to the NOT muted state of the master volume 73262306a36Sopenharmony_ci * and G is the index of the GPIO to use as the mute LED control (0..9) 73362306a36Sopenharmony_ci * If _G portion is missing it is assigned based on the codec ID 73462306a36Sopenharmony_ci * 73562306a36Sopenharmony_ci * So, HP B-series like systems may have HP_Mute_LED_0 (current models) 73662306a36Sopenharmony_ci * or HP_Mute_LED_0_3 (future models) OEM SMBIOS strings 73762306a36Sopenharmony_ci * 73862306a36Sopenharmony_ci * 73962306a36Sopenharmony_ci * The dv-series laptops don't seem to have the HP_Mute_LED* strings in 74062306a36Sopenharmony_ci * SMBIOS - at least the ones I have seen do not have them - which include 74162306a36Sopenharmony_ci * my own system (HP Pavilion dv6-1110ax) and my cousin's 74262306a36Sopenharmony_ci * HP Pavilion dv9500t CTO. 74362306a36Sopenharmony_ci * Need more information on whether it is true across the entire series. 74462306a36Sopenharmony_ci * -- kunal 74562306a36Sopenharmony_ci */ 74662306a36Sopenharmony_cistatic int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) 74762306a36Sopenharmony_ci{ 74862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 74962306a36Sopenharmony_ci const struct dmi_device *dev = NULL; 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) { 75262306a36Sopenharmony_ci get_int_hint(codec, "gpio_led_polarity", 75362306a36Sopenharmony_ci &spec->gpio_led_polarity); 75462306a36Sopenharmony_ci return 1; 75562306a36Sopenharmony_ci } 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) { 75862306a36Sopenharmony_ci if (sscanf(dev->name, "HP_Mute_LED_%u_%x", 75962306a36Sopenharmony_ci &spec->gpio_led_polarity, 76062306a36Sopenharmony_ci &spec->gpio_led) == 2) { 76162306a36Sopenharmony_ci unsigned int max_gpio; 76262306a36Sopenharmony_ci max_gpio = snd_hda_param_read(codec, codec->core.afg, 76362306a36Sopenharmony_ci AC_PAR_GPIO_CAP); 76462306a36Sopenharmony_ci max_gpio &= AC_GPIO_IO_COUNT; 76562306a36Sopenharmony_ci if (spec->gpio_led < max_gpio) 76662306a36Sopenharmony_ci spec->gpio_led = 1 << spec->gpio_led; 76762306a36Sopenharmony_ci else 76862306a36Sopenharmony_ci spec->vref_mute_led_nid = spec->gpio_led; 76962306a36Sopenharmony_ci return 1; 77062306a36Sopenharmony_ci } 77162306a36Sopenharmony_ci if (sscanf(dev->name, "HP_Mute_LED_%u", 77262306a36Sopenharmony_ci &spec->gpio_led_polarity) == 1) { 77362306a36Sopenharmony_ci set_hp_led_gpio(codec); 77462306a36Sopenharmony_ci return 1; 77562306a36Sopenharmony_ci } 77662306a36Sopenharmony_ci /* BIOS bug: unfilled OEM string */ 77762306a36Sopenharmony_ci if (strstr(dev->name, "HP_Mute_LED_P_G")) { 77862306a36Sopenharmony_ci set_hp_led_gpio(codec); 77962306a36Sopenharmony_ci if (default_polarity >= 0) 78062306a36Sopenharmony_ci spec->gpio_led_polarity = default_polarity; 78162306a36Sopenharmony_ci else 78262306a36Sopenharmony_ci spec->gpio_led_polarity = 1; 78362306a36Sopenharmony_ci return 1; 78462306a36Sopenharmony_ci } 78562306a36Sopenharmony_ci } 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci /* 78862306a36Sopenharmony_ci * Fallback case - if we don't find the DMI strings, 78962306a36Sopenharmony_ci * we statically set the GPIO - if not a B-series system 79062306a36Sopenharmony_ci * and default polarity is provided 79162306a36Sopenharmony_ci */ 79262306a36Sopenharmony_ci if (!hp_blike_system(codec->core.subsystem_id) && 79362306a36Sopenharmony_ci (default_polarity == 0 || default_polarity == 1)) { 79462306a36Sopenharmony_ci set_hp_led_gpio(codec); 79562306a36Sopenharmony_ci spec->gpio_led_polarity = default_polarity; 79662306a36Sopenharmony_ci return 1; 79762306a36Sopenharmony_ci } 79862306a36Sopenharmony_ci return 0; 79962306a36Sopenharmony_ci} 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci/* check whether a built-in speaker is included in parsed pins */ 80262306a36Sopenharmony_cistatic bool has_builtin_speaker(struct hda_codec *codec) 80362306a36Sopenharmony_ci{ 80462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 80562306a36Sopenharmony_ci const hda_nid_t *nid_pin; 80662306a36Sopenharmony_ci int nids, i; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) { 80962306a36Sopenharmony_ci nid_pin = spec->gen.autocfg.line_out_pins; 81062306a36Sopenharmony_ci nids = spec->gen.autocfg.line_outs; 81162306a36Sopenharmony_ci } else { 81262306a36Sopenharmony_ci nid_pin = spec->gen.autocfg.speaker_pins; 81362306a36Sopenharmony_ci nids = spec->gen.autocfg.speaker_outs; 81462306a36Sopenharmony_ci } 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci for (i = 0; i < nids; i++) { 81762306a36Sopenharmony_ci unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]); 81862306a36Sopenharmony_ci if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT) 81962306a36Sopenharmony_ci return true; 82062306a36Sopenharmony_ci } 82162306a36Sopenharmony_ci return false; 82262306a36Sopenharmony_ci} 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci/* 82562306a36Sopenharmony_ci * PC beep controls 82662306a36Sopenharmony_ci */ 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_ci/* create PC beep volume controls */ 82962306a36Sopenharmony_cistatic int stac_auto_create_beep_ctls(struct hda_codec *codec, 83062306a36Sopenharmony_ci hda_nid_t nid) 83162306a36Sopenharmony_ci{ 83262306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 83362306a36Sopenharmony_ci u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT); 83462306a36Sopenharmony_ci struct snd_kcontrol_new *knew; 83562306a36Sopenharmony_ci static const struct snd_kcontrol_new abeep_mute_ctl = 83662306a36Sopenharmony_ci HDA_CODEC_MUTE(NULL, 0, 0, 0); 83762306a36Sopenharmony_ci static const struct snd_kcontrol_new dbeep_mute_ctl = 83862306a36Sopenharmony_ci HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0); 83962306a36Sopenharmony_ci static const struct snd_kcontrol_new beep_vol_ctl = 84062306a36Sopenharmony_ci HDA_CODEC_VOLUME(NULL, 0, 0, 0); 84162306a36Sopenharmony_ci 84262306a36Sopenharmony_ci /* check for mute support for the amp */ 84362306a36Sopenharmony_ci if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) { 84462306a36Sopenharmony_ci const struct snd_kcontrol_new *temp; 84562306a36Sopenharmony_ci if (spec->anabeep_nid == nid) 84662306a36Sopenharmony_ci temp = &abeep_mute_ctl; 84762306a36Sopenharmony_ci else 84862306a36Sopenharmony_ci temp = &dbeep_mute_ctl; 84962306a36Sopenharmony_ci knew = snd_hda_gen_add_kctl(&spec->gen, 85062306a36Sopenharmony_ci "Beep Playback Switch", temp); 85162306a36Sopenharmony_ci if (!knew) 85262306a36Sopenharmony_ci return -ENOMEM; 85362306a36Sopenharmony_ci knew->private_value = 85462306a36Sopenharmony_ci HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT); 85562306a36Sopenharmony_ci } 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci /* check to see if there is volume support for the amp */ 85862306a36Sopenharmony_ci if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) { 85962306a36Sopenharmony_ci knew = snd_hda_gen_add_kctl(&spec->gen, 86062306a36Sopenharmony_ci "Beep Playback Volume", 86162306a36Sopenharmony_ci &beep_vol_ctl); 86262306a36Sopenharmony_ci if (!knew) 86362306a36Sopenharmony_ci return -ENOMEM; 86462306a36Sopenharmony_ci knew->private_value = 86562306a36Sopenharmony_ci HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT); 86662306a36Sopenharmony_ci } 86762306a36Sopenharmony_ci return 0; 86862306a36Sopenharmony_ci} 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci#ifdef CONFIG_SND_HDA_INPUT_BEEP 87162306a36Sopenharmony_ci#define stac_dig_beep_switch_info snd_ctl_boolean_mono_info 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_cistatic int stac_dig_beep_switch_get(struct snd_kcontrol *kcontrol, 87462306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 87562306a36Sopenharmony_ci{ 87662306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 87762306a36Sopenharmony_ci ucontrol->value.integer.value[0] = codec->beep->enabled; 87862306a36Sopenharmony_ci return 0; 87962306a36Sopenharmony_ci} 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_cistatic int stac_dig_beep_switch_put(struct snd_kcontrol *kcontrol, 88262306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 88362306a36Sopenharmony_ci{ 88462306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 88562306a36Sopenharmony_ci return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]); 88662306a36Sopenharmony_ci} 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac_dig_beep_ctrl = { 88962306a36Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 89062306a36Sopenharmony_ci .name = "Beep Playback Switch", 89162306a36Sopenharmony_ci .info = stac_dig_beep_switch_info, 89262306a36Sopenharmony_ci .get = stac_dig_beep_switch_get, 89362306a36Sopenharmony_ci .put = stac_dig_beep_switch_put, 89462306a36Sopenharmony_ci}; 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_cistatic int stac_beep_switch_ctl(struct hda_codec *codec) 89762306a36Sopenharmony_ci{ 89862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &stac_dig_beep_ctrl)) 90162306a36Sopenharmony_ci return -ENOMEM; 90262306a36Sopenharmony_ci return 0; 90362306a36Sopenharmony_ci} 90462306a36Sopenharmony_ci#endif 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci/* 90762306a36Sopenharmony_ci * SPDIF-out mux controls 90862306a36Sopenharmony_ci */ 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_cistatic int stac_smux_enum_info(struct snd_kcontrol *kcontrol, 91162306a36Sopenharmony_ci struct snd_ctl_elem_info *uinfo) 91262306a36Sopenharmony_ci{ 91362306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 91462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 91562306a36Sopenharmony_ci return snd_hda_input_mux_info(&spec->spdif_mux, uinfo); 91662306a36Sopenharmony_ci} 91762306a36Sopenharmony_ci 91862306a36Sopenharmony_cistatic int stac_smux_enum_get(struct snd_kcontrol *kcontrol, 91962306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 92062306a36Sopenharmony_ci{ 92162306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 92262306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 92362306a36Sopenharmony_ci unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_ci ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx]; 92662306a36Sopenharmony_ci return 0; 92762306a36Sopenharmony_ci} 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_cistatic int stac_smux_enum_put(struct snd_kcontrol *kcontrol, 93062306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 93162306a36Sopenharmony_ci{ 93262306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 93362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 93462306a36Sopenharmony_ci unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_ci return snd_hda_input_mux_put(codec, &spec->spdif_mux, ucontrol, 93762306a36Sopenharmony_ci spec->gen.autocfg.dig_out_pins[smux_idx], 93862306a36Sopenharmony_ci &spec->cur_smux[smux_idx]); 93962306a36Sopenharmony_ci} 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac_smux_mixer = { 94262306a36Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 94362306a36Sopenharmony_ci .name = "IEC958 Playback Source", 94462306a36Sopenharmony_ci /* count set later */ 94562306a36Sopenharmony_ci .info = stac_smux_enum_info, 94662306a36Sopenharmony_ci .get = stac_smux_enum_get, 94762306a36Sopenharmony_ci .put = stac_smux_enum_put, 94862306a36Sopenharmony_ci}; 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_cistatic const char * const stac_spdif_labels[] = { 95162306a36Sopenharmony_ci "Digital Playback", "Analog Mux 1", "Analog Mux 2", NULL 95262306a36Sopenharmony_ci}; 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_cistatic int stac_create_spdif_mux_ctls(struct hda_codec *codec) 95562306a36Sopenharmony_ci{ 95662306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 95762306a36Sopenharmony_ci struct auto_pin_cfg *cfg = &spec->gen.autocfg; 95862306a36Sopenharmony_ci const char * const *labels = spec->spdif_labels; 95962306a36Sopenharmony_ci struct snd_kcontrol_new *kctl; 96062306a36Sopenharmony_ci int i, num_cons; 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_ci if (cfg->dig_outs < 1) 96362306a36Sopenharmony_ci return 0; 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci num_cons = snd_hda_get_num_conns(codec, cfg->dig_out_pins[0]); 96662306a36Sopenharmony_ci if (num_cons <= 1) 96762306a36Sopenharmony_ci return 0; 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci if (!labels) 97062306a36Sopenharmony_ci labels = stac_spdif_labels; 97162306a36Sopenharmony_ci for (i = 0; i < num_cons; i++) { 97262306a36Sopenharmony_ci if (snd_BUG_ON(!labels[i])) 97362306a36Sopenharmony_ci return -EINVAL; 97462306a36Sopenharmony_ci snd_hda_add_imux_item(codec, &spec->spdif_mux, labels[i], i, NULL); 97562306a36Sopenharmony_ci } 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci kctl = snd_hda_gen_add_kctl(&spec->gen, NULL, &stac_smux_mixer); 97862306a36Sopenharmony_ci if (!kctl) 97962306a36Sopenharmony_ci return -ENOMEM; 98062306a36Sopenharmony_ci kctl->count = cfg->dig_outs; 98162306a36Sopenharmony_ci 98262306a36Sopenharmony_ci return 0; 98362306a36Sopenharmony_ci} 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_cistatic const struct hda_verb stac9200_eapd_init[] = { 98662306a36Sopenharmony_ci /* set dac0mux for dac converter */ 98762306a36Sopenharmony_ci {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 98862306a36Sopenharmony_ci {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 98962306a36Sopenharmony_ci {} 99062306a36Sopenharmony_ci}; 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_cistatic const struct hda_verb dell_eq_core_init[] = { 99362306a36Sopenharmony_ci /* set master volume to max value without distortion 99462306a36Sopenharmony_ci * and direct control */ 99562306a36Sopenharmony_ci { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, 99662306a36Sopenharmony_ci {} 99762306a36Sopenharmony_ci}; 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_cistatic const struct hda_verb stac92hd73xx_core_init[] = { 100062306a36Sopenharmony_ci /* set master volume and direct control */ 100162306a36Sopenharmony_ci { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 100262306a36Sopenharmony_ci {} 100362306a36Sopenharmony_ci}; 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_cistatic const struct hda_verb stac92hd83xxx_core_init[] = { 100662306a36Sopenharmony_ci /* power state controls amps */ 100762306a36Sopenharmony_ci { 0x01, AC_VERB_SET_EAPD, 1 << 2}, 100862306a36Sopenharmony_ci {} 100962306a36Sopenharmony_ci}; 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_cistatic const struct hda_verb stac92hd83xxx_hp_zephyr_init[] = { 101262306a36Sopenharmony_ci { 0x22, 0x785, 0x43 }, 101362306a36Sopenharmony_ci { 0x22, 0x782, 0xe0 }, 101462306a36Sopenharmony_ci { 0x22, 0x795, 0x00 }, 101562306a36Sopenharmony_ci {} 101662306a36Sopenharmony_ci}; 101762306a36Sopenharmony_ci 101862306a36Sopenharmony_cistatic const struct hda_verb stac92hd71bxx_core_init[] = { 101962306a36Sopenharmony_ci /* set master volume and direct control */ 102062306a36Sopenharmony_ci { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 102162306a36Sopenharmony_ci {} 102262306a36Sopenharmony_ci}; 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_cistatic const hda_nid_t stac92hd71bxx_unmute_nids[] = { 102562306a36Sopenharmony_ci /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */ 102662306a36Sopenharmony_ci 0x0f, 0x0a, 0x0d, 0 102762306a36Sopenharmony_ci}; 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_cistatic const struct hda_verb stac925x_core_init[] = { 103062306a36Sopenharmony_ci /* set dac0mux for dac converter */ 103162306a36Sopenharmony_ci { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00}, 103262306a36Sopenharmony_ci /* mute the master volume */ 103362306a36Sopenharmony_ci { 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 103462306a36Sopenharmony_ci {} 103562306a36Sopenharmony_ci}; 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_cistatic const struct hda_verb stac922x_core_init[] = { 103862306a36Sopenharmony_ci /* set master volume and direct control */ 103962306a36Sopenharmony_ci { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 104062306a36Sopenharmony_ci {} 104162306a36Sopenharmony_ci}; 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_cistatic const struct hda_verb d965_core_init[] = { 104462306a36Sopenharmony_ci /* unmute node 0x1b */ 104562306a36Sopenharmony_ci { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 104662306a36Sopenharmony_ci /* select node 0x03 as DAC */ 104762306a36Sopenharmony_ci { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01}, 104862306a36Sopenharmony_ci {} 104962306a36Sopenharmony_ci}; 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_cistatic const struct hda_verb dell_3st_core_init[] = { 105262306a36Sopenharmony_ci /* don't set delta bit */ 105362306a36Sopenharmony_ci {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f}, 105462306a36Sopenharmony_ci /* unmute node 0x1b */ 105562306a36Sopenharmony_ci {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 105662306a36Sopenharmony_ci /* select node 0x03 as DAC */ 105762306a36Sopenharmony_ci {0x0b, AC_VERB_SET_CONNECT_SEL, 0x01}, 105862306a36Sopenharmony_ci {} 105962306a36Sopenharmony_ci}; 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_cistatic const struct hda_verb stac927x_core_init[] = { 106262306a36Sopenharmony_ci /* set master volume and direct control */ 106362306a36Sopenharmony_ci { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 106462306a36Sopenharmony_ci /* enable analog pc beep path */ 106562306a36Sopenharmony_ci { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, 106662306a36Sopenharmony_ci {} 106762306a36Sopenharmony_ci}; 106862306a36Sopenharmony_ci 106962306a36Sopenharmony_cistatic const struct hda_verb stac927x_volknob_core_init[] = { 107062306a36Sopenharmony_ci /* don't set delta bit */ 107162306a36Sopenharmony_ci {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f}, 107262306a36Sopenharmony_ci /* enable analog pc beep path */ 107362306a36Sopenharmony_ci {0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, 107462306a36Sopenharmony_ci {} 107562306a36Sopenharmony_ci}; 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_cistatic const struct hda_verb stac9205_core_init[] = { 107862306a36Sopenharmony_ci /* set master volume and direct control */ 107962306a36Sopenharmony_ci { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 108062306a36Sopenharmony_ci /* enable analog pc beep path */ 108162306a36Sopenharmony_ci { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, 108262306a36Sopenharmony_ci {} 108362306a36Sopenharmony_ci}; 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd73xx_6ch_loopback = 108662306a36Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3); 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd73xx_8ch_loopback = 108962306a36Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4); 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd73xx_10ch_loopback = 109262306a36Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5); 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd71bxx_loopback = 109562306a36Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2); 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac9205_loopback = 109862306a36Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1); 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac927x_loopback = 110162306a36Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1); 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_cistatic const struct hda_pintbl ref9200_pin_configs[] = { 110462306a36Sopenharmony_ci { 0x08, 0x01c47010 }, 110562306a36Sopenharmony_ci { 0x09, 0x01447010 }, 110662306a36Sopenharmony_ci { 0x0d, 0x0221401f }, 110762306a36Sopenharmony_ci { 0x0e, 0x01114010 }, 110862306a36Sopenharmony_ci { 0x0f, 0x02a19020 }, 110962306a36Sopenharmony_ci { 0x10, 0x01a19021 }, 111062306a36Sopenharmony_ci { 0x11, 0x90100140 }, 111162306a36Sopenharmony_ci { 0x12, 0x01813122 }, 111262306a36Sopenharmony_ci {} 111362306a36Sopenharmony_ci}; 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_cistatic const struct hda_pintbl gateway9200_m4_pin_configs[] = { 111662306a36Sopenharmony_ci { 0x08, 0x400000fe }, 111762306a36Sopenharmony_ci { 0x09, 0x404500f4 }, 111862306a36Sopenharmony_ci { 0x0d, 0x400100f0 }, 111962306a36Sopenharmony_ci { 0x0e, 0x90110010 }, 112062306a36Sopenharmony_ci { 0x0f, 0x400100f1 }, 112162306a36Sopenharmony_ci { 0x10, 0x02a1902e }, 112262306a36Sopenharmony_ci { 0x11, 0x500000f2 }, 112362306a36Sopenharmony_ci { 0x12, 0x500000f3 }, 112462306a36Sopenharmony_ci {} 112562306a36Sopenharmony_ci}; 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_cistatic const struct hda_pintbl gateway9200_m4_2_pin_configs[] = { 112862306a36Sopenharmony_ci { 0x08, 0x400000fe }, 112962306a36Sopenharmony_ci { 0x09, 0x404500f4 }, 113062306a36Sopenharmony_ci { 0x0d, 0x400100f0 }, 113162306a36Sopenharmony_ci { 0x0e, 0x90110010 }, 113262306a36Sopenharmony_ci { 0x0f, 0x400100f1 }, 113362306a36Sopenharmony_ci { 0x10, 0x02a1902e }, 113462306a36Sopenharmony_ci { 0x11, 0x500000f2 }, 113562306a36Sopenharmony_ci { 0x12, 0x500000f3 }, 113662306a36Sopenharmony_ci {} 113762306a36Sopenharmony_ci}; 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci/* 114062306a36Sopenharmony_ci STAC 9200 pin configs for 114162306a36Sopenharmony_ci 102801A8 114262306a36Sopenharmony_ci 102801DE 114362306a36Sopenharmony_ci 102801E8 114462306a36Sopenharmony_ci*/ 114562306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_d21_pin_configs[] = { 114662306a36Sopenharmony_ci { 0x08, 0x400001f0 }, 114762306a36Sopenharmony_ci { 0x09, 0x400001f1 }, 114862306a36Sopenharmony_ci { 0x0d, 0x02214030 }, 114962306a36Sopenharmony_ci { 0x0e, 0x01014010 }, 115062306a36Sopenharmony_ci { 0x0f, 0x02a19020 }, 115162306a36Sopenharmony_ci { 0x10, 0x01a19021 }, 115262306a36Sopenharmony_ci { 0x11, 0x90100140 }, 115362306a36Sopenharmony_ci { 0x12, 0x01813122 }, 115462306a36Sopenharmony_ci {} 115562306a36Sopenharmony_ci}; 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci/* 115862306a36Sopenharmony_ci STAC 9200 pin configs for 115962306a36Sopenharmony_ci 102801C0 116062306a36Sopenharmony_ci 102801C1 116162306a36Sopenharmony_ci*/ 116262306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_d22_pin_configs[] = { 116362306a36Sopenharmony_ci { 0x08, 0x400001f0 }, 116462306a36Sopenharmony_ci { 0x09, 0x400001f1 }, 116562306a36Sopenharmony_ci { 0x0d, 0x0221401f }, 116662306a36Sopenharmony_ci { 0x0e, 0x01014010 }, 116762306a36Sopenharmony_ci { 0x0f, 0x01813020 }, 116862306a36Sopenharmony_ci { 0x10, 0x02a19021 }, 116962306a36Sopenharmony_ci { 0x11, 0x90100140 }, 117062306a36Sopenharmony_ci { 0x12, 0x400001f2 }, 117162306a36Sopenharmony_ci {} 117262306a36Sopenharmony_ci}; 117362306a36Sopenharmony_ci 117462306a36Sopenharmony_ci/* 117562306a36Sopenharmony_ci STAC 9200 pin configs for 117662306a36Sopenharmony_ci 102801C4 (Dell Dimension E310) 117762306a36Sopenharmony_ci 102801C5 117862306a36Sopenharmony_ci 102801C7 117962306a36Sopenharmony_ci 102801D9 118062306a36Sopenharmony_ci 102801DA 118162306a36Sopenharmony_ci 102801E3 118262306a36Sopenharmony_ci*/ 118362306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_d23_pin_configs[] = { 118462306a36Sopenharmony_ci { 0x08, 0x400001f0 }, 118562306a36Sopenharmony_ci { 0x09, 0x400001f1 }, 118662306a36Sopenharmony_ci { 0x0d, 0x0221401f }, 118762306a36Sopenharmony_ci { 0x0e, 0x01014010 }, 118862306a36Sopenharmony_ci { 0x0f, 0x01813020 }, 118962306a36Sopenharmony_ci { 0x10, 0x01a19021 }, 119062306a36Sopenharmony_ci { 0x11, 0x90100140 }, 119162306a36Sopenharmony_ci { 0x12, 0x400001f2 }, 119262306a36Sopenharmony_ci {} 119362306a36Sopenharmony_ci}; 119462306a36Sopenharmony_ci 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci/* 119762306a36Sopenharmony_ci STAC 9200-32 pin configs for 119862306a36Sopenharmony_ci 102801B5 (Dell Inspiron 630m) 119962306a36Sopenharmony_ci 102801D8 (Dell Inspiron 640m) 120062306a36Sopenharmony_ci*/ 120162306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m21_pin_configs[] = { 120262306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 120362306a36Sopenharmony_ci { 0x09, 0x03441340 }, 120462306a36Sopenharmony_ci { 0x0d, 0x0321121f }, 120562306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 120662306a36Sopenharmony_ci { 0x0f, 0x408003fb }, 120762306a36Sopenharmony_ci { 0x10, 0x03a11020 }, 120862306a36Sopenharmony_ci { 0x11, 0x401003fc }, 120962306a36Sopenharmony_ci { 0x12, 0x403003fd }, 121062306a36Sopenharmony_ci {} 121162306a36Sopenharmony_ci}; 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci/* 121462306a36Sopenharmony_ci STAC 9200-32 pin configs for 121562306a36Sopenharmony_ci 102801C2 (Dell Latitude D620) 121662306a36Sopenharmony_ci 102801C8 121762306a36Sopenharmony_ci 102801CC (Dell Latitude D820) 121862306a36Sopenharmony_ci 102801D4 121962306a36Sopenharmony_ci 102801D6 122062306a36Sopenharmony_ci*/ 122162306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m22_pin_configs[] = { 122262306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 122362306a36Sopenharmony_ci { 0x09, 0x0144131f }, 122462306a36Sopenharmony_ci { 0x0d, 0x0321121f }, 122562306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 122662306a36Sopenharmony_ci { 0x0f, 0x90a70321 }, 122762306a36Sopenharmony_ci { 0x10, 0x03a11020 }, 122862306a36Sopenharmony_ci { 0x11, 0x401003fb }, 122962306a36Sopenharmony_ci { 0x12, 0x40f000fc }, 123062306a36Sopenharmony_ci {} 123162306a36Sopenharmony_ci}; 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci/* 123462306a36Sopenharmony_ci STAC 9200-32 pin configs for 123562306a36Sopenharmony_ci 102801CE (Dell XPS M1710) 123662306a36Sopenharmony_ci 102801CF (Dell Precision M90) 123762306a36Sopenharmony_ci*/ 123862306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m23_pin_configs[] = { 123962306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 124062306a36Sopenharmony_ci { 0x09, 0x01441340 }, 124162306a36Sopenharmony_ci { 0x0d, 0x0421421f }, 124262306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 124362306a36Sopenharmony_ci { 0x0f, 0x408003fb }, 124462306a36Sopenharmony_ci { 0x10, 0x04a1102e }, 124562306a36Sopenharmony_ci { 0x11, 0x90170311 }, 124662306a36Sopenharmony_ci { 0x12, 0x403003fc }, 124762306a36Sopenharmony_ci {} 124862306a36Sopenharmony_ci}; 124962306a36Sopenharmony_ci 125062306a36Sopenharmony_ci/* 125162306a36Sopenharmony_ci STAC 9200-32 pin configs for 125262306a36Sopenharmony_ci 102801C9 125362306a36Sopenharmony_ci 102801CA 125462306a36Sopenharmony_ci 102801CB (Dell Latitude 120L) 125562306a36Sopenharmony_ci 102801D3 125662306a36Sopenharmony_ci*/ 125762306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m24_pin_configs[] = { 125862306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 125962306a36Sopenharmony_ci { 0x09, 0x404003fb }, 126062306a36Sopenharmony_ci { 0x0d, 0x0321121f }, 126162306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 126262306a36Sopenharmony_ci { 0x0f, 0x408003fc }, 126362306a36Sopenharmony_ci { 0x10, 0x03a11020 }, 126462306a36Sopenharmony_ci { 0x11, 0x401003fd }, 126562306a36Sopenharmony_ci { 0x12, 0x403003fe }, 126662306a36Sopenharmony_ci {} 126762306a36Sopenharmony_ci}; 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci/* 127062306a36Sopenharmony_ci STAC 9200-32 pin configs for 127162306a36Sopenharmony_ci 102801BD (Dell Inspiron E1505n) 127262306a36Sopenharmony_ci 102801EE 127362306a36Sopenharmony_ci 102801EF 127462306a36Sopenharmony_ci*/ 127562306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m25_pin_configs[] = { 127662306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 127762306a36Sopenharmony_ci { 0x09, 0x01441340 }, 127862306a36Sopenharmony_ci { 0x0d, 0x0421121f }, 127962306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 128062306a36Sopenharmony_ci { 0x0f, 0x408003fb }, 128162306a36Sopenharmony_ci { 0x10, 0x04a11020 }, 128262306a36Sopenharmony_ci { 0x11, 0x401003fc }, 128362306a36Sopenharmony_ci { 0x12, 0x403003fd }, 128462306a36Sopenharmony_ci {} 128562306a36Sopenharmony_ci}; 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci/* 128862306a36Sopenharmony_ci STAC 9200-32 pin configs for 128962306a36Sopenharmony_ci 102801F5 (Dell Inspiron 1501) 129062306a36Sopenharmony_ci 102801F6 129162306a36Sopenharmony_ci*/ 129262306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m26_pin_configs[] = { 129362306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 129462306a36Sopenharmony_ci { 0x09, 0x404003fb }, 129562306a36Sopenharmony_ci { 0x0d, 0x0421121f }, 129662306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 129762306a36Sopenharmony_ci { 0x0f, 0x408003fc }, 129862306a36Sopenharmony_ci { 0x10, 0x04a11020 }, 129962306a36Sopenharmony_ci { 0x11, 0x401003fd }, 130062306a36Sopenharmony_ci { 0x12, 0x403003fe }, 130162306a36Sopenharmony_ci {} 130262306a36Sopenharmony_ci}; 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci/* 130562306a36Sopenharmony_ci STAC 9200-32 130662306a36Sopenharmony_ci 102801CD (Dell Inspiron E1705/9400) 130762306a36Sopenharmony_ci*/ 130862306a36Sopenharmony_cistatic const struct hda_pintbl dell9200_m27_pin_configs[] = { 130962306a36Sopenharmony_ci { 0x08, 0x40c003fa }, 131062306a36Sopenharmony_ci { 0x09, 0x01441340 }, 131162306a36Sopenharmony_ci { 0x0d, 0x0421121f }, 131262306a36Sopenharmony_ci { 0x0e, 0x90170310 }, 131362306a36Sopenharmony_ci { 0x0f, 0x90170310 }, 131462306a36Sopenharmony_ci { 0x10, 0x04a11020 }, 131562306a36Sopenharmony_ci { 0x11, 0x90170310 }, 131662306a36Sopenharmony_ci { 0x12, 0x40f003fc }, 131762306a36Sopenharmony_ci {} 131862306a36Sopenharmony_ci}; 131962306a36Sopenharmony_ci 132062306a36Sopenharmony_cistatic const struct hda_pintbl oqo9200_pin_configs[] = { 132162306a36Sopenharmony_ci { 0x08, 0x40c000f0 }, 132262306a36Sopenharmony_ci { 0x09, 0x404000f1 }, 132362306a36Sopenharmony_ci { 0x0d, 0x0221121f }, 132462306a36Sopenharmony_ci { 0x0e, 0x02211210 }, 132562306a36Sopenharmony_ci { 0x0f, 0x90170111 }, 132662306a36Sopenharmony_ci { 0x10, 0x90a70120 }, 132762306a36Sopenharmony_ci { 0x11, 0x400000f2 }, 132862306a36Sopenharmony_ci { 0x12, 0x400000f3 }, 132962306a36Sopenharmony_ci {} 133062306a36Sopenharmony_ci}; 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci/* 133362306a36Sopenharmony_ci * STAC 92HD700 133462306a36Sopenharmony_ci * 18881000 Amigaone X1000 133562306a36Sopenharmony_ci */ 133662306a36Sopenharmony_cistatic const struct hda_pintbl nemo_pin_configs[] = { 133762306a36Sopenharmony_ci { 0x0a, 0x02214020 }, /* Front panel HP socket */ 133862306a36Sopenharmony_ci { 0x0b, 0x02a19080 }, /* Front Mic */ 133962306a36Sopenharmony_ci { 0x0c, 0x0181304e }, /* Line in */ 134062306a36Sopenharmony_ci { 0x0d, 0x01014010 }, /* Line out */ 134162306a36Sopenharmony_ci { 0x0e, 0x01a19040 }, /* Rear Mic */ 134262306a36Sopenharmony_ci { 0x0f, 0x01011012 }, /* Rear speakers */ 134362306a36Sopenharmony_ci { 0x10, 0x01016011 }, /* Center speaker */ 134462306a36Sopenharmony_ci { 0x11, 0x01012014 }, /* Side speakers (7.1) */ 134562306a36Sopenharmony_ci { 0x12, 0x103301f0 }, /* Motherboard CD line in connector */ 134662306a36Sopenharmony_ci { 0x13, 0x411111f0 }, /* Unused */ 134762306a36Sopenharmony_ci { 0x14, 0x411111f0 }, /* Unused */ 134862306a36Sopenharmony_ci { 0x21, 0x01442170 }, /* S/PDIF line out */ 134962306a36Sopenharmony_ci { 0x22, 0x411111f0 }, /* Unused */ 135062306a36Sopenharmony_ci { 0x23, 0x411111f0 }, /* Unused */ 135162306a36Sopenharmony_ci {} 135262306a36Sopenharmony_ci}; 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_cistatic void stac9200_fixup_panasonic(struct hda_codec *codec, 135562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 135662306a36Sopenharmony_ci{ 135762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 136062306a36Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = 0x09; 136162306a36Sopenharmony_ci spec->gpio_data = 0x00; 136262306a36Sopenharmony_ci /* CF-74 has no headphone detection, and the driver should *NOT* 136362306a36Sopenharmony_ci * do detection and HP/speaker toggle because the hardware does it. 136462306a36Sopenharmony_ci */ 136562306a36Sopenharmony_ci spec->gen.suppress_auto_mute = 1; 136662306a36Sopenharmony_ci } 136762306a36Sopenharmony_ci} 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_ci 137062306a36Sopenharmony_cistatic const struct hda_fixup stac9200_fixups[] = { 137162306a36Sopenharmony_ci [STAC_REF] = { 137262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 137362306a36Sopenharmony_ci .v.pins = ref9200_pin_configs, 137462306a36Sopenharmony_ci }, 137562306a36Sopenharmony_ci [STAC_9200_OQO] = { 137662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 137762306a36Sopenharmony_ci .v.pins = oqo9200_pin_configs, 137862306a36Sopenharmony_ci .chained = true, 137962306a36Sopenharmony_ci .chain_id = STAC_9200_EAPD_INIT, 138062306a36Sopenharmony_ci }, 138162306a36Sopenharmony_ci [STAC_9200_DELL_D21] = { 138262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 138362306a36Sopenharmony_ci .v.pins = dell9200_d21_pin_configs, 138462306a36Sopenharmony_ci }, 138562306a36Sopenharmony_ci [STAC_9200_DELL_D22] = { 138662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 138762306a36Sopenharmony_ci .v.pins = dell9200_d22_pin_configs, 138862306a36Sopenharmony_ci }, 138962306a36Sopenharmony_ci [STAC_9200_DELL_D23] = { 139062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 139162306a36Sopenharmony_ci .v.pins = dell9200_d23_pin_configs, 139262306a36Sopenharmony_ci }, 139362306a36Sopenharmony_ci [STAC_9200_DELL_M21] = { 139462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 139562306a36Sopenharmony_ci .v.pins = dell9200_m21_pin_configs, 139662306a36Sopenharmony_ci }, 139762306a36Sopenharmony_ci [STAC_9200_DELL_M22] = { 139862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 139962306a36Sopenharmony_ci .v.pins = dell9200_m22_pin_configs, 140062306a36Sopenharmony_ci }, 140162306a36Sopenharmony_ci [STAC_9200_DELL_M23] = { 140262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 140362306a36Sopenharmony_ci .v.pins = dell9200_m23_pin_configs, 140462306a36Sopenharmony_ci }, 140562306a36Sopenharmony_ci [STAC_9200_DELL_M24] = { 140662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 140762306a36Sopenharmony_ci .v.pins = dell9200_m24_pin_configs, 140862306a36Sopenharmony_ci }, 140962306a36Sopenharmony_ci [STAC_9200_DELL_M25] = { 141062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 141162306a36Sopenharmony_ci .v.pins = dell9200_m25_pin_configs, 141262306a36Sopenharmony_ci }, 141362306a36Sopenharmony_ci [STAC_9200_DELL_M26] = { 141462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 141562306a36Sopenharmony_ci .v.pins = dell9200_m26_pin_configs, 141662306a36Sopenharmony_ci }, 141762306a36Sopenharmony_ci [STAC_9200_DELL_M27] = { 141862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 141962306a36Sopenharmony_ci .v.pins = dell9200_m27_pin_configs, 142062306a36Sopenharmony_ci }, 142162306a36Sopenharmony_ci [STAC_9200_M4] = { 142262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 142362306a36Sopenharmony_ci .v.pins = gateway9200_m4_pin_configs, 142462306a36Sopenharmony_ci .chained = true, 142562306a36Sopenharmony_ci .chain_id = STAC_9200_EAPD_INIT, 142662306a36Sopenharmony_ci }, 142762306a36Sopenharmony_ci [STAC_9200_M4_2] = { 142862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 142962306a36Sopenharmony_ci .v.pins = gateway9200_m4_2_pin_configs, 143062306a36Sopenharmony_ci .chained = true, 143162306a36Sopenharmony_ci .chain_id = STAC_9200_EAPD_INIT, 143262306a36Sopenharmony_ci }, 143362306a36Sopenharmony_ci [STAC_9200_PANASONIC] = { 143462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 143562306a36Sopenharmony_ci .v.func = stac9200_fixup_panasonic, 143662306a36Sopenharmony_ci }, 143762306a36Sopenharmony_ci [STAC_9200_EAPD_INIT] = { 143862306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 143962306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 144062306a36Sopenharmony_ci {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 144162306a36Sopenharmony_ci {} 144262306a36Sopenharmony_ci }, 144362306a36Sopenharmony_ci }, 144462306a36Sopenharmony_ci}; 144562306a36Sopenharmony_ci 144662306a36Sopenharmony_cistatic const struct hda_model_fixup stac9200_models[] = { 144762306a36Sopenharmony_ci { .id = STAC_REF, .name = "ref" }, 144862306a36Sopenharmony_ci { .id = STAC_9200_OQO, .name = "oqo" }, 144962306a36Sopenharmony_ci { .id = STAC_9200_DELL_D21, .name = "dell-d21" }, 145062306a36Sopenharmony_ci { .id = STAC_9200_DELL_D22, .name = "dell-d22" }, 145162306a36Sopenharmony_ci { .id = STAC_9200_DELL_D23, .name = "dell-d23" }, 145262306a36Sopenharmony_ci { .id = STAC_9200_DELL_M21, .name = "dell-m21" }, 145362306a36Sopenharmony_ci { .id = STAC_9200_DELL_M22, .name = "dell-m22" }, 145462306a36Sopenharmony_ci { .id = STAC_9200_DELL_M23, .name = "dell-m23" }, 145562306a36Sopenharmony_ci { .id = STAC_9200_DELL_M24, .name = "dell-m24" }, 145662306a36Sopenharmony_ci { .id = STAC_9200_DELL_M25, .name = "dell-m25" }, 145762306a36Sopenharmony_ci { .id = STAC_9200_DELL_M26, .name = "dell-m26" }, 145862306a36Sopenharmony_ci { .id = STAC_9200_DELL_M27, .name = "dell-m27" }, 145962306a36Sopenharmony_ci { .id = STAC_9200_M4, .name = "gateway-m4" }, 146062306a36Sopenharmony_ci { .id = STAC_9200_M4_2, .name = "gateway-m4-2" }, 146162306a36Sopenharmony_ci { .id = STAC_9200_PANASONIC, .name = "panasonic" }, 146262306a36Sopenharmony_ci {} 146362306a36Sopenharmony_ci}; 146462306a36Sopenharmony_ci 146562306a36Sopenharmony_cistatic const struct snd_pci_quirk stac9200_fixup_tbl[] = { 146662306a36Sopenharmony_ci /* SigmaTel reference board */ 146762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 146862306a36Sopenharmony_ci "DFI LanParty", STAC_REF), 146962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 147062306a36Sopenharmony_ci "DFI LanParty", STAC_REF), 147162306a36Sopenharmony_ci /* Dell laptops have BIOS problem */ 147262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8, 147362306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D21), 147462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5, 147562306a36Sopenharmony_ci "Dell Inspiron 630m", STAC_9200_DELL_M21), 147662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd, 147762306a36Sopenharmony_ci "Dell Inspiron E1505n", STAC_9200_DELL_M25), 147862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0, 147962306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D22), 148062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1, 148162306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D22), 148262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2, 148362306a36Sopenharmony_ci "Dell Latitude D620", STAC_9200_DELL_M22), 148462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5, 148562306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 148662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7, 148762306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 148862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8, 148962306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 149062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9, 149162306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M24), 149262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca, 149362306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M24), 149462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb, 149562306a36Sopenharmony_ci "Dell Latitude 120L", STAC_9200_DELL_M24), 149662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc, 149762306a36Sopenharmony_ci "Dell Latitude D820", STAC_9200_DELL_M22), 149862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd, 149962306a36Sopenharmony_ci "Dell Inspiron E1705/9400", STAC_9200_DELL_M27), 150062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce, 150162306a36Sopenharmony_ci "Dell XPS M1710", STAC_9200_DELL_M23), 150262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf, 150362306a36Sopenharmony_ci "Dell Precision M90", STAC_9200_DELL_M23), 150462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3, 150562306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 150662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4, 150762306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 150862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6, 150962306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 151062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8, 151162306a36Sopenharmony_ci "Dell Inspiron 640m", STAC_9200_DELL_M21), 151262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9, 151362306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 151462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da, 151562306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 151662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de, 151762306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D21), 151862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3, 151962306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 152062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8, 152162306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D21), 152262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee, 152362306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M25), 152462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef, 152562306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M25), 152662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5, 152762306a36Sopenharmony_ci "Dell Inspiron 1501", STAC_9200_DELL_M26), 152862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6, 152962306a36Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M26), 153062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0201, 153162306a36Sopenharmony_ci "Dell Latitude D430", STAC_9200_DELL_M22), 153262306a36Sopenharmony_ci /* Panasonic */ 153362306a36Sopenharmony_ci SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC), 153462306a36Sopenharmony_ci /* Gateway machines needs EAPD to be set on resume */ 153562306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4), 153662306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2), 153762306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2), 153862306a36Sopenharmony_ci /* OQO Mobile */ 153962306a36Sopenharmony_ci SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO), 154062306a36Sopenharmony_ci {} /* terminator */ 154162306a36Sopenharmony_ci}; 154262306a36Sopenharmony_ci 154362306a36Sopenharmony_cistatic const struct hda_pintbl ref925x_pin_configs[] = { 154462306a36Sopenharmony_ci { 0x07, 0x40c003f0 }, 154562306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 154662306a36Sopenharmony_ci { 0x0a, 0x01813022 }, 154762306a36Sopenharmony_ci { 0x0b, 0x02a19021 }, 154862306a36Sopenharmony_ci { 0x0c, 0x90a70320 }, 154962306a36Sopenharmony_ci { 0x0d, 0x02214210 }, 155062306a36Sopenharmony_ci { 0x10, 0x01019020 }, 155162306a36Sopenharmony_ci { 0x11, 0x9033032e }, 155262306a36Sopenharmony_ci {} 155362306a36Sopenharmony_ci}; 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM1_pin_configs[] = { 155662306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 155762306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 155862306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 155962306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 156062306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 156162306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 156262306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 156362306a36Sopenharmony_ci { 0x11, 0x9033032e }, 156462306a36Sopenharmony_ci {} 156562306a36Sopenharmony_ci}; 156662306a36Sopenharmony_ci 156762306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM1_2_pin_configs[] = { 156862306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 156962306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 157062306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 157162306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 157262306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 157362306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 157462306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 157562306a36Sopenharmony_ci { 0x11, 0x9033032e }, 157662306a36Sopenharmony_ci {} 157762306a36Sopenharmony_ci}; 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM2_pin_configs[] = { 158062306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 158162306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 158262306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 158362306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 158462306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 158562306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 158662306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 158762306a36Sopenharmony_ci { 0x11, 0x9033032e }, 158862306a36Sopenharmony_ci {} 158962306a36Sopenharmony_ci}; 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM2_2_pin_configs[] = { 159262306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 159362306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 159462306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 159562306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 159662306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 159762306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 159862306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 159962306a36Sopenharmony_ci { 0x11, 0x9033032e }, 160062306a36Sopenharmony_ci {} 160162306a36Sopenharmony_ci}; 160262306a36Sopenharmony_ci 160362306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM3_pin_configs[] = { 160462306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 160562306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 160662306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 160762306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 160862306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 160962306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 161062306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 161162306a36Sopenharmony_ci { 0x11, 0x503303f3 }, 161262306a36Sopenharmony_ci {} 161362306a36Sopenharmony_ci}; 161462306a36Sopenharmony_ci 161562306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM5_pin_configs[] = { 161662306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 161762306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 161862306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 161962306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 162062306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 162162306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 162262306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 162362306a36Sopenharmony_ci { 0x11, 0x9033032e }, 162462306a36Sopenharmony_ci {} 162562306a36Sopenharmony_ci}; 162662306a36Sopenharmony_ci 162762306a36Sopenharmony_cistatic const struct hda_pintbl stac925xM6_pin_configs[] = { 162862306a36Sopenharmony_ci { 0x07, 0x40c003f4 }, 162962306a36Sopenharmony_ci { 0x08, 0x424503f2 }, 163062306a36Sopenharmony_ci { 0x0a, 0x400000f3 }, 163162306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 163262306a36Sopenharmony_ci { 0x0c, 0x40a000f0 }, 163362306a36Sopenharmony_ci { 0x0d, 0x90100210 }, 163462306a36Sopenharmony_ci { 0x10, 0x400003f1 }, 163562306a36Sopenharmony_ci { 0x11, 0x90330320 }, 163662306a36Sopenharmony_ci {} 163762306a36Sopenharmony_ci}; 163862306a36Sopenharmony_ci 163962306a36Sopenharmony_cistatic const struct hda_fixup stac925x_fixups[] = { 164062306a36Sopenharmony_ci [STAC_REF] = { 164162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 164262306a36Sopenharmony_ci .v.pins = ref925x_pin_configs, 164362306a36Sopenharmony_ci }, 164462306a36Sopenharmony_ci [STAC_M1] = { 164562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 164662306a36Sopenharmony_ci .v.pins = stac925xM1_pin_configs, 164762306a36Sopenharmony_ci }, 164862306a36Sopenharmony_ci [STAC_M1_2] = { 164962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 165062306a36Sopenharmony_ci .v.pins = stac925xM1_2_pin_configs, 165162306a36Sopenharmony_ci }, 165262306a36Sopenharmony_ci [STAC_M2] = { 165362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 165462306a36Sopenharmony_ci .v.pins = stac925xM2_pin_configs, 165562306a36Sopenharmony_ci }, 165662306a36Sopenharmony_ci [STAC_M2_2] = { 165762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 165862306a36Sopenharmony_ci .v.pins = stac925xM2_2_pin_configs, 165962306a36Sopenharmony_ci }, 166062306a36Sopenharmony_ci [STAC_M3] = { 166162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 166262306a36Sopenharmony_ci .v.pins = stac925xM3_pin_configs, 166362306a36Sopenharmony_ci }, 166462306a36Sopenharmony_ci [STAC_M5] = { 166562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 166662306a36Sopenharmony_ci .v.pins = stac925xM5_pin_configs, 166762306a36Sopenharmony_ci }, 166862306a36Sopenharmony_ci [STAC_M6] = { 166962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 167062306a36Sopenharmony_ci .v.pins = stac925xM6_pin_configs, 167162306a36Sopenharmony_ci }, 167262306a36Sopenharmony_ci}; 167362306a36Sopenharmony_ci 167462306a36Sopenharmony_cistatic const struct hda_model_fixup stac925x_models[] = { 167562306a36Sopenharmony_ci { .id = STAC_REF, .name = "ref" }, 167662306a36Sopenharmony_ci { .id = STAC_M1, .name = "m1" }, 167762306a36Sopenharmony_ci { .id = STAC_M1_2, .name = "m1-2" }, 167862306a36Sopenharmony_ci { .id = STAC_M2, .name = "m2" }, 167962306a36Sopenharmony_ci { .id = STAC_M2_2, .name = "m2-2" }, 168062306a36Sopenharmony_ci { .id = STAC_M3, .name = "m3" }, 168162306a36Sopenharmony_ci { .id = STAC_M5, .name = "m5" }, 168262306a36Sopenharmony_ci { .id = STAC_M6, .name = "m6" }, 168362306a36Sopenharmony_ci {} 168462306a36Sopenharmony_ci}; 168562306a36Sopenharmony_ci 168662306a36Sopenharmony_cistatic const struct snd_pci_quirk stac925x_fixup_tbl[] = { 168762306a36Sopenharmony_ci /* SigmaTel reference board */ 168862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), 168962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF), 169062306a36Sopenharmony_ci SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF), 169162306a36Sopenharmony_ci 169262306a36Sopenharmony_ci /* Default table for unknown ID */ 169362306a36Sopenharmony_ci SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2), 169462306a36Sopenharmony_ci 169562306a36Sopenharmony_ci /* gateway machines are checked via codec ssid */ 169662306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2), 169762306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5), 169862306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1), 169962306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2), 170062306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2), 170162306a36Sopenharmony_ci /* Not sure about the brand name for those */ 170262306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1), 170362306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3), 170462306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6), 170562306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2), 170662306a36Sopenharmony_ci {} /* terminator */ 170762306a36Sopenharmony_ci}; 170862306a36Sopenharmony_ci 170962306a36Sopenharmony_cistatic const struct hda_pintbl ref92hd73xx_pin_configs[] = { 171062306a36Sopenharmony_ci // Port A-H 171162306a36Sopenharmony_ci { 0x0a, 0x02214030 }, 171262306a36Sopenharmony_ci { 0x0b, 0x02a19040 }, 171362306a36Sopenharmony_ci { 0x0c, 0x01a19020 }, 171462306a36Sopenharmony_ci { 0x0d, 0x02214030 }, 171562306a36Sopenharmony_ci { 0x0e, 0x0181302e }, 171662306a36Sopenharmony_ci { 0x0f, 0x01014010 }, 171762306a36Sopenharmony_ci { 0x10, 0x01014020 }, 171862306a36Sopenharmony_ci { 0x11, 0x01014030 }, 171962306a36Sopenharmony_ci // CD in 172062306a36Sopenharmony_ci { 0x12, 0x02319040 }, 172162306a36Sopenharmony_ci // Digial Mic ins 172262306a36Sopenharmony_ci { 0x13, 0x90a000f0 }, 172362306a36Sopenharmony_ci { 0x14, 0x90a000f0 }, 172462306a36Sopenharmony_ci // Digital outs 172562306a36Sopenharmony_ci { 0x22, 0x01452050 }, 172662306a36Sopenharmony_ci { 0x23, 0x01452050 }, 172762306a36Sopenharmony_ci {} 172862306a36Sopenharmony_ci}; 172962306a36Sopenharmony_ci 173062306a36Sopenharmony_cistatic const struct hda_pintbl dell_m6_pin_configs[] = { 173162306a36Sopenharmony_ci { 0x0a, 0x0321101f }, 173262306a36Sopenharmony_ci { 0x0b, 0x4f00000f }, 173362306a36Sopenharmony_ci { 0x0c, 0x4f0000f0 }, 173462306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 173562306a36Sopenharmony_ci { 0x0e, 0x03a11020 }, 173662306a36Sopenharmony_ci { 0x0f, 0x0321101f }, 173762306a36Sopenharmony_ci { 0x10, 0x4f0000f0 }, 173862306a36Sopenharmony_ci { 0x11, 0x4f0000f0 }, 173962306a36Sopenharmony_ci { 0x12, 0x4f0000f0 }, 174062306a36Sopenharmony_ci { 0x13, 0x90a60160 }, 174162306a36Sopenharmony_ci { 0x14, 0x4f0000f0 }, 174262306a36Sopenharmony_ci { 0x22, 0x4f0000f0 }, 174362306a36Sopenharmony_ci { 0x23, 0x4f0000f0 }, 174462306a36Sopenharmony_ci {} 174562306a36Sopenharmony_ci}; 174662306a36Sopenharmony_ci 174762306a36Sopenharmony_cistatic const struct hda_pintbl alienware_m17x_pin_configs[] = { 174862306a36Sopenharmony_ci { 0x0a, 0x0321101f }, 174962306a36Sopenharmony_ci { 0x0b, 0x0321101f }, 175062306a36Sopenharmony_ci { 0x0c, 0x03a11020 }, 175162306a36Sopenharmony_ci { 0x0d, 0x03014020 }, 175262306a36Sopenharmony_ci { 0x0e, 0x90170110 }, 175362306a36Sopenharmony_ci { 0x0f, 0x4f0000f0 }, 175462306a36Sopenharmony_ci { 0x10, 0x4f0000f0 }, 175562306a36Sopenharmony_ci { 0x11, 0x4f0000f0 }, 175662306a36Sopenharmony_ci { 0x12, 0x4f0000f0 }, 175762306a36Sopenharmony_ci { 0x13, 0x90a60160 }, 175862306a36Sopenharmony_ci { 0x14, 0x4f0000f0 }, 175962306a36Sopenharmony_ci { 0x22, 0x4f0000f0 }, 176062306a36Sopenharmony_ci { 0x23, 0x904601b0 }, 176162306a36Sopenharmony_ci {} 176262306a36Sopenharmony_ci}; 176362306a36Sopenharmony_ci 176462306a36Sopenharmony_cistatic const struct hda_pintbl intel_dg45id_pin_configs[] = { 176562306a36Sopenharmony_ci // Analog outputs 176662306a36Sopenharmony_ci { 0x0a, 0x02214230 }, 176762306a36Sopenharmony_ci { 0x0b, 0x02A19240 }, 176862306a36Sopenharmony_ci { 0x0c, 0x01013214 }, 176962306a36Sopenharmony_ci { 0x0d, 0x01014210 }, 177062306a36Sopenharmony_ci { 0x0e, 0x01A19250 }, 177162306a36Sopenharmony_ci { 0x0f, 0x01011212 }, 177262306a36Sopenharmony_ci { 0x10, 0x01016211 }, 177362306a36Sopenharmony_ci // Digital output 177462306a36Sopenharmony_ci { 0x22, 0x01451380 }, 177562306a36Sopenharmony_ci { 0x23, 0x40f000f0 }, 177662306a36Sopenharmony_ci {} 177762306a36Sopenharmony_ci}; 177862306a36Sopenharmony_ci 177962306a36Sopenharmony_cistatic const struct hda_pintbl stac92hd89xx_hp_front_jack_pin_configs[] = { 178062306a36Sopenharmony_ci { 0x0a, 0x02214030 }, 178162306a36Sopenharmony_ci { 0x0b, 0x02A19010 }, 178262306a36Sopenharmony_ci {} 178362306a36Sopenharmony_ci}; 178462306a36Sopenharmony_ci 178562306a36Sopenharmony_cistatic const struct hda_pintbl stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs[] = { 178662306a36Sopenharmony_ci { 0x0e, 0x400000f0 }, 178762306a36Sopenharmony_ci {} 178862306a36Sopenharmony_ci}; 178962306a36Sopenharmony_ci 179062306a36Sopenharmony_cistatic void stac92hd73xx_fixup_ref(struct hda_codec *codec, 179162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 179262306a36Sopenharmony_ci{ 179362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 179462306a36Sopenharmony_ci 179562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 179662306a36Sopenharmony_ci return; 179762306a36Sopenharmony_ci 179862306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref92hd73xx_pin_configs); 179962306a36Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0; 180062306a36Sopenharmony_ci} 180162306a36Sopenharmony_ci 180262306a36Sopenharmony_cistatic void stac92hd73xx_fixup_dell(struct hda_codec *codec) 180362306a36Sopenharmony_ci{ 180462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 180562306a36Sopenharmony_ci 180662306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, dell_m6_pin_configs); 180762306a36Sopenharmony_ci spec->eapd_switch = 0; 180862306a36Sopenharmony_ci} 180962306a36Sopenharmony_ci 181062306a36Sopenharmony_cistatic void stac92hd73xx_fixup_dell_eq(struct hda_codec *codec, 181162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 181262306a36Sopenharmony_ci{ 181362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 181462306a36Sopenharmony_ci 181562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 181662306a36Sopenharmony_ci return; 181762306a36Sopenharmony_ci 181862306a36Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 181962306a36Sopenharmony_ci snd_hda_add_verbs(codec, dell_eq_core_init); 182062306a36Sopenharmony_ci spec->volknob_init = 1; 182162306a36Sopenharmony_ci} 182262306a36Sopenharmony_ci 182362306a36Sopenharmony_ci/* Analog Mics */ 182462306a36Sopenharmony_cistatic void stac92hd73xx_fixup_dell_m6_amic(struct hda_codec *codec, 182562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 182662306a36Sopenharmony_ci{ 182762306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 182862306a36Sopenharmony_ci return; 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 183162306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); 183262306a36Sopenharmony_ci} 183362306a36Sopenharmony_ci 183462306a36Sopenharmony_ci/* Digital Mics */ 183562306a36Sopenharmony_cistatic void stac92hd73xx_fixup_dell_m6_dmic(struct hda_codec *codec, 183662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 183762306a36Sopenharmony_ci{ 183862306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 183962306a36Sopenharmony_ci return; 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 184262306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); 184362306a36Sopenharmony_ci} 184462306a36Sopenharmony_ci 184562306a36Sopenharmony_ci/* Both */ 184662306a36Sopenharmony_cistatic void stac92hd73xx_fixup_dell_m6_both(struct hda_codec *codec, 184762306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 184862306a36Sopenharmony_ci{ 184962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 185062306a36Sopenharmony_ci return; 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 185362306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); 185462306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); 185562306a36Sopenharmony_ci} 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_cistatic void stac92hd73xx_fixup_alienware_m17x(struct hda_codec *codec, 185862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 185962306a36Sopenharmony_ci{ 186062306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 186362306a36Sopenharmony_ci return; 186462306a36Sopenharmony_ci 186562306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, alienware_m17x_pin_configs); 186662306a36Sopenharmony_ci spec->eapd_switch = 0; 186762306a36Sopenharmony_ci} 186862306a36Sopenharmony_ci 186962306a36Sopenharmony_cistatic void stac92hd73xx_fixup_no_jd(struct hda_codec *codec, 187062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 187162306a36Sopenharmony_ci{ 187262306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 187362306a36Sopenharmony_ci codec->no_jack_detect = 1; 187462306a36Sopenharmony_ci} 187562306a36Sopenharmony_ci 187662306a36Sopenharmony_ci 187762306a36Sopenharmony_cistatic void stac92hd73xx_disable_automute(struct hda_codec *codec, 187862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 187962306a36Sopenharmony_ci{ 188062306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 188362306a36Sopenharmony_ci return; 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_ci spec->gen.suppress_auto_mute = 1; 188662306a36Sopenharmony_ci} 188762306a36Sopenharmony_ci 188862306a36Sopenharmony_cistatic const struct hda_fixup stac92hd73xx_fixups[] = { 188962306a36Sopenharmony_ci [STAC_92HD73XX_REF] = { 189062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 189162306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_ref, 189262306a36Sopenharmony_ci }, 189362306a36Sopenharmony_ci [STAC_DELL_M6_AMIC] = { 189462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 189562306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_m6_amic, 189662306a36Sopenharmony_ci }, 189762306a36Sopenharmony_ci [STAC_DELL_M6_DMIC] = { 189862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 189962306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_m6_dmic, 190062306a36Sopenharmony_ci }, 190162306a36Sopenharmony_ci [STAC_DELL_M6_BOTH] = { 190262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 190362306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_m6_both, 190462306a36Sopenharmony_ci }, 190562306a36Sopenharmony_ci [STAC_DELL_EQ] = { 190662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 190762306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_eq, 190862306a36Sopenharmony_ci }, 190962306a36Sopenharmony_ci [STAC_ALIENWARE_M17X] = { 191062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 191162306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_alienware_m17x, 191262306a36Sopenharmony_ci }, 191362306a36Sopenharmony_ci [STAC_ELO_VUPOINT_15MX] = { 191462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 191562306a36Sopenharmony_ci .v.func = stac92hd73xx_disable_automute, 191662306a36Sopenharmony_ci }, 191762306a36Sopenharmony_ci [STAC_92HD73XX_INTEL] = { 191862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 191962306a36Sopenharmony_ci .v.pins = intel_dg45id_pin_configs, 192062306a36Sopenharmony_ci }, 192162306a36Sopenharmony_ci [STAC_92HD73XX_NO_JD] = { 192262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 192362306a36Sopenharmony_ci .v.func = stac92hd73xx_fixup_no_jd, 192462306a36Sopenharmony_ci }, 192562306a36Sopenharmony_ci [STAC_92HD89XX_HP_FRONT_JACK] = { 192662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 192762306a36Sopenharmony_ci .v.pins = stac92hd89xx_hp_front_jack_pin_configs, 192862306a36Sopenharmony_ci }, 192962306a36Sopenharmony_ci [STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK] = { 193062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 193162306a36Sopenharmony_ci .v.pins = stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs, 193262306a36Sopenharmony_ci }, 193362306a36Sopenharmony_ci [STAC_92HD73XX_ASUS_MOBO] = { 193462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 193562306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 193662306a36Sopenharmony_ci /* enable 5.1 and SPDIF out */ 193762306a36Sopenharmony_ci { 0x0c, 0x01014411 }, 193862306a36Sopenharmony_ci { 0x0d, 0x01014410 }, 193962306a36Sopenharmony_ci { 0x0e, 0x01014412 }, 194062306a36Sopenharmony_ci { 0x22, 0x014b1180 }, 194162306a36Sopenharmony_ci { } 194262306a36Sopenharmony_ci } 194362306a36Sopenharmony_ci }, 194462306a36Sopenharmony_ci}; 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_cistatic const struct hda_model_fixup stac92hd73xx_models[] = { 194762306a36Sopenharmony_ci { .id = STAC_92HD73XX_NO_JD, .name = "no-jd" }, 194862306a36Sopenharmony_ci { .id = STAC_92HD73XX_REF, .name = "ref" }, 194962306a36Sopenharmony_ci { .id = STAC_92HD73XX_INTEL, .name = "intel" }, 195062306a36Sopenharmony_ci { .id = STAC_DELL_M6_AMIC, .name = "dell-m6-amic" }, 195162306a36Sopenharmony_ci { .id = STAC_DELL_M6_DMIC, .name = "dell-m6-dmic" }, 195262306a36Sopenharmony_ci { .id = STAC_DELL_M6_BOTH, .name = "dell-m6" }, 195362306a36Sopenharmony_ci { .id = STAC_DELL_EQ, .name = "dell-eq" }, 195462306a36Sopenharmony_ci { .id = STAC_ALIENWARE_M17X, .name = "alienware" }, 195562306a36Sopenharmony_ci { .id = STAC_ELO_VUPOINT_15MX, .name = "elo-vupoint-15mx" }, 195662306a36Sopenharmony_ci { .id = STAC_92HD73XX_ASUS_MOBO, .name = "asus-mobo" }, 195762306a36Sopenharmony_ci {} 195862306a36Sopenharmony_ci}; 195962306a36Sopenharmony_ci 196062306a36Sopenharmony_cistatic const struct snd_pci_quirk stac92hd73xx_fixup_tbl[] = { 196162306a36Sopenharmony_ci /* SigmaTel reference board */ 196262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 196362306a36Sopenharmony_ci "DFI LanParty", STAC_92HD73XX_REF), 196462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 196562306a36Sopenharmony_ci "DFI LanParty", STAC_92HD73XX_REF), 196662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5001, 196762306a36Sopenharmony_ci "Intel DP45SG", STAC_92HD73XX_INTEL), 196862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002, 196962306a36Sopenharmony_ci "Intel DG45ID", STAC_92HD73XX_INTEL), 197062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003, 197162306a36Sopenharmony_ci "Intel DG45FC", STAC_92HD73XX_INTEL), 197262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, 197362306a36Sopenharmony_ci "Dell Studio 1535", STAC_DELL_M6_DMIC), 197462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, 197562306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_DMIC), 197662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, 197762306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_BOTH), 197862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, 197962306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_BOTH), 198062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, 198162306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_AMIC), 198262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, 198362306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_AMIC), 198462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, 198562306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_DMIC), 198662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272, 198762306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M6_DMIC), 198862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f, 198962306a36Sopenharmony_ci "Dell Studio 1537", STAC_DELL_M6_DMIC), 199062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0, 199162306a36Sopenharmony_ci "Dell Studio 17", STAC_DELL_M6_DMIC), 199262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be, 199362306a36Sopenharmony_ci "Dell Studio 1555", STAC_DELL_M6_DMIC), 199462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, 199562306a36Sopenharmony_ci "Dell Studio 1557", STAC_DELL_M6_DMIC), 199662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe, 199762306a36Sopenharmony_ci "Dell Studio XPS 1645", STAC_DELL_M6_DMIC), 199862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413, 199962306a36Sopenharmony_ci "Dell Studio 1558", STAC_DELL_M6_DMIC), 200062306a36Sopenharmony_ci /* codec SSID matching */ 200162306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1, 200262306a36Sopenharmony_ci "Alienware M17x", STAC_ALIENWARE_M17X), 200362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, 200462306a36Sopenharmony_ci "Alienware M17x", STAC_ALIENWARE_M17X), 200562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, 200662306a36Sopenharmony_ci "Alienware M17x R3", STAC_DELL_EQ), 200762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1059, 0x1011, 200862306a36Sopenharmony_ci "ELO VuPoint 15MX", STAC_ELO_VUPOINT_15MX), 200962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1927, 201062306a36Sopenharmony_ci "HP Z1 G2", STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK), 201162306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2b17, 201262306a36Sopenharmony_ci "unknown HP", STAC_92HD89XX_HP_FRONT_JACK), 201362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_ASUSTEK, 0x83f8, "ASUS AT4NM10", 201462306a36Sopenharmony_ci STAC_92HD73XX_ASUS_MOBO), 201562306a36Sopenharmony_ci {} /* terminator */ 201662306a36Sopenharmony_ci}; 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_cistatic const struct hda_pintbl ref92hd83xxx_pin_configs[] = { 201962306a36Sopenharmony_ci { 0x0a, 0x02214030 }, 202062306a36Sopenharmony_ci { 0x0b, 0x02211010 }, 202162306a36Sopenharmony_ci { 0x0c, 0x02a19020 }, 202262306a36Sopenharmony_ci { 0x0d, 0x02170130 }, 202362306a36Sopenharmony_ci { 0x0e, 0x01014050 }, 202462306a36Sopenharmony_ci { 0x0f, 0x01819040 }, 202562306a36Sopenharmony_ci { 0x10, 0x01014020 }, 202662306a36Sopenharmony_ci { 0x11, 0x90a3014e }, 202762306a36Sopenharmony_ci { 0x1f, 0x01451160 }, 202862306a36Sopenharmony_ci { 0x20, 0x98560170 }, 202962306a36Sopenharmony_ci {} 203062306a36Sopenharmony_ci}; 203162306a36Sopenharmony_ci 203262306a36Sopenharmony_cistatic const struct hda_pintbl dell_s14_pin_configs[] = { 203362306a36Sopenharmony_ci { 0x0a, 0x0221403f }, 203462306a36Sopenharmony_ci { 0x0b, 0x0221101f }, 203562306a36Sopenharmony_ci { 0x0c, 0x02a19020 }, 203662306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 203762306a36Sopenharmony_ci { 0x0e, 0x40f000f0 }, 203862306a36Sopenharmony_ci { 0x0f, 0x40f000f0 }, 203962306a36Sopenharmony_ci { 0x10, 0x40f000f0 }, 204062306a36Sopenharmony_ci { 0x11, 0x90a60160 }, 204162306a36Sopenharmony_ci { 0x1f, 0x40f000f0 }, 204262306a36Sopenharmony_ci { 0x20, 0x40f000f0 }, 204362306a36Sopenharmony_ci {} 204462306a36Sopenharmony_ci}; 204562306a36Sopenharmony_ci 204662306a36Sopenharmony_cistatic const struct hda_pintbl dell_vostro_3500_pin_configs[] = { 204762306a36Sopenharmony_ci { 0x0a, 0x02a11020 }, 204862306a36Sopenharmony_ci { 0x0b, 0x0221101f }, 204962306a36Sopenharmony_ci { 0x0c, 0x400000f0 }, 205062306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 205162306a36Sopenharmony_ci { 0x0e, 0x400000f1 }, 205262306a36Sopenharmony_ci { 0x0f, 0x400000f2 }, 205362306a36Sopenharmony_ci { 0x10, 0x400000f3 }, 205462306a36Sopenharmony_ci { 0x11, 0x90a60160 }, 205562306a36Sopenharmony_ci { 0x1f, 0x400000f4 }, 205662306a36Sopenharmony_ci { 0x20, 0x400000f5 }, 205762306a36Sopenharmony_ci {} 205862306a36Sopenharmony_ci}; 205962306a36Sopenharmony_ci 206062306a36Sopenharmony_cistatic const struct hda_pintbl hp_dv7_4000_pin_configs[] = { 206162306a36Sopenharmony_ci { 0x0a, 0x03a12050 }, 206262306a36Sopenharmony_ci { 0x0b, 0x0321201f }, 206362306a36Sopenharmony_ci { 0x0c, 0x40f000f0 }, 206462306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 206562306a36Sopenharmony_ci { 0x0e, 0x40f000f0 }, 206662306a36Sopenharmony_ci { 0x0f, 0x40f000f0 }, 206762306a36Sopenharmony_ci { 0x10, 0x90170110 }, 206862306a36Sopenharmony_ci { 0x11, 0xd5a30140 }, 206962306a36Sopenharmony_ci { 0x1f, 0x40f000f0 }, 207062306a36Sopenharmony_ci { 0x20, 0x40f000f0 }, 207162306a36Sopenharmony_ci {} 207262306a36Sopenharmony_ci}; 207362306a36Sopenharmony_ci 207462306a36Sopenharmony_cistatic const struct hda_pintbl hp_zephyr_pin_configs[] = { 207562306a36Sopenharmony_ci { 0x0a, 0x01813050 }, 207662306a36Sopenharmony_ci { 0x0b, 0x0421201f }, 207762306a36Sopenharmony_ci { 0x0c, 0x04a1205e }, 207862306a36Sopenharmony_ci { 0x0d, 0x96130310 }, 207962306a36Sopenharmony_ci { 0x0e, 0x96130310 }, 208062306a36Sopenharmony_ci { 0x0f, 0x0101401f }, 208162306a36Sopenharmony_ci { 0x10, 0x1111611f }, 208262306a36Sopenharmony_ci { 0x11, 0xd5a30130 }, 208362306a36Sopenharmony_ci {} 208462306a36Sopenharmony_ci}; 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_cistatic const struct hda_pintbl hp_cNB11_intquad_pin_configs[] = { 208762306a36Sopenharmony_ci { 0x0a, 0x40f000f0 }, 208862306a36Sopenharmony_ci { 0x0b, 0x0221101f }, 208962306a36Sopenharmony_ci { 0x0c, 0x02a11020 }, 209062306a36Sopenharmony_ci { 0x0d, 0x92170110 }, 209162306a36Sopenharmony_ci { 0x0e, 0x40f000f0 }, 209262306a36Sopenharmony_ci { 0x0f, 0x92170110 }, 209362306a36Sopenharmony_ci { 0x10, 0x40f000f0 }, 209462306a36Sopenharmony_ci { 0x11, 0xd5a30130 }, 209562306a36Sopenharmony_ci { 0x1f, 0x40f000f0 }, 209662306a36Sopenharmony_ci { 0x20, 0x40f000f0 }, 209762306a36Sopenharmony_ci {} 209862306a36Sopenharmony_ci}; 209962306a36Sopenharmony_ci 210062306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_hp(struct hda_codec *codec, 210162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 210262306a36Sopenharmony_ci{ 210362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 210462306a36Sopenharmony_ci 210562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 210662306a36Sopenharmony_ci return; 210762306a36Sopenharmony_ci 210862306a36Sopenharmony_ci if (hp_bnb2011_with_dock(codec)) { 210962306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f); 211062306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); 211162306a36Sopenharmony_ci } 211262306a36Sopenharmony_ci 211362306a36Sopenharmony_ci if (find_mute_led_cfg(codec, spec->default_polarity)) 211462306a36Sopenharmony_ci codec_dbg(codec, "mute LED gpio %d polarity %d\n", 211562306a36Sopenharmony_ci spec->gpio_led, 211662306a36Sopenharmony_ci spec->gpio_led_polarity); 211762306a36Sopenharmony_ci 211862306a36Sopenharmony_ci /* allow auto-switching of dock line-in */ 211962306a36Sopenharmony_ci spec->gen.line_in_auto_switch = true; 212062306a36Sopenharmony_ci} 212162306a36Sopenharmony_ci 212262306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_zephyr(struct hda_codec *codec, 212362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 212462306a36Sopenharmony_ci{ 212562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 212662306a36Sopenharmony_ci return; 212762306a36Sopenharmony_ci 212862306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, hp_zephyr_pin_configs); 212962306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd83xxx_hp_zephyr_init); 213062306a36Sopenharmony_ci} 213162306a36Sopenharmony_ci 213262306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_led(struct hda_codec *codec, 213362306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 213462306a36Sopenharmony_ci{ 213562306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 213662306a36Sopenharmony_ci 213762306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 213862306a36Sopenharmony_ci spec->default_polarity = 0; 213962306a36Sopenharmony_ci} 214062306a36Sopenharmony_ci 214162306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_inv_led(struct hda_codec *codec, 214262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 214362306a36Sopenharmony_ci{ 214462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 214562306a36Sopenharmony_ci 214662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 214762306a36Sopenharmony_ci spec->default_polarity = 1; 214862306a36Sopenharmony_ci} 214962306a36Sopenharmony_ci 215062306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_mic_led(struct hda_codec *codec, 215162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 215262306a36Sopenharmony_ci{ 215362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 215662306a36Sopenharmony_ci spec->mic_mute_led_gpio = 0x08; /* GPIO3 */ 215762306a36Sopenharmony_ci#ifdef CONFIG_PM 215862306a36Sopenharmony_ci /* resetting controller clears GPIO, so we need to keep on */ 215962306a36Sopenharmony_ci codec->core.power_caps &= ~AC_PWRST_CLKSTOP; 216062306a36Sopenharmony_ci#endif 216162306a36Sopenharmony_ci } 216262306a36Sopenharmony_ci} 216362306a36Sopenharmony_ci 216462306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_led_gpio10(struct hda_codec *codec, 216562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 216662306a36Sopenharmony_ci{ 216762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 217062306a36Sopenharmony_ci spec->gpio_led = 0x10; /* GPIO4 */ 217162306a36Sopenharmony_ci spec->default_polarity = 0; 217262306a36Sopenharmony_ci } 217362306a36Sopenharmony_ci} 217462306a36Sopenharmony_ci 217562306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec, 217662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 217762306a36Sopenharmony_ci{ 217862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 217962306a36Sopenharmony_ci 218062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 218162306a36Sopenharmony_ci spec->headset_jack = 1; 218262306a36Sopenharmony_ci} 218362306a36Sopenharmony_ci 218462306a36Sopenharmony_cistatic void stac92hd83xxx_fixup_gpio10_eapd(struct hda_codec *codec, 218562306a36Sopenharmony_ci const struct hda_fixup *fix, 218662306a36Sopenharmony_ci int action) 218762306a36Sopenharmony_ci{ 218862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 218962306a36Sopenharmony_ci 219062306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 219162306a36Sopenharmony_ci return; 219262306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 219362306a36Sopenharmony_ci spec->gpio_data = 0x10; 219462306a36Sopenharmony_ci spec->eapd_switch = 0; 219562306a36Sopenharmony_ci} 219662306a36Sopenharmony_ci 219762306a36Sopenharmony_cistatic void hp_envy_ts_fixup_dac_bind(struct hda_codec *codec, 219862306a36Sopenharmony_ci const struct hda_fixup *fix, 219962306a36Sopenharmony_ci int action) 220062306a36Sopenharmony_ci{ 220162306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 220262306a36Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 220362306a36Sopenharmony_ci 0xd, 0x13, 220462306a36Sopenharmony_ci 0 220562306a36Sopenharmony_ci }; 220662306a36Sopenharmony_ci 220762306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 220862306a36Sopenharmony_ci return; 220962306a36Sopenharmony_ci 221062306a36Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 221162306a36Sopenharmony_ci} 221262306a36Sopenharmony_ci 221362306a36Sopenharmony_cistatic const struct hda_verb hp_bnb13_eq_verbs[] = { 221462306a36Sopenharmony_ci /* 44.1KHz base */ 221562306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 221662306a36Sopenharmony_ci { 0x22, 0x7A7, 0x68 }, 221762306a36Sopenharmony_ci { 0x22, 0x7A8, 0x17 }, 221862306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 221962306a36Sopenharmony_ci { 0x22, 0x7AA, 0x68 }, 222062306a36Sopenharmony_ci { 0x22, 0x7AB, 0x17 }, 222162306a36Sopenharmony_ci { 0x22, 0x7AC, 0x00 }, 222262306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 222362306a36Sopenharmony_ci { 0x22, 0x7A6, 0x83 }, 222462306a36Sopenharmony_ci { 0x22, 0x7A7, 0x2F }, 222562306a36Sopenharmony_ci { 0x22, 0x7A8, 0xD1 }, 222662306a36Sopenharmony_ci { 0x22, 0x7A9, 0x83 }, 222762306a36Sopenharmony_ci { 0x22, 0x7AA, 0x2F }, 222862306a36Sopenharmony_ci { 0x22, 0x7AB, 0xD1 }, 222962306a36Sopenharmony_ci { 0x22, 0x7AC, 0x01 }, 223062306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 223162306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 223262306a36Sopenharmony_ci { 0x22, 0x7A7, 0x68 }, 223362306a36Sopenharmony_ci { 0x22, 0x7A8, 0x17 }, 223462306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 223562306a36Sopenharmony_ci { 0x22, 0x7AA, 0x68 }, 223662306a36Sopenharmony_ci { 0x22, 0x7AB, 0x17 }, 223762306a36Sopenharmony_ci { 0x22, 0x7AC, 0x02 }, 223862306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 223962306a36Sopenharmony_ci { 0x22, 0x7A6, 0x7C }, 224062306a36Sopenharmony_ci { 0x22, 0x7A7, 0xC6 }, 224162306a36Sopenharmony_ci { 0x22, 0x7A8, 0x0C }, 224262306a36Sopenharmony_ci { 0x22, 0x7A9, 0x7C }, 224362306a36Sopenharmony_ci { 0x22, 0x7AA, 0xC6 }, 224462306a36Sopenharmony_ci { 0x22, 0x7AB, 0x0C }, 224562306a36Sopenharmony_ci { 0x22, 0x7AC, 0x03 }, 224662306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 224762306a36Sopenharmony_ci { 0x22, 0x7A6, 0xC3 }, 224862306a36Sopenharmony_ci { 0x22, 0x7A7, 0x25 }, 224962306a36Sopenharmony_ci { 0x22, 0x7A8, 0xAF }, 225062306a36Sopenharmony_ci { 0x22, 0x7A9, 0xC3 }, 225162306a36Sopenharmony_ci { 0x22, 0x7AA, 0x25 }, 225262306a36Sopenharmony_ci { 0x22, 0x7AB, 0xAF }, 225362306a36Sopenharmony_ci { 0x22, 0x7AC, 0x04 }, 225462306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 225562306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 225662306a36Sopenharmony_ci { 0x22, 0x7A7, 0x85 }, 225762306a36Sopenharmony_ci { 0x22, 0x7A8, 0x73 }, 225862306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 225962306a36Sopenharmony_ci { 0x22, 0x7AA, 0x85 }, 226062306a36Sopenharmony_ci { 0x22, 0x7AB, 0x73 }, 226162306a36Sopenharmony_ci { 0x22, 0x7AC, 0x05 }, 226262306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 226362306a36Sopenharmony_ci { 0x22, 0x7A6, 0x85 }, 226462306a36Sopenharmony_ci { 0x22, 0x7A7, 0x39 }, 226562306a36Sopenharmony_ci { 0x22, 0x7A8, 0xC7 }, 226662306a36Sopenharmony_ci { 0x22, 0x7A9, 0x85 }, 226762306a36Sopenharmony_ci { 0x22, 0x7AA, 0x39 }, 226862306a36Sopenharmony_ci { 0x22, 0x7AB, 0xC7 }, 226962306a36Sopenharmony_ci { 0x22, 0x7AC, 0x06 }, 227062306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 227162306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3C }, 227262306a36Sopenharmony_ci { 0x22, 0x7A7, 0x90 }, 227362306a36Sopenharmony_ci { 0x22, 0x7A8, 0xB0 }, 227462306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3C }, 227562306a36Sopenharmony_ci { 0x22, 0x7AA, 0x90 }, 227662306a36Sopenharmony_ci { 0x22, 0x7AB, 0xB0 }, 227762306a36Sopenharmony_ci { 0x22, 0x7AC, 0x07 }, 227862306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 227962306a36Sopenharmony_ci { 0x22, 0x7A6, 0x7A }, 228062306a36Sopenharmony_ci { 0x22, 0x7A7, 0xC6 }, 228162306a36Sopenharmony_ci { 0x22, 0x7A8, 0x39 }, 228262306a36Sopenharmony_ci { 0x22, 0x7A9, 0x7A }, 228362306a36Sopenharmony_ci { 0x22, 0x7AA, 0xC6 }, 228462306a36Sopenharmony_ci { 0x22, 0x7AB, 0x39 }, 228562306a36Sopenharmony_ci { 0x22, 0x7AC, 0x08 }, 228662306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 228762306a36Sopenharmony_ci { 0x22, 0x7A6, 0xC4 }, 228862306a36Sopenharmony_ci { 0x22, 0x7A7, 0xE9 }, 228962306a36Sopenharmony_ci { 0x22, 0x7A8, 0xDC }, 229062306a36Sopenharmony_ci { 0x22, 0x7A9, 0xC4 }, 229162306a36Sopenharmony_ci { 0x22, 0x7AA, 0xE9 }, 229262306a36Sopenharmony_ci { 0x22, 0x7AB, 0xDC }, 229362306a36Sopenharmony_ci { 0x22, 0x7AC, 0x09 }, 229462306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 229562306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3D }, 229662306a36Sopenharmony_ci { 0x22, 0x7A7, 0xE1 }, 229762306a36Sopenharmony_ci { 0x22, 0x7A8, 0x0D }, 229862306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3D }, 229962306a36Sopenharmony_ci { 0x22, 0x7AA, 0xE1 }, 230062306a36Sopenharmony_ci { 0x22, 0x7AB, 0x0D }, 230162306a36Sopenharmony_ci { 0x22, 0x7AC, 0x0A }, 230262306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 230362306a36Sopenharmony_ci { 0x22, 0x7A6, 0x89 }, 230462306a36Sopenharmony_ci { 0x22, 0x7A7, 0xB6 }, 230562306a36Sopenharmony_ci { 0x22, 0x7A8, 0xEB }, 230662306a36Sopenharmony_ci { 0x22, 0x7A9, 0x89 }, 230762306a36Sopenharmony_ci { 0x22, 0x7AA, 0xB6 }, 230862306a36Sopenharmony_ci { 0x22, 0x7AB, 0xEB }, 230962306a36Sopenharmony_ci { 0x22, 0x7AC, 0x0B }, 231062306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 231162306a36Sopenharmony_ci { 0x22, 0x7A6, 0x39 }, 231262306a36Sopenharmony_ci { 0x22, 0x7A7, 0x9D }, 231362306a36Sopenharmony_ci { 0x22, 0x7A8, 0xFE }, 231462306a36Sopenharmony_ci { 0x22, 0x7A9, 0x39 }, 231562306a36Sopenharmony_ci { 0x22, 0x7AA, 0x9D }, 231662306a36Sopenharmony_ci { 0x22, 0x7AB, 0xFE }, 231762306a36Sopenharmony_ci { 0x22, 0x7AC, 0x0C }, 231862306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 231962306a36Sopenharmony_ci { 0x22, 0x7A6, 0x76 }, 232062306a36Sopenharmony_ci { 0x22, 0x7A7, 0x49 }, 232162306a36Sopenharmony_ci { 0x22, 0x7A8, 0x15 }, 232262306a36Sopenharmony_ci { 0x22, 0x7A9, 0x76 }, 232362306a36Sopenharmony_ci { 0x22, 0x7AA, 0x49 }, 232462306a36Sopenharmony_ci { 0x22, 0x7AB, 0x15 }, 232562306a36Sopenharmony_ci { 0x22, 0x7AC, 0x0D }, 232662306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 232762306a36Sopenharmony_ci { 0x22, 0x7A6, 0xC8 }, 232862306a36Sopenharmony_ci { 0x22, 0x7A7, 0x80 }, 232962306a36Sopenharmony_ci { 0x22, 0x7A8, 0xF5 }, 233062306a36Sopenharmony_ci { 0x22, 0x7A9, 0xC8 }, 233162306a36Sopenharmony_ci { 0x22, 0x7AA, 0x80 }, 233262306a36Sopenharmony_ci { 0x22, 0x7AB, 0xF5 }, 233362306a36Sopenharmony_ci { 0x22, 0x7AC, 0x0E }, 233462306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 233562306a36Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 233662306a36Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 233762306a36Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 233862306a36Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 233962306a36Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 234062306a36Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 234162306a36Sopenharmony_ci { 0x22, 0x7AC, 0x0F }, 234262306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 234362306a36Sopenharmony_ci { 0x22, 0x7A6, 0x90 }, 234462306a36Sopenharmony_ci { 0x22, 0x7A7, 0x68 }, 234562306a36Sopenharmony_ci { 0x22, 0x7A8, 0xF1 }, 234662306a36Sopenharmony_ci { 0x22, 0x7A9, 0x90 }, 234762306a36Sopenharmony_ci { 0x22, 0x7AA, 0x68 }, 234862306a36Sopenharmony_ci { 0x22, 0x7AB, 0xF1 }, 234962306a36Sopenharmony_ci { 0x22, 0x7AC, 0x10 }, 235062306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 235162306a36Sopenharmony_ci { 0x22, 0x7A6, 0x34 }, 235262306a36Sopenharmony_ci { 0x22, 0x7A7, 0x47 }, 235362306a36Sopenharmony_ci { 0x22, 0x7A8, 0x6C }, 235462306a36Sopenharmony_ci { 0x22, 0x7A9, 0x34 }, 235562306a36Sopenharmony_ci { 0x22, 0x7AA, 0x47 }, 235662306a36Sopenharmony_ci { 0x22, 0x7AB, 0x6C }, 235762306a36Sopenharmony_ci { 0x22, 0x7AC, 0x11 }, 235862306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 235962306a36Sopenharmony_ci { 0x22, 0x7A6, 0x6F }, 236062306a36Sopenharmony_ci { 0x22, 0x7A7, 0x97 }, 236162306a36Sopenharmony_ci { 0x22, 0x7A8, 0x0F }, 236262306a36Sopenharmony_ci { 0x22, 0x7A9, 0x6F }, 236362306a36Sopenharmony_ci { 0x22, 0x7AA, 0x97 }, 236462306a36Sopenharmony_ci { 0x22, 0x7AB, 0x0F }, 236562306a36Sopenharmony_ci { 0x22, 0x7AC, 0x12 }, 236662306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 236762306a36Sopenharmony_ci { 0x22, 0x7A6, 0xCB }, 236862306a36Sopenharmony_ci { 0x22, 0x7A7, 0xB8 }, 236962306a36Sopenharmony_ci { 0x22, 0x7A8, 0x94 }, 237062306a36Sopenharmony_ci { 0x22, 0x7A9, 0xCB }, 237162306a36Sopenharmony_ci { 0x22, 0x7AA, 0xB8 }, 237262306a36Sopenharmony_ci { 0x22, 0x7AB, 0x94 }, 237362306a36Sopenharmony_ci { 0x22, 0x7AC, 0x13 }, 237462306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 237562306a36Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 237662306a36Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 237762306a36Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 237862306a36Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 237962306a36Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 238062306a36Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 238162306a36Sopenharmony_ci { 0x22, 0x7AC, 0x14 }, 238262306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 238362306a36Sopenharmony_ci { 0x22, 0x7A6, 0x95 }, 238462306a36Sopenharmony_ci { 0x22, 0x7A7, 0x76 }, 238562306a36Sopenharmony_ci { 0x22, 0x7A8, 0x5B }, 238662306a36Sopenharmony_ci { 0x22, 0x7A9, 0x95 }, 238762306a36Sopenharmony_ci { 0x22, 0x7AA, 0x76 }, 238862306a36Sopenharmony_ci { 0x22, 0x7AB, 0x5B }, 238962306a36Sopenharmony_ci { 0x22, 0x7AC, 0x15 }, 239062306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 239162306a36Sopenharmony_ci { 0x22, 0x7A6, 0x31 }, 239262306a36Sopenharmony_ci { 0x22, 0x7A7, 0xAC }, 239362306a36Sopenharmony_ci { 0x22, 0x7A8, 0x31 }, 239462306a36Sopenharmony_ci { 0x22, 0x7A9, 0x31 }, 239562306a36Sopenharmony_ci { 0x22, 0x7AA, 0xAC }, 239662306a36Sopenharmony_ci { 0x22, 0x7AB, 0x31 }, 239762306a36Sopenharmony_ci { 0x22, 0x7AC, 0x16 }, 239862306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 239962306a36Sopenharmony_ci { 0x22, 0x7A6, 0x6A }, 240062306a36Sopenharmony_ci { 0x22, 0x7A7, 0x89 }, 240162306a36Sopenharmony_ci { 0x22, 0x7A8, 0xA5 }, 240262306a36Sopenharmony_ci { 0x22, 0x7A9, 0x6A }, 240362306a36Sopenharmony_ci { 0x22, 0x7AA, 0x89 }, 240462306a36Sopenharmony_ci { 0x22, 0x7AB, 0xA5 }, 240562306a36Sopenharmony_ci { 0x22, 0x7AC, 0x17 }, 240662306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 240762306a36Sopenharmony_ci { 0x22, 0x7A6, 0xCE }, 240862306a36Sopenharmony_ci { 0x22, 0x7A7, 0x53 }, 240962306a36Sopenharmony_ci { 0x22, 0x7A8, 0xCF }, 241062306a36Sopenharmony_ci { 0x22, 0x7A9, 0xCE }, 241162306a36Sopenharmony_ci { 0x22, 0x7AA, 0x53 }, 241262306a36Sopenharmony_ci { 0x22, 0x7AB, 0xCF }, 241362306a36Sopenharmony_ci { 0x22, 0x7AC, 0x18 }, 241462306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 241562306a36Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 241662306a36Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 241762306a36Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 241862306a36Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 241962306a36Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 242062306a36Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 242162306a36Sopenharmony_ci { 0x22, 0x7AC, 0x19 }, 242262306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 242362306a36Sopenharmony_ci /* 48KHz base */ 242462306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 242562306a36Sopenharmony_ci { 0x22, 0x7A7, 0x88 }, 242662306a36Sopenharmony_ci { 0x22, 0x7A8, 0xDC }, 242762306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 242862306a36Sopenharmony_ci { 0x22, 0x7AA, 0x88 }, 242962306a36Sopenharmony_ci { 0x22, 0x7AB, 0xDC }, 243062306a36Sopenharmony_ci { 0x22, 0x7AC, 0x1A }, 243162306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 243262306a36Sopenharmony_ci { 0x22, 0x7A6, 0x82 }, 243362306a36Sopenharmony_ci { 0x22, 0x7A7, 0xEE }, 243462306a36Sopenharmony_ci { 0x22, 0x7A8, 0x46 }, 243562306a36Sopenharmony_ci { 0x22, 0x7A9, 0x82 }, 243662306a36Sopenharmony_ci { 0x22, 0x7AA, 0xEE }, 243762306a36Sopenharmony_ci { 0x22, 0x7AB, 0x46 }, 243862306a36Sopenharmony_ci { 0x22, 0x7AC, 0x1B }, 243962306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 244062306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 244162306a36Sopenharmony_ci { 0x22, 0x7A7, 0x88 }, 244262306a36Sopenharmony_ci { 0x22, 0x7A8, 0xDC }, 244362306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 244462306a36Sopenharmony_ci { 0x22, 0x7AA, 0x88 }, 244562306a36Sopenharmony_ci { 0x22, 0x7AB, 0xDC }, 244662306a36Sopenharmony_ci { 0x22, 0x7AC, 0x1C }, 244762306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 244862306a36Sopenharmony_ci { 0x22, 0x7A6, 0x7D }, 244962306a36Sopenharmony_ci { 0x22, 0x7A7, 0x09 }, 245062306a36Sopenharmony_ci { 0x22, 0x7A8, 0x28 }, 245162306a36Sopenharmony_ci { 0x22, 0x7A9, 0x7D }, 245262306a36Sopenharmony_ci { 0x22, 0x7AA, 0x09 }, 245362306a36Sopenharmony_ci { 0x22, 0x7AB, 0x28 }, 245462306a36Sopenharmony_ci { 0x22, 0x7AC, 0x1D }, 245562306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 245662306a36Sopenharmony_ci { 0x22, 0x7A6, 0xC2 }, 245762306a36Sopenharmony_ci { 0x22, 0x7A7, 0xE5 }, 245862306a36Sopenharmony_ci { 0x22, 0x7A8, 0xB4 }, 245962306a36Sopenharmony_ci { 0x22, 0x7A9, 0xC2 }, 246062306a36Sopenharmony_ci { 0x22, 0x7AA, 0xE5 }, 246162306a36Sopenharmony_ci { 0x22, 0x7AB, 0xB4 }, 246262306a36Sopenharmony_ci { 0x22, 0x7AC, 0x1E }, 246362306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 246462306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 246562306a36Sopenharmony_ci { 0x22, 0x7A7, 0xA3 }, 246662306a36Sopenharmony_ci { 0x22, 0x7A8, 0x1F }, 246762306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 246862306a36Sopenharmony_ci { 0x22, 0x7AA, 0xA3 }, 246962306a36Sopenharmony_ci { 0x22, 0x7AB, 0x1F }, 247062306a36Sopenharmony_ci { 0x22, 0x7AC, 0x1F }, 247162306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 247262306a36Sopenharmony_ci { 0x22, 0x7A6, 0x84 }, 247362306a36Sopenharmony_ci { 0x22, 0x7A7, 0xCA }, 247462306a36Sopenharmony_ci { 0x22, 0x7A8, 0xF1 }, 247562306a36Sopenharmony_ci { 0x22, 0x7A9, 0x84 }, 247662306a36Sopenharmony_ci { 0x22, 0x7AA, 0xCA }, 247762306a36Sopenharmony_ci { 0x22, 0x7AB, 0xF1 }, 247862306a36Sopenharmony_ci { 0x22, 0x7AC, 0x20 }, 247962306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 248062306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3C }, 248162306a36Sopenharmony_ci { 0x22, 0x7A7, 0xD5 }, 248262306a36Sopenharmony_ci { 0x22, 0x7A8, 0x9C }, 248362306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3C }, 248462306a36Sopenharmony_ci { 0x22, 0x7AA, 0xD5 }, 248562306a36Sopenharmony_ci { 0x22, 0x7AB, 0x9C }, 248662306a36Sopenharmony_ci { 0x22, 0x7AC, 0x21 }, 248762306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 248862306a36Sopenharmony_ci { 0x22, 0x7A6, 0x7B }, 248962306a36Sopenharmony_ci { 0x22, 0x7A7, 0x35 }, 249062306a36Sopenharmony_ci { 0x22, 0x7A8, 0x0F }, 249162306a36Sopenharmony_ci { 0x22, 0x7A9, 0x7B }, 249262306a36Sopenharmony_ci { 0x22, 0x7AA, 0x35 }, 249362306a36Sopenharmony_ci { 0x22, 0x7AB, 0x0F }, 249462306a36Sopenharmony_ci { 0x22, 0x7AC, 0x22 }, 249562306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 249662306a36Sopenharmony_ci { 0x22, 0x7A6, 0xC4 }, 249762306a36Sopenharmony_ci { 0x22, 0x7A7, 0x87 }, 249862306a36Sopenharmony_ci { 0x22, 0x7A8, 0x45 }, 249962306a36Sopenharmony_ci { 0x22, 0x7A9, 0xC4 }, 250062306a36Sopenharmony_ci { 0x22, 0x7AA, 0x87 }, 250162306a36Sopenharmony_ci { 0x22, 0x7AB, 0x45 }, 250262306a36Sopenharmony_ci { 0x22, 0x7AC, 0x23 }, 250362306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 250462306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 250562306a36Sopenharmony_ci { 0x22, 0x7A7, 0x0A }, 250662306a36Sopenharmony_ci { 0x22, 0x7A8, 0x78 }, 250762306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 250862306a36Sopenharmony_ci { 0x22, 0x7AA, 0x0A }, 250962306a36Sopenharmony_ci { 0x22, 0x7AB, 0x78 }, 251062306a36Sopenharmony_ci { 0x22, 0x7AC, 0x24 }, 251162306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 251262306a36Sopenharmony_ci { 0x22, 0x7A6, 0x88 }, 251362306a36Sopenharmony_ci { 0x22, 0x7A7, 0xE2 }, 251462306a36Sopenharmony_ci { 0x22, 0x7A8, 0x05 }, 251562306a36Sopenharmony_ci { 0x22, 0x7A9, 0x88 }, 251662306a36Sopenharmony_ci { 0x22, 0x7AA, 0xE2 }, 251762306a36Sopenharmony_ci { 0x22, 0x7AB, 0x05 }, 251862306a36Sopenharmony_ci { 0x22, 0x7AC, 0x25 }, 251962306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 252062306a36Sopenharmony_ci { 0x22, 0x7A6, 0x3A }, 252162306a36Sopenharmony_ci { 0x22, 0x7A7, 0x1A }, 252262306a36Sopenharmony_ci { 0x22, 0x7A8, 0xA3 }, 252362306a36Sopenharmony_ci { 0x22, 0x7A9, 0x3A }, 252462306a36Sopenharmony_ci { 0x22, 0x7AA, 0x1A }, 252562306a36Sopenharmony_ci { 0x22, 0x7AB, 0xA3 }, 252662306a36Sopenharmony_ci { 0x22, 0x7AC, 0x26 }, 252762306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 252862306a36Sopenharmony_ci { 0x22, 0x7A6, 0x77 }, 252962306a36Sopenharmony_ci { 0x22, 0x7A7, 0x1D }, 253062306a36Sopenharmony_ci { 0x22, 0x7A8, 0xFB }, 253162306a36Sopenharmony_ci { 0x22, 0x7A9, 0x77 }, 253262306a36Sopenharmony_ci { 0x22, 0x7AA, 0x1D }, 253362306a36Sopenharmony_ci { 0x22, 0x7AB, 0xFB }, 253462306a36Sopenharmony_ci { 0x22, 0x7AC, 0x27 }, 253562306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 253662306a36Sopenharmony_ci { 0x22, 0x7A6, 0xC7 }, 253762306a36Sopenharmony_ci { 0x22, 0x7A7, 0xDA }, 253862306a36Sopenharmony_ci { 0x22, 0x7A8, 0xE5 }, 253962306a36Sopenharmony_ci { 0x22, 0x7A9, 0xC7 }, 254062306a36Sopenharmony_ci { 0x22, 0x7AA, 0xDA }, 254162306a36Sopenharmony_ci { 0x22, 0x7AB, 0xE5 }, 254262306a36Sopenharmony_ci { 0x22, 0x7AC, 0x28 }, 254362306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 254462306a36Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 254562306a36Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 254662306a36Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 254762306a36Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 254862306a36Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 254962306a36Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 255062306a36Sopenharmony_ci { 0x22, 0x7AC, 0x29 }, 255162306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 255262306a36Sopenharmony_ci { 0x22, 0x7A6, 0x8E }, 255362306a36Sopenharmony_ci { 0x22, 0x7A7, 0xD7 }, 255462306a36Sopenharmony_ci { 0x22, 0x7A8, 0x22 }, 255562306a36Sopenharmony_ci { 0x22, 0x7A9, 0x8E }, 255662306a36Sopenharmony_ci { 0x22, 0x7AA, 0xD7 }, 255762306a36Sopenharmony_ci { 0x22, 0x7AB, 0x22 }, 255862306a36Sopenharmony_ci { 0x22, 0x7AC, 0x2A }, 255962306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 256062306a36Sopenharmony_ci { 0x22, 0x7A6, 0x35 }, 256162306a36Sopenharmony_ci { 0x22, 0x7A7, 0x26 }, 256262306a36Sopenharmony_ci { 0x22, 0x7A8, 0xC6 }, 256362306a36Sopenharmony_ci { 0x22, 0x7A9, 0x35 }, 256462306a36Sopenharmony_ci { 0x22, 0x7AA, 0x26 }, 256562306a36Sopenharmony_ci { 0x22, 0x7AB, 0xC6 }, 256662306a36Sopenharmony_ci { 0x22, 0x7AC, 0x2B }, 256762306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 256862306a36Sopenharmony_ci { 0x22, 0x7A6, 0x71 }, 256962306a36Sopenharmony_ci { 0x22, 0x7A7, 0x28 }, 257062306a36Sopenharmony_ci { 0x22, 0x7A8, 0xDE }, 257162306a36Sopenharmony_ci { 0x22, 0x7A9, 0x71 }, 257262306a36Sopenharmony_ci { 0x22, 0x7AA, 0x28 }, 257362306a36Sopenharmony_ci { 0x22, 0x7AB, 0xDE }, 257462306a36Sopenharmony_ci { 0x22, 0x7AC, 0x2C }, 257562306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 257662306a36Sopenharmony_ci { 0x22, 0x7A6, 0xCA }, 257762306a36Sopenharmony_ci { 0x22, 0x7A7, 0xD9 }, 257862306a36Sopenharmony_ci { 0x22, 0x7A8, 0x3A }, 257962306a36Sopenharmony_ci { 0x22, 0x7A9, 0xCA }, 258062306a36Sopenharmony_ci { 0x22, 0x7AA, 0xD9 }, 258162306a36Sopenharmony_ci { 0x22, 0x7AB, 0x3A }, 258262306a36Sopenharmony_ci { 0x22, 0x7AC, 0x2D }, 258362306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 258462306a36Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 258562306a36Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 258662306a36Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 258762306a36Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 258862306a36Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 258962306a36Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 259062306a36Sopenharmony_ci { 0x22, 0x7AC, 0x2E }, 259162306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 259262306a36Sopenharmony_ci { 0x22, 0x7A6, 0x93 }, 259362306a36Sopenharmony_ci { 0x22, 0x7A7, 0x5E }, 259462306a36Sopenharmony_ci { 0x22, 0x7A8, 0xD8 }, 259562306a36Sopenharmony_ci { 0x22, 0x7A9, 0x93 }, 259662306a36Sopenharmony_ci { 0x22, 0x7AA, 0x5E }, 259762306a36Sopenharmony_ci { 0x22, 0x7AB, 0xD8 }, 259862306a36Sopenharmony_ci { 0x22, 0x7AC, 0x2F }, 259962306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 260062306a36Sopenharmony_ci { 0x22, 0x7A6, 0x32 }, 260162306a36Sopenharmony_ci { 0x22, 0x7A7, 0xB7 }, 260262306a36Sopenharmony_ci { 0x22, 0x7A8, 0xB1 }, 260362306a36Sopenharmony_ci { 0x22, 0x7A9, 0x32 }, 260462306a36Sopenharmony_ci { 0x22, 0x7AA, 0xB7 }, 260562306a36Sopenharmony_ci { 0x22, 0x7AB, 0xB1 }, 260662306a36Sopenharmony_ci { 0x22, 0x7AC, 0x30 }, 260762306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 260862306a36Sopenharmony_ci { 0x22, 0x7A6, 0x6C }, 260962306a36Sopenharmony_ci { 0x22, 0x7A7, 0xA1 }, 261062306a36Sopenharmony_ci { 0x22, 0x7A8, 0x28 }, 261162306a36Sopenharmony_ci { 0x22, 0x7A9, 0x6C }, 261262306a36Sopenharmony_ci { 0x22, 0x7AA, 0xA1 }, 261362306a36Sopenharmony_ci { 0x22, 0x7AB, 0x28 }, 261462306a36Sopenharmony_ci { 0x22, 0x7AC, 0x31 }, 261562306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 261662306a36Sopenharmony_ci { 0x22, 0x7A6, 0xCD }, 261762306a36Sopenharmony_ci { 0x22, 0x7A7, 0x48 }, 261862306a36Sopenharmony_ci { 0x22, 0x7A8, 0x4F }, 261962306a36Sopenharmony_ci { 0x22, 0x7A9, 0xCD }, 262062306a36Sopenharmony_ci { 0x22, 0x7AA, 0x48 }, 262162306a36Sopenharmony_ci { 0x22, 0x7AB, 0x4F }, 262262306a36Sopenharmony_ci { 0x22, 0x7AC, 0x32 }, 262362306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 262462306a36Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 262562306a36Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 262662306a36Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 262762306a36Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 262862306a36Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 262962306a36Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 263062306a36Sopenharmony_ci { 0x22, 0x7AC, 0x33 }, 263162306a36Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 263262306a36Sopenharmony_ci /* common */ 263362306a36Sopenharmony_ci { 0x22, 0x782, 0xC1 }, 263462306a36Sopenharmony_ci { 0x22, 0x771, 0x2C }, 263562306a36Sopenharmony_ci { 0x22, 0x772, 0x2C }, 263662306a36Sopenharmony_ci { 0x22, 0x788, 0x04 }, 263762306a36Sopenharmony_ci { 0x01, 0x7B0, 0x08 }, 263862306a36Sopenharmony_ci {} 263962306a36Sopenharmony_ci}; 264062306a36Sopenharmony_ci 264162306a36Sopenharmony_cistatic const struct hda_fixup stac92hd83xxx_fixups[] = { 264262306a36Sopenharmony_ci [STAC_92HD83XXX_REF] = { 264362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 264462306a36Sopenharmony_ci .v.pins = ref92hd83xxx_pin_configs, 264562306a36Sopenharmony_ci }, 264662306a36Sopenharmony_ci [STAC_92HD83XXX_PWR_REF] = { 264762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 264862306a36Sopenharmony_ci .v.pins = ref92hd83xxx_pin_configs, 264962306a36Sopenharmony_ci }, 265062306a36Sopenharmony_ci [STAC_DELL_S14] = { 265162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 265262306a36Sopenharmony_ci .v.pins = dell_s14_pin_configs, 265362306a36Sopenharmony_ci }, 265462306a36Sopenharmony_ci [STAC_DELL_VOSTRO_3500] = { 265562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 265662306a36Sopenharmony_ci .v.pins = dell_vostro_3500_pin_configs, 265762306a36Sopenharmony_ci }, 265862306a36Sopenharmony_ci [STAC_92HD83XXX_HP_cNB11_INTQUAD] = { 265962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 266062306a36Sopenharmony_ci .v.pins = hp_cNB11_intquad_pin_configs, 266162306a36Sopenharmony_ci .chained = true, 266262306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 266362306a36Sopenharmony_ci }, 266462306a36Sopenharmony_ci [STAC_92HD83XXX_HP] = { 266562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 266662306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp, 266762306a36Sopenharmony_ci }, 266862306a36Sopenharmony_ci [STAC_HP_DV7_4000] = { 266962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 267062306a36Sopenharmony_ci .v.pins = hp_dv7_4000_pin_configs, 267162306a36Sopenharmony_ci .chained = true, 267262306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 267362306a36Sopenharmony_ci }, 267462306a36Sopenharmony_ci [STAC_HP_ZEPHYR] = { 267562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 267662306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_zephyr, 267762306a36Sopenharmony_ci .chained = true, 267862306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 267962306a36Sopenharmony_ci }, 268062306a36Sopenharmony_ci [STAC_92HD83XXX_HP_LED] = { 268162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 268262306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_led, 268362306a36Sopenharmony_ci .chained = true, 268462306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 268562306a36Sopenharmony_ci }, 268662306a36Sopenharmony_ci [STAC_92HD83XXX_HP_INV_LED] = { 268762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 268862306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_inv_led, 268962306a36Sopenharmony_ci .chained = true, 269062306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 269162306a36Sopenharmony_ci }, 269262306a36Sopenharmony_ci [STAC_92HD83XXX_HP_MIC_LED] = { 269362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 269462306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_mic_led, 269562306a36Sopenharmony_ci .chained = true, 269662306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 269762306a36Sopenharmony_ci }, 269862306a36Sopenharmony_ci [STAC_HP_LED_GPIO10] = { 269962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 270062306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_led_gpio10, 270162306a36Sopenharmony_ci .chained = true, 270262306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 270362306a36Sopenharmony_ci }, 270462306a36Sopenharmony_ci [STAC_92HD83XXX_HEADSET_JACK] = { 270562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 270662306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_headset_jack, 270762306a36Sopenharmony_ci }, 270862306a36Sopenharmony_ci [STAC_HP_ENVY_BASS] = { 270962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 271062306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 271162306a36Sopenharmony_ci { 0x0f, 0x90170111 }, 271262306a36Sopenharmony_ci {} 271362306a36Sopenharmony_ci }, 271462306a36Sopenharmony_ci }, 271562306a36Sopenharmony_ci [STAC_HP_BNB13_EQ] = { 271662306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 271762306a36Sopenharmony_ci .v.verbs = hp_bnb13_eq_verbs, 271862306a36Sopenharmony_ci .chained = true, 271962306a36Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP_MIC_LED, 272062306a36Sopenharmony_ci }, 272162306a36Sopenharmony_ci [STAC_HP_ENVY_TS_BASS] = { 272262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 272362306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 272462306a36Sopenharmony_ci { 0x10, 0x92170111 }, 272562306a36Sopenharmony_ci {} 272662306a36Sopenharmony_ci }, 272762306a36Sopenharmony_ci }, 272862306a36Sopenharmony_ci [STAC_HP_ENVY_TS_DAC_BIND] = { 272962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 273062306a36Sopenharmony_ci .v.func = hp_envy_ts_fixup_dac_bind, 273162306a36Sopenharmony_ci .chained = true, 273262306a36Sopenharmony_ci .chain_id = STAC_HP_ENVY_TS_BASS, 273362306a36Sopenharmony_ci }, 273462306a36Sopenharmony_ci [STAC_92HD83XXX_GPIO10_EAPD] = { 273562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 273662306a36Sopenharmony_ci .v.func = stac92hd83xxx_fixup_gpio10_eapd, 273762306a36Sopenharmony_ci }, 273862306a36Sopenharmony_ci}; 273962306a36Sopenharmony_ci 274062306a36Sopenharmony_cistatic const struct hda_model_fixup stac92hd83xxx_models[] = { 274162306a36Sopenharmony_ci { .id = STAC_92HD83XXX_REF, .name = "ref" }, 274262306a36Sopenharmony_ci { .id = STAC_92HD83XXX_PWR_REF, .name = "mic-ref" }, 274362306a36Sopenharmony_ci { .id = STAC_DELL_S14, .name = "dell-s14" }, 274462306a36Sopenharmony_ci { .id = STAC_DELL_VOSTRO_3500, .name = "dell-vostro-3500" }, 274562306a36Sopenharmony_ci { .id = STAC_92HD83XXX_HP_cNB11_INTQUAD, .name = "hp_cNB11_intquad" }, 274662306a36Sopenharmony_ci { .id = STAC_HP_DV7_4000, .name = "hp-dv7-4000" }, 274762306a36Sopenharmony_ci { .id = STAC_HP_ZEPHYR, .name = "hp-zephyr" }, 274862306a36Sopenharmony_ci { .id = STAC_92HD83XXX_HP_LED, .name = "hp-led" }, 274962306a36Sopenharmony_ci { .id = STAC_92HD83XXX_HP_INV_LED, .name = "hp-inv-led" }, 275062306a36Sopenharmony_ci { .id = STAC_92HD83XXX_HP_MIC_LED, .name = "hp-mic-led" }, 275162306a36Sopenharmony_ci { .id = STAC_92HD83XXX_HEADSET_JACK, .name = "headset-jack" }, 275262306a36Sopenharmony_ci { .id = STAC_HP_ENVY_BASS, .name = "hp-envy-bass" }, 275362306a36Sopenharmony_ci { .id = STAC_HP_BNB13_EQ, .name = "hp-bnb13-eq" }, 275462306a36Sopenharmony_ci { .id = STAC_HP_ENVY_TS_BASS, .name = "hp-envy-ts-bass" }, 275562306a36Sopenharmony_ci {} 275662306a36Sopenharmony_ci}; 275762306a36Sopenharmony_ci 275862306a36Sopenharmony_cistatic const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { 275962306a36Sopenharmony_ci /* SigmaTel reference board */ 276062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 276162306a36Sopenharmony_ci "DFI LanParty", STAC_92HD83XXX_REF), 276262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 276362306a36Sopenharmony_ci "DFI LanParty", STAC_92HD83XXX_REF), 276462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, 276562306a36Sopenharmony_ci "unknown Dell", STAC_DELL_S14), 276662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0532, 276762306a36Sopenharmony_ci "Dell Latitude E6230", STAC_92HD83XXX_HEADSET_JACK), 276862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0533, 276962306a36Sopenharmony_ci "Dell Latitude E6330", STAC_92HD83XXX_HEADSET_JACK), 277062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0534, 277162306a36Sopenharmony_ci "Dell Latitude E6430", STAC_92HD83XXX_HEADSET_JACK), 277262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0535, 277362306a36Sopenharmony_ci "Dell Latitude E6530", STAC_92HD83XXX_HEADSET_JACK), 277462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x053c, 277562306a36Sopenharmony_ci "Dell Latitude E5430", STAC_92HD83XXX_HEADSET_JACK), 277662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x053d, 277762306a36Sopenharmony_ci "Dell Latitude E5530", STAC_92HD83XXX_HEADSET_JACK), 277862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0549, 277962306a36Sopenharmony_ci "Dell Latitude E5430", STAC_92HD83XXX_HEADSET_JACK), 278062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x057d, 278162306a36Sopenharmony_ci "Dell Latitude E6430s", STAC_92HD83XXX_HEADSET_JACK), 278262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0584, 278362306a36Sopenharmony_ci "Dell Latitude E6430U", STAC_92HD83XXX_HEADSET_JACK), 278462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028, 278562306a36Sopenharmony_ci "Dell Vostro 3500", STAC_DELL_VOSTRO_3500), 278662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656, 278762306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 278862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657, 278962306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 279062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658, 279162306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 279262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659, 279362306a36Sopenharmony_ci "HP Pavilion dv7", STAC_HP_DV7_4000), 279462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A, 279562306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 279662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B, 279762306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 279862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888, 279962306a36Sopenharmony_ci "HP Envy Spectre", STAC_HP_ENVY_BASS), 280062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1899, 280162306a36Sopenharmony_ci "HP Folio 13", STAC_HP_LED_GPIO10), 280262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df, 280362306a36Sopenharmony_ci "HP Folio", STAC_HP_BNB13_EQ), 280462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8, 280562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 280662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1909, 280762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 280862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190A, 280962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 281062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190e, 281162306a36Sopenharmony_ci "HP ENVY TS", STAC_HP_ENVY_TS_BASS), 281262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1967, 281362306a36Sopenharmony_ci "HP ENVY TS", STAC_HP_ENVY_TS_DAC_BIND), 281462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940, 281562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 281662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941, 281762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 281862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1942, 281962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 282062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1943, 282162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 282262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1944, 282362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 282462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1945, 282562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 282662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1946, 282762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 282862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1948, 282962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 283062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1949, 283162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 283262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194A, 283362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 283462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194B, 283562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 283662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194C, 283762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 283862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194E, 283962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 284062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194F, 284162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 284262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1950, 284362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 284462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1951, 284562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 284662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195A, 284762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 284862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195B, 284962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 285062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195C, 285162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 285262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1991, 285362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 285462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2103, 285562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 285662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2104, 285762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 285862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2105, 285962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 286062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2106, 286162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 286262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2107, 286362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 286462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2108, 286562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 286662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2109, 286762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 286862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210A, 286962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 287062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210B, 287162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 287262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211C, 287362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 287462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211D, 287562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 287662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211E, 287762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 287862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211F, 287962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 288062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2120, 288162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 288262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2121, 288362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 288462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2122, 288562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 288662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2123, 288762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 288862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213E, 288962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 289062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213F, 289162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 289262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2140, 289362306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 289462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B2, 289562306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 289662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B3, 289762306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 289862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B5, 289962306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 290062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B6, 290162306a36Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 290262306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x1900, 290362306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_MIC_LED), 290462306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2000, 290562306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_MIC_LED), 290662306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2100, 290762306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_MIC_LED), 290862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3388, 290962306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 291062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3389, 291162306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 291262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355B, 291362306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 291462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355C, 291562306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 291662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355D, 291762306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 291862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355E, 291962306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 292062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355F, 292162306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 292262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3560, 292362306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 292462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358B, 292562306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 292662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358C, 292762306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 292862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358D, 292962306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 293062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3591, 293162306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 293262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3592, 293362306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 293462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3593, 293562306a36Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 293662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3561, 293762306a36Sopenharmony_ci "HP", STAC_HP_ZEPHYR), 293862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3660, 293962306a36Sopenharmony_ci "HP Mini", STAC_92HD83XXX_HP_LED), 294062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x144E, 294162306a36Sopenharmony_ci "HP Pavilion dv5", STAC_92HD83XXX_HP_INV_LED), 294262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a, 294362306a36Sopenharmony_ci "HP Mini", STAC_92HD83XXX_HP_LED), 294462306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP), 294562306a36Sopenharmony_ci /* match both for 0xfa91 and 0xfa93 */ 294662306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_TOSHIBA, 0xfffd, 0xfa91, 294762306a36Sopenharmony_ci "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD), 294862306a36Sopenharmony_ci {} /* terminator */ 294962306a36Sopenharmony_ci}; 295062306a36Sopenharmony_ci 295162306a36Sopenharmony_ci/* HP dv7 bass switch - GPIO5 */ 295262306a36Sopenharmony_ci#define stac_hp_bass_gpio_info snd_ctl_boolean_mono_info 295362306a36Sopenharmony_cistatic int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol, 295462306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 295562306a36Sopenharmony_ci{ 295662306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 295762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 295862306a36Sopenharmony_ci ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20); 295962306a36Sopenharmony_ci return 0; 296062306a36Sopenharmony_ci} 296162306a36Sopenharmony_ci 296262306a36Sopenharmony_cistatic int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol, 296362306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 296462306a36Sopenharmony_ci{ 296562306a36Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 296662306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 296762306a36Sopenharmony_ci unsigned int gpio_data; 296862306a36Sopenharmony_ci 296962306a36Sopenharmony_ci gpio_data = (spec->gpio_data & ~0x20) | 297062306a36Sopenharmony_ci (ucontrol->value.integer.value[0] ? 0x20 : 0); 297162306a36Sopenharmony_ci if (gpio_data == spec->gpio_data) 297262306a36Sopenharmony_ci return 0; 297362306a36Sopenharmony_ci spec->gpio_data = gpio_data; 297462306a36Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 297562306a36Sopenharmony_ci return 1; 297662306a36Sopenharmony_ci} 297762306a36Sopenharmony_ci 297862306a36Sopenharmony_cistatic const struct snd_kcontrol_new stac_hp_bass_sw_ctrl = { 297962306a36Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 298062306a36Sopenharmony_ci .info = stac_hp_bass_gpio_info, 298162306a36Sopenharmony_ci .get = stac_hp_bass_gpio_get, 298262306a36Sopenharmony_ci .put = stac_hp_bass_gpio_put, 298362306a36Sopenharmony_ci}; 298462306a36Sopenharmony_ci 298562306a36Sopenharmony_cistatic int stac_add_hp_bass_switch(struct hda_codec *codec) 298662306a36Sopenharmony_ci{ 298762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 298862306a36Sopenharmony_ci 298962306a36Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, "Bass Speaker Playback Switch", 299062306a36Sopenharmony_ci &stac_hp_bass_sw_ctrl)) 299162306a36Sopenharmony_ci return -ENOMEM; 299262306a36Sopenharmony_ci 299362306a36Sopenharmony_ci spec->gpio_mask |= 0x20; 299462306a36Sopenharmony_ci spec->gpio_dir |= 0x20; 299562306a36Sopenharmony_ci spec->gpio_data |= 0x20; 299662306a36Sopenharmony_ci return 0; 299762306a36Sopenharmony_ci} 299862306a36Sopenharmony_ci 299962306a36Sopenharmony_cistatic const struct hda_pintbl ref92hd71bxx_pin_configs[] = { 300062306a36Sopenharmony_ci { 0x0a, 0x02214030 }, 300162306a36Sopenharmony_ci { 0x0b, 0x02a19040 }, 300262306a36Sopenharmony_ci { 0x0c, 0x01a19020 }, 300362306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 300462306a36Sopenharmony_ci { 0x0e, 0x0181302e }, 300562306a36Sopenharmony_ci { 0x0f, 0x01014010 }, 300662306a36Sopenharmony_ci { 0x14, 0x01019020 }, 300762306a36Sopenharmony_ci { 0x18, 0x90a000f0 }, 300862306a36Sopenharmony_ci { 0x19, 0x90a000f0 }, 300962306a36Sopenharmony_ci { 0x1e, 0x01452050 }, 301062306a36Sopenharmony_ci { 0x1f, 0x01452050 }, 301162306a36Sopenharmony_ci {} 301262306a36Sopenharmony_ci}; 301362306a36Sopenharmony_ci 301462306a36Sopenharmony_cistatic const struct hda_pintbl dell_m4_1_pin_configs[] = { 301562306a36Sopenharmony_ci { 0x0a, 0x0421101f }, 301662306a36Sopenharmony_ci { 0x0b, 0x04a11221 }, 301762306a36Sopenharmony_ci { 0x0c, 0x40f000f0 }, 301862306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 301962306a36Sopenharmony_ci { 0x0e, 0x23a1902e }, 302062306a36Sopenharmony_ci { 0x0f, 0x23014250 }, 302162306a36Sopenharmony_ci { 0x14, 0x40f000f0 }, 302262306a36Sopenharmony_ci { 0x18, 0x90a000f0 }, 302362306a36Sopenharmony_ci { 0x19, 0x40f000f0 }, 302462306a36Sopenharmony_ci { 0x1e, 0x4f0000f0 }, 302562306a36Sopenharmony_ci { 0x1f, 0x4f0000f0 }, 302662306a36Sopenharmony_ci {} 302762306a36Sopenharmony_ci}; 302862306a36Sopenharmony_ci 302962306a36Sopenharmony_cistatic const struct hda_pintbl dell_m4_2_pin_configs[] = { 303062306a36Sopenharmony_ci { 0x0a, 0x0421101f }, 303162306a36Sopenharmony_ci { 0x0b, 0x04a11221 }, 303262306a36Sopenharmony_ci { 0x0c, 0x90a70330 }, 303362306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 303462306a36Sopenharmony_ci { 0x0e, 0x23a1902e }, 303562306a36Sopenharmony_ci { 0x0f, 0x23014250 }, 303662306a36Sopenharmony_ci { 0x14, 0x40f000f0 }, 303762306a36Sopenharmony_ci { 0x18, 0x40f000f0 }, 303862306a36Sopenharmony_ci { 0x19, 0x40f000f0 }, 303962306a36Sopenharmony_ci { 0x1e, 0x044413b0 }, 304062306a36Sopenharmony_ci { 0x1f, 0x044413b0 }, 304162306a36Sopenharmony_ci {} 304262306a36Sopenharmony_ci}; 304362306a36Sopenharmony_ci 304462306a36Sopenharmony_cistatic const struct hda_pintbl dell_m4_3_pin_configs[] = { 304562306a36Sopenharmony_ci { 0x0a, 0x0421101f }, 304662306a36Sopenharmony_ci { 0x0b, 0x04a11221 }, 304762306a36Sopenharmony_ci { 0x0c, 0x90a70330 }, 304862306a36Sopenharmony_ci { 0x0d, 0x90170110 }, 304962306a36Sopenharmony_ci { 0x0e, 0x40f000f0 }, 305062306a36Sopenharmony_ci { 0x0f, 0x40f000f0 }, 305162306a36Sopenharmony_ci { 0x14, 0x40f000f0 }, 305262306a36Sopenharmony_ci { 0x18, 0x90a000f0 }, 305362306a36Sopenharmony_ci { 0x19, 0x40f000f0 }, 305462306a36Sopenharmony_ci { 0x1e, 0x044413b0 }, 305562306a36Sopenharmony_ci { 0x1f, 0x044413b0 }, 305662306a36Sopenharmony_ci {} 305762306a36Sopenharmony_ci}; 305862306a36Sopenharmony_ci 305962306a36Sopenharmony_cistatic void stac92hd71bxx_fixup_ref(struct hda_codec *codec, 306062306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 306162306a36Sopenharmony_ci{ 306262306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 306362306a36Sopenharmony_ci 306462306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 306562306a36Sopenharmony_ci return; 306662306a36Sopenharmony_ci 306762306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref92hd71bxx_pin_configs); 306862306a36Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0; 306962306a36Sopenharmony_ci} 307062306a36Sopenharmony_ci 307162306a36Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_m4(struct hda_codec *codec, 307262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 307362306a36Sopenharmony_ci{ 307462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 307562306a36Sopenharmony_ci struct hda_jack_callback *jack; 307662306a36Sopenharmony_ci 307762306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 307862306a36Sopenharmony_ci return; 307962306a36Sopenharmony_ci 308062306a36Sopenharmony_ci /* Enable VREF power saving on GPIO1 detect */ 308162306a36Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 308262306a36Sopenharmony_ci AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); 308362306a36Sopenharmony_ci jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg, 308462306a36Sopenharmony_ci stac_vref_event); 308562306a36Sopenharmony_ci if (!IS_ERR(jack)) 308662306a36Sopenharmony_ci jack->private_data = 0x02; 308762306a36Sopenharmony_ci 308862306a36Sopenharmony_ci spec->gpio_mask |= 0x02; 308962306a36Sopenharmony_ci 309062306a36Sopenharmony_ci /* enable internal microphone */ 309162306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040); 309262306a36Sopenharmony_ci} 309362306a36Sopenharmony_ci 309462306a36Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_dv4(struct hda_codec *codec, 309562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 309662306a36Sopenharmony_ci{ 309762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 309862306a36Sopenharmony_ci 309962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 310062306a36Sopenharmony_ci return; 310162306a36Sopenharmony_ci spec->gpio_led = 0x01; 310262306a36Sopenharmony_ci} 310362306a36Sopenharmony_ci 310462306a36Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_dv5(struct hda_codec *codec, 310562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 310662306a36Sopenharmony_ci{ 310762306a36Sopenharmony_ci unsigned int cap; 310862306a36Sopenharmony_ci 310962306a36Sopenharmony_ci switch (action) { 311062306a36Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 311162306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); 311262306a36Sopenharmony_ci break; 311362306a36Sopenharmony_ci 311462306a36Sopenharmony_ci case HDA_FIXUP_ACT_PROBE: 311562306a36Sopenharmony_ci /* enable bass on HP dv7 */ 311662306a36Sopenharmony_ci cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP); 311762306a36Sopenharmony_ci cap &= AC_GPIO_IO_COUNT; 311862306a36Sopenharmony_ci if (cap >= 6) 311962306a36Sopenharmony_ci stac_add_hp_bass_switch(codec); 312062306a36Sopenharmony_ci break; 312162306a36Sopenharmony_ci } 312262306a36Sopenharmony_ci} 312362306a36Sopenharmony_ci 312462306a36Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_hdx(struct hda_codec *codec, 312562306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 312662306a36Sopenharmony_ci{ 312762306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 312862306a36Sopenharmony_ci 312962306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 313062306a36Sopenharmony_ci return; 313162306a36Sopenharmony_ci spec->gpio_led = 0x08; 313262306a36Sopenharmony_ci} 313362306a36Sopenharmony_ci 313462306a36Sopenharmony_cistatic bool is_hp_output(struct hda_codec *codec, hda_nid_t pin) 313562306a36Sopenharmony_ci{ 313662306a36Sopenharmony_ci unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin); 313762306a36Sopenharmony_ci 313862306a36Sopenharmony_ci /* count line-out, too, as BIOS sets often so */ 313962306a36Sopenharmony_ci return get_defcfg_connect(pin_cfg) != AC_JACK_PORT_NONE && 314062306a36Sopenharmony_ci (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || 314162306a36Sopenharmony_ci get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT); 314262306a36Sopenharmony_ci} 314362306a36Sopenharmony_ci 314462306a36Sopenharmony_cistatic void fixup_hp_headphone(struct hda_codec *codec, hda_nid_t pin) 314562306a36Sopenharmony_ci{ 314662306a36Sopenharmony_ci unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin); 314762306a36Sopenharmony_ci 314862306a36Sopenharmony_ci /* It was changed in the BIOS to just satisfy MS DTM. 314962306a36Sopenharmony_ci * Lets turn it back into follower HP 315062306a36Sopenharmony_ci */ 315162306a36Sopenharmony_ci pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) | 315262306a36Sopenharmony_ci (AC_JACK_HP_OUT << AC_DEFCFG_DEVICE_SHIFT); 315362306a36Sopenharmony_ci pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | AC_DEFCFG_SEQUENCE))) | 315462306a36Sopenharmony_ci 0x1f; 315562306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, pin, pin_cfg); 315662306a36Sopenharmony_ci} 315762306a36Sopenharmony_ci 315862306a36Sopenharmony_cistatic void stac92hd71bxx_fixup_hp(struct hda_codec *codec, 315962306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 316062306a36Sopenharmony_ci{ 316162306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 316262306a36Sopenharmony_ci 316362306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 316462306a36Sopenharmony_ci return; 316562306a36Sopenharmony_ci 316662306a36Sopenharmony_ci /* when both output A and F are assigned, these are supposedly 316762306a36Sopenharmony_ci * dock and built-in headphones; fix both pin configs 316862306a36Sopenharmony_ci */ 316962306a36Sopenharmony_ci if (is_hp_output(codec, 0x0a) && is_hp_output(codec, 0x0f)) { 317062306a36Sopenharmony_ci fixup_hp_headphone(codec, 0x0a); 317162306a36Sopenharmony_ci fixup_hp_headphone(codec, 0x0f); 317262306a36Sopenharmony_ci } 317362306a36Sopenharmony_ci 317462306a36Sopenharmony_ci if (find_mute_led_cfg(codec, 1)) 317562306a36Sopenharmony_ci codec_dbg(codec, "mute LED gpio %d polarity %d\n", 317662306a36Sopenharmony_ci spec->gpio_led, 317762306a36Sopenharmony_ci spec->gpio_led_polarity); 317862306a36Sopenharmony_ci 317962306a36Sopenharmony_ci} 318062306a36Sopenharmony_ci 318162306a36Sopenharmony_cistatic const struct hda_fixup stac92hd71bxx_fixups[] = { 318262306a36Sopenharmony_ci [STAC_92HD71BXX_REF] = { 318362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 318462306a36Sopenharmony_ci .v.func = stac92hd71bxx_fixup_ref, 318562306a36Sopenharmony_ci }, 318662306a36Sopenharmony_ci [STAC_DELL_M4_1] = { 318762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 318862306a36Sopenharmony_ci .v.pins = dell_m4_1_pin_configs, 318962306a36Sopenharmony_ci }, 319062306a36Sopenharmony_ci [STAC_DELL_M4_2] = { 319162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 319262306a36Sopenharmony_ci .v.pins = dell_m4_2_pin_configs, 319362306a36Sopenharmony_ci }, 319462306a36Sopenharmony_ci [STAC_DELL_M4_3] = { 319562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 319662306a36Sopenharmony_ci .v.pins = dell_m4_3_pin_configs, 319762306a36Sopenharmony_ci }, 319862306a36Sopenharmony_ci [STAC_HP_M4] = { 319962306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 320062306a36Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_m4, 320162306a36Sopenharmony_ci .chained = true, 320262306a36Sopenharmony_ci .chain_id = STAC_92HD71BXX_HP, 320362306a36Sopenharmony_ci }, 320462306a36Sopenharmony_ci [STAC_HP_DV4] = { 320562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 320662306a36Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_dv4, 320762306a36Sopenharmony_ci .chained = true, 320862306a36Sopenharmony_ci .chain_id = STAC_HP_DV5, 320962306a36Sopenharmony_ci }, 321062306a36Sopenharmony_ci [STAC_HP_DV5] = { 321162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 321262306a36Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_dv5, 321362306a36Sopenharmony_ci .chained = true, 321462306a36Sopenharmony_ci .chain_id = STAC_92HD71BXX_HP, 321562306a36Sopenharmony_ci }, 321662306a36Sopenharmony_ci [STAC_HP_HDX] = { 321762306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 321862306a36Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_hdx, 321962306a36Sopenharmony_ci .chained = true, 322062306a36Sopenharmony_ci .chain_id = STAC_92HD71BXX_HP, 322162306a36Sopenharmony_ci }, 322262306a36Sopenharmony_ci [STAC_92HD71BXX_HP] = { 322362306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 322462306a36Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp, 322562306a36Sopenharmony_ci }, 322662306a36Sopenharmony_ci}; 322762306a36Sopenharmony_ci 322862306a36Sopenharmony_cistatic const struct hda_model_fixup stac92hd71bxx_models[] = { 322962306a36Sopenharmony_ci { .id = STAC_92HD71BXX_REF, .name = "ref" }, 323062306a36Sopenharmony_ci { .id = STAC_DELL_M4_1, .name = "dell-m4-1" }, 323162306a36Sopenharmony_ci { .id = STAC_DELL_M4_2, .name = "dell-m4-2" }, 323262306a36Sopenharmony_ci { .id = STAC_DELL_M4_3, .name = "dell-m4-3" }, 323362306a36Sopenharmony_ci { .id = STAC_HP_M4, .name = "hp-m4" }, 323462306a36Sopenharmony_ci { .id = STAC_HP_DV4, .name = "hp-dv4" }, 323562306a36Sopenharmony_ci { .id = STAC_HP_DV5, .name = "hp-dv5" }, 323662306a36Sopenharmony_ci { .id = STAC_HP_HDX, .name = "hp-hdx" }, 323762306a36Sopenharmony_ci { .id = STAC_HP_DV4, .name = "hp-dv4-1222nr" }, 323862306a36Sopenharmony_ci {} 323962306a36Sopenharmony_ci}; 324062306a36Sopenharmony_ci 324162306a36Sopenharmony_cistatic const struct snd_pci_quirk stac92hd71bxx_fixup_tbl[] = { 324262306a36Sopenharmony_ci /* SigmaTel reference board */ 324362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 324462306a36Sopenharmony_ci "DFI LanParty", STAC_92HD71BXX_REF), 324562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 324662306a36Sopenharmony_ci "DFI LanParty", STAC_92HD71BXX_REF), 324762306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720, 324862306a36Sopenharmony_ci "HP", STAC_HP_DV5), 324962306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, 325062306a36Sopenharmony_ci "HP", STAC_HP_DV5), 325162306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, 325262306a36Sopenharmony_ci "HP dv4-7", STAC_HP_DV4), 325362306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600, 325462306a36Sopenharmony_ci "HP dv4-7", STAC_HP_DV5), 325562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610, 325662306a36Sopenharmony_ci "HP HDX", STAC_HP_HDX), /* HDX18 */ 325762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, 325862306a36Sopenharmony_ci "HP mini 1000", STAC_HP_M4), 325962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b, 326062306a36Sopenharmony_ci "HP HDX", STAC_HP_HDX), /* HDX16 */ 326162306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620, 326262306a36Sopenharmony_ci "HP dv6", STAC_HP_DV5), 326362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061, 326462306a36Sopenharmony_ci "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */ 326562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e, 326662306a36Sopenharmony_ci "HP DV6", STAC_HP_DV5), 326762306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010, 326862306a36Sopenharmony_ci "HP", STAC_HP_DV5), 326962306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD71BXX_HP), 327062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, 327162306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 327262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234, 327362306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 327462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250, 327562306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 327662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f, 327762306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 327862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d, 327962306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 328062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251, 328162306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 328262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277, 328362306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 328462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263, 328562306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 328662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265, 328762306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 328862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262, 328962306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 329062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, 329162306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 329262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa, 329362306a36Sopenharmony_ci "unknown Dell", STAC_DELL_M4_3), 329462306a36Sopenharmony_ci {} /* terminator */ 329562306a36Sopenharmony_ci}; 329662306a36Sopenharmony_ci 329762306a36Sopenharmony_cistatic const struct hda_pintbl ref922x_pin_configs[] = { 329862306a36Sopenharmony_ci { 0x0a, 0x01014010 }, 329962306a36Sopenharmony_ci { 0x0b, 0x01016011 }, 330062306a36Sopenharmony_ci { 0x0c, 0x01012012 }, 330162306a36Sopenharmony_ci { 0x0d, 0x0221401f }, 330262306a36Sopenharmony_ci { 0x0e, 0x01813122 }, 330362306a36Sopenharmony_ci { 0x0f, 0x01011014 }, 330462306a36Sopenharmony_ci { 0x10, 0x01441030 }, 330562306a36Sopenharmony_ci { 0x11, 0x01c41030 }, 330662306a36Sopenharmony_ci { 0x15, 0x40000100 }, 330762306a36Sopenharmony_ci { 0x1b, 0x40000100 }, 330862306a36Sopenharmony_ci {} 330962306a36Sopenharmony_ci}; 331062306a36Sopenharmony_ci 331162306a36Sopenharmony_ci/* 331262306a36Sopenharmony_ci STAC 922X pin configs for 331362306a36Sopenharmony_ci 102801A7 331462306a36Sopenharmony_ci 102801AB 331562306a36Sopenharmony_ci 102801A9 331662306a36Sopenharmony_ci 102801D1 331762306a36Sopenharmony_ci 102801D2 331862306a36Sopenharmony_ci*/ 331962306a36Sopenharmony_cistatic const struct hda_pintbl dell_922x_d81_pin_configs[] = { 332062306a36Sopenharmony_ci { 0x0a, 0x02214030 }, 332162306a36Sopenharmony_ci { 0x0b, 0x01a19021 }, 332262306a36Sopenharmony_ci { 0x0c, 0x01111012 }, 332362306a36Sopenharmony_ci { 0x0d, 0x01114010 }, 332462306a36Sopenharmony_ci { 0x0e, 0x02a19020 }, 332562306a36Sopenharmony_ci { 0x0f, 0x01117011 }, 332662306a36Sopenharmony_ci { 0x10, 0x400001f0 }, 332762306a36Sopenharmony_ci { 0x11, 0x400001f1 }, 332862306a36Sopenharmony_ci { 0x15, 0x01813122 }, 332962306a36Sopenharmony_ci { 0x1b, 0x400001f2 }, 333062306a36Sopenharmony_ci {} 333162306a36Sopenharmony_ci}; 333262306a36Sopenharmony_ci 333362306a36Sopenharmony_ci/* 333462306a36Sopenharmony_ci STAC 922X pin configs for 333562306a36Sopenharmony_ci 102801AC 333662306a36Sopenharmony_ci 102801D0 333762306a36Sopenharmony_ci*/ 333862306a36Sopenharmony_cistatic const struct hda_pintbl dell_922x_d82_pin_configs[] = { 333962306a36Sopenharmony_ci { 0x0a, 0x02214030 }, 334062306a36Sopenharmony_ci { 0x0b, 0x01a19021 }, 334162306a36Sopenharmony_ci { 0x0c, 0x01111012 }, 334262306a36Sopenharmony_ci { 0x0d, 0x01114010 }, 334362306a36Sopenharmony_ci { 0x0e, 0x02a19020 }, 334462306a36Sopenharmony_ci { 0x0f, 0x01117011 }, 334562306a36Sopenharmony_ci { 0x10, 0x01451140 }, 334662306a36Sopenharmony_ci { 0x11, 0x400001f0 }, 334762306a36Sopenharmony_ci { 0x15, 0x01813122 }, 334862306a36Sopenharmony_ci { 0x1b, 0x400001f1 }, 334962306a36Sopenharmony_ci {} 335062306a36Sopenharmony_ci}; 335162306a36Sopenharmony_ci 335262306a36Sopenharmony_ci/* 335362306a36Sopenharmony_ci STAC 922X pin configs for 335462306a36Sopenharmony_ci 102801BF 335562306a36Sopenharmony_ci*/ 335662306a36Sopenharmony_cistatic const struct hda_pintbl dell_922x_m81_pin_configs[] = { 335762306a36Sopenharmony_ci { 0x0a, 0x0321101f }, 335862306a36Sopenharmony_ci { 0x0b, 0x01112024 }, 335962306a36Sopenharmony_ci { 0x0c, 0x01111222 }, 336062306a36Sopenharmony_ci { 0x0d, 0x91174220 }, 336162306a36Sopenharmony_ci { 0x0e, 0x03a11050 }, 336262306a36Sopenharmony_ci { 0x0f, 0x01116221 }, 336362306a36Sopenharmony_ci { 0x10, 0x90a70330 }, 336462306a36Sopenharmony_ci { 0x11, 0x01452340 }, 336562306a36Sopenharmony_ci { 0x15, 0x40C003f1 }, 336662306a36Sopenharmony_ci { 0x1b, 0x405003f0 }, 336762306a36Sopenharmony_ci {} 336862306a36Sopenharmony_ci}; 336962306a36Sopenharmony_ci 337062306a36Sopenharmony_ci/* 337162306a36Sopenharmony_ci STAC 9221 A1 pin configs for 337262306a36Sopenharmony_ci 102801D7 (Dell XPS M1210) 337362306a36Sopenharmony_ci*/ 337462306a36Sopenharmony_cistatic const struct hda_pintbl dell_922x_m82_pin_configs[] = { 337562306a36Sopenharmony_ci { 0x0a, 0x02211211 }, 337662306a36Sopenharmony_ci { 0x0b, 0x408103ff }, 337762306a36Sopenharmony_ci { 0x0c, 0x02a1123e }, 337862306a36Sopenharmony_ci { 0x0d, 0x90100310 }, 337962306a36Sopenharmony_ci { 0x0e, 0x408003f1 }, 338062306a36Sopenharmony_ci { 0x0f, 0x0221121f }, 338162306a36Sopenharmony_ci { 0x10, 0x03451340 }, 338262306a36Sopenharmony_ci { 0x11, 0x40c003f2 }, 338362306a36Sopenharmony_ci { 0x15, 0x508003f3 }, 338462306a36Sopenharmony_ci { 0x1b, 0x405003f4 }, 338562306a36Sopenharmony_ci {} 338662306a36Sopenharmony_ci}; 338762306a36Sopenharmony_ci 338862306a36Sopenharmony_cistatic const struct hda_pintbl d945gtp3_pin_configs[] = { 338962306a36Sopenharmony_ci { 0x0a, 0x0221401f }, 339062306a36Sopenharmony_ci { 0x0b, 0x01a19022 }, 339162306a36Sopenharmony_ci { 0x0c, 0x01813021 }, 339262306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 339362306a36Sopenharmony_ci { 0x0e, 0x40000100 }, 339462306a36Sopenharmony_ci { 0x0f, 0x40000100 }, 339562306a36Sopenharmony_ci { 0x10, 0x40000100 }, 339662306a36Sopenharmony_ci { 0x11, 0x40000100 }, 339762306a36Sopenharmony_ci { 0x15, 0x02a19120 }, 339862306a36Sopenharmony_ci { 0x1b, 0x40000100 }, 339962306a36Sopenharmony_ci {} 340062306a36Sopenharmony_ci}; 340162306a36Sopenharmony_ci 340262306a36Sopenharmony_cistatic const struct hda_pintbl d945gtp5_pin_configs[] = { 340362306a36Sopenharmony_ci { 0x0a, 0x0221401f }, 340462306a36Sopenharmony_ci { 0x0b, 0x01011012 }, 340562306a36Sopenharmony_ci { 0x0c, 0x01813024 }, 340662306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 340762306a36Sopenharmony_ci { 0x0e, 0x01a19021 }, 340862306a36Sopenharmony_ci { 0x0f, 0x01016011 }, 340962306a36Sopenharmony_ci { 0x10, 0x01452130 }, 341062306a36Sopenharmony_ci { 0x11, 0x40000100 }, 341162306a36Sopenharmony_ci { 0x15, 0x02a19320 }, 341262306a36Sopenharmony_ci { 0x1b, 0x40000100 }, 341362306a36Sopenharmony_ci {} 341462306a36Sopenharmony_ci}; 341562306a36Sopenharmony_ci 341662306a36Sopenharmony_cistatic const struct hda_pintbl intel_mac_v1_pin_configs[] = { 341762306a36Sopenharmony_ci { 0x0a, 0x0121e21f }, 341862306a36Sopenharmony_ci { 0x0b, 0x400000ff }, 341962306a36Sopenharmony_ci { 0x0c, 0x9017e110 }, 342062306a36Sopenharmony_ci { 0x0d, 0x400000fd }, 342162306a36Sopenharmony_ci { 0x0e, 0x400000fe }, 342262306a36Sopenharmony_ci { 0x0f, 0x0181e020 }, 342362306a36Sopenharmony_ci { 0x10, 0x1145e030 }, 342462306a36Sopenharmony_ci { 0x11, 0x11c5e240 }, 342562306a36Sopenharmony_ci { 0x15, 0x400000fc }, 342662306a36Sopenharmony_ci { 0x1b, 0x400000fb }, 342762306a36Sopenharmony_ci {} 342862306a36Sopenharmony_ci}; 342962306a36Sopenharmony_ci 343062306a36Sopenharmony_cistatic const struct hda_pintbl intel_mac_v2_pin_configs[] = { 343162306a36Sopenharmony_ci { 0x0a, 0x0121e21f }, 343262306a36Sopenharmony_ci { 0x0b, 0x90a7012e }, 343362306a36Sopenharmony_ci { 0x0c, 0x9017e110 }, 343462306a36Sopenharmony_ci { 0x0d, 0x400000fd }, 343562306a36Sopenharmony_ci { 0x0e, 0x400000fe }, 343662306a36Sopenharmony_ci { 0x0f, 0x0181e020 }, 343762306a36Sopenharmony_ci { 0x10, 0x1145e230 }, 343862306a36Sopenharmony_ci { 0x11, 0x500000fa }, 343962306a36Sopenharmony_ci { 0x15, 0x400000fc }, 344062306a36Sopenharmony_ci { 0x1b, 0x400000fb }, 344162306a36Sopenharmony_ci {} 344262306a36Sopenharmony_ci}; 344362306a36Sopenharmony_ci 344462306a36Sopenharmony_cistatic const struct hda_pintbl intel_mac_v3_pin_configs[] = { 344562306a36Sopenharmony_ci { 0x0a, 0x0121e21f }, 344662306a36Sopenharmony_ci { 0x0b, 0x90a7012e }, 344762306a36Sopenharmony_ci { 0x0c, 0x9017e110 }, 344862306a36Sopenharmony_ci { 0x0d, 0x400000fd }, 344962306a36Sopenharmony_ci { 0x0e, 0x400000fe }, 345062306a36Sopenharmony_ci { 0x0f, 0x0181e020 }, 345162306a36Sopenharmony_ci { 0x10, 0x1145e230 }, 345262306a36Sopenharmony_ci { 0x11, 0x11c5e240 }, 345362306a36Sopenharmony_ci { 0x15, 0x400000fc }, 345462306a36Sopenharmony_ci { 0x1b, 0x400000fb }, 345562306a36Sopenharmony_ci {} 345662306a36Sopenharmony_ci}; 345762306a36Sopenharmony_ci 345862306a36Sopenharmony_cistatic const struct hda_pintbl intel_mac_v4_pin_configs[] = { 345962306a36Sopenharmony_ci { 0x0a, 0x0321e21f }, 346062306a36Sopenharmony_ci { 0x0b, 0x03a1e02e }, 346162306a36Sopenharmony_ci { 0x0c, 0x9017e110 }, 346262306a36Sopenharmony_ci { 0x0d, 0x9017e11f }, 346362306a36Sopenharmony_ci { 0x0e, 0x400000fe }, 346462306a36Sopenharmony_ci { 0x0f, 0x0381e020 }, 346562306a36Sopenharmony_ci { 0x10, 0x1345e230 }, 346662306a36Sopenharmony_ci { 0x11, 0x13c5e240 }, 346762306a36Sopenharmony_ci { 0x15, 0x400000fc }, 346862306a36Sopenharmony_ci { 0x1b, 0x400000fb }, 346962306a36Sopenharmony_ci {} 347062306a36Sopenharmony_ci}; 347162306a36Sopenharmony_ci 347262306a36Sopenharmony_cistatic const struct hda_pintbl intel_mac_v5_pin_configs[] = { 347362306a36Sopenharmony_ci { 0x0a, 0x0321e21f }, 347462306a36Sopenharmony_ci { 0x0b, 0x03a1e02e }, 347562306a36Sopenharmony_ci { 0x0c, 0x9017e110 }, 347662306a36Sopenharmony_ci { 0x0d, 0x9017e11f }, 347762306a36Sopenharmony_ci { 0x0e, 0x400000fe }, 347862306a36Sopenharmony_ci { 0x0f, 0x0381e020 }, 347962306a36Sopenharmony_ci { 0x10, 0x1345e230 }, 348062306a36Sopenharmony_ci { 0x11, 0x13c5e240 }, 348162306a36Sopenharmony_ci { 0x15, 0x400000fc }, 348262306a36Sopenharmony_ci { 0x1b, 0x400000fb }, 348362306a36Sopenharmony_ci {} 348462306a36Sopenharmony_ci}; 348562306a36Sopenharmony_ci 348662306a36Sopenharmony_cistatic const struct hda_pintbl ecs202_pin_configs[] = { 348762306a36Sopenharmony_ci { 0x0a, 0x0221401f }, 348862306a36Sopenharmony_ci { 0x0b, 0x02a19020 }, 348962306a36Sopenharmony_ci { 0x0c, 0x01a19020 }, 349062306a36Sopenharmony_ci { 0x0d, 0x01114010 }, 349162306a36Sopenharmony_ci { 0x0e, 0x408000f0 }, 349262306a36Sopenharmony_ci { 0x0f, 0x01813022 }, 349362306a36Sopenharmony_ci { 0x10, 0x074510a0 }, 349462306a36Sopenharmony_ci { 0x11, 0x40c400f1 }, 349562306a36Sopenharmony_ci { 0x15, 0x9037012e }, 349662306a36Sopenharmony_ci { 0x1b, 0x40e000f2 }, 349762306a36Sopenharmony_ci {} 349862306a36Sopenharmony_ci}; 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_ci/* codec SSIDs for Intel Mac sharing the same PCI SSID 8384:7680 */ 350162306a36Sopenharmony_cistatic const struct snd_pci_quirk stac922x_intel_mac_fixup_tbl[] = { 350262306a36Sopenharmony_ci SND_PCI_QUIRK(0x0000, 0x0100, "Mac Mini", STAC_INTEL_MAC_V3), 350362306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0800, "Mac", STAC_INTEL_MAC_V1), 350462306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0600, "Mac", STAC_INTEL_MAC_V2), 350562306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0700, "Mac", STAC_INTEL_MAC_V2), 350662306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0e00, "Mac", STAC_INTEL_MAC_V3), 350762306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0f00, "Mac", STAC_INTEL_MAC_V3), 350862306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1600, "Mac", STAC_INTEL_MAC_V3), 350962306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1700, "Mac", STAC_INTEL_MAC_V3), 351062306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0200, "Mac", STAC_INTEL_MAC_V3), 351162306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1e00, "Mac", STAC_INTEL_MAC_V3), 351262306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1a00, "Mac", STAC_INTEL_MAC_V4), 351362306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0a00, "Mac", STAC_INTEL_MAC_V5), 351462306a36Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x2200, "Mac", STAC_INTEL_MAC_V5), 351562306a36Sopenharmony_ci {} 351662306a36Sopenharmony_ci}; 351762306a36Sopenharmony_ci 351862306a36Sopenharmony_cistatic const struct hda_fixup stac922x_fixups[]; 351962306a36Sopenharmony_ci 352062306a36Sopenharmony_ci/* remap the fixup from codec SSID and apply it */ 352162306a36Sopenharmony_cistatic void stac922x_fixup_intel_mac_auto(struct hda_codec *codec, 352262306a36Sopenharmony_ci const struct hda_fixup *fix, 352362306a36Sopenharmony_ci int action) 352462306a36Sopenharmony_ci{ 352562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 352662306a36Sopenharmony_ci return; 352762306a36Sopenharmony_ci 352862306a36Sopenharmony_ci codec->fixup_id = HDA_FIXUP_ID_NOT_SET; 352962306a36Sopenharmony_ci snd_hda_pick_fixup(codec, NULL, stac922x_intel_mac_fixup_tbl, 353062306a36Sopenharmony_ci stac922x_fixups); 353162306a36Sopenharmony_ci if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET) 353262306a36Sopenharmony_ci snd_hda_apply_fixup(codec, action); 353362306a36Sopenharmony_ci} 353462306a36Sopenharmony_ci 353562306a36Sopenharmony_cistatic void stac922x_fixup_intel_mac_gpio(struct hda_codec *codec, 353662306a36Sopenharmony_ci const struct hda_fixup *fix, 353762306a36Sopenharmony_ci int action) 353862306a36Sopenharmony_ci{ 353962306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 354062306a36Sopenharmony_ci 354162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 354262306a36Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = 0x03; 354362306a36Sopenharmony_ci spec->gpio_data = 0x03; 354462306a36Sopenharmony_ci } 354562306a36Sopenharmony_ci} 354662306a36Sopenharmony_ci 354762306a36Sopenharmony_cistatic const struct hda_fixup stac922x_fixups[] = { 354862306a36Sopenharmony_ci [STAC_D945_REF] = { 354962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 355062306a36Sopenharmony_ci .v.pins = ref922x_pin_configs, 355162306a36Sopenharmony_ci }, 355262306a36Sopenharmony_ci [STAC_D945GTP3] = { 355362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 355462306a36Sopenharmony_ci .v.pins = d945gtp3_pin_configs, 355562306a36Sopenharmony_ci }, 355662306a36Sopenharmony_ci [STAC_D945GTP5] = { 355762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 355862306a36Sopenharmony_ci .v.pins = d945gtp5_pin_configs, 355962306a36Sopenharmony_ci }, 356062306a36Sopenharmony_ci [STAC_INTEL_MAC_AUTO] = { 356162306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 356262306a36Sopenharmony_ci .v.func = stac922x_fixup_intel_mac_auto, 356362306a36Sopenharmony_ci }, 356462306a36Sopenharmony_ci [STAC_INTEL_MAC_V1] = { 356562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 356662306a36Sopenharmony_ci .v.pins = intel_mac_v1_pin_configs, 356762306a36Sopenharmony_ci .chained = true, 356862306a36Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 356962306a36Sopenharmony_ci }, 357062306a36Sopenharmony_ci [STAC_INTEL_MAC_V2] = { 357162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 357262306a36Sopenharmony_ci .v.pins = intel_mac_v2_pin_configs, 357362306a36Sopenharmony_ci .chained = true, 357462306a36Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 357562306a36Sopenharmony_ci }, 357662306a36Sopenharmony_ci [STAC_INTEL_MAC_V3] = { 357762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 357862306a36Sopenharmony_ci .v.pins = intel_mac_v3_pin_configs, 357962306a36Sopenharmony_ci .chained = true, 358062306a36Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 358162306a36Sopenharmony_ci }, 358262306a36Sopenharmony_ci [STAC_INTEL_MAC_V4] = { 358362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 358462306a36Sopenharmony_ci .v.pins = intel_mac_v4_pin_configs, 358562306a36Sopenharmony_ci .chained = true, 358662306a36Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 358762306a36Sopenharmony_ci }, 358862306a36Sopenharmony_ci [STAC_INTEL_MAC_V5] = { 358962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 359062306a36Sopenharmony_ci .v.pins = intel_mac_v5_pin_configs, 359162306a36Sopenharmony_ci .chained = true, 359262306a36Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 359362306a36Sopenharmony_ci }, 359462306a36Sopenharmony_ci [STAC_922X_INTEL_MAC_GPIO] = { 359562306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 359662306a36Sopenharmony_ci .v.func = stac922x_fixup_intel_mac_gpio, 359762306a36Sopenharmony_ci }, 359862306a36Sopenharmony_ci [STAC_ECS_202] = { 359962306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 360062306a36Sopenharmony_ci .v.pins = ecs202_pin_configs, 360162306a36Sopenharmony_ci }, 360262306a36Sopenharmony_ci [STAC_922X_DELL_D81] = { 360362306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 360462306a36Sopenharmony_ci .v.pins = dell_922x_d81_pin_configs, 360562306a36Sopenharmony_ci }, 360662306a36Sopenharmony_ci [STAC_922X_DELL_D82] = { 360762306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 360862306a36Sopenharmony_ci .v.pins = dell_922x_d82_pin_configs, 360962306a36Sopenharmony_ci }, 361062306a36Sopenharmony_ci [STAC_922X_DELL_M81] = { 361162306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 361262306a36Sopenharmony_ci .v.pins = dell_922x_m81_pin_configs, 361362306a36Sopenharmony_ci }, 361462306a36Sopenharmony_ci [STAC_922X_DELL_M82] = { 361562306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 361662306a36Sopenharmony_ci .v.pins = dell_922x_m82_pin_configs, 361762306a36Sopenharmony_ci }, 361862306a36Sopenharmony_ci}; 361962306a36Sopenharmony_ci 362062306a36Sopenharmony_cistatic const struct hda_model_fixup stac922x_models[] = { 362162306a36Sopenharmony_ci { .id = STAC_D945_REF, .name = "ref" }, 362262306a36Sopenharmony_ci { .id = STAC_D945GTP5, .name = "5stack" }, 362362306a36Sopenharmony_ci { .id = STAC_D945GTP3, .name = "3stack" }, 362462306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V1, .name = "intel-mac-v1" }, 362562306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V2, .name = "intel-mac-v2" }, 362662306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "intel-mac-v3" }, 362762306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V4, .name = "intel-mac-v4" }, 362862306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V5, .name = "intel-mac-v5" }, 362962306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_AUTO, .name = "intel-mac-auto" }, 363062306a36Sopenharmony_ci { .id = STAC_ECS_202, .name = "ecs202" }, 363162306a36Sopenharmony_ci { .id = STAC_922X_DELL_D81, .name = "dell-d81" }, 363262306a36Sopenharmony_ci { .id = STAC_922X_DELL_D82, .name = "dell-d82" }, 363362306a36Sopenharmony_ci { .id = STAC_922X_DELL_M81, .name = "dell-m81" }, 363462306a36Sopenharmony_ci { .id = STAC_922X_DELL_M82, .name = "dell-m82" }, 363562306a36Sopenharmony_ci /* for backward compatibility */ 363662306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "macmini" }, 363762306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V5, .name = "macbook" }, 363862306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "macbook-pro-v1" }, 363962306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "macbook-pro" }, 364062306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V2, .name = "imac-intel" }, 364162306a36Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "imac-intel-20" }, 364262306a36Sopenharmony_ci {} 364362306a36Sopenharmony_ci}; 364462306a36Sopenharmony_ci 364562306a36Sopenharmony_cistatic const struct snd_pci_quirk stac922x_fixup_tbl[] = { 364662306a36Sopenharmony_ci /* SigmaTel reference board */ 364762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 364862306a36Sopenharmony_ci "DFI LanParty", STAC_D945_REF), 364962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 365062306a36Sopenharmony_ci "DFI LanParty", STAC_D945_REF), 365162306a36Sopenharmony_ci /* Intel 945G based systems */ 365262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101, 365362306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 365462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202, 365562306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 365662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606, 365762306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 365862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601, 365962306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 366062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111, 366162306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 366262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115, 366362306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 366462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116, 366562306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 366662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117, 366762306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 366862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118, 366962306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 367062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119, 367162306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 367262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826, 367362306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 367462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049, 367562306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 367662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055, 367762306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 367862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048, 367962306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 368062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110, 368162306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 368262306a36Sopenharmony_ci /* Intel D945G 5-stack systems */ 368362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404, 368462306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 368562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303, 368662306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 368762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013, 368862306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 368962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417, 369062306a36Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 369162306a36Sopenharmony_ci /* Intel 945P based systems */ 369262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b, 369362306a36Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 369462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112, 369562306a36Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 369662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d, 369762306a36Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 369862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909, 369962306a36Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 370062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505, 370162306a36Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 370262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707, 370362306a36Sopenharmony_ci "Intel D945P", STAC_D945GTP5), 370462306a36Sopenharmony_ci /* other intel */ 370562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204, 370662306a36Sopenharmony_ci "Intel D945", STAC_D945_REF), 370762306a36Sopenharmony_ci /* other systems */ 370862306a36Sopenharmony_ci 370962306a36Sopenharmony_ci /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */ 371062306a36Sopenharmony_ci SND_PCI_QUIRK(0x8384, 0x7680, "Mac", STAC_INTEL_MAC_AUTO), 371162306a36Sopenharmony_ci 371262306a36Sopenharmony_ci /* Dell systems */ 371362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7, 371462306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 371562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9, 371662306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 371762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab, 371862306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 371962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac, 372062306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D82), 372162306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf, 372262306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_M81), 372362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0, 372462306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D82), 372562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1, 372662306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 372762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2, 372862306a36Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 372962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7, 373062306a36Sopenharmony_ci "Dell XPS M1210", STAC_922X_DELL_M82), 373162306a36Sopenharmony_ci /* ECS/PC Chips boards */ 373262306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000, 373362306a36Sopenharmony_ci "ECS/PC chips", STAC_ECS_202), 373462306a36Sopenharmony_ci {} /* terminator */ 373562306a36Sopenharmony_ci}; 373662306a36Sopenharmony_ci 373762306a36Sopenharmony_cistatic const struct hda_pintbl ref927x_pin_configs[] = { 373862306a36Sopenharmony_ci { 0x0a, 0x02214020 }, 373962306a36Sopenharmony_ci { 0x0b, 0x02a19080 }, 374062306a36Sopenharmony_ci { 0x0c, 0x0181304e }, 374162306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 374262306a36Sopenharmony_ci { 0x0e, 0x01a19040 }, 374362306a36Sopenharmony_ci { 0x0f, 0x01011012 }, 374462306a36Sopenharmony_ci { 0x10, 0x01016011 }, 374562306a36Sopenharmony_ci { 0x11, 0x0101201f }, 374662306a36Sopenharmony_ci { 0x12, 0x183301f0 }, 374762306a36Sopenharmony_ci { 0x13, 0x18a001f0 }, 374862306a36Sopenharmony_ci { 0x14, 0x18a001f0 }, 374962306a36Sopenharmony_ci { 0x21, 0x01442070 }, 375062306a36Sopenharmony_ci { 0x22, 0x01c42190 }, 375162306a36Sopenharmony_ci { 0x23, 0x40000100 }, 375262306a36Sopenharmony_ci {} 375362306a36Sopenharmony_ci}; 375462306a36Sopenharmony_ci 375562306a36Sopenharmony_cistatic const struct hda_pintbl d965_3st_pin_configs[] = { 375662306a36Sopenharmony_ci { 0x0a, 0x0221401f }, 375762306a36Sopenharmony_ci { 0x0b, 0x02a19120 }, 375862306a36Sopenharmony_ci { 0x0c, 0x40000100 }, 375962306a36Sopenharmony_ci { 0x0d, 0x01014011 }, 376062306a36Sopenharmony_ci { 0x0e, 0x01a19021 }, 376162306a36Sopenharmony_ci { 0x0f, 0x01813024 }, 376262306a36Sopenharmony_ci { 0x10, 0x40000100 }, 376362306a36Sopenharmony_ci { 0x11, 0x40000100 }, 376462306a36Sopenharmony_ci { 0x12, 0x40000100 }, 376562306a36Sopenharmony_ci { 0x13, 0x40000100 }, 376662306a36Sopenharmony_ci { 0x14, 0x40000100 }, 376762306a36Sopenharmony_ci { 0x21, 0x40000100 }, 376862306a36Sopenharmony_ci { 0x22, 0x40000100 }, 376962306a36Sopenharmony_ci { 0x23, 0x40000100 }, 377062306a36Sopenharmony_ci {} 377162306a36Sopenharmony_ci}; 377262306a36Sopenharmony_ci 377362306a36Sopenharmony_cistatic const struct hda_pintbl d965_5st_pin_configs[] = { 377462306a36Sopenharmony_ci { 0x0a, 0x02214020 }, 377562306a36Sopenharmony_ci { 0x0b, 0x02a19080 }, 377662306a36Sopenharmony_ci { 0x0c, 0x0181304e }, 377762306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 377862306a36Sopenharmony_ci { 0x0e, 0x01a19040 }, 377962306a36Sopenharmony_ci { 0x0f, 0x01011012 }, 378062306a36Sopenharmony_ci { 0x10, 0x01016011 }, 378162306a36Sopenharmony_ci { 0x11, 0x40000100 }, 378262306a36Sopenharmony_ci { 0x12, 0x40000100 }, 378362306a36Sopenharmony_ci { 0x13, 0x40000100 }, 378462306a36Sopenharmony_ci { 0x14, 0x40000100 }, 378562306a36Sopenharmony_ci { 0x21, 0x01442070 }, 378662306a36Sopenharmony_ci { 0x22, 0x40000100 }, 378762306a36Sopenharmony_ci { 0x23, 0x40000100 }, 378862306a36Sopenharmony_ci {} 378962306a36Sopenharmony_ci}; 379062306a36Sopenharmony_ci 379162306a36Sopenharmony_cistatic const struct hda_pintbl d965_5st_no_fp_pin_configs[] = { 379262306a36Sopenharmony_ci { 0x0a, 0x40000100 }, 379362306a36Sopenharmony_ci { 0x0b, 0x40000100 }, 379462306a36Sopenharmony_ci { 0x0c, 0x0181304e }, 379562306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 379662306a36Sopenharmony_ci { 0x0e, 0x01a19040 }, 379762306a36Sopenharmony_ci { 0x0f, 0x01011012 }, 379862306a36Sopenharmony_ci { 0x10, 0x01016011 }, 379962306a36Sopenharmony_ci { 0x11, 0x40000100 }, 380062306a36Sopenharmony_ci { 0x12, 0x40000100 }, 380162306a36Sopenharmony_ci { 0x13, 0x40000100 }, 380262306a36Sopenharmony_ci { 0x14, 0x40000100 }, 380362306a36Sopenharmony_ci { 0x21, 0x01442070 }, 380462306a36Sopenharmony_ci { 0x22, 0x40000100 }, 380562306a36Sopenharmony_ci { 0x23, 0x40000100 }, 380662306a36Sopenharmony_ci {} 380762306a36Sopenharmony_ci}; 380862306a36Sopenharmony_ci 380962306a36Sopenharmony_cistatic const struct hda_pintbl dell_3st_pin_configs[] = { 381062306a36Sopenharmony_ci { 0x0a, 0x02211230 }, 381162306a36Sopenharmony_ci { 0x0b, 0x02a11220 }, 381262306a36Sopenharmony_ci { 0x0c, 0x01a19040 }, 381362306a36Sopenharmony_ci { 0x0d, 0x01114210 }, 381462306a36Sopenharmony_ci { 0x0e, 0x01111212 }, 381562306a36Sopenharmony_ci { 0x0f, 0x01116211 }, 381662306a36Sopenharmony_ci { 0x10, 0x01813050 }, 381762306a36Sopenharmony_ci { 0x11, 0x01112214 }, 381862306a36Sopenharmony_ci { 0x12, 0x403003fa }, 381962306a36Sopenharmony_ci { 0x13, 0x90a60040 }, 382062306a36Sopenharmony_ci { 0x14, 0x90a60040 }, 382162306a36Sopenharmony_ci { 0x21, 0x404003fb }, 382262306a36Sopenharmony_ci { 0x22, 0x40c003fc }, 382362306a36Sopenharmony_ci { 0x23, 0x40000100 }, 382462306a36Sopenharmony_ci {} 382562306a36Sopenharmony_ci}; 382662306a36Sopenharmony_ci 382762306a36Sopenharmony_cistatic void stac927x_fixup_ref_no_jd(struct hda_codec *codec, 382862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 382962306a36Sopenharmony_ci{ 383062306a36Sopenharmony_ci /* no jack detecion for ref-no-jd model */ 383162306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 383262306a36Sopenharmony_ci codec->no_jack_detect = 1; 383362306a36Sopenharmony_ci} 383462306a36Sopenharmony_ci 383562306a36Sopenharmony_cistatic void stac927x_fixup_ref(struct hda_codec *codec, 383662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 383762306a36Sopenharmony_ci{ 383862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 383962306a36Sopenharmony_ci 384062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 384162306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref927x_pin_configs); 384262306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = 0; 384362306a36Sopenharmony_ci spec->gpio_dir = spec->gpio_data = 0; 384462306a36Sopenharmony_ci } 384562306a36Sopenharmony_ci} 384662306a36Sopenharmony_ci 384762306a36Sopenharmony_cistatic void stac927x_fixup_dell_dmic(struct hda_codec *codec, 384862306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 384962306a36Sopenharmony_ci{ 385062306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 385162306a36Sopenharmony_ci 385262306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 385362306a36Sopenharmony_ci return; 385462306a36Sopenharmony_ci 385562306a36Sopenharmony_ci if (codec->core.subsystem_id != 0x1028022f) { 385662306a36Sopenharmony_ci /* GPIO2 High = Enable EAPD */ 385762306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = 0x04; 385862306a36Sopenharmony_ci spec->gpio_dir = spec->gpio_data = 0x04; 385962306a36Sopenharmony_ci } 386062306a36Sopenharmony_ci 386162306a36Sopenharmony_ci snd_hda_add_verbs(codec, dell_3st_core_init); 386262306a36Sopenharmony_ci spec->volknob_init = 1; 386362306a36Sopenharmony_ci} 386462306a36Sopenharmony_ci 386562306a36Sopenharmony_cistatic void stac927x_fixup_volknob(struct hda_codec *codec, 386662306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 386762306a36Sopenharmony_ci{ 386862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 386962306a36Sopenharmony_ci 387062306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 387162306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac927x_volknob_core_init); 387262306a36Sopenharmony_ci spec->volknob_init = 1; 387362306a36Sopenharmony_ci } 387462306a36Sopenharmony_ci} 387562306a36Sopenharmony_ci 387662306a36Sopenharmony_cistatic const struct hda_fixup stac927x_fixups[] = { 387762306a36Sopenharmony_ci [STAC_D965_REF_NO_JD] = { 387862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 387962306a36Sopenharmony_ci .v.func = stac927x_fixup_ref_no_jd, 388062306a36Sopenharmony_ci .chained = true, 388162306a36Sopenharmony_ci .chain_id = STAC_D965_REF, 388262306a36Sopenharmony_ci }, 388362306a36Sopenharmony_ci [STAC_D965_REF] = { 388462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 388562306a36Sopenharmony_ci .v.func = stac927x_fixup_ref, 388662306a36Sopenharmony_ci }, 388762306a36Sopenharmony_ci [STAC_D965_3ST] = { 388862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 388962306a36Sopenharmony_ci .v.pins = d965_3st_pin_configs, 389062306a36Sopenharmony_ci .chained = true, 389162306a36Sopenharmony_ci .chain_id = STAC_D965_VERBS, 389262306a36Sopenharmony_ci }, 389362306a36Sopenharmony_ci [STAC_D965_5ST] = { 389462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 389562306a36Sopenharmony_ci .v.pins = d965_5st_pin_configs, 389662306a36Sopenharmony_ci .chained = true, 389762306a36Sopenharmony_ci .chain_id = STAC_D965_VERBS, 389862306a36Sopenharmony_ci }, 389962306a36Sopenharmony_ci [STAC_D965_VERBS] = { 390062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 390162306a36Sopenharmony_ci .v.verbs = d965_core_init, 390262306a36Sopenharmony_ci }, 390362306a36Sopenharmony_ci [STAC_D965_5ST_NO_FP] = { 390462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 390562306a36Sopenharmony_ci .v.pins = d965_5st_no_fp_pin_configs, 390662306a36Sopenharmony_ci }, 390762306a36Sopenharmony_ci [STAC_NEMO_DEFAULT] = { 390862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 390962306a36Sopenharmony_ci .v.pins = nemo_pin_configs, 391062306a36Sopenharmony_ci }, 391162306a36Sopenharmony_ci [STAC_DELL_3ST] = { 391262306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 391362306a36Sopenharmony_ci .v.pins = dell_3st_pin_configs, 391462306a36Sopenharmony_ci .chained = true, 391562306a36Sopenharmony_ci .chain_id = STAC_927X_DELL_DMIC, 391662306a36Sopenharmony_ci }, 391762306a36Sopenharmony_ci [STAC_DELL_BIOS] = { 391862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 391962306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 392062306a36Sopenharmony_ci /* correct the front output jack as a hp out */ 392162306a36Sopenharmony_ci { 0x0f, 0x0221101f }, 392262306a36Sopenharmony_ci /* correct the front input jack as a mic */ 392362306a36Sopenharmony_ci { 0x0e, 0x02a79130 }, 392462306a36Sopenharmony_ci {} 392562306a36Sopenharmony_ci }, 392662306a36Sopenharmony_ci .chained = true, 392762306a36Sopenharmony_ci .chain_id = STAC_927X_DELL_DMIC, 392862306a36Sopenharmony_ci }, 392962306a36Sopenharmony_ci [STAC_DELL_BIOS_AMIC] = { 393062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 393162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 393262306a36Sopenharmony_ci /* configure the analog microphone on some laptops */ 393362306a36Sopenharmony_ci { 0x0c, 0x90a79130 }, 393462306a36Sopenharmony_ci {} 393562306a36Sopenharmony_ci }, 393662306a36Sopenharmony_ci .chained = true, 393762306a36Sopenharmony_ci .chain_id = STAC_DELL_BIOS, 393862306a36Sopenharmony_ci }, 393962306a36Sopenharmony_ci [STAC_DELL_BIOS_SPDIF] = { 394062306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 394162306a36Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 394262306a36Sopenharmony_ci /* correct the device field to SPDIF out */ 394362306a36Sopenharmony_ci { 0x21, 0x01442070 }, 394462306a36Sopenharmony_ci {} 394562306a36Sopenharmony_ci }, 394662306a36Sopenharmony_ci .chained = true, 394762306a36Sopenharmony_ci .chain_id = STAC_DELL_BIOS, 394862306a36Sopenharmony_ci }, 394962306a36Sopenharmony_ci [STAC_927X_DELL_DMIC] = { 395062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 395162306a36Sopenharmony_ci .v.func = stac927x_fixup_dell_dmic, 395262306a36Sopenharmony_ci }, 395362306a36Sopenharmony_ci [STAC_927X_VOLKNOB] = { 395462306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 395562306a36Sopenharmony_ci .v.func = stac927x_fixup_volknob, 395662306a36Sopenharmony_ci }, 395762306a36Sopenharmony_ci}; 395862306a36Sopenharmony_ci 395962306a36Sopenharmony_cistatic const struct hda_model_fixup stac927x_models[] = { 396062306a36Sopenharmony_ci { .id = STAC_D965_REF_NO_JD, .name = "ref-no-jd" }, 396162306a36Sopenharmony_ci { .id = STAC_D965_REF, .name = "ref" }, 396262306a36Sopenharmony_ci { .id = STAC_D965_3ST, .name = "3stack" }, 396362306a36Sopenharmony_ci { .id = STAC_D965_5ST, .name = "5stack" }, 396462306a36Sopenharmony_ci { .id = STAC_D965_5ST_NO_FP, .name = "5stack-no-fp" }, 396562306a36Sopenharmony_ci { .id = STAC_DELL_3ST, .name = "dell-3stack" }, 396662306a36Sopenharmony_ci { .id = STAC_DELL_BIOS, .name = "dell-bios" }, 396762306a36Sopenharmony_ci { .id = STAC_NEMO_DEFAULT, .name = "nemo-default" }, 396862306a36Sopenharmony_ci { .id = STAC_DELL_BIOS_AMIC, .name = "dell-bios-amic" }, 396962306a36Sopenharmony_ci { .id = STAC_927X_VOLKNOB, .name = "volknob" }, 397062306a36Sopenharmony_ci {} 397162306a36Sopenharmony_ci}; 397262306a36Sopenharmony_ci 397362306a36Sopenharmony_cistatic const struct snd_pci_quirk stac927x_fixup_tbl[] = { 397462306a36Sopenharmony_ci /* SigmaTel reference board */ 397562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 397662306a36Sopenharmony_ci "DFI LanParty", STAC_D965_REF), 397762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 397862306a36Sopenharmony_ci "DFI LanParty", STAC_D965_REF), 397962306a36Sopenharmony_ci /* Intel 946 based systems */ 398062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST), 398162306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST), 398262306a36Sopenharmony_ci /* 965 based 3 stack systems */ 398362306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100, 398462306a36Sopenharmony_ci "Intel D965", STAC_D965_3ST), 398562306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000, 398662306a36Sopenharmony_ci "Intel D965", STAC_D965_3ST), 398762306a36Sopenharmony_ci /* Dell 3 stack systems */ 398862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST), 398962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST), 399062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST), 399162306a36Sopenharmony_ci /* Dell 3 stack systems with verb table in BIOS */ 399262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS), 399362306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_BIOS), 399462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS), 399562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS_SPDIF), 399662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS), 399762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS), 399862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS), 399962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS), 400062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS_SPDIF), 400162306a36Sopenharmony_ci /* 965 based 5 stack systems */ 400262306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300, 400362306a36Sopenharmony_ci "Intel D965", STAC_D965_5ST), 400462306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500, 400562306a36Sopenharmony_ci "Intel D965", STAC_D965_5ST), 400662306a36Sopenharmony_ci /* Nemo */ 400762306a36Sopenharmony_ci SND_PCI_QUIRK(0x1888, 0x1000, "AmigaOne X1000", STAC_NEMO_DEFAULT), 400862306a36Sopenharmony_ci /* volume-knob fixes */ 400962306a36Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB), 401062306a36Sopenharmony_ci {} /* terminator */ 401162306a36Sopenharmony_ci}; 401262306a36Sopenharmony_ci 401362306a36Sopenharmony_cistatic const struct hda_pintbl ref9205_pin_configs[] = { 401462306a36Sopenharmony_ci { 0x0a, 0x40000100 }, 401562306a36Sopenharmony_ci { 0x0b, 0x40000100 }, 401662306a36Sopenharmony_ci { 0x0c, 0x01016011 }, 401762306a36Sopenharmony_ci { 0x0d, 0x01014010 }, 401862306a36Sopenharmony_ci { 0x0e, 0x01813122 }, 401962306a36Sopenharmony_ci { 0x0f, 0x01a19021 }, 402062306a36Sopenharmony_ci { 0x14, 0x01019020 }, 402162306a36Sopenharmony_ci { 0x16, 0x40000100 }, 402262306a36Sopenharmony_ci { 0x17, 0x90a000f0 }, 402362306a36Sopenharmony_ci { 0x18, 0x90a000f0 }, 402462306a36Sopenharmony_ci { 0x21, 0x01441030 }, 402562306a36Sopenharmony_ci { 0x22, 0x01c41030 }, 402662306a36Sopenharmony_ci {} 402762306a36Sopenharmony_ci}; 402862306a36Sopenharmony_ci 402962306a36Sopenharmony_ci/* 403062306a36Sopenharmony_ci STAC 9205 pin configs for 403162306a36Sopenharmony_ci 102801F1 403262306a36Sopenharmony_ci 102801F2 403362306a36Sopenharmony_ci 102801FC 403462306a36Sopenharmony_ci 102801FD 403562306a36Sopenharmony_ci 10280204 403662306a36Sopenharmony_ci 1028021F 403762306a36Sopenharmony_ci 10280228 (Dell Vostro 1500) 403862306a36Sopenharmony_ci 10280229 (Dell Vostro 1700) 403962306a36Sopenharmony_ci*/ 404062306a36Sopenharmony_cistatic const struct hda_pintbl dell_9205_m42_pin_configs[] = { 404162306a36Sopenharmony_ci { 0x0a, 0x0321101F }, 404262306a36Sopenharmony_ci { 0x0b, 0x03A11020 }, 404362306a36Sopenharmony_ci { 0x0c, 0x400003FA }, 404462306a36Sopenharmony_ci { 0x0d, 0x90170310 }, 404562306a36Sopenharmony_ci { 0x0e, 0x400003FB }, 404662306a36Sopenharmony_ci { 0x0f, 0x400003FC }, 404762306a36Sopenharmony_ci { 0x14, 0x400003FD }, 404862306a36Sopenharmony_ci { 0x16, 0x40F000F9 }, 404962306a36Sopenharmony_ci { 0x17, 0x90A60330 }, 405062306a36Sopenharmony_ci { 0x18, 0x400003FF }, 405162306a36Sopenharmony_ci { 0x21, 0x0144131F }, 405262306a36Sopenharmony_ci { 0x22, 0x40C003FE }, 405362306a36Sopenharmony_ci {} 405462306a36Sopenharmony_ci}; 405562306a36Sopenharmony_ci 405662306a36Sopenharmony_ci/* 405762306a36Sopenharmony_ci STAC 9205 pin configs for 405862306a36Sopenharmony_ci 102801F9 405962306a36Sopenharmony_ci 102801FA 406062306a36Sopenharmony_ci 102801FE 406162306a36Sopenharmony_ci 102801FF (Dell Precision M4300) 406262306a36Sopenharmony_ci 10280206 406362306a36Sopenharmony_ci 10280200 406462306a36Sopenharmony_ci 10280201 406562306a36Sopenharmony_ci*/ 406662306a36Sopenharmony_cistatic const struct hda_pintbl dell_9205_m43_pin_configs[] = { 406762306a36Sopenharmony_ci { 0x0a, 0x0321101f }, 406862306a36Sopenharmony_ci { 0x0b, 0x03a11020 }, 406962306a36Sopenharmony_ci { 0x0c, 0x90a70330 }, 407062306a36Sopenharmony_ci { 0x0d, 0x90170310 }, 407162306a36Sopenharmony_ci { 0x0e, 0x400000fe }, 407262306a36Sopenharmony_ci { 0x0f, 0x400000ff }, 407362306a36Sopenharmony_ci { 0x14, 0x400000fd }, 407462306a36Sopenharmony_ci { 0x16, 0x40f000f9 }, 407562306a36Sopenharmony_ci { 0x17, 0x400000fa }, 407662306a36Sopenharmony_ci { 0x18, 0x400000fc }, 407762306a36Sopenharmony_ci { 0x21, 0x0144131f }, 407862306a36Sopenharmony_ci { 0x22, 0x40c003f8 }, 407962306a36Sopenharmony_ci /* Enable SPDIF in/out */ 408062306a36Sopenharmony_ci { 0x1f, 0x01441030 }, 408162306a36Sopenharmony_ci { 0x20, 0x1c410030 }, 408262306a36Sopenharmony_ci {} 408362306a36Sopenharmony_ci}; 408462306a36Sopenharmony_ci 408562306a36Sopenharmony_cistatic const struct hda_pintbl dell_9205_m44_pin_configs[] = { 408662306a36Sopenharmony_ci { 0x0a, 0x0421101f }, 408762306a36Sopenharmony_ci { 0x0b, 0x04a11020 }, 408862306a36Sopenharmony_ci { 0x0c, 0x400003fa }, 408962306a36Sopenharmony_ci { 0x0d, 0x90170310 }, 409062306a36Sopenharmony_ci { 0x0e, 0x400003fb }, 409162306a36Sopenharmony_ci { 0x0f, 0x400003fc }, 409262306a36Sopenharmony_ci { 0x14, 0x400003fd }, 409362306a36Sopenharmony_ci { 0x16, 0x400003f9 }, 409462306a36Sopenharmony_ci { 0x17, 0x90a60330 }, 409562306a36Sopenharmony_ci { 0x18, 0x400003ff }, 409662306a36Sopenharmony_ci { 0x21, 0x01441340 }, 409762306a36Sopenharmony_ci { 0x22, 0x40c003fe }, 409862306a36Sopenharmony_ci {} 409962306a36Sopenharmony_ci}; 410062306a36Sopenharmony_ci 410162306a36Sopenharmony_cistatic void stac9205_fixup_ref(struct hda_codec *codec, 410262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 410362306a36Sopenharmony_ci{ 410462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 410562306a36Sopenharmony_ci 410662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 410762306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref9205_pin_configs); 410862306a36Sopenharmony_ci /* SPDIF-In enabled */ 410962306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0; 411062306a36Sopenharmony_ci } 411162306a36Sopenharmony_ci} 411262306a36Sopenharmony_ci 411362306a36Sopenharmony_cistatic void stac9205_fixup_dell_m43(struct hda_codec *codec, 411462306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 411562306a36Sopenharmony_ci{ 411662306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 411762306a36Sopenharmony_ci struct hda_jack_callback *jack; 411862306a36Sopenharmony_ci 411962306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 412062306a36Sopenharmony_ci snd_hda_apply_pincfgs(codec, dell_9205_m43_pin_configs); 412162306a36Sopenharmony_ci 412262306a36Sopenharmony_ci /* Enable unsol response for GPIO4/Dock HP connection */ 412362306a36Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 412462306a36Sopenharmony_ci AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); 412562306a36Sopenharmony_ci jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg, 412662306a36Sopenharmony_ci stac_vref_event); 412762306a36Sopenharmony_ci if (!IS_ERR(jack)) 412862306a36Sopenharmony_ci jack->private_data = 0x01; 412962306a36Sopenharmony_ci 413062306a36Sopenharmony_ci spec->gpio_dir = 0x0b; 413162306a36Sopenharmony_ci spec->eapd_mask = 0x01; 413262306a36Sopenharmony_ci spec->gpio_mask = 0x1b; 413362306a36Sopenharmony_ci spec->gpio_mute = 0x10; 413462306a36Sopenharmony_ci /* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute, 413562306a36Sopenharmony_ci * GPIO3 Low = DRM 413662306a36Sopenharmony_ci */ 413762306a36Sopenharmony_ci spec->gpio_data = 0x01; 413862306a36Sopenharmony_ci } 413962306a36Sopenharmony_ci} 414062306a36Sopenharmony_ci 414162306a36Sopenharmony_cistatic void stac9205_fixup_eapd(struct hda_codec *codec, 414262306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 414362306a36Sopenharmony_ci{ 414462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 414562306a36Sopenharmony_ci 414662306a36Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 414762306a36Sopenharmony_ci spec->eapd_switch = 0; 414862306a36Sopenharmony_ci} 414962306a36Sopenharmony_ci 415062306a36Sopenharmony_cistatic const struct hda_fixup stac9205_fixups[] = { 415162306a36Sopenharmony_ci [STAC_9205_REF] = { 415262306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 415362306a36Sopenharmony_ci .v.func = stac9205_fixup_ref, 415462306a36Sopenharmony_ci }, 415562306a36Sopenharmony_ci [STAC_9205_DELL_M42] = { 415662306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 415762306a36Sopenharmony_ci .v.pins = dell_9205_m42_pin_configs, 415862306a36Sopenharmony_ci }, 415962306a36Sopenharmony_ci [STAC_9205_DELL_M43] = { 416062306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 416162306a36Sopenharmony_ci .v.func = stac9205_fixup_dell_m43, 416262306a36Sopenharmony_ci }, 416362306a36Sopenharmony_ci [STAC_9205_DELL_M44] = { 416462306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 416562306a36Sopenharmony_ci .v.pins = dell_9205_m44_pin_configs, 416662306a36Sopenharmony_ci }, 416762306a36Sopenharmony_ci [STAC_9205_EAPD] = { 416862306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 416962306a36Sopenharmony_ci .v.func = stac9205_fixup_eapd, 417062306a36Sopenharmony_ci }, 417162306a36Sopenharmony_ci {} 417262306a36Sopenharmony_ci}; 417362306a36Sopenharmony_ci 417462306a36Sopenharmony_cistatic const struct hda_model_fixup stac9205_models[] = { 417562306a36Sopenharmony_ci { .id = STAC_9205_REF, .name = "ref" }, 417662306a36Sopenharmony_ci { .id = STAC_9205_DELL_M42, .name = "dell-m42" }, 417762306a36Sopenharmony_ci { .id = STAC_9205_DELL_M43, .name = "dell-m43" }, 417862306a36Sopenharmony_ci { .id = STAC_9205_DELL_M44, .name = "dell-m44" }, 417962306a36Sopenharmony_ci { .id = STAC_9205_EAPD, .name = "eapd" }, 418062306a36Sopenharmony_ci {} 418162306a36Sopenharmony_ci}; 418262306a36Sopenharmony_ci 418362306a36Sopenharmony_cistatic const struct snd_pci_quirk stac9205_fixup_tbl[] = { 418462306a36Sopenharmony_ci /* SigmaTel reference board */ 418562306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 418662306a36Sopenharmony_ci "DFI LanParty", STAC_9205_REF), 418762306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30, 418862306a36Sopenharmony_ci "SigmaTel", STAC_9205_REF), 418962306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 419062306a36Sopenharmony_ci "DFI LanParty", STAC_9205_REF), 419162306a36Sopenharmony_ci /* Dell */ 419262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1, 419362306a36Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 419462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2, 419562306a36Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 419662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8, 419762306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 419862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9, 419962306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 420062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa, 420162306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 420262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc, 420362306a36Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 420462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd, 420562306a36Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 420662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe, 420762306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 420862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff, 420962306a36Sopenharmony_ci "Dell Precision M4300", STAC_9205_DELL_M43), 421062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204, 421162306a36Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 421262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206, 421362306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 421462306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b, 421562306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 421662306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c, 421762306a36Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 421862306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f, 421962306a36Sopenharmony_ci "Dell Inspiron", STAC_9205_DELL_M44), 422062306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228, 422162306a36Sopenharmony_ci "Dell Vostro 1500", STAC_9205_DELL_M42), 422262306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0229, 422362306a36Sopenharmony_ci "Dell Vostro 1700", STAC_9205_DELL_M42), 422462306a36Sopenharmony_ci /* Gateway */ 422562306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD), 422662306a36Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD), 422762306a36Sopenharmony_ci {} /* terminator */ 422862306a36Sopenharmony_ci}; 422962306a36Sopenharmony_ci 423062306a36Sopenharmony_cistatic void stac92hd95_fixup_hp_led(struct hda_codec *codec, 423162306a36Sopenharmony_ci const struct hda_fixup *fix, int action) 423262306a36Sopenharmony_ci{ 423362306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 423462306a36Sopenharmony_ci 423562306a36Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 423662306a36Sopenharmony_ci return; 423762306a36Sopenharmony_ci 423862306a36Sopenharmony_ci if (find_mute_led_cfg(codec, spec->default_polarity)) 423962306a36Sopenharmony_ci codec_dbg(codec, "mute LED gpio %d polarity %d\n", 424062306a36Sopenharmony_ci spec->gpio_led, 424162306a36Sopenharmony_ci spec->gpio_led_polarity); 424262306a36Sopenharmony_ci} 424362306a36Sopenharmony_ci 424462306a36Sopenharmony_cistatic const struct hda_fixup stac92hd95_fixups[] = { 424562306a36Sopenharmony_ci [STAC_92HD95_HP_LED] = { 424662306a36Sopenharmony_ci .type = HDA_FIXUP_FUNC, 424762306a36Sopenharmony_ci .v.func = stac92hd95_fixup_hp_led, 424862306a36Sopenharmony_ci }, 424962306a36Sopenharmony_ci [STAC_92HD95_HP_BASS] = { 425062306a36Sopenharmony_ci .type = HDA_FIXUP_VERBS, 425162306a36Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 425262306a36Sopenharmony_ci {0x1a, 0x795, 0x00}, /* HPF to 100Hz */ 425362306a36Sopenharmony_ci {} 425462306a36Sopenharmony_ci }, 425562306a36Sopenharmony_ci .chained = true, 425662306a36Sopenharmony_ci .chain_id = STAC_92HD95_HP_LED, 425762306a36Sopenharmony_ci }, 425862306a36Sopenharmony_ci}; 425962306a36Sopenharmony_ci 426062306a36Sopenharmony_cistatic const struct snd_pci_quirk stac92hd95_fixup_tbl[] = { 426162306a36Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1911, "HP Spectre 13", STAC_92HD95_HP_BASS), 426262306a36Sopenharmony_ci {} /* terminator */ 426362306a36Sopenharmony_ci}; 426462306a36Sopenharmony_ci 426562306a36Sopenharmony_cistatic const struct hda_model_fixup stac92hd95_models[] = { 426662306a36Sopenharmony_ci { .id = STAC_92HD95_HP_LED, .name = "hp-led" }, 426762306a36Sopenharmony_ci { .id = STAC_92HD95_HP_BASS, .name = "hp-bass" }, 426862306a36Sopenharmony_ci {} 426962306a36Sopenharmony_ci}; 427062306a36Sopenharmony_ci 427162306a36Sopenharmony_ci 427262306a36Sopenharmony_cistatic int stac_parse_auto_config(struct hda_codec *codec) 427362306a36Sopenharmony_ci{ 427462306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 427562306a36Sopenharmony_ci int err; 427662306a36Sopenharmony_ci int flags = 0; 427762306a36Sopenharmony_ci 427862306a36Sopenharmony_ci if (spec->headset_jack) 427962306a36Sopenharmony_ci flags |= HDA_PINCFG_HEADSET_MIC; 428062306a36Sopenharmony_ci 428162306a36Sopenharmony_ci err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, flags); 428262306a36Sopenharmony_ci if (err < 0) 428362306a36Sopenharmony_ci return err; 428462306a36Sopenharmony_ci 428562306a36Sopenharmony_ci /* add hooks */ 428662306a36Sopenharmony_ci spec->gen.pcm_playback_hook = stac_playback_pcm_hook; 428762306a36Sopenharmony_ci spec->gen.pcm_capture_hook = stac_capture_pcm_hook; 428862306a36Sopenharmony_ci 428962306a36Sopenharmony_ci spec->gen.automute_hook = stac_update_outputs; 429062306a36Sopenharmony_ci 429162306a36Sopenharmony_ci if (spec->gpio_led) 429262306a36Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, stac_vmaster_hook); 429362306a36Sopenharmony_ci 429462306a36Sopenharmony_ci err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg); 429562306a36Sopenharmony_ci if (err < 0) 429662306a36Sopenharmony_ci return err; 429762306a36Sopenharmony_ci 429862306a36Sopenharmony_ci if (spec->vref_mute_led_nid) { 429962306a36Sopenharmony_ci err = snd_hda_gen_fix_pin_power(codec, spec->vref_mute_led_nid); 430062306a36Sopenharmony_ci if (err < 0) 430162306a36Sopenharmony_ci return err; 430262306a36Sopenharmony_ci } 430362306a36Sopenharmony_ci 430462306a36Sopenharmony_ci /* setup analog beep controls */ 430562306a36Sopenharmony_ci if (spec->anabeep_nid > 0) { 430662306a36Sopenharmony_ci err = stac_auto_create_beep_ctls(codec, 430762306a36Sopenharmony_ci spec->anabeep_nid); 430862306a36Sopenharmony_ci if (err < 0) 430962306a36Sopenharmony_ci return err; 431062306a36Sopenharmony_ci } 431162306a36Sopenharmony_ci 431262306a36Sopenharmony_ci /* setup digital beep controls and input device */ 431362306a36Sopenharmony_ci#ifdef CONFIG_SND_HDA_INPUT_BEEP 431462306a36Sopenharmony_ci if (spec->gen.beep_nid) { 431562306a36Sopenharmony_ci hda_nid_t nid = spec->gen.beep_nid; 431662306a36Sopenharmony_ci unsigned int caps; 431762306a36Sopenharmony_ci 431862306a36Sopenharmony_ci err = stac_auto_create_beep_ctls(codec, nid); 431962306a36Sopenharmony_ci if (err < 0) 432062306a36Sopenharmony_ci return err; 432162306a36Sopenharmony_ci if (codec->beep) { 432262306a36Sopenharmony_ci /* IDT/STAC codecs have linear beep tone parameter */ 432362306a36Sopenharmony_ci codec->beep->linear_tone = spec->linear_tone_beep; 432462306a36Sopenharmony_ci /* keep power up while beep is enabled */ 432562306a36Sopenharmony_ci codec->beep->keep_power_at_enable = 1; 432662306a36Sopenharmony_ci /* if no beep switch is available, make its own one */ 432762306a36Sopenharmony_ci caps = query_amp_caps(codec, nid, HDA_OUTPUT); 432862306a36Sopenharmony_ci if (!(caps & AC_AMPCAP_MUTE)) { 432962306a36Sopenharmony_ci err = stac_beep_switch_ctl(codec); 433062306a36Sopenharmony_ci if (err < 0) 433162306a36Sopenharmony_ci return err; 433262306a36Sopenharmony_ci } 433362306a36Sopenharmony_ci } 433462306a36Sopenharmony_ci } 433562306a36Sopenharmony_ci#endif 433662306a36Sopenharmony_ci 433762306a36Sopenharmony_ci if (spec->aloopback_ctl && 433862306a36Sopenharmony_ci snd_hda_get_bool_hint(codec, "loopback") == 1) { 433962306a36Sopenharmony_ci unsigned int wr_verb = 434062306a36Sopenharmony_ci spec->aloopback_ctl->private_value >> 16; 434162306a36Sopenharmony_ci if (snd_hdac_regmap_add_vendor_verb(&codec->core, wr_verb)) 434262306a36Sopenharmony_ci return -ENOMEM; 434362306a36Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, NULL, spec->aloopback_ctl)) 434462306a36Sopenharmony_ci return -ENOMEM; 434562306a36Sopenharmony_ci } 434662306a36Sopenharmony_ci 434762306a36Sopenharmony_ci if (spec->have_spdif_mux) { 434862306a36Sopenharmony_ci err = stac_create_spdif_mux_ctls(codec); 434962306a36Sopenharmony_ci if (err < 0) 435062306a36Sopenharmony_ci return err; 435162306a36Sopenharmony_ci } 435262306a36Sopenharmony_ci 435362306a36Sopenharmony_ci stac_init_power_map(codec); 435462306a36Sopenharmony_ci 435562306a36Sopenharmony_ci return 0; 435662306a36Sopenharmony_ci} 435762306a36Sopenharmony_ci 435862306a36Sopenharmony_cistatic int stac_init(struct hda_codec *codec) 435962306a36Sopenharmony_ci{ 436062306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 436162306a36Sopenharmony_ci int i; 436262306a36Sopenharmony_ci 436362306a36Sopenharmony_ci /* override some hints */ 436462306a36Sopenharmony_ci stac_store_hints(codec); 436562306a36Sopenharmony_ci 436662306a36Sopenharmony_ci /* set up GPIO */ 436762306a36Sopenharmony_ci /* turn on EAPD statically when spec->eapd_switch isn't set. 436862306a36Sopenharmony_ci * otherwise, unsol event will turn it on/off dynamically 436962306a36Sopenharmony_ci */ 437062306a36Sopenharmony_ci if (!spec->eapd_switch) 437162306a36Sopenharmony_ci spec->gpio_data |= spec->eapd_mask; 437262306a36Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 437362306a36Sopenharmony_ci 437462306a36Sopenharmony_ci snd_hda_gen_init(codec); 437562306a36Sopenharmony_ci 437662306a36Sopenharmony_ci /* sync the power-map */ 437762306a36Sopenharmony_ci if (spec->num_pwrs) 437862306a36Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 437962306a36Sopenharmony_ci AC_VERB_IDT_SET_POWER_MAP, 438062306a36Sopenharmony_ci spec->power_map_bits); 438162306a36Sopenharmony_ci 438262306a36Sopenharmony_ci /* power down inactive ADCs */ 438362306a36Sopenharmony_ci if (spec->powerdown_adcs) { 438462306a36Sopenharmony_ci for (i = 0; i < spec->gen.num_all_adcs; i++) { 438562306a36Sopenharmony_ci if (spec->active_adcs & (1 << i)) 438662306a36Sopenharmony_ci continue; 438762306a36Sopenharmony_ci snd_hda_codec_write(codec, spec->gen.all_adcs[i], 0, 438862306a36Sopenharmony_ci AC_VERB_SET_POWER_STATE, 438962306a36Sopenharmony_ci AC_PWRST_D3); 439062306a36Sopenharmony_ci } 439162306a36Sopenharmony_ci } 439262306a36Sopenharmony_ci 439362306a36Sopenharmony_ci return 0; 439462306a36Sopenharmony_ci} 439562306a36Sopenharmony_ci 439662306a36Sopenharmony_ci#define stac_free snd_hda_gen_free 439762306a36Sopenharmony_ci 439862306a36Sopenharmony_ci#ifdef CONFIG_SND_PROC_FS 439962306a36Sopenharmony_cistatic void stac92hd_proc_hook(struct snd_info_buffer *buffer, 440062306a36Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 440162306a36Sopenharmony_ci{ 440262306a36Sopenharmony_ci if (nid == codec->core.afg) 440362306a36Sopenharmony_ci snd_iprintf(buffer, "Power-Map: 0x%02x\n", 440462306a36Sopenharmony_ci snd_hda_codec_read(codec, nid, 0, 440562306a36Sopenharmony_ci AC_VERB_IDT_GET_POWER_MAP, 0)); 440662306a36Sopenharmony_ci} 440762306a36Sopenharmony_ci 440862306a36Sopenharmony_cistatic void analog_loop_proc_hook(struct snd_info_buffer *buffer, 440962306a36Sopenharmony_ci struct hda_codec *codec, 441062306a36Sopenharmony_ci unsigned int verb) 441162306a36Sopenharmony_ci{ 441262306a36Sopenharmony_ci snd_iprintf(buffer, "Analog Loopback: 0x%02x\n", 441362306a36Sopenharmony_ci snd_hda_codec_read(codec, codec->core.afg, 0, verb, 0)); 441462306a36Sopenharmony_ci} 441562306a36Sopenharmony_ci 441662306a36Sopenharmony_ci/* stac92hd71bxx, stac92hd73xx */ 441762306a36Sopenharmony_cistatic void stac92hd7x_proc_hook(struct snd_info_buffer *buffer, 441862306a36Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 441962306a36Sopenharmony_ci{ 442062306a36Sopenharmony_ci stac92hd_proc_hook(buffer, codec, nid); 442162306a36Sopenharmony_ci if (nid == codec->core.afg) 442262306a36Sopenharmony_ci analog_loop_proc_hook(buffer, codec, 0xfa0); 442362306a36Sopenharmony_ci} 442462306a36Sopenharmony_ci 442562306a36Sopenharmony_cistatic void stac9205_proc_hook(struct snd_info_buffer *buffer, 442662306a36Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 442762306a36Sopenharmony_ci{ 442862306a36Sopenharmony_ci if (nid == codec->core.afg) 442962306a36Sopenharmony_ci analog_loop_proc_hook(buffer, codec, 0xfe0); 443062306a36Sopenharmony_ci} 443162306a36Sopenharmony_ci 443262306a36Sopenharmony_cistatic void stac927x_proc_hook(struct snd_info_buffer *buffer, 443362306a36Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 443462306a36Sopenharmony_ci{ 443562306a36Sopenharmony_ci if (nid == codec->core.afg) 443662306a36Sopenharmony_ci analog_loop_proc_hook(buffer, codec, 0xfeb); 443762306a36Sopenharmony_ci} 443862306a36Sopenharmony_ci#else 443962306a36Sopenharmony_ci#define stac92hd_proc_hook NULL 444062306a36Sopenharmony_ci#define stac92hd7x_proc_hook NULL 444162306a36Sopenharmony_ci#define stac9205_proc_hook NULL 444262306a36Sopenharmony_ci#define stac927x_proc_hook NULL 444362306a36Sopenharmony_ci#endif 444462306a36Sopenharmony_ci 444562306a36Sopenharmony_ci#ifdef CONFIG_PM 444662306a36Sopenharmony_cistatic int stac_suspend(struct hda_codec *codec) 444762306a36Sopenharmony_ci{ 444862306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 444962306a36Sopenharmony_ci 445062306a36Sopenharmony_ci snd_hda_shutup_pins(codec); 445162306a36Sopenharmony_ci 445262306a36Sopenharmony_ci if (spec->eapd_mask) 445362306a36Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, 445462306a36Sopenharmony_ci spec->gpio_dir, spec->gpio_data & 445562306a36Sopenharmony_ci ~spec->eapd_mask); 445662306a36Sopenharmony_ci 445762306a36Sopenharmony_ci return 0; 445862306a36Sopenharmony_ci} 445962306a36Sopenharmony_ci#else 446062306a36Sopenharmony_ci#define stac_suspend NULL 446162306a36Sopenharmony_ci#endif /* CONFIG_PM */ 446262306a36Sopenharmony_ci 446362306a36Sopenharmony_cistatic const struct hda_codec_ops stac_patch_ops = { 446462306a36Sopenharmony_ci .build_controls = snd_hda_gen_build_controls, 446562306a36Sopenharmony_ci .build_pcms = snd_hda_gen_build_pcms, 446662306a36Sopenharmony_ci .init = stac_init, 446762306a36Sopenharmony_ci .free = stac_free, 446862306a36Sopenharmony_ci .unsol_event = snd_hda_jack_unsol_event, 446962306a36Sopenharmony_ci#ifdef CONFIG_PM 447062306a36Sopenharmony_ci .suspend = stac_suspend, 447162306a36Sopenharmony_ci#endif 447262306a36Sopenharmony_ci}; 447362306a36Sopenharmony_ci 447462306a36Sopenharmony_cistatic int alloc_stac_spec(struct hda_codec *codec) 447562306a36Sopenharmony_ci{ 447662306a36Sopenharmony_ci struct sigmatel_spec *spec; 447762306a36Sopenharmony_ci 447862306a36Sopenharmony_ci spec = kzalloc(sizeof(*spec), GFP_KERNEL); 447962306a36Sopenharmony_ci if (!spec) 448062306a36Sopenharmony_ci return -ENOMEM; 448162306a36Sopenharmony_ci snd_hda_gen_spec_init(&spec->gen); 448262306a36Sopenharmony_ci codec->spec = spec; 448362306a36Sopenharmony_ci codec->no_trigger_sense = 1; /* seems common with STAC/IDT codecs */ 448462306a36Sopenharmony_ci spec->gen.dac_min_mute = true; 448562306a36Sopenharmony_ci codec->patch_ops = stac_patch_ops; 448662306a36Sopenharmony_ci return 0; 448762306a36Sopenharmony_ci} 448862306a36Sopenharmony_ci 448962306a36Sopenharmony_cistatic int patch_stac9200(struct hda_codec *codec) 449062306a36Sopenharmony_ci{ 449162306a36Sopenharmony_ci struct sigmatel_spec *spec; 449262306a36Sopenharmony_ci int err; 449362306a36Sopenharmony_ci 449462306a36Sopenharmony_ci err = alloc_stac_spec(codec); 449562306a36Sopenharmony_ci if (err < 0) 449662306a36Sopenharmony_ci return err; 449762306a36Sopenharmony_ci 449862306a36Sopenharmony_ci spec = codec->spec; 449962306a36Sopenharmony_ci spec->linear_tone_beep = 1; 450062306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 450162306a36Sopenharmony_ci 450262306a36Sopenharmony_ci codec->power_filter = snd_hda_codec_eapd_power_filter; 450362306a36Sopenharmony_ci 450462306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac9200_eapd_init); 450562306a36Sopenharmony_ci 450662306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac9200_models, stac9200_fixup_tbl, 450762306a36Sopenharmony_ci stac9200_fixups); 450862306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 450962306a36Sopenharmony_ci 451062306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 451162306a36Sopenharmony_ci if (err < 0) { 451262306a36Sopenharmony_ci stac_free(codec); 451362306a36Sopenharmony_ci return err; 451462306a36Sopenharmony_ci } 451562306a36Sopenharmony_ci 451662306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 451762306a36Sopenharmony_ci 451862306a36Sopenharmony_ci return 0; 451962306a36Sopenharmony_ci} 452062306a36Sopenharmony_ci 452162306a36Sopenharmony_cistatic int patch_stac925x(struct hda_codec *codec) 452262306a36Sopenharmony_ci{ 452362306a36Sopenharmony_ci struct sigmatel_spec *spec; 452462306a36Sopenharmony_ci int err; 452562306a36Sopenharmony_ci 452662306a36Sopenharmony_ci err = alloc_stac_spec(codec); 452762306a36Sopenharmony_ci if (err < 0) 452862306a36Sopenharmony_ci return err; 452962306a36Sopenharmony_ci 453062306a36Sopenharmony_ci spec = codec->spec; 453162306a36Sopenharmony_ci spec->linear_tone_beep = 1; 453262306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 453362306a36Sopenharmony_ci 453462306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac925x_core_init); 453562306a36Sopenharmony_ci 453662306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac925x_models, stac925x_fixup_tbl, 453762306a36Sopenharmony_ci stac925x_fixups); 453862306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 453962306a36Sopenharmony_ci 454062306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 454162306a36Sopenharmony_ci if (err < 0) { 454262306a36Sopenharmony_ci stac_free(codec); 454362306a36Sopenharmony_ci return err; 454462306a36Sopenharmony_ci } 454562306a36Sopenharmony_ci 454662306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 454762306a36Sopenharmony_ci 454862306a36Sopenharmony_ci return 0; 454962306a36Sopenharmony_ci} 455062306a36Sopenharmony_ci 455162306a36Sopenharmony_cistatic int patch_stac92hd73xx(struct hda_codec *codec) 455262306a36Sopenharmony_ci{ 455362306a36Sopenharmony_ci struct sigmatel_spec *spec; 455462306a36Sopenharmony_ci int err; 455562306a36Sopenharmony_ci int num_dacs; 455662306a36Sopenharmony_ci 455762306a36Sopenharmony_ci err = alloc_stac_spec(codec); 455862306a36Sopenharmony_ci if (err < 0) 455962306a36Sopenharmony_ci return err; 456062306a36Sopenharmony_ci 456162306a36Sopenharmony_ci spec = codec->spec; 456262306a36Sopenharmony_ci /* enable power_save_node only for new 92HD89xx chips, as it causes 456362306a36Sopenharmony_ci * click noises on old 92HD73xx chips. 456462306a36Sopenharmony_ci */ 456562306a36Sopenharmony_ci if ((codec->core.vendor_id & 0xfffffff0) != 0x111d7670) 456662306a36Sopenharmony_ci codec->power_save_node = 1; 456762306a36Sopenharmony_ci spec->linear_tone_beep = 0; 456862306a36Sopenharmony_ci spec->gen.mixer_nid = 0x1d; 456962306a36Sopenharmony_ci spec->have_spdif_mux = 1; 457062306a36Sopenharmony_ci 457162306a36Sopenharmony_ci num_dacs = snd_hda_get_num_conns(codec, 0x0a) - 1; 457262306a36Sopenharmony_ci if (num_dacs < 3 || num_dacs > 5) { 457362306a36Sopenharmony_ci codec_warn(codec, 457462306a36Sopenharmony_ci "Could not determine number of channels defaulting to DAC count\n"); 457562306a36Sopenharmony_ci num_dacs = 5; 457662306a36Sopenharmony_ci } 457762306a36Sopenharmony_ci 457862306a36Sopenharmony_ci switch (num_dacs) { 457962306a36Sopenharmony_ci case 0x3: /* 6 Channel */ 458062306a36Sopenharmony_ci spec->aloopback_ctl = &stac92hd73xx_6ch_loopback; 458162306a36Sopenharmony_ci break; 458262306a36Sopenharmony_ci case 0x4: /* 8 Channel */ 458362306a36Sopenharmony_ci spec->aloopback_ctl = &stac92hd73xx_8ch_loopback; 458462306a36Sopenharmony_ci break; 458562306a36Sopenharmony_ci case 0x5: /* 10 Channel */ 458662306a36Sopenharmony_ci spec->aloopback_ctl = &stac92hd73xx_10ch_loopback; 458762306a36Sopenharmony_ci break; 458862306a36Sopenharmony_ci } 458962306a36Sopenharmony_ci 459062306a36Sopenharmony_ci spec->aloopback_mask = 0x01; 459162306a36Sopenharmony_ci spec->aloopback_shift = 8; 459262306a36Sopenharmony_ci 459362306a36Sopenharmony_ci spec->gen.beep_nid = 0x1c; /* digital beep */ 459462306a36Sopenharmony_ci 459562306a36Sopenharmony_ci /* GPIO0 High = Enable EAPD */ 459662306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1; 459762306a36Sopenharmony_ci spec->gpio_data = 0x01; 459862306a36Sopenharmony_ci 459962306a36Sopenharmony_ci spec->eapd_switch = 1; 460062306a36Sopenharmony_ci 460162306a36Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids); 460262306a36Sopenharmony_ci spec->pwr_nids = stac92hd73xx_pwr_nids; 460362306a36Sopenharmony_ci 460462306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 460562306a36Sopenharmony_ci spec->gen.power_down_unused = 1; 460662306a36Sopenharmony_ci 460762306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd73xx_models, stac92hd73xx_fixup_tbl, 460862306a36Sopenharmony_ci stac92hd73xx_fixups); 460962306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 461062306a36Sopenharmony_ci 461162306a36Sopenharmony_ci if (!spec->volknob_init) 461262306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd73xx_core_init); 461362306a36Sopenharmony_ci 461462306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 461562306a36Sopenharmony_ci if (err < 0) { 461662306a36Sopenharmony_ci stac_free(codec); 461762306a36Sopenharmony_ci return err; 461862306a36Sopenharmony_ci } 461962306a36Sopenharmony_ci 462062306a36Sopenharmony_ci /* Don't GPIO-mute speakers if there are no internal speakers, because 462162306a36Sopenharmony_ci * the GPIO might be necessary for Headphone 462262306a36Sopenharmony_ci */ 462362306a36Sopenharmony_ci if (spec->eapd_switch && !has_builtin_speaker(codec)) 462462306a36Sopenharmony_ci spec->eapd_switch = 0; 462562306a36Sopenharmony_ci 462662306a36Sopenharmony_ci codec->proc_widget_hook = stac92hd7x_proc_hook; 462762306a36Sopenharmony_ci 462862306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 462962306a36Sopenharmony_ci 463062306a36Sopenharmony_ci return 0; 463162306a36Sopenharmony_ci} 463262306a36Sopenharmony_ci 463362306a36Sopenharmony_cistatic void stac_setup_gpio(struct hda_codec *codec) 463462306a36Sopenharmony_ci{ 463562306a36Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 463662306a36Sopenharmony_ci 463762306a36Sopenharmony_ci spec->gpio_mask |= spec->eapd_mask; 463862306a36Sopenharmony_ci if (spec->gpio_led) { 463962306a36Sopenharmony_ci if (!spec->vref_mute_led_nid) { 464062306a36Sopenharmony_ci spec->gpio_mask |= spec->gpio_led; 464162306a36Sopenharmony_ci spec->gpio_dir |= spec->gpio_led; 464262306a36Sopenharmony_ci spec->gpio_data |= spec->gpio_led; 464362306a36Sopenharmony_ci } else { 464462306a36Sopenharmony_ci codec->power_filter = stac_vref_led_power_filter; 464562306a36Sopenharmony_ci } 464662306a36Sopenharmony_ci } 464762306a36Sopenharmony_ci 464862306a36Sopenharmony_ci if (spec->mic_mute_led_gpio) { 464962306a36Sopenharmony_ci spec->gpio_mask |= spec->mic_mute_led_gpio; 465062306a36Sopenharmony_ci spec->gpio_dir |= spec->mic_mute_led_gpio; 465162306a36Sopenharmony_ci spec->mic_enabled = 0; 465262306a36Sopenharmony_ci spec->gpio_data |= spec->mic_mute_led_gpio; 465362306a36Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, stac_capture_led_update); 465462306a36Sopenharmony_ci } 465562306a36Sopenharmony_ci} 465662306a36Sopenharmony_ci 465762306a36Sopenharmony_cistatic int patch_stac92hd83xxx(struct hda_codec *codec) 465862306a36Sopenharmony_ci{ 465962306a36Sopenharmony_ci struct sigmatel_spec *spec; 466062306a36Sopenharmony_ci int err; 466162306a36Sopenharmony_ci 466262306a36Sopenharmony_ci err = alloc_stac_spec(codec); 466362306a36Sopenharmony_ci if (err < 0) 466462306a36Sopenharmony_ci return err; 466562306a36Sopenharmony_ci 466662306a36Sopenharmony_ci /* longer delay needed for D3 */ 466762306a36Sopenharmony_ci codec->core.power_caps &= ~AC_PWRST_EPSS; 466862306a36Sopenharmony_ci 466962306a36Sopenharmony_ci spec = codec->spec; 467062306a36Sopenharmony_ci codec->power_save_node = 1; 467162306a36Sopenharmony_ci spec->linear_tone_beep = 0; 467262306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 467362306a36Sopenharmony_ci spec->gen.power_down_unused = 1; 467462306a36Sopenharmony_ci spec->gen.mixer_nid = 0x1b; 467562306a36Sopenharmony_ci 467662306a36Sopenharmony_ci spec->gen.beep_nid = 0x21; /* digital beep */ 467762306a36Sopenharmony_ci spec->pwr_nids = stac92hd83xxx_pwr_nids; 467862306a36Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); 467962306a36Sopenharmony_ci spec->default_polarity = -1; /* no default cfg */ 468062306a36Sopenharmony_ci 468162306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd83xxx_core_init); 468262306a36Sopenharmony_ci 468362306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd83xxx_models, stac92hd83xxx_fixup_tbl, 468462306a36Sopenharmony_ci stac92hd83xxx_fixups); 468562306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 468662306a36Sopenharmony_ci 468762306a36Sopenharmony_ci stac_setup_gpio(codec); 468862306a36Sopenharmony_ci 468962306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 469062306a36Sopenharmony_ci if (err < 0) { 469162306a36Sopenharmony_ci stac_free(codec); 469262306a36Sopenharmony_ci return err; 469362306a36Sopenharmony_ci } 469462306a36Sopenharmony_ci 469562306a36Sopenharmony_ci codec->proc_widget_hook = stac92hd_proc_hook; 469662306a36Sopenharmony_ci 469762306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 469862306a36Sopenharmony_ci 469962306a36Sopenharmony_ci return 0; 470062306a36Sopenharmony_ci} 470162306a36Sopenharmony_ci 470262306a36Sopenharmony_cistatic const hda_nid_t stac92hd95_pwr_nids[] = { 470362306a36Sopenharmony_ci 0x0a, 0x0b, 0x0c, 0x0d 470462306a36Sopenharmony_ci}; 470562306a36Sopenharmony_ci 470662306a36Sopenharmony_cistatic int patch_stac92hd95(struct hda_codec *codec) 470762306a36Sopenharmony_ci{ 470862306a36Sopenharmony_ci struct sigmatel_spec *spec; 470962306a36Sopenharmony_ci int err; 471062306a36Sopenharmony_ci 471162306a36Sopenharmony_ci err = alloc_stac_spec(codec); 471262306a36Sopenharmony_ci if (err < 0) 471362306a36Sopenharmony_ci return err; 471462306a36Sopenharmony_ci 471562306a36Sopenharmony_ci /* longer delay needed for D3 */ 471662306a36Sopenharmony_ci codec->core.power_caps &= ~AC_PWRST_EPSS; 471762306a36Sopenharmony_ci 471862306a36Sopenharmony_ci spec = codec->spec; 471962306a36Sopenharmony_ci codec->power_save_node = 1; 472062306a36Sopenharmony_ci spec->linear_tone_beep = 0; 472162306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 472262306a36Sopenharmony_ci spec->gen.power_down_unused = 1; 472362306a36Sopenharmony_ci 472462306a36Sopenharmony_ci spec->gen.beep_nid = 0x19; /* digital beep */ 472562306a36Sopenharmony_ci spec->pwr_nids = stac92hd95_pwr_nids; 472662306a36Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd95_pwr_nids); 472762306a36Sopenharmony_ci spec->default_polarity = 0; 472862306a36Sopenharmony_ci 472962306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd95_models, stac92hd95_fixup_tbl, 473062306a36Sopenharmony_ci stac92hd95_fixups); 473162306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 473262306a36Sopenharmony_ci 473362306a36Sopenharmony_ci stac_setup_gpio(codec); 473462306a36Sopenharmony_ci 473562306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 473662306a36Sopenharmony_ci if (err < 0) { 473762306a36Sopenharmony_ci stac_free(codec); 473862306a36Sopenharmony_ci return err; 473962306a36Sopenharmony_ci } 474062306a36Sopenharmony_ci 474162306a36Sopenharmony_ci codec->proc_widget_hook = stac92hd_proc_hook; 474262306a36Sopenharmony_ci 474362306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 474462306a36Sopenharmony_ci 474562306a36Sopenharmony_ci return 0; 474662306a36Sopenharmony_ci} 474762306a36Sopenharmony_ci 474862306a36Sopenharmony_cistatic int patch_stac92hd71bxx(struct hda_codec *codec) 474962306a36Sopenharmony_ci{ 475062306a36Sopenharmony_ci struct sigmatel_spec *spec; 475162306a36Sopenharmony_ci const hda_nid_t *unmute_nids = stac92hd71bxx_unmute_nids; 475262306a36Sopenharmony_ci int err; 475362306a36Sopenharmony_ci 475462306a36Sopenharmony_ci err = alloc_stac_spec(codec); 475562306a36Sopenharmony_ci if (err < 0) 475662306a36Sopenharmony_ci return err; 475762306a36Sopenharmony_ci 475862306a36Sopenharmony_ci spec = codec->spec; 475962306a36Sopenharmony_ci /* disabled power_save_node since it causes noises on a Dell machine */ 476062306a36Sopenharmony_ci /* codec->power_save_node = 1; */ 476162306a36Sopenharmony_ci spec->linear_tone_beep = 0; 476262306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 476362306a36Sopenharmony_ci spec->gen.power_down_unused = 1; 476462306a36Sopenharmony_ci spec->gen.mixer_nid = 0x17; 476562306a36Sopenharmony_ci spec->have_spdif_mux = 1; 476662306a36Sopenharmony_ci 476762306a36Sopenharmony_ci /* GPIO0 = EAPD */ 476862306a36Sopenharmony_ci spec->gpio_mask = 0x01; 476962306a36Sopenharmony_ci spec->gpio_dir = 0x01; 477062306a36Sopenharmony_ci spec->gpio_data = 0x01; 477162306a36Sopenharmony_ci 477262306a36Sopenharmony_ci switch (codec->core.vendor_id) { 477362306a36Sopenharmony_ci case 0x111d76b6: /* 4 Port without Analog Mixer */ 477462306a36Sopenharmony_ci case 0x111d76b7: 477562306a36Sopenharmony_ci unmute_nids++; 477662306a36Sopenharmony_ci break; 477762306a36Sopenharmony_ci case 0x111d7608: /* 5 Port with Analog Mixer */ 477862306a36Sopenharmony_ci if ((codec->core.revision_id & 0xf) == 0 || 477962306a36Sopenharmony_ci (codec->core.revision_id & 0xf) == 1) 478062306a36Sopenharmony_ci spec->stream_delay = 40; /* 40 milliseconds */ 478162306a36Sopenharmony_ci 478262306a36Sopenharmony_ci /* disable VSW */ 478362306a36Sopenharmony_ci unmute_nids++; 478462306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0); 478562306a36Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3); 478662306a36Sopenharmony_ci break; 478762306a36Sopenharmony_ci case 0x111d7603: /* 6 Port with Analog Mixer */ 478862306a36Sopenharmony_ci if ((codec->core.revision_id & 0xf) == 1) 478962306a36Sopenharmony_ci spec->stream_delay = 40; /* 40 milliseconds */ 479062306a36Sopenharmony_ci 479162306a36Sopenharmony_ci break; 479262306a36Sopenharmony_ci } 479362306a36Sopenharmony_ci 479462306a36Sopenharmony_ci if (get_wcaps_type(get_wcaps(codec, 0x28)) == AC_WID_VOL_KNB) 479562306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd71bxx_core_init); 479662306a36Sopenharmony_ci 479762306a36Sopenharmony_ci if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) { 479862306a36Sopenharmony_ci const hda_nid_t *p; 479962306a36Sopenharmony_ci for (p = unmute_nids; *p; p++) 480062306a36Sopenharmony_ci snd_hda_codec_amp_init_stereo(codec, *p, HDA_INPUT, 0, 480162306a36Sopenharmony_ci 0xff, 0x00); 480262306a36Sopenharmony_ci } 480362306a36Sopenharmony_ci 480462306a36Sopenharmony_ci spec->aloopback_ctl = &stac92hd71bxx_loopback; 480562306a36Sopenharmony_ci spec->aloopback_mask = 0x50; 480662306a36Sopenharmony_ci spec->aloopback_shift = 0; 480762306a36Sopenharmony_ci 480862306a36Sopenharmony_ci spec->powerdown_adcs = 1; 480962306a36Sopenharmony_ci spec->gen.beep_nid = 0x26; /* digital beep */ 481062306a36Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids); 481162306a36Sopenharmony_ci spec->pwr_nids = stac92hd71bxx_pwr_nids; 481262306a36Sopenharmony_ci 481362306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd71bxx_models, stac92hd71bxx_fixup_tbl, 481462306a36Sopenharmony_ci stac92hd71bxx_fixups); 481562306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 481662306a36Sopenharmony_ci 481762306a36Sopenharmony_ci stac_setup_gpio(codec); 481862306a36Sopenharmony_ci 481962306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 482062306a36Sopenharmony_ci if (err < 0) { 482162306a36Sopenharmony_ci stac_free(codec); 482262306a36Sopenharmony_ci return err; 482362306a36Sopenharmony_ci } 482462306a36Sopenharmony_ci 482562306a36Sopenharmony_ci codec->proc_widget_hook = stac92hd7x_proc_hook; 482662306a36Sopenharmony_ci 482762306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 482862306a36Sopenharmony_ci 482962306a36Sopenharmony_ci return 0; 483062306a36Sopenharmony_ci} 483162306a36Sopenharmony_ci 483262306a36Sopenharmony_cistatic int patch_stac922x(struct hda_codec *codec) 483362306a36Sopenharmony_ci{ 483462306a36Sopenharmony_ci struct sigmatel_spec *spec; 483562306a36Sopenharmony_ci int err; 483662306a36Sopenharmony_ci 483762306a36Sopenharmony_ci err = alloc_stac_spec(codec); 483862306a36Sopenharmony_ci if (err < 0) 483962306a36Sopenharmony_ci return err; 484062306a36Sopenharmony_ci 484162306a36Sopenharmony_ci spec = codec->spec; 484262306a36Sopenharmony_ci spec->linear_tone_beep = 1; 484362306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 484462306a36Sopenharmony_ci 484562306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac922x_core_init); 484662306a36Sopenharmony_ci 484762306a36Sopenharmony_ci /* Fix Mux capture level; max to 2 */ 484862306a36Sopenharmony_ci snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT, 484962306a36Sopenharmony_ci (0 << AC_AMPCAP_OFFSET_SHIFT) | 485062306a36Sopenharmony_ci (2 << AC_AMPCAP_NUM_STEPS_SHIFT) | 485162306a36Sopenharmony_ci (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) | 485262306a36Sopenharmony_ci (0 << AC_AMPCAP_MUTE_SHIFT)); 485362306a36Sopenharmony_ci 485462306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac922x_models, stac922x_fixup_tbl, 485562306a36Sopenharmony_ci stac922x_fixups); 485662306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 485762306a36Sopenharmony_ci 485862306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 485962306a36Sopenharmony_ci if (err < 0) { 486062306a36Sopenharmony_ci stac_free(codec); 486162306a36Sopenharmony_ci return err; 486262306a36Sopenharmony_ci } 486362306a36Sopenharmony_ci 486462306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 486562306a36Sopenharmony_ci 486662306a36Sopenharmony_ci return 0; 486762306a36Sopenharmony_ci} 486862306a36Sopenharmony_ci 486962306a36Sopenharmony_cistatic const char * const stac927x_spdif_labels[] = { 487062306a36Sopenharmony_ci "Digital Playback", "ADAT", "Analog Mux 1", 487162306a36Sopenharmony_ci "Analog Mux 2", "Analog Mux 3", NULL 487262306a36Sopenharmony_ci}; 487362306a36Sopenharmony_ci 487462306a36Sopenharmony_cistatic int patch_stac927x(struct hda_codec *codec) 487562306a36Sopenharmony_ci{ 487662306a36Sopenharmony_ci struct sigmatel_spec *spec; 487762306a36Sopenharmony_ci int err; 487862306a36Sopenharmony_ci 487962306a36Sopenharmony_ci err = alloc_stac_spec(codec); 488062306a36Sopenharmony_ci if (err < 0) 488162306a36Sopenharmony_ci return err; 488262306a36Sopenharmony_ci 488362306a36Sopenharmony_ci spec = codec->spec; 488462306a36Sopenharmony_ci spec->linear_tone_beep = 1; 488562306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 488662306a36Sopenharmony_ci spec->have_spdif_mux = 1; 488762306a36Sopenharmony_ci spec->spdif_labels = stac927x_spdif_labels; 488862306a36Sopenharmony_ci 488962306a36Sopenharmony_ci spec->gen.beep_nid = 0x23; /* digital beep */ 489062306a36Sopenharmony_ci 489162306a36Sopenharmony_ci /* GPIO0 High = Enable EAPD */ 489262306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = 0x01; 489362306a36Sopenharmony_ci spec->gpio_dir = spec->gpio_data = 0x01; 489462306a36Sopenharmony_ci 489562306a36Sopenharmony_ci spec->aloopback_ctl = &stac927x_loopback; 489662306a36Sopenharmony_ci spec->aloopback_mask = 0x40; 489762306a36Sopenharmony_ci spec->aloopback_shift = 0; 489862306a36Sopenharmony_ci spec->eapd_switch = 1; 489962306a36Sopenharmony_ci 490062306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac927x_models, stac927x_fixup_tbl, 490162306a36Sopenharmony_ci stac927x_fixups); 490262306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 490362306a36Sopenharmony_ci 490462306a36Sopenharmony_ci if (!spec->volknob_init) 490562306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac927x_core_init); 490662306a36Sopenharmony_ci 490762306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 490862306a36Sopenharmony_ci if (err < 0) { 490962306a36Sopenharmony_ci stac_free(codec); 491062306a36Sopenharmony_ci return err; 491162306a36Sopenharmony_ci } 491262306a36Sopenharmony_ci 491362306a36Sopenharmony_ci codec->proc_widget_hook = stac927x_proc_hook; 491462306a36Sopenharmony_ci 491562306a36Sopenharmony_ci /* 491662306a36Sopenharmony_ci * !!FIXME!! 491762306a36Sopenharmony_ci * The STAC927x seem to require fairly long delays for certain 491862306a36Sopenharmony_ci * command sequences. With too short delays (even if the answer 491962306a36Sopenharmony_ci * is set to RIRB properly), it results in the silence output 492062306a36Sopenharmony_ci * on some hardwares like Dell. 492162306a36Sopenharmony_ci * 492262306a36Sopenharmony_ci * The below flag enables the longer delay (see get_response 492362306a36Sopenharmony_ci * in hda_intel.c). 492462306a36Sopenharmony_ci */ 492562306a36Sopenharmony_ci codec->bus->core.needs_damn_long_delay = 1; 492662306a36Sopenharmony_ci 492762306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 492862306a36Sopenharmony_ci 492962306a36Sopenharmony_ci return 0; 493062306a36Sopenharmony_ci} 493162306a36Sopenharmony_ci 493262306a36Sopenharmony_cistatic int patch_stac9205(struct hda_codec *codec) 493362306a36Sopenharmony_ci{ 493462306a36Sopenharmony_ci struct sigmatel_spec *spec; 493562306a36Sopenharmony_ci int err; 493662306a36Sopenharmony_ci 493762306a36Sopenharmony_ci err = alloc_stac_spec(codec); 493862306a36Sopenharmony_ci if (err < 0) 493962306a36Sopenharmony_ci return err; 494062306a36Sopenharmony_ci 494162306a36Sopenharmony_ci spec = codec->spec; 494262306a36Sopenharmony_ci spec->linear_tone_beep = 1; 494362306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 494462306a36Sopenharmony_ci spec->have_spdif_mux = 1; 494562306a36Sopenharmony_ci 494662306a36Sopenharmony_ci spec->gen.beep_nid = 0x23; /* digital beep */ 494762306a36Sopenharmony_ci 494862306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac9205_core_init); 494962306a36Sopenharmony_ci spec->aloopback_ctl = &stac9205_loopback; 495062306a36Sopenharmony_ci 495162306a36Sopenharmony_ci spec->aloopback_mask = 0x40; 495262306a36Sopenharmony_ci spec->aloopback_shift = 0; 495362306a36Sopenharmony_ci 495462306a36Sopenharmony_ci /* GPIO0 High = EAPD */ 495562306a36Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1; 495662306a36Sopenharmony_ci spec->gpio_data = 0x01; 495762306a36Sopenharmony_ci 495862306a36Sopenharmony_ci /* Turn on/off EAPD per HP plugging */ 495962306a36Sopenharmony_ci spec->eapd_switch = 1; 496062306a36Sopenharmony_ci 496162306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac9205_models, stac9205_fixup_tbl, 496262306a36Sopenharmony_ci stac9205_fixups); 496362306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 496462306a36Sopenharmony_ci 496562306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 496662306a36Sopenharmony_ci if (err < 0) { 496762306a36Sopenharmony_ci stac_free(codec); 496862306a36Sopenharmony_ci return err; 496962306a36Sopenharmony_ci } 497062306a36Sopenharmony_ci 497162306a36Sopenharmony_ci codec->proc_widget_hook = stac9205_proc_hook; 497262306a36Sopenharmony_ci 497362306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 497462306a36Sopenharmony_ci 497562306a36Sopenharmony_ci return 0; 497662306a36Sopenharmony_ci} 497762306a36Sopenharmony_ci 497862306a36Sopenharmony_ci/* 497962306a36Sopenharmony_ci * STAC9872 hack 498062306a36Sopenharmony_ci */ 498162306a36Sopenharmony_ci 498262306a36Sopenharmony_cistatic const struct hda_verb stac9872_core_init[] = { 498362306a36Sopenharmony_ci {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */ 498462306a36Sopenharmony_ci {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */ 498562306a36Sopenharmony_ci {} 498662306a36Sopenharmony_ci}; 498762306a36Sopenharmony_ci 498862306a36Sopenharmony_cistatic const struct hda_pintbl stac9872_vaio_pin_configs[] = { 498962306a36Sopenharmony_ci { 0x0a, 0x03211020 }, 499062306a36Sopenharmony_ci { 0x0b, 0x411111f0 }, 499162306a36Sopenharmony_ci { 0x0c, 0x411111f0 }, 499262306a36Sopenharmony_ci { 0x0d, 0x03a15030 }, 499362306a36Sopenharmony_ci { 0x0e, 0x411111f0 }, 499462306a36Sopenharmony_ci { 0x0f, 0x90170110 }, 499562306a36Sopenharmony_ci { 0x11, 0x411111f0 }, 499662306a36Sopenharmony_ci { 0x13, 0x411111f0 }, 499762306a36Sopenharmony_ci { 0x14, 0x90a7013e }, 499862306a36Sopenharmony_ci {} 499962306a36Sopenharmony_ci}; 500062306a36Sopenharmony_ci 500162306a36Sopenharmony_cistatic const struct hda_model_fixup stac9872_models[] = { 500262306a36Sopenharmony_ci { .id = STAC_9872_VAIO, .name = "vaio" }, 500362306a36Sopenharmony_ci {} 500462306a36Sopenharmony_ci}; 500562306a36Sopenharmony_ci 500662306a36Sopenharmony_cistatic const struct hda_fixup stac9872_fixups[] = { 500762306a36Sopenharmony_ci [STAC_9872_VAIO] = { 500862306a36Sopenharmony_ci .type = HDA_FIXUP_PINS, 500962306a36Sopenharmony_ci .v.pins = stac9872_vaio_pin_configs, 501062306a36Sopenharmony_ci }, 501162306a36Sopenharmony_ci}; 501262306a36Sopenharmony_ci 501362306a36Sopenharmony_cistatic const struct snd_pci_quirk stac9872_fixup_tbl[] = { 501462306a36Sopenharmony_ci SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0, 501562306a36Sopenharmony_ci "Sony VAIO F/S", STAC_9872_VAIO), 501662306a36Sopenharmony_ci {} /* terminator */ 501762306a36Sopenharmony_ci}; 501862306a36Sopenharmony_ci 501962306a36Sopenharmony_cistatic int patch_stac9872(struct hda_codec *codec) 502062306a36Sopenharmony_ci{ 502162306a36Sopenharmony_ci struct sigmatel_spec *spec; 502262306a36Sopenharmony_ci int err; 502362306a36Sopenharmony_ci 502462306a36Sopenharmony_ci err = alloc_stac_spec(codec); 502562306a36Sopenharmony_ci if (err < 0) 502662306a36Sopenharmony_ci return err; 502762306a36Sopenharmony_ci 502862306a36Sopenharmony_ci spec = codec->spec; 502962306a36Sopenharmony_ci spec->linear_tone_beep = 1; 503062306a36Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 503162306a36Sopenharmony_ci 503262306a36Sopenharmony_ci snd_hda_add_verbs(codec, stac9872_core_init); 503362306a36Sopenharmony_ci 503462306a36Sopenharmony_ci snd_hda_pick_fixup(codec, stac9872_models, stac9872_fixup_tbl, 503562306a36Sopenharmony_ci stac9872_fixups); 503662306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 503762306a36Sopenharmony_ci 503862306a36Sopenharmony_ci err = stac_parse_auto_config(codec); 503962306a36Sopenharmony_ci if (err < 0) { 504062306a36Sopenharmony_ci stac_free(codec); 504162306a36Sopenharmony_ci return -EINVAL; 504262306a36Sopenharmony_ci } 504362306a36Sopenharmony_ci 504462306a36Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 504562306a36Sopenharmony_ci 504662306a36Sopenharmony_ci return 0; 504762306a36Sopenharmony_ci} 504862306a36Sopenharmony_ci 504962306a36Sopenharmony_ci 505062306a36Sopenharmony_ci/* 505162306a36Sopenharmony_ci * patch entries 505262306a36Sopenharmony_ci */ 505362306a36Sopenharmony_cistatic const struct hda_device_id snd_hda_id_sigmatel[] = { 505462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847690, "STAC9200", patch_stac9200), 505562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847882, "STAC9220 A1", patch_stac922x), 505662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847680, "STAC9221 A1", patch_stac922x), 505762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847880, "STAC9220 A2", patch_stac922x), 505862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847681, "STAC9220D/9223D A2", patch_stac922x), 505962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847682, "STAC9221 A2", patch_stac922x), 506062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847683, "STAC9221D A2", patch_stac922x), 506162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847618, "STAC9227", patch_stac927x), 506262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847619, "STAC9227", patch_stac927x), 506362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847638, "STAC92HD700", patch_stac927x), 506462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847616, "STAC9228", patch_stac927x), 506562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847617, "STAC9228", patch_stac927x), 506662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847614, "STAC9229", patch_stac927x), 506762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847615, "STAC9229", patch_stac927x), 506862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847620, "STAC9274", patch_stac927x), 506962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847621, "STAC9274D", patch_stac927x), 507062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847622, "STAC9273X", patch_stac927x), 507162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847623, "STAC9273D", patch_stac927x), 507262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847624, "STAC9272X", patch_stac927x), 507362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847625, "STAC9272D", patch_stac927x), 507462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847626, "STAC9271X", patch_stac927x), 507562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847627, "STAC9271D", patch_stac927x), 507662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847628, "STAC9274X5NH", patch_stac927x), 507762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847629, "STAC9274D5NH", patch_stac927x), 507862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847632, "STAC9202", patch_stac925x), 507962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847633, "STAC9202D", patch_stac925x), 508062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847634, "STAC9250", patch_stac925x), 508162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847635, "STAC9250D", patch_stac925x), 508262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847636, "STAC9251", patch_stac925x), 508362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847637, "STAC9250D", patch_stac925x), 508462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847645, "92HD206X", patch_stac927x), 508562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847646, "92HD206D", patch_stac927x), 508662306a36Sopenharmony_ci /* The following does not take into account .id=0x83847661 when subsys = 508762306a36Sopenharmony_ci * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are 508862306a36Sopenharmony_ci * currently not fully supported. 508962306a36Sopenharmony_ci */ 509062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847661, "CXD9872RD/K", patch_stac9872), 509162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847662, "STAC9872AK", patch_stac9872), 509262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847664, "CXD9872AKD", patch_stac9872), 509362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x83847698, "STAC9205", patch_stac9205), 509462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a0, "STAC9205", patch_stac9205), 509562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a1, "STAC9205D", patch_stac9205), 509662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a2, "STAC9204", patch_stac9205), 509762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a3, "STAC9204D", patch_stac9205), 509862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a4, "STAC9255", patch_stac9205), 509962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a5, "STAC9255D", patch_stac9205), 510062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a6, "STAC9254", patch_stac9205), 510162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a7, "STAC9254D", patch_stac9205), 510262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7603, "92HD75B3X5", patch_stac92hd71bxx), 510362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7604, "92HD83C1X5", patch_stac92hd83xxx), 510462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d4, "92HD83C1C5", patch_stac92hd83xxx), 510562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7605, "92HD81B1X5", patch_stac92hd83xxx), 510662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d5, "92HD81B1C5", patch_stac92hd83xxx), 510762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d1, "92HD87B1/3", patch_stac92hd83xxx), 510862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d9, "92HD87B2/4", patch_stac92hd83xxx), 510962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7666, "92HD88B3", patch_stac92hd83xxx), 511062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7667, "92HD88B1", patch_stac92hd83xxx), 511162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7668, "92HD88B2", patch_stac92hd83xxx), 511262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7669, "92HD88B4", patch_stac92hd83xxx), 511362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7608, "92HD75B2X5", patch_stac92hd71bxx), 511462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7674, "92HD73D1X5", patch_stac92hd73xx), 511562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7675, "92HD73C1X5", patch_stac92hd73xx), 511662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7676, "92HD73E1X5", patch_stac92hd73xx), 511762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7695, "92HD95", patch_stac92hd95), 511862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b0, "92HD71B8X", patch_stac92hd71bxx), 511962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b1, "92HD71B8X", patch_stac92hd71bxx), 512062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b2, "92HD71B7X", patch_stac92hd71bxx), 512162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b3, "92HD71B7X", patch_stac92hd71bxx), 512262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b4, "92HD71B6X", patch_stac92hd71bxx), 512362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b5, "92HD71B6X", patch_stac92hd71bxx), 512462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b6, "92HD71B5X", patch_stac92hd71bxx), 512562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b7, "92HD71B5X", patch_stac92hd71bxx), 512662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c0, "92HD89C3", patch_stac92hd73xx), 512762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c1, "92HD89C2", patch_stac92hd73xx), 512862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c2, "92HD89C1", patch_stac92hd73xx), 512962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c3, "92HD89B3", patch_stac92hd73xx), 513062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c4, "92HD89B2", patch_stac92hd73xx), 513162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c5, "92HD89B1", patch_stac92hd73xx), 513262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c6, "92HD89E3", patch_stac92hd73xx), 513362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c7, "92HD89E2", patch_stac92hd73xx), 513462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c8, "92HD89E1", patch_stac92hd73xx), 513562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c9, "92HD89D3", patch_stac92hd73xx), 513662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ca, "92HD89D2", patch_stac92hd73xx), 513762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76cb, "92HD89D1", patch_stac92hd73xx), 513862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76cc, "92HD89F3", patch_stac92hd73xx), 513962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76cd, "92HD89F2", patch_stac92hd73xx), 514062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ce, "92HD89F1", patch_stac92hd73xx), 514162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76df, "92HD93BXX", patch_stac92hd83xxx), 514262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e0, "92HD91BXX", patch_stac92hd83xxx), 514362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e3, "92HD98BXX", patch_stac92hd83xxx), 514462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e5, "92HD99BXX", patch_stac92hd83xxx), 514562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e7, "92HD90BXX", patch_stac92hd83xxx), 514662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e8, "92HD66B1X5", patch_stac92hd83xxx), 514762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e9, "92HD66B2X5", patch_stac92hd83xxx), 514862306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ea, "92HD66B3X5", patch_stac92hd83xxx), 514962306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76eb, "92HD66C1X5", patch_stac92hd83xxx), 515062306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ec, "92HD66C2X5", patch_stac92hd83xxx), 515162306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ed, "92HD66C3X5", patch_stac92hd83xxx), 515262306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ee, "92HD66B1X3", patch_stac92hd83xxx), 515362306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ef, "92HD66B2X3", patch_stac92hd83xxx), 515462306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f0, "92HD66B3X3", patch_stac92hd83xxx), 515562306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f1, "92HD66C1X3", patch_stac92hd83xxx), 515662306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f2, "92HD66C2X3", patch_stac92hd83xxx), 515762306a36Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f3, "92HD66C3/65", patch_stac92hd83xxx), 515862306a36Sopenharmony_ci {} /* terminator */ 515962306a36Sopenharmony_ci}; 516062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(hdaudio, snd_hda_id_sigmatel); 516162306a36Sopenharmony_ci 516262306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 516362306a36Sopenharmony_ciMODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec"); 516462306a36Sopenharmony_ci 516562306a36Sopenharmony_cistatic struct hda_codec_driver sigmatel_driver = { 516662306a36Sopenharmony_ci .id = snd_hda_id_sigmatel, 516762306a36Sopenharmony_ci}; 516862306a36Sopenharmony_ci 516962306a36Sopenharmony_cimodule_hda_codec_driver(sigmatel_driver); 5170