18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Universal Interface for Intel High Definition Audio Codec 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * HD audio interface patch for SigmaTel STAC92xx 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (c) 2005 Embedded Alley Solutions, Inc. 88c2ecf20Sopenharmony_ci * Matt Porter <mporter@embeddedalley.com> 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * Based on patch_cmedia.c and patch_realtek.c 118c2ecf20Sopenharmony_ci * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de> 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/init.h> 158c2ecf20Sopenharmony_ci#include <linux/delay.h> 168c2ecf20Sopenharmony_ci#include <linux/slab.h> 178c2ecf20Sopenharmony_ci#include <linux/pci.h> 188c2ecf20Sopenharmony_ci#include <linux/dmi.h> 198c2ecf20Sopenharmony_ci#include <linux/module.h> 208c2ecf20Sopenharmony_ci#include <sound/core.h> 218c2ecf20Sopenharmony_ci#include <sound/jack.h> 228c2ecf20Sopenharmony_ci#include <sound/hda_codec.h> 238c2ecf20Sopenharmony_ci#include "hda_local.h" 248c2ecf20Sopenharmony_ci#include "hda_auto_parser.h" 258c2ecf20Sopenharmony_ci#include "hda_beep.h" 268c2ecf20Sopenharmony_ci#include "hda_jack.h" 278c2ecf20Sopenharmony_ci#include "hda_generic.h" 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cienum { 308c2ecf20Sopenharmony_ci STAC_REF, 318c2ecf20Sopenharmony_ci STAC_9200_OQO, 328c2ecf20Sopenharmony_ci STAC_9200_DELL_D21, 338c2ecf20Sopenharmony_ci STAC_9200_DELL_D22, 348c2ecf20Sopenharmony_ci STAC_9200_DELL_D23, 358c2ecf20Sopenharmony_ci STAC_9200_DELL_M21, 368c2ecf20Sopenharmony_ci STAC_9200_DELL_M22, 378c2ecf20Sopenharmony_ci STAC_9200_DELL_M23, 388c2ecf20Sopenharmony_ci STAC_9200_DELL_M24, 398c2ecf20Sopenharmony_ci STAC_9200_DELL_M25, 408c2ecf20Sopenharmony_ci STAC_9200_DELL_M26, 418c2ecf20Sopenharmony_ci STAC_9200_DELL_M27, 428c2ecf20Sopenharmony_ci STAC_9200_M4, 438c2ecf20Sopenharmony_ci STAC_9200_M4_2, 448c2ecf20Sopenharmony_ci STAC_9200_PANASONIC, 458c2ecf20Sopenharmony_ci STAC_9200_EAPD_INIT, 468c2ecf20Sopenharmony_ci STAC_9200_MODELS 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cienum { 508c2ecf20Sopenharmony_ci STAC_9205_REF, 518c2ecf20Sopenharmony_ci STAC_9205_DELL_M42, 528c2ecf20Sopenharmony_ci STAC_9205_DELL_M43, 538c2ecf20Sopenharmony_ci STAC_9205_DELL_M44, 548c2ecf20Sopenharmony_ci STAC_9205_EAPD, 558c2ecf20Sopenharmony_ci STAC_9205_MODELS 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cienum { 598c2ecf20Sopenharmony_ci STAC_92HD73XX_NO_JD, /* no jack-detection */ 608c2ecf20Sopenharmony_ci STAC_92HD73XX_REF, 618c2ecf20Sopenharmony_ci STAC_92HD73XX_INTEL, 628c2ecf20Sopenharmony_ci STAC_DELL_M6_AMIC, 638c2ecf20Sopenharmony_ci STAC_DELL_M6_DMIC, 648c2ecf20Sopenharmony_ci STAC_DELL_M6_BOTH, 658c2ecf20Sopenharmony_ci STAC_DELL_EQ, 668c2ecf20Sopenharmony_ci STAC_ALIENWARE_M17X, 678c2ecf20Sopenharmony_ci STAC_ELO_VUPOINT_15MX, 688c2ecf20Sopenharmony_ci STAC_92HD89XX_HP_FRONT_JACK, 698c2ecf20Sopenharmony_ci STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK, 708c2ecf20Sopenharmony_ci STAC_92HD73XX_ASUS_MOBO, 718c2ecf20Sopenharmony_ci STAC_92HD73XX_MODELS 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cienum { 758c2ecf20Sopenharmony_ci STAC_92HD83XXX_REF, 768c2ecf20Sopenharmony_ci STAC_92HD83XXX_PWR_REF, 778c2ecf20Sopenharmony_ci STAC_DELL_S14, 788c2ecf20Sopenharmony_ci STAC_DELL_VOSTRO_3500, 798c2ecf20Sopenharmony_ci STAC_92HD83XXX_HP_cNB11_INTQUAD, 808c2ecf20Sopenharmony_ci STAC_HP_DV7_4000, 818c2ecf20Sopenharmony_ci STAC_HP_ZEPHYR, 828c2ecf20Sopenharmony_ci STAC_92HD83XXX_HP_LED, 838c2ecf20Sopenharmony_ci STAC_92HD83XXX_HP_INV_LED, 848c2ecf20Sopenharmony_ci STAC_92HD83XXX_HP_MIC_LED, 858c2ecf20Sopenharmony_ci STAC_HP_LED_GPIO10, 868c2ecf20Sopenharmony_ci STAC_92HD83XXX_HEADSET_JACK, 878c2ecf20Sopenharmony_ci STAC_92HD83XXX_HP, 888c2ecf20Sopenharmony_ci STAC_HP_ENVY_BASS, 898c2ecf20Sopenharmony_ci STAC_HP_BNB13_EQ, 908c2ecf20Sopenharmony_ci STAC_HP_ENVY_TS_BASS, 918c2ecf20Sopenharmony_ci STAC_HP_ENVY_TS_DAC_BIND, 928c2ecf20Sopenharmony_ci STAC_92HD83XXX_GPIO10_EAPD, 938c2ecf20Sopenharmony_ci STAC_92HD83XXX_MODELS 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cienum { 978c2ecf20Sopenharmony_ci STAC_92HD71BXX_REF, 988c2ecf20Sopenharmony_ci STAC_DELL_M4_1, 998c2ecf20Sopenharmony_ci STAC_DELL_M4_2, 1008c2ecf20Sopenharmony_ci STAC_DELL_M4_3, 1018c2ecf20Sopenharmony_ci STAC_HP_M4, 1028c2ecf20Sopenharmony_ci STAC_HP_DV4, 1038c2ecf20Sopenharmony_ci STAC_HP_DV5, 1048c2ecf20Sopenharmony_ci STAC_HP_HDX, 1058c2ecf20Sopenharmony_ci STAC_92HD71BXX_HP, 1068c2ecf20Sopenharmony_ci STAC_92HD71BXX_NO_DMIC, 1078c2ecf20Sopenharmony_ci STAC_92HD71BXX_NO_SMUX, 1088c2ecf20Sopenharmony_ci STAC_92HD71BXX_MODELS 1098c2ecf20Sopenharmony_ci}; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_cienum { 1128c2ecf20Sopenharmony_ci STAC_92HD95_HP_LED, 1138c2ecf20Sopenharmony_ci STAC_92HD95_HP_BASS, 1148c2ecf20Sopenharmony_ci STAC_92HD95_MODELS 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cienum { 1188c2ecf20Sopenharmony_ci STAC_925x_REF, 1198c2ecf20Sopenharmony_ci STAC_M1, 1208c2ecf20Sopenharmony_ci STAC_M1_2, 1218c2ecf20Sopenharmony_ci STAC_M2, 1228c2ecf20Sopenharmony_ci STAC_M2_2, 1238c2ecf20Sopenharmony_ci STAC_M3, 1248c2ecf20Sopenharmony_ci STAC_M5, 1258c2ecf20Sopenharmony_ci STAC_M6, 1268c2ecf20Sopenharmony_ci STAC_925x_MODELS 1278c2ecf20Sopenharmony_ci}; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cienum { 1308c2ecf20Sopenharmony_ci STAC_D945_REF, 1318c2ecf20Sopenharmony_ci STAC_D945GTP3, 1328c2ecf20Sopenharmony_ci STAC_D945GTP5, 1338c2ecf20Sopenharmony_ci STAC_INTEL_MAC_V1, 1348c2ecf20Sopenharmony_ci STAC_INTEL_MAC_V2, 1358c2ecf20Sopenharmony_ci STAC_INTEL_MAC_V3, 1368c2ecf20Sopenharmony_ci STAC_INTEL_MAC_V4, 1378c2ecf20Sopenharmony_ci STAC_INTEL_MAC_V5, 1388c2ecf20Sopenharmony_ci STAC_INTEL_MAC_AUTO, 1398c2ecf20Sopenharmony_ci STAC_ECS_202, 1408c2ecf20Sopenharmony_ci STAC_922X_DELL_D81, 1418c2ecf20Sopenharmony_ci STAC_922X_DELL_D82, 1428c2ecf20Sopenharmony_ci STAC_922X_DELL_M81, 1438c2ecf20Sopenharmony_ci STAC_922X_DELL_M82, 1448c2ecf20Sopenharmony_ci STAC_922X_INTEL_MAC_GPIO, 1458c2ecf20Sopenharmony_ci STAC_922X_MODELS 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cienum { 1498c2ecf20Sopenharmony_ci STAC_D965_REF_NO_JD, /* no jack-detection */ 1508c2ecf20Sopenharmony_ci STAC_D965_REF, 1518c2ecf20Sopenharmony_ci STAC_D965_3ST, 1528c2ecf20Sopenharmony_ci STAC_D965_5ST, 1538c2ecf20Sopenharmony_ci STAC_D965_5ST_NO_FP, 1548c2ecf20Sopenharmony_ci STAC_D965_VERBS, 1558c2ecf20Sopenharmony_ci STAC_DELL_3ST, 1568c2ecf20Sopenharmony_ci STAC_DELL_BIOS, 1578c2ecf20Sopenharmony_ci STAC_NEMO_DEFAULT, 1588c2ecf20Sopenharmony_ci STAC_DELL_BIOS_AMIC, 1598c2ecf20Sopenharmony_ci STAC_DELL_BIOS_SPDIF, 1608c2ecf20Sopenharmony_ci STAC_927X_DELL_DMIC, 1618c2ecf20Sopenharmony_ci STAC_927X_VOLKNOB, 1628c2ecf20Sopenharmony_ci STAC_927X_MODELS 1638c2ecf20Sopenharmony_ci}; 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_cienum { 1668c2ecf20Sopenharmony_ci STAC_9872_VAIO, 1678c2ecf20Sopenharmony_ci STAC_9872_MODELS 1688c2ecf20Sopenharmony_ci}; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistruct sigmatel_spec { 1718c2ecf20Sopenharmony_ci struct hda_gen_spec gen; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci unsigned int eapd_switch: 1; 1748c2ecf20Sopenharmony_ci unsigned int linear_tone_beep:1; 1758c2ecf20Sopenharmony_ci unsigned int headset_jack:1; /* 4-pin headset jack (hp + mono mic) */ 1768c2ecf20Sopenharmony_ci unsigned int volknob_init:1; /* special volume-knob initialization */ 1778c2ecf20Sopenharmony_ci unsigned int powerdown_adcs:1; 1788c2ecf20Sopenharmony_ci unsigned int have_spdif_mux:1; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci /* gpio lines */ 1818c2ecf20Sopenharmony_ci unsigned int eapd_mask; 1828c2ecf20Sopenharmony_ci unsigned int gpio_mask; 1838c2ecf20Sopenharmony_ci unsigned int gpio_dir; 1848c2ecf20Sopenharmony_ci unsigned int gpio_data; 1858c2ecf20Sopenharmony_ci unsigned int gpio_mute; 1868c2ecf20Sopenharmony_ci unsigned int gpio_led; 1878c2ecf20Sopenharmony_ci unsigned int gpio_led_polarity; 1888c2ecf20Sopenharmony_ci unsigned int vref_mute_led_nid; /* pin NID for mute-LED vref control */ 1898c2ecf20Sopenharmony_ci unsigned int vref_led; 1908c2ecf20Sopenharmony_ci int default_polarity; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci unsigned int mic_mute_led_gpio; /* capture mute LED GPIO */ 1938c2ecf20Sopenharmony_ci unsigned int mic_enabled; /* current mic mute state (bitmask) */ 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci /* stream */ 1968c2ecf20Sopenharmony_ci unsigned int stream_delay; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci /* analog loopback */ 1998c2ecf20Sopenharmony_ci const struct snd_kcontrol_new *aloopback_ctl; 2008c2ecf20Sopenharmony_ci unsigned int aloopback; 2018c2ecf20Sopenharmony_ci unsigned char aloopback_mask; 2028c2ecf20Sopenharmony_ci unsigned char aloopback_shift; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci /* power management */ 2058c2ecf20Sopenharmony_ci unsigned int power_map_bits; 2068c2ecf20Sopenharmony_ci unsigned int num_pwrs; 2078c2ecf20Sopenharmony_ci const hda_nid_t *pwr_nids; 2088c2ecf20Sopenharmony_ci unsigned int active_adcs; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci /* beep widgets */ 2118c2ecf20Sopenharmony_ci hda_nid_t anabeep_nid; 2128c2ecf20Sopenharmony_ci bool beep_power_on; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci /* SPDIF-out mux */ 2158c2ecf20Sopenharmony_ci const char * const *spdif_labels; 2168c2ecf20Sopenharmony_ci struct hda_input_mux spdif_mux; 2178c2ecf20Sopenharmony_ci unsigned int cur_smux[2]; 2188c2ecf20Sopenharmony_ci}; 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci#define AC_VERB_IDT_SET_POWER_MAP 0x7ec 2218c2ecf20Sopenharmony_ci#define AC_VERB_IDT_GET_POWER_MAP 0xfec 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cistatic const hda_nid_t stac92hd73xx_pwr_nids[8] = { 2248c2ecf20Sopenharmony_ci 0x0a, 0x0b, 0x0c, 0xd, 0x0e, 2258c2ecf20Sopenharmony_ci 0x0f, 0x10, 0x11 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistatic const hda_nid_t stac92hd83xxx_pwr_nids[7] = { 2298c2ecf20Sopenharmony_ci 0x0a, 0x0b, 0x0c, 0xd, 0x0e, 2308c2ecf20Sopenharmony_ci 0x0f, 0x10 2318c2ecf20Sopenharmony_ci}; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_cistatic const hda_nid_t stac92hd71bxx_pwr_nids[3] = { 2348c2ecf20Sopenharmony_ci 0x0a, 0x0d, 0x0f 2358c2ecf20Sopenharmony_ci}; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci/* 2398c2ecf20Sopenharmony_ci * PCM hooks 2408c2ecf20Sopenharmony_ci */ 2418c2ecf20Sopenharmony_cistatic void stac_playback_pcm_hook(struct hda_pcm_stream *hinfo, 2428c2ecf20Sopenharmony_ci struct hda_codec *codec, 2438c2ecf20Sopenharmony_ci struct snd_pcm_substream *substream, 2448c2ecf20Sopenharmony_ci int action) 2458c2ecf20Sopenharmony_ci{ 2468c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 2478c2ecf20Sopenharmony_ci if (action == HDA_GEN_PCM_ACT_OPEN && spec->stream_delay) 2488c2ecf20Sopenharmony_ci msleep(spec->stream_delay); 2498c2ecf20Sopenharmony_ci} 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistatic void stac_capture_pcm_hook(struct hda_pcm_stream *hinfo, 2528c2ecf20Sopenharmony_ci struct hda_codec *codec, 2538c2ecf20Sopenharmony_ci struct snd_pcm_substream *substream, 2548c2ecf20Sopenharmony_ci int action) 2558c2ecf20Sopenharmony_ci{ 2568c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 2578c2ecf20Sopenharmony_ci int i, idx = 0; 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci if (!spec->powerdown_adcs) 2608c2ecf20Sopenharmony_ci return; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci for (i = 0; i < spec->gen.num_all_adcs; i++) { 2638c2ecf20Sopenharmony_ci if (spec->gen.all_adcs[i] == hinfo->nid) { 2648c2ecf20Sopenharmony_ci idx = i; 2658c2ecf20Sopenharmony_ci break; 2668c2ecf20Sopenharmony_ci } 2678c2ecf20Sopenharmony_ci } 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci switch (action) { 2708c2ecf20Sopenharmony_ci case HDA_GEN_PCM_ACT_OPEN: 2718c2ecf20Sopenharmony_ci msleep(40); 2728c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, hinfo->nid, 0, 2738c2ecf20Sopenharmony_ci AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 2748c2ecf20Sopenharmony_ci spec->active_adcs |= (1 << idx); 2758c2ecf20Sopenharmony_ci break; 2768c2ecf20Sopenharmony_ci case HDA_GEN_PCM_ACT_CLOSE: 2778c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, hinfo->nid, 0, 2788c2ecf20Sopenharmony_ci AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 2798c2ecf20Sopenharmony_ci spec->active_adcs &= ~(1 << idx); 2808c2ecf20Sopenharmony_ci break; 2818c2ecf20Sopenharmony_ci } 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci/* 2858c2ecf20Sopenharmony_ci * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a 2868c2ecf20Sopenharmony_ci * funky external mute control using GPIO pins. 2878c2ecf20Sopenharmony_ci */ 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_cistatic void stac_gpio_set(struct hda_codec *codec, unsigned int mask, 2908c2ecf20Sopenharmony_ci unsigned int dir_mask, unsigned int data) 2918c2ecf20Sopenharmony_ci{ 2928c2ecf20Sopenharmony_ci unsigned int gpiostate, gpiomask, gpiodir; 2938c2ecf20Sopenharmony_ci hda_nid_t fg = codec->core.afg; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci codec_dbg(codec, "%s msk %x dir %x gpio %x\n", __func__, mask, dir_mask, data); 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci gpiostate = snd_hda_codec_read(codec, fg, 0, 2988c2ecf20Sopenharmony_ci AC_VERB_GET_GPIO_DATA, 0); 2998c2ecf20Sopenharmony_ci gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask); 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci gpiomask = snd_hda_codec_read(codec, fg, 0, 3028c2ecf20Sopenharmony_ci AC_VERB_GET_GPIO_MASK, 0); 3038c2ecf20Sopenharmony_ci gpiomask |= mask; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci gpiodir = snd_hda_codec_read(codec, fg, 0, 3068c2ecf20Sopenharmony_ci AC_VERB_GET_GPIO_DIRECTION, 0); 3078c2ecf20Sopenharmony_ci gpiodir |= dir_mask; 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci /* Configure GPIOx as CMOS */ 3108c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, fg, 0, 0x7e7, 0); 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, fg, 0, 3138c2ecf20Sopenharmony_ci AC_VERB_SET_GPIO_MASK, gpiomask); 3148c2ecf20Sopenharmony_ci snd_hda_codec_read(codec, fg, 0, 3158c2ecf20Sopenharmony_ci AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */ 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci msleep(1); 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci snd_hda_codec_read(codec, fg, 0, 3208c2ecf20Sopenharmony_ci AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ 3218c2ecf20Sopenharmony_ci} 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci/* hook for controlling mic-mute LED GPIO */ 3248c2ecf20Sopenharmony_cistatic int stac_capture_led_update(struct led_classdev *led_cdev, 3258c2ecf20Sopenharmony_ci enum led_brightness brightness) 3268c2ecf20Sopenharmony_ci{ 3278c2ecf20Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 3288c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci if (brightness) 3318c2ecf20Sopenharmony_ci spec->gpio_data |= spec->mic_mute_led_gpio; 3328c2ecf20Sopenharmony_ci else 3338c2ecf20Sopenharmony_ci spec->gpio_data &= ~spec->mic_mute_led_gpio; 3348c2ecf20Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 3358c2ecf20Sopenharmony_ci return 0; 3368c2ecf20Sopenharmony_ci} 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_cistatic int stac_vrefout_set(struct hda_codec *codec, 3398c2ecf20Sopenharmony_ci hda_nid_t nid, unsigned int new_vref) 3408c2ecf20Sopenharmony_ci{ 3418c2ecf20Sopenharmony_ci int error, pinctl; 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci codec_dbg(codec, "%s, nid %x ctl %x\n", __func__, nid, new_vref); 3448c2ecf20Sopenharmony_ci pinctl = snd_hda_codec_read(codec, nid, 0, 3458c2ecf20Sopenharmony_ci AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci if (pinctl < 0) 3488c2ecf20Sopenharmony_ci return pinctl; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci pinctl &= 0xff; 3518c2ecf20Sopenharmony_ci pinctl &= ~AC_PINCTL_VREFEN; 3528c2ecf20Sopenharmony_ci pinctl |= (new_vref & AC_PINCTL_VREFEN); 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci error = snd_hda_set_pin_ctl_cache(codec, nid, pinctl); 3558c2ecf20Sopenharmony_ci if (error < 0) 3568c2ecf20Sopenharmony_ci return error; 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci return 1; 3598c2ecf20Sopenharmony_ci} 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci/* prevent codec AFG to D3 state when vref-out pin is used for mute LED */ 3628c2ecf20Sopenharmony_ci/* this hook is set in stac_setup_gpio() */ 3638c2ecf20Sopenharmony_cistatic unsigned int stac_vref_led_power_filter(struct hda_codec *codec, 3648c2ecf20Sopenharmony_ci hda_nid_t nid, 3658c2ecf20Sopenharmony_ci unsigned int power_state) 3668c2ecf20Sopenharmony_ci{ 3678c2ecf20Sopenharmony_ci if (nid == codec->core.afg && power_state == AC_PWRST_D3) 3688c2ecf20Sopenharmony_ci return AC_PWRST_D1; 3698c2ecf20Sopenharmony_ci return snd_hda_gen_path_power_filter(codec, nid, power_state); 3708c2ecf20Sopenharmony_ci} 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci/* update mute-LED accoring to the master switch */ 3738c2ecf20Sopenharmony_cistatic void stac_update_led_status(struct hda_codec *codec, bool muted) 3748c2ecf20Sopenharmony_ci{ 3758c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci if (!spec->gpio_led) 3788c2ecf20Sopenharmony_ci return; 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_ci /* LED state is inverted on these systems */ 3818c2ecf20Sopenharmony_ci if (spec->gpio_led_polarity) 3828c2ecf20Sopenharmony_ci muted = !muted; 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci if (!spec->vref_mute_led_nid) { 3858c2ecf20Sopenharmony_ci if (muted) 3868c2ecf20Sopenharmony_ci spec->gpio_data |= spec->gpio_led; 3878c2ecf20Sopenharmony_ci else 3888c2ecf20Sopenharmony_ci spec->gpio_data &= ~spec->gpio_led; 3898c2ecf20Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, 3908c2ecf20Sopenharmony_ci spec->gpio_dir, spec->gpio_data); 3918c2ecf20Sopenharmony_ci } else { 3928c2ecf20Sopenharmony_ci spec->vref_led = muted ? AC_PINCTL_VREF_50 : AC_PINCTL_VREF_GRD; 3938c2ecf20Sopenharmony_ci stac_vrefout_set(codec, spec->vref_mute_led_nid, 3948c2ecf20Sopenharmony_ci spec->vref_led); 3958c2ecf20Sopenharmony_ci } 3968c2ecf20Sopenharmony_ci} 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci/* vmaster hook to update mute LED */ 3998c2ecf20Sopenharmony_cistatic int stac_vmaster_hook(struct led_classdev *led_cdev, 4008c2ecf20Sopenharmony_ci enum led_brightness brightness) 4018c2ecf20Sopenharmony_ci{ 4028c2ecf20Sopenharmony_ci struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci stac_update_led_status(codec, brightness); 4058c2ecf20Sopenharmony_ci return 0; 4068c2ecf20Sopenharmony_ci} 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci/* automute hook to handle GPIO mute and EAPD updates */ 4098c2ecf20Sopenharmony_cistatic void stac_update_outputs(struct hda_codec *codec) 4108c2ecf20Sopenharmony_ci{ 4118c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci if (spec->gpio_mute) 4148c2ecf20Sopenharmony_ci spec->gen.master_mute = 4158c2ecf20Sopenharmony_ci !(snd_hda_codec_read(codec, codec->core.afg, 0, 4168c2ecf20Sopenharmony_ci AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute); 4178c2ecf20Sopenharmony_ci 4188c2ecf20Sopenharmony_ci snd_hda_gen_update_outputs(codec); 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ci if (spec->eapd_mask && spec->eapd_switch) { 4218c2ecf20Sopenharmony_ci unsigned int val = spec->gpio_data; 4228c2ecf20Sopenharmony_ci if (spec->gen.speaker_muted) 4238c2ecf20Sopenharmony_ci val &= ~spec->eapd_mask; 4248c2ecf20Sopenharmony_ci else 4258c2ecf20Sopenharmony_ci val |= spec->eapd_mask; 4268c2ecf20Sopenharmony_ci if (spec->gpio_data != val) { 4278c2ecf20Sopenharmony_ci spec->gpio_data = val; 4288c2ecf20Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, 4298c2ecf20Sopenharmony_ci val); 4308c2ecf20Sopenharmony_ci } 4318c2ecf20Sopenharmony_ci } 4328c2ecf20Sopenharmony_ci} 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_cistatic void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, 4358c2ecf20Sopenharmony_ci bool enable, bool do_write) 4368c2ecf20Sopenharmony_ci{ 4378c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 4388c2ecf20Sopenharmony_ci unsigned int idx, val; 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_ci for (idx = 0; idx < spec->num_pwrs; idx++) { 4418c2ecf20Sopenharmony_ci if (spec->pwr_nids[idx] == nid) 4428c2ecf20Sopenharmony_ci break; 4438c2ecf20Sopenharmony_ci } 4448c2ecf20Sopenharmony_ci if (idx >= spec->num_pwrs) 4458c2ecf20Sopenharmony_ci return; 4468c2ecf20Sopenharmony_ci 4478c2ecf20Sopenharmony_ci idx = 1 << idx; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci val = spec->power_map_bits; 4508c2ecf20Sopenharmony_ci if (enable) 4518c2ecf20Sopenharmony_ci val &= ~idx; 4528c2ecf20Sopenharmony_ci else 4538c2ecf20Sopenharmony_ci val |= idx; 4548c2ecf20Sopenharmony_ci 4558c2ecf20Sopenharmony_ci /* power down unused output ports */ 4568c2ecf20Sopenharmony_ci if (val != spec->power_map_bits) { 4578c2ecf20Sopenharmony_ci spec->power_map_bits = val; 4588c2ecf20Sopenharmony_ci if (do_write) 4598c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 4608c2ecf20Sopenharmony_ci AC_VERB_IDT_SET_POWER_MAP, val); 4618c2ecf20Sopenharmony_ci } 4628c2ecf20Sopenharmony_ci} 4638c2ecf20Sopenharmony_ci 4648c2ecf20Sopenharmony_ci/* update power bit per jack plug/unplug */ 4658c2ecf20Sopenharmony_cistatic void jack_update_power(struct hda_codec *codec, 4668c2ecf20Sopenharmony_ci struct hda_jack_callback *jack) 4678c2ecf20Sopenharmony_ci{ 4688c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 4698c2ecf20Sopenharmony_ci int i; 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ci if (!spec->num_pwrs) 4728c2ecf20Sopenharmony_ci return; 4738c2ecf20Sopenharmony_ci 4748c2ecf20Sopenharmony_ci if (jack && jack->nid) { 4758c2ecf20Sopenharmony_ci stac_toggle_power_map(codec, jack->nid, 4768c2ecf20Sopenharmony_ci snd_hda_jack_detect(codec, jack->nid), 4778c2ecf20Sopenharmony_ci true); 4788c2ecf20Sopenharmony_ci return; 4798c2ecf20Sopenharmony_ci } 4808c2ecf20Sopenharmony_ci 4818c2ecf20Sopenharmony_ci /* update all jacks */ 4828c2ecf20Sopenharmony_ci for (i = 0; i < spec->num_pwrs; i++) { 4838c2ecf20Sopenharmony_ci hda_nid_t nid = spec->pwr_nids[i]; 4848c2ecf20Sopenharmony_ci if (!snd_hda_jack_tbl_get(codec, nid)) 4858c2ecf20Sopenharmony_ci continue; 4868c2ecf20Sopenharmony_ci stac_toggle_power_map(codec, nid, 4878c2ecf20Sopenharmony_ci snd_hda_jack_detect(codec, nid), 4888c2ecf20Sopenharmony_ci false); 4898c2ecf20Sopenharmony_ci } 4908c2ecf20Sopenharmony_ci 4918c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 4928c2ecf20Sopenharmony_ci AC_VERB_IDT_SET_POWER_MAP, 4938c2ecf20Sopenharmony_ci spec->power_map_bits); 4948c2ecf20Sopenharmony_ci} 4958c2ecf20Sopenharmony_ci 4968c2ecf20Sopenharmony_cistatic void stac_vref_event(struct hda_codec *codec, 4978c2ecf20Sopenharmony_ci struct hda_jack_callback *event) 4988c2ecf20Sopenharmony_ci{ 4998c2ecf20Sopenharmony_ci unsigned int data; 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_ci data = snd_hda_codec_read(codec, codec->core.afg, 0, 5028c2ecf20Sopenharmony_ci AC_VERB_GET_GPIO_DATA, 0); 5038c2ecf20Sopenharmony_ci /* toggle VREF state based on GPIOx status */ 5048c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 0x7e0, 5058c2ecf20Sopenharmony_ci !!(data & (1 << event->private_data))); 5068c2ecf20Sopenharmony_ci} 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci/* initialize the power map and enable the power event to jacks that 5098c2ecf20Sopenharmony_ci * haven't been assigned to automute 5108c2ecf20Sopenharmony_ci */ 5118c2ecf20Sopenharmony_cistatic void stac_init_power_map(struct hda_codec *codec) 5128c2ecf20Sopenharmony_ci{ 5138c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 5148c2ecf20Sopenharmony_ci int i; 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_ci for (i = 0; i < spec->num_pwrs; i++) { 5178c2ecf20Sopenharmony_ci hda_nid_t nid = spec->pwr_nids[i]; 5188c2ecf20Sopenharmony_ci unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); 5198c2ecf20Sopenharmony_ci def_conf = get_defcfg_connect(def_conf); 5208c2ecf20Sopenharmony_ci if (def_conf == AC_JACK_PORT_COMPLEX && 5218c2ecf20Sopenharmony_ci spec->vref_mute_led_nid != nid && 5228c2ecf20Sopenharmony_ci is_jack_detectable(codec, nid)) { 5238c2ecf20Sopenharmony_ci snd_hda_jack_detect_enable_callback(codec, nid, 5248c2ecf20Sopenharmony_ci jack_update_power); 5258c2ecf20Sopenharmony_ci } else { 5268c2ecf20Sopenharmony_ci if (def_conf == AC_JACK_PORT_NONE) 5278c2ecf20Sopenharmony_ci stac_toggle_power_map(codec, nid, false, false); 5288c2ecf20Sopenharmony_ci else 5298c2ecf20Sopenharmony_ci stac_toggle_power_map(codec, nid, true, false); 5308c2ecf20Sopenharmony_ci } 5318c2ecf20Sopenharmony_ci } 5328c2ecf20Sopenharmony_ci} 5338c2ecf20Sopenharmony_ci 5348c2ecf20Sopenharmony_ci/* 5358c2ecf20Sopenharmony_ci */ 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_cistatic inline bool get_int_hint(struct hda_codec *codec, const char *key, 5388c2ecf20Sopenharmony_ci int *valp) 5398c2ecf20Sopenharmony_ci{ 5408c2ecf20Sopenharmony_ci return !snd_hda_get_int_hint(codec, key, valp); 5418c2ecf20Sopenharmony_ci} 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_ci/* override some hints from the hwdep entry */ 5448c2ecf20Sopenharmony_cistatic void stac_store_hints(struct hda_codec *codec) 5458c2ecf20Sopenharmony_ci{ 5468c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 5478c2ecf20Sopenharmony_ci int val; 5488c2ecf20Sopenharmony_ci 5498c2ecf20Sopenharmony_ci if (get_int_hint(codec, "gpio_mask", &spec->gpio_mask)) { 5508c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_dir = spec->gpio_data = 5518c2ecf20Sopenharmony_ci spec->gpio_mask; 5528c2ecf20Sopenharmony_ci } 5538c2ecf20Sopenharmony_ci if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir)) 5548c2ecf20Sopenharmony_ci spec->gpio_dir &= spec->gpio_mask; 5558c2ecf20Sopenharmony_ci if (get_int_hint(codec, "gpio_data", &spec->gpio_data)) 5568c2ecf20Sopenharmony_ci spec->gpio_data &= spec->gpio_mask; 5578c2ecf20Sopenharmony_ci if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask)) 5588c2ecf20Sopenharmony_ci spec->eapd_mask &= spec->gpio_mask; 5598c2ecf20Sopenharmony_ci if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute)) 5608c2ecf20Sopenharmony_ci spec->gpio_mute &= spec->gpio_mask; 5618c2ecf20Sopenharmony_ci val = snd_hda_get_bool_hint(codec, "eapd_switch"); 5628c2ecf20Sopenharmony_ci if (val >= 0) 5638c2ecf20Sopenharmony_ci spec->eapd_switch = val; 5648c2ecf20Sopenharmony_ci} 5658c2ecf20Sopenharmony_ci 5668c2ecf20Sopenharmony_ci/* 5678c2ecf20Sopenharmony_ci * loopback controls 5688c2ecf20Sopenharmony_ci */ 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci#define stac_aloopback_info snd_ctl_boolean_mono_info 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_cistatic int stac_aloopback_get(struct snd_kcontrol *kcontrol, 5738c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 5748c2ecf20Sopenharmony_ci{ 5758c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 5768c2ecf20Sopenharmony_ci unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 5778c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci ucontrol->value.integer.value[0] = !!(spec->aloopback & 5808c2ecf20Sopenharmony_ci (spec->aloopback_mask << idx)); 5818c2ecf20Sopenharmony_ci return 0; 5828c2ecf20Sopenharmony_ci} 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_cistatic int stac_aloopback_put(struct snd_kcontrol *kcontrol, 5858c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 5868c2ecf20Sopenharmony_ci{ 5878c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 5888c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 5898c2ecf20Sopenharmony_ci unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 5908c2ecf20Sopenharmony_ci unsigned int dac_mode; 5918c2ecf20Sopenharmony_ci unsigned int val, idx_val; 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_ci idx_val = spec->aloopback_mask << idx; 5948c2ecf20Sopenharmony_ci if (ucontrol->value.integer.value[0]) 5958c2ecf20Sopenharmony_ci val = spec->aloopback | idx_val; 5968c2ecf20Sopenharmony_ci else 5978c2ecf20Sopenharmony_ci val = spec->aloopback & ~idx_val; 5988c2ecf20Sopenharmony_ci if (spec->aloopback == val) 5998c2ecf20Sopenharmony_ci return 0; 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_ci spec->aloopback = val; 6028c2ecf20Sopenharmony_ci 6038c2ecf20Sopenharmony_ci /* Only return the bits defined by the shift value of the 6048c2ecf20Sopenharmony_ci * first two bytes of the mask 6058c2ecf20Sopenharmony_ci */ 6068c2ecf20Sopenharmony_ci dac_mode = snd_hda_codec_read(codec, codec->core.afg, 0, 6078c2ecf20Sopenharmony_ci kcontrol->private_value & 0xFFFF, 0x0); 6088c2ecf20Sopenharmony_ci dac_mode >>= spec->aloopback_shift; 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_ci if (spec->aloopback & idx_val) { 6118c2ecf20Sopenharmony_ci snd_hda_power_up(codec); 6128c2ecf20Sopenharmony_ci dac_mode |= idx_val; 6138c2ecf20Sopenharmony_ci } else { 6148c2ecf20Sopenharmony_ci snd_hda_power_down(codec); 6158c2ecf20Sopenharmony_ci dac_mode &= ~idx_val; 6168c2ecf20Sopenharmony_ci } 6178c2ecf20Sopenharmony_ci 6188c2ecf20Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 6198c2ecf20Sopenharmony_ci kcontrol->private_value >> 16, dac_mode); 6208c2ecf20Sopenharmony_ci 6218c2ecf20Sopenharmony_ci return 1; 6228c2ecf20Sopenharmony_ci} 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_ci#define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \ 6258c2ecf20Sopenharmony_ci { \ 6268c2ecf20Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 6278c2ecf20Sopenharmony_ci .name = "Analog Loopback", \ 6288c2ecf20Sopenharmony_ci .count = cnt, \ 6298c2ecf20Sopenharmony_ci .info = stac_aloopback_info, \ 6308c2ecf20Sopenharmony_ci .get = stac_aloopback_get, \ 6318c2ecf20Sopenharmony_ci .put = stac_aloopback_put, \ 6328c2ecf20Sopenharmony_ci .private_value = verb_read | (verb_write << 16), \ 6338c2ecf20Sopenharmony_ci } 6348c2ecf20Sopenharmony_ci 6358c2ecf20Sopenharmony_ci/* 6368c2ecf20Sopenharmony_ci * Mute LED handling on HP laptops 6378c2ecf20Sopenharmony_ci */ 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_ci/* check whether it's a HP laptop with a docking port */ 6408c2ecf20Sopenharmony_cistatic bool hp_bnb2011_with_dock(struct hda_codec *codec) 6418c2ecf20Sopenharmony_ci{ 6428c2ecf20Sopenharmony_ci if (codec->core.vendor_id != 0x111d7605 && 6438c2ecf20Sopenharmony_ci codec->core.vendor_id != 0x111d76d1) 6448c2ecf20Sopenharmony_ci return false; 6458c2ecf20Sopenharmony_ci 6468c2ecf20Sopenharmony_ci switch (codec->core.subsystem_id) { 6478c2ecf20Sopenharmony_ci case 0x103c1618: 6488c2ecf20Sopenharmony_ci case 0x103c1619: 6498c2ecf20Sopenharmony_ci case 0x103c161a: 6508c2ecf20Sopenharmony_ci case 0x103c161b: 6518c2ecf20Sopenharmony_ci case 0x103c161c: 6528c2ecf20Sopenharmony_ci case 0x103c161d: 6538c2ecf20Sopenharmony_ci case 0x103c161e: 6548c2ecf20Sopenharmony_ci case 0x103c161f: 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci case 0x103c162a: 6578c2ecf20Sopenharmony_ci case 0x103c162b: 6588c2ecf20Sopenharmony_ci 6598c2ecf20Sopenharmony_ci case 0x103c1630: 6608c2ecf20Sopenharmony_ci case 0x103c1631: 6618c2ecf20Sopenharmony_ci 6628c2ecf20Sopenharmony_ci case 0x103c1633: 6638c2ecf20Sopenharmony_ci case 0x103c1634: 6648c2ecf20Sopenharmony_ci case 0x103c1635: 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_ci case 0x103c3587: 6678c2ecf20Sopenharmony_ci case 0x103c3588: 6688c2ecf20Sopenharmony_ci case 0x103c3589: 6698c2ecf20Sopenharmony_ci case 0x103c358a: 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_ci case 0x103c3667: 6728c2ecf20Sopenharmony_ci case 0x103c3668: 6738c2ecf20Sopenharmony_ci case 0x103c3669: 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_ci return true; 6768c2ecf20Sopenharmony_ci } 6778c2ecf20Sopenharmony_ci return false; 6788c2ecf20Sopenharmony_ci} 6798c2ecf20Sopenharmony_ci 6808c2ecf20Sopenharmony_cistatic bool hp_blike_system(u32 subsystem_id) 6818c2ecf20Sopenharmony_ci{ 6828c2ecf20Sopenharmony_ci switch (subsystem_id) { 6838c2ecf20Sopenharmony_ci case 0x103c1473: /* HP ProBook 6550b */ 6848c2ecf20Sopenharmony_ci case 0x103c1520: 6858c2ecf20Sopenharmony_ci case 0x103c1521: 6868c2ecf20Sopenharmony_ci case 0x103c1523: 6878c2ecf20Sopenharmony_ci case 0x103c1524: 6888c2ecf20Sopenharmony_ci case 0x103c1525: 6898c2ecf20Sopenharmony_ci case 0x103c1722: 6908c2ecf20Sopenharmony_ci case 0x103c1723: 6918c2ecf20Sopenharmony_ci case 0x103c1724: 6928c2ecf20Sopenharmony_ci case 0x103c1725: 6938c2ecf20Sopenharmony_ci case 0x103c1726: 6948c2ecf20Sopenharmony_ci case 0x103c1727: 6958c2ecf20Sopenharmony_ci case 0x103c1728: 6968c2ecf20Sopenharmony_ci case 0x103c1729: 6978c2ecf20Sopenharmony_ci case 0x103c172a: 6988c2ecf20Sopenharmony_ci case 0x103c172b: 6998c2ecf20Sopenharmony_ci case 0x103c307e: 7008c2ecf20Sopenharmony_ci case 0x103c307f: 7018c2ecf20Sopenharmony_ci case 0x103c3080: 7028c2ecf20Sopenharmony_ci case 0x103c3081: 7038c2ecf20Sopenharmony_ci case 0x103c7007: 7048c2ecf20Sopenharmony_ci case 0x103c7008: 7058c2ecf20Sopenharmony_ci return true; 7068c2ecf20Sopenharmony_ci } 7078c2ecf20Sopenharmony_ci return false; 7088c2ecf20Sopenharmony_ci} 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_cistatic void set_hp_led_gpio(struct hda_codec *codec) 7118c2ecf20Sopenharmony_ci{ 7128c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 7138c2ecf20Sopenharmony_ci unsigned int gpio; 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci if (spec->gpio_led) 7168c2ecf20Sopenharmony_ci return; 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci gpio = snd_hda_param_read(codec, codec->core.afg, AC_PAR_GPIO_CAP); 7198c2ecf20Sopenharmony_ci gpio &= AC_GPIO_IO_COUNT; 7208c2ecf20Sopenharmony_ci if (gpio > 3) 7218c2ecf20Sopenharmony_ci spec->gpio_led = 0x08; /* GPIO 3 */ 7228c2ecf20Sopenharmony_ci else 7238c2ecf20Sopenharmony_ci spec->gpio_led = 0x01; /* GPIO 0 */ 7248c2ecf20Sopenharmony_ci} 7258c2ecf20Sopenharmony_ci 7268c2ecf20Sopenharmony_ci/* 7278c2ecf20Sopenharmony_ci * This method searches for the mute LED GPIO configuration 7288c2ecf20Sopenharmony_ci * provided as OEM string in SMBIOS. The format of that string 7298c2ecf20Sopenharmony_ci * is HP_Mute_LED_P_G or HP_Mute_LED_P 7308c2ecf20Sopenharmony_ci * where P can be 0 or 1 and defines mute LED GPIO control state (low/high) 7318c2ecf20Sopenharmony_ci * that corresponds to the NOT muted state of the master volume 7328c2ecf20Sopenharmony_ci * and G is the index of the GPIO to use as the mute LED control (0..9) 7338c2ecf20Sopenharmony_ci * If _G portion is missing it is assigned based on the codec ID 7348c2ecf20Sopenharmony_ci * 7358c2ecf20Sopenharmony_ci * So, HP B-series like systems may have HP_Mute_LED_0 (current models) 7368c2ecf20Sopenharmony_ci * or HP_Mute_LED_0_3 (future models) OEM SMBIOS strings 7378c2ecf20Sopenharmony_ci * 7388c2ecf20Sopenharmony_ci * 7398c2ecf20Sopenharmony_ci * The dv-series laptops don't seem to have the HP_Mute_LED* strings in 7408c2ecf20Sopenharmony_ci * SMBIOS - at least the ones I have seen do not have them - which include 7418c2ecf20Sopenharmony_ci * my own system (HP Pavilion dv6-1110ax) and my cousin's 7428c2ecf20Sopenharmony_ci * HP Pavilion dv9500t CTO. 7438c2ecf20Sopenharmony_ci * Need more information on whether it is true across the entire series. 7448c2ecf20Sopenharmony_ci * -- kunal 7458c2ecf20Sopenharmony_ci */ 7468c2ecf20Sopenharmony_cistatic int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) 7478c2ecf20Sopenharmony_ci{ 7488c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 7498c2ecf20Sopenharmony_ci const struct dmi_device *dev = NULL; 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_ci if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) { 7528c2ecf20Sopenharmony_ci get_int_hint(codec, "gpio_led_polarity", 7538c2ecf20Sopenharmony_ci &spec->gpio_led_polarity); 7548c2ecf20Sopenharmony_ci return 1; 7558c2ecf20Sopenharmony_ci } 7568c2ecf20Sopenharmony_ci 7578c2ecf20Sopenharmony_ci while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) { 7588c2ecf20Sopenharmony_ci if (sscanf(dev->name, "HP_Mute_LED_%u_%x", 7598c2ecf20Sopenharmony_ci &spec->gpio_led_polarity, 7608c2ecf20Sopenharmony_ci &spec->gpio_led) == 2) { 7618c2ecf20Sopenharmony_ci unsigned int max_gpio; 7628c2ecf20Sopenharmony_ci max_gpio = snd_hda_param_read(codec, codec->core.afg, 7638c2ecf20Sopenharmony_ci AC_PAR_GPIO_CAP); 7648c2ecf20Sopenharmony_ci max_gpio &= AC_GPIO_IO_COUNT; 7658c2ecf20Sopenharmony_ci if (spec->gpio_led < max_gpio) 7668c2ecf20Sopenharmony_ci spec->gpio_led = 1 << spec->gpio_led; 7678c2ecf20Sopenharmony_ci else 7688c2ecf20Sopenharmony_ci spec->vref_mute_led_nid = spec->gpio_led; 7698c2ecf20Sopenharmony_ci return 1; 7708c2ecf20Sopenharmony_ci } 7718c2ecf20Sopenharmony_ci if (sscanf(dev->name, "HP_Mute_LED_%u", 7728c2ecf20Sopenharmony_ci &spec->gpio_led_polarity) == 1) { 7738c2ecf20Sopenharmony_ci set_hp_led_gpio(codec); 7748c2ecf20Sopenharmony_ci return 1; 7758c2ecf20Sopenharmony_ci } 7768c2ecf20Sopenharmony_ci /* BIOS bug: unfilled OEM string */ 7778c2ecf20Sopenharmony_ci if (strstr(dev->name, "HP_Mute_LED_P_G")) { 7788c2ecf20Sopenharmony_ci set_hp_led_gpio(codec); 7798c2ecf20Sopenharmony_ci if (default_polarity >= 0) 7808c2ecf20Sopenharmony_ci spec->gpio_led_polarity = default_polarity; 7818c2ecf20Sopenharmony_ci else 7828c2ecf20Sopenharmony_ci spec->gpio_led_polarity = 1; 7838c2ecf20Sopenharmony_ci return 1; 7848c2ecf20Sopenharmony_ci } 7858c2ecf20Sopenharmony_ci } 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_ci /* 7888c2ecf20Sopenharmony_ci * Fallback case - if we don't find the DMI strings, 7898c2ecf20Sopenharmony_ci * we statically set the GPIO - if not a B-series system 7908c2ecf20Sopenharmony_ci * and default polarity is provided 7918c2ecf20Sopenharmony_ci */ 7928c2ecf20Sopenharmony_ci if (!hp_blike_system(codec->core.subsystem_id) && 7938c2ecf20Sopenharmony_ci (default_polarity == 0 || default_polarity == 1)) { 7948c2ecf20Sopenharmony_ci set_hp_led_gpio(codec); 7958c2ecf20Sopenharmony_ci spec->gpio_led_polarity = default_polarity; 7968c2ecf20Sopenharmony_ci return 1; 7978c2ecf20Sopenharmony_ci } 7988c2ecf20Sopenharmony_ci return 0; 7998c2ecf20Sopenharmony_ci} 8008c2ecf20Sopenharmony_ci 8018c2ecf20Sopenharmony_ci/* check whether a built-in speaker is included in parsed pins */ 8028c2ecf20Sopenharmony_cistatic bool has_builtin_speaker(struct hda_codec *codec) 8038c2ecf20Sopenharmony_ci{ 8048c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 8058c2ecf20Sopenharmony_ci const hda_nid_t *nid_pin; 8068c2ecf20Sopenharmony_ci int nids, i; 8078c2ecf20Sopenharmony_ci 8088c2ecf20Sopenharmony_ci if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) { 8098c2ecf20Sopenharmony_ci nid_pin = spec->gen.autocfg.line_out_pins; 8108c2ecf20Sopenharmony_ci nids = spec->gen.autocfg.line_outs; 8118c2ecf20Sopenharmony_ci } else { 8128c2ecf20Sopenharmony_ci nid_pin = spec->gen.autocfg.speaker_pins; 8138c2ecf20Sopenharmony_ci nids = spec->gen.autocfg.speaker_outs; 8148c2ecf20Sopenharmony_ci } 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci for (i = 0; i < nids; i++) { 8178c2ecf20Sopenharmony_ci unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]); 8188c2ecf20Sopenharmony_ci if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT) 8198c2ecf20Sopenharmony_ci return true; 8208c2ecf20Sopenharmony_ci } 8218c2ecf20Sopenharmony_ci return false; 8228c2ecf20Sopenharmony_ci} 8238c2ecf20Sopenharmony_ci 8248c2ecf20Sopenharmony_ci/* 8258c2ecf20Sopenharmony_ci * PC beep controls 8268c2ecf20Sopenharmony_ci */ 8278c2ecf20Sopenharmony_ci 8288c2ecf20Sopenharmony_ci/* create PC beep volume controls */ 8298c2ecf20Sopenharmony_cistatic int stac_auto_create_beep_ctls(struct hda_codec *codec, 8308c2ecf20Sopenharmony_ci hda_nid_t nid) 8318c2ecf20Sopenharmony_ci{ 8328c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 8338c2ecf20Sopenharmony_ci u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT); 8348c2ecf20Sopenharmony_ci struct snd_kcontrol_new *knew; 8358c2ecf20Sopenharmony_ci static const struct snd_kcontrol_new abeep_mute_ctl = 8368c2ecf20Sopenharmony_ci HDA_CODEC_MUTE(NULL, 0, 0, 0); 8378c2ecf20Sopenharmony_ci static const struct snd_kcontrol_new dbeep_mute_ctl = 8388c2ecf20Sopenharmony_ci HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0); 8398c2ecf20Sopenharmony_ci static const struct snd_kcontrol_new beep_vol_ctl = 8408c2ecf20Sopenharmony_ci HDA_CODEC_VOLUME(NULL, 0, 0, 0); 8418c2ecf20Sopenharmony_ci 8428c2ecf20Sopenharmony_ci /* check for mute support for the amp */ 8438c2ecf20Sopenharmony_ci if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) { 8448c2ecf20Sopenharmony_ci const struct snd_kcontrol_new *temp; 8458c2ecf20Sopenharmony_ci if (spec->anabeep_nid == nid) 8468c2ecf20Sopenharmony_ci temp = &abeep_mute_ctl; 8478c2ecf20Sopenharmony_ci else 8488c2ecf20Sopenharmony_ci temp = &dbeep_mute_ctl; 8498c2ecf20Sopenharmony_ci knew = snd_hda_gen_add_kctl(&spec->gen, 8508c2ecf20Sopenharmony_ci "Beep Playback Switch", temp); 8518c2ecf20Sopenharmony_ci if (!knew) 8528c2ecf20Sopenharmony_ci return -ENOMEM; 8538c2ecf20Sopenharmony_ci knew->private_value = 8548c2ecf20Sopenharmony_ci HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT); 8558c2ecf20Sopenharmony_ci } 8568c2ecf20Sopenharmony_ci 8578c2ecf20Sopenharmony_ci /* check to see if there is volume support for the amp */ 8588c2ecf20Sopenharmony_ci if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) { 8598c2ecf20Sopenharmony_ci knew = snd_hda_gen_add_kctl(&spec->gen, 8608c2ecf20Sopenharmony_ci "Beep Playback Volume", 8618c2ecf20Sopenharmony_ci &beep_vol_ctl); 8628c2ecf20Sopenharmony_ci if (!knew) 8638c2ecf20Sopenharmony_ci return -ENOMEM; 8648c2ecf20Sopenharmony_ci knew->private_value = 8658c2ecf20Sopenharmony_ci HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT); 8668c2ecf20Sopenharmony_ci } 8678c2ecf20Sopenharmony_ci return 0; 8688c2ecf20Sopenharmony_ci} 8698c2ecf20Sopenharmony_ci 8708c2ecf20Sopenharmony_ci#ifdef CONFIG_SND_HDA_INPUT_BEEP 8718c2ecf20Sopenharmony_ci#define stac_dig_beep_switch_info snd_ctl_boolean_mono_info 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_cistatic int stac_dig_beep_switch_get(struct snd_kcontrol *kcontrol, 8748c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 8758c2ecf20Sopenharmony_ci{ 8768c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 8778c2ecf20Sopenharmony_ci ucontrol->value.integer.value[0] = codec->beep->enabled; 8788c2ecf20Sopenharmony_ci return 0; 8798c2ecf20Sopenharmony_ci} 8808c2ecf20Sopenharmony_ci 8818c2ecf20Sopenharmony_cistatic int stac_dig_beep_switch_put(struct snd_kcontrol *kcontrol, 8828c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 8838c2ecf20Sopenharmony_ci{ 8848c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 8858c2ecf20Sopenharmony_ci return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]); 8868c2ecf20Sopenharmony_ci} 8878c2ecf20Sopenharmony_ci 8888c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac_dig_beep_ctrl = { 8898c2ecf20Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 8908c2ecf20Sopenharmony_ci .name = "Beep Playback Switch", 8918c2ecf20Sopenharmony_ci .info = stac_dig_beep_switch_info, 8928c2ecf20Sopenharmony_ci .get = stac_dig_beep_switch_get, 8938c2ecf20Sopenharmony_ci .put = stac_dig_beep_switch_put, 8948c2ecf20Sopenharmony_ci}; 8958c2ecf20Sopenharmony_ci 8968c2ecf20Sopenharmony_cistatic int stac_beep_switch_ctl(struct hda_codec *codec) 8978c2ecf20Sopenharmony_ci{ 8988c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 8998c2ecf20Sopenharmony_ci 9008c2ecf20Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &stac_dig_beep_ctrl)) 9018c2ecf20Sopenharmony_ci return -ENOMEM; 9028c2ecf20Sopenharmony_ci return 0; 9038c2ecf20Sopenharmony_ci} 9048c2ecf20Sopenharmony_ci#endif 9058c2ecf20Sopenharmony_ci 9068c2ecf20Sopenharmony_ci/* 9078c2ecf20Sopenharmony_ci * SPDIF-out mux controls 9088c2ecf20Sopenharmony_ci */ 9098c2ecf20Sopenharmony_ci 9108c2ecf20Sopenharmony_cistatic int stac_smux_enum_info(struct snd_kcontrol *kcontrol, 9118c2ecf20Sopenharmony_ci struct snd_ctl_elem_info *uinfo) 9128c2ecf20Sopenharmony_ci{ 9138c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9148c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 9158c2ecf20Sopenharmony_ci return snd_hda_input_mux_info(&spec->spdif_mux, uinfo); 9168c2ecf20Sopenharmony_ci} 9178c2ecf20Sopenharmony_ci 9188c2ecf20Sopenharmony_cistatic int stac_smux_enum_get(struct snd_kcontrol *kcontrol, 9198c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 9208c2ecf20Sopenharmony_ci{ 9218c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9228c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 9238c2ecf20Sopenharmony_ci unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 9248c2ecf20Sopenharmony_ci 9258c2ecf20Sopenharmony_ci ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx]; 9268c2ecf20Sopenharmony_ci return 0; 9278c2ecf20Sopenharmony_ci} 9288c2ecf20Sopenharmony_ci 9298c2ecf20Sopenharmony_cistatic int stac_smux_enum_put(struct snd_kcontrol *kcontrol, 9308c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 9318c2ecf20Sopenharmony_ci{ 9328c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9338c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 9348c2ecf20Sopenharmony_ci unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 9358c2ecf20Sopenharmony_ci 9368c2ecf20Sopenharmony_ci return snd_hda_input_mux_put(codec, &spec->spdif_mux, ucontrol, 9378c2ecf20Sopenharmony_ci spec->gen.autocfg.dig_out_pins[smux_idx], 9388c2ecf20Sopenharmony_ci &spec->cur_smux[smux_idx]); 9398c2ecf20Sopenharmony_ci} 9408c2ecf20Sopenharmony_ci 9418c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac_smux_mixer = { 9428c2ecf20Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9438c2ecf20Sopenharmony_ci .name = "IEC958 Playback Source", 9448c2ecf20Sopenharmony_ci /* count set later */ 9458c2ecf20Sopenharmony_ci .info = stac_smux_enum_info, 9468c2ecf20Sopenharmony_ci .get = stac_smux_enum_get, 9478c2ecf20Sopenharmony_ci .put = stac_smux_enum_put, 9488c2ecf20Sopenharmony_ci}; 9498c2ecf20Sopenharmony_ci 9508c2ecf20Sopenharmony_cistatic const char * const stac_spdif_labels[] = { 9518c2ecf20Sopenharmony_ci "Digital Playback", "Analog Mux 1", "Analog Mux 2", NULL 9528c2ecf20Sopenharmony_ci}; 9538c2ecf20Sopenharmony_ci 9548c2ecf20Sopenharmony_cistatic int stac_create_spdif_mux_ctls(struct hda_codec *codec) 9558c2ecf20Sopenharmony_ci{ 9568c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 9578c2ecf20Sopenharmony_ci struct auto_pin_cfg *cfg = &spec->gen.autocfg; 9588c2ecf20Sopenharmony_ci const char * const *labels = spec->spdif_labels; 9598c2ecf20Sopenharmony_ci struct snd_kcontrol_new *kctl; 9608c2ecf20Sopenharmony_ci int i, num_cons; 9618c2ecf20Sopenharmony_ci 9628c2ecf20Sopenharmony_ci if (cfg->dig_outs < 1) 9638c2ecf20Sopenharmony_ci return 0; 9648c2ecf20Sopenharmony_ci 9658c2ecf20Sopenharmony_ci num_cons = snd_hda_get_num_conns(codec, cfg->dig_out_pins[0]); 9668c2ecf20Sopenharmony_ci if (num_cons <= 1) 9678c2ecf20Sopenharmony_ci return 0; 9688c2ecf20Sopenharmony_ci 9698c2ecf20Sopenharmony_ci if (!labels) 9708c2ecf20Sopenharmony_ci labels = stac_spdif_labels; 9718c2ecf20Sopenharmony_ci for (i = 0; i < num_cons; i++) { 9728c2ecf20Sopenharmony_ci if (snd_BUG_ON(!labels[i])) 9738c2ecf20Sopenharmony_ci return -EINVAL; 9748c2ecf20Sopenharmony_ci snd_hda_add_imux_item(codec, &spec->spdif_mux, labels[i], i, NULL); 9758c2ecf20Sopenharmony_ci } 9768c2ecf20Sopenharmony_ci 9778c2ecf20Sopenharmony_ci kctl = snd_hda_gen_add_kctl(&spec->gen, NULL, &stac_smux_mixer); 9788c2ecf20Sopenharmony_ci if (!kctl) 9798c2ecf20Sopenharmony_ci return -ENOMEM; 9808c2ecf20Sopenharmony_ci kctl->count = cfg->dig_outs; 9818c2ecf20Sopenharmony_ci 9828c2ecf20Sopenharmony_ci return 0; 9838c2ecf20Sopenharmony_ci} 9848c2ecf20Sopenharmony_ci 9858c2ecf20Sopenharmony_cistatic const struct hda_verb stac9200_eapd_init[] = { 9868c2ecf20Sopenharmony_ci /* set dac0mux for dac converter */ 9878c2ecf20Sopenharmony_ci {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 9888c2ecf20Sopenharmony_ci {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 9898c2ecf20Sopenharmony_ci {} 9908c2ecf20Sopenharmony_ci}; 9918c2ecf20Sopenharmony_ci 9928c2ecf20Sopenharmony_cistatic const struct hda_verb dell_eq_core_init[] = { 9938c2ecf20Sopenharmony_ci /* set master volume to max value without distortion 9948c2ecf20Sopenharmony_ci * and direct control */ 9958c2ecf20Sopenharmony_ci { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, 9968c2ecf20Sopenharmony_ci {} 9978c2ecf20Sopenharmony_ci}; 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_cistatic const struct hda_verb stac92hd73xx_core_init[] = { 10008c2ecf20Sopenharmony_ci /* set master volume and direct control */ 10018c2ecf20Sopenharmony_ci { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 10028c2ecf20Sopenharmony_ci {} 10038c2ecf20Sopenharmony_ci}; 10048c2ecf20Sopenharmony_ci 10058c2ecf20Sopenharmony_cistatic const struct hda_verb stac92hd83xxx_core_init[] = { 10068c2ecf20Sopenharmony_ci /* power state controls amps */ 10078c2ecf20Sopenharmony_ci { 0x01, AC_VERB_SET_EAPD, 1 << 2}, 10088c2ecf20Sopenharmony_ci {} 10098c2ecf20Sopenharmony_ci}; 10108c2ecf20Sopenharmony_ci 10118c2ecf20Sopenharmony_cistatic const struct hda_verb stac92hd83xxx_hp_zephyr_init[] = { 10128c2ecf20Sopenharmony_ci { 0x22, 0x785, 0x43 }, 10138c2ecf20Sopenharmony_ci { 0x22, 0x782, 0xe0 }, 10148c2ecf20Sopenharmony_ci { 0x22, 0x795, 0x00 }, 10158c2ecf20Sopenharmony_ci {} 10168c2ecf20Sopenharmony_ci}; 10178c2ecf20Sopenharmony_ci 10188c2ecf20Sopenharmony_cistatic const struct hda_verb stac92hd71bxx_core_init[] = { 10198c2ecf20Sopenharmony_ci /* set master volume and direct control */ 10208c2ecf20Sopenharmony_ci { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 10218c2ecf20Sopenharmony_ci {} 10228c2ecf20Sopenharmony_ci}; 10238c2ecf20Sopenharmony_ci 10248c2ecf20Sopenharmony_cistatic const hda_nid_t stac92hd71bxx_unmute_nids[] = { 10258c2ecf20Sopenharmony_ci /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */ 10268c2ecf20Sopenharmony_ci 0x0f, 0x0a, 0x0d, 0 10278c2ecf20Sopenharmony_ci}; 10288c2ecf20Sopenharmony_ci 10298c2ecf20Sopenharmony_cistatic const struct hda_verb stac925x_core_init[] = { 10308c2ecf20Sopenharmony_ci /* set dac0mux for dac converter */ 10318c2ecf20Sopenharmony_ci { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00}, 10328c2ecf20Sopenharmony_ci /* mute the master volume */ 10338c2ecf20Sopenharmony_ci { 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 10348c2ecf20Sopenharmony_ci {} 10358c2ecf20Sopenharmony_ci}; 10368c2ecf20Sopenharmony_ci 10378c2ecf20Sopenharmony_cistatic const struct hda_verb stac922x_core_init[] = { 10388c2ecf20Sopenharmony_ci /* set master volume and direct control */ 10398c2ecf20Sopenharmony_ci { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 10408c2ecf20Sopenharmony_ci {} 10418c2ecf20Sopenharmony_ci}; 10428c2ecf20Sopenharmony_ci 10438c2ecf20Sopenharmony_cistatic const struct hda_verb d965_core_init[] = { 10448c2ecf20Sopenharmony_ci /* unmute node 0x1b */ 10458c2ecf20Sopenharmony_ci { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 10468c2ecf20Sopenharmony_ci /* select node 0x03 as DAC */ 10478c2ecf20Sopenharmony_ci { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01}, 10488c2ecf20Sopenharmony_ci {} 10498c2ecf20Sopenharmony_ci}; 10508c2ecf20Sopenharmony_ci 10518c2ecf20Sopenharmony_cistatic const struct hda_verb dell_3st_core_init[] = { 10528c2ecf20Sopenharmony_ci /* don't set delta bit */ 10538c2ecf20Sopenharmony_ci {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f}, 10548c2ecf20Sopenharmony_ci /* unmute node 0x1b */ 10558c2ecf20Sopenharmony_ci {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 10568c2ecf20Sopenharmony_ci /* select node 0x03 as DAC */ 10578c2ecf20Sopenharmony_ci {0x0b, AC_VERB_SET_CONNECT_SEL, 0x01}, 10588c2ecf20Sopenharmony_ci {} 10598c2ecf20Sopenharmony_ci}; 10608c2ecf20Sopenharmony_ci 10618c2ecf20Sopenharmony_cistatic const struct hda_verb stac927x_core_init[] = { 10628c2ecf20Sopenharmony_ci /* set master volume and direct control */ 10638c2ecf20Sopenharmony_ci { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 10648c2ecf20Sopenharmony_ci /* enable analog pc beep path */ 10658c2ecf20Sopenharmony_ci { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, 10668c2ecf20Sopenharmony_ci {} 10678c2ecf20Sopenharmony_ci}; 10688c2ecf20Sopenharmony_ci 10698c2ecf20Sopenharmony_cistatic const struct hda_verb stac927x_volknob_core_init[] = { 10708c2ecf20Sopenharmony_ci /* don't set delta bit */ 10718c2ecf20Sopenharmony_ci {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f}, 10728c2ecf20Sopenharmony_ci /* enable analog pc beep path */ 10738c2ecf20Sopenharmony_ci {0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, 10748c2ecf20Sopenharmony_ci {} 10758c2ecf20Sopenharmony_ci}; 10768c2ecf20Sopenharmony_ci 10778c2ecf20Sopenharmony_cistatic const struct hda_verb stac9205_core_init[] = { 10788c2ecf20Sopenharmony_ci /* set master volume and direct control */ 10798c2ecf20Sopenharmony_ci { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, 10808c2ecf20Sopenharmony_ci /* enable analog pc beep path */ 10818c2ecf20Sopenharmony_ci { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, 10828c2ecf20Sopenharmony_ci {} 10838c2ecf20Sopenharmony_ci}; 10848c2ecf20Sopenharmony_ci 10858c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd73xx_6ch_loopback = 10868c2ecf20Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3); 10878c2ecf20Sopenharmony_ci 10888c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd73xx_8ch_loopback = 10898c2ecf20Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4); 10908c2ecf20Sopenharmony_ci 10918c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd73xx_10ch_loopback = 10928c2ecf20Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5); 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac92hd71bxx_loopback = 10958c2ecf20Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2); 10968c2ecf20Sopenharmony_ci 10978c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac9205_loopback = 10988c2ecf20Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1); 10998c2ecf20Sopenharmony_ci 11008c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac927x_loopback = 11018c2ecf20Sopenharmony_ci STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1); 11028c2ecf20Sopenharmony_ci 11038c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref9200_pin_configs[] = { 11048c2ecf20Sopenharmony_ci { 0x08, 0x01c47010 }, 11058c2ecf20Sopenharmony_ci { 0x09, 0x01447010 }, 11068c2ecf20Sopenharmony_ci { 0x0d, 0x0221401f }, 11078c2ecf20Sopenharmony_ci { 0x0e, 0x01114010 }, 11088c2ecf20Sopenharmony_ci { 0x0f, 0x02a19020 }, 11098c2ecf20Sopenharmony_ci { 0x10, 0x01a19021 }, 11108c2ecf20Sopenharmony_ci { 0x11, 0x90100140 }, 11118c2ecf20Sopenharmony_ci { 0x12, 0x01813122 }, 11128c2ecf20Sopenharmony_ci {} 11138c2ecf20Sopenharmony_ci}; 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_cistatic const struct hda_pintbl gateway9200_m4_pin_configs[] = { 11168c2ecf20Sopenharmony_ci { 0x08, 0x400000fe }, 11178c2ecf20Sopenharmony_ci { 0x09, 0x404500f4 }, 11188c2ecf20Sopenharmony_ci { 0x0d, 0x400100f0 }, 11198c2ecf20Sopenharmony_ci { 0x0e, 0x90110010 }, 11208c2ecf20Sopenharmony_ci { 0x0f, 0x400100f1 }, 11218c2ecf20Sopenharmony_ci { 0x10, 0x02a1902e }, 11228c2ecf20Sopenharmony_ci { 0x11, 0x500000f2 }, 11238c2ecf20Sopenharmony_ci { 0x12, 0x500000f3 }, 11248c2ecf20Sopenharmony_ci {} 11258c2ecf20Sopenharmony_ci}; 11268c2ecf20Sopenharmony_ci 11278c2ecf20Sopenharmony_cistatic const struct hda_pintbl gateway9200_m4_2_pin_configs[] = { 11288c2ecf20Sopenharmony_ci { 0x08, 0x400000fe }, 11298c2ecf20Sopenharmony_ci { 0x09, 0x404500f4 }, 11308c2ecf20Sopenharmony_ci { 0x0d, 0x400100f0 }, 11318c2ecf20Sopenharmony_ci { 0x0e, 0x90110010 }, 11328c2ecf20Sopenharmony_ci { 0x0f, 0x400100f1 }, 11338c2ecf20Sopenharmony_ci { 0x10, 0x02a1902e }, 11348c2ecf20Sopenharmony_ci { 0x11, 0x500000f2 }, 11358c2ecf20Sopenharmony_ci { 0x12, 0x500000f3 }, 11368c2ecf20Sopenharmony_ci {} 11378c2ecf20Sopenharmony_ci}; 11388c2ecf20Sopenharmony_ci 11398c2ecf20Sopenharmony_ci/* 11408c2ecf20Sopenharmony_ci STAC 9200 pin configs for 11418c2ecf20Sopenharmony_ci 102801A8 11428c2ecf20Sopenharmony_ci 102801DE 11438c2ecf20Sopenharmony_ci 102801E8 11448c2ecf20Sopenharmony_ci*/ 11458c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_d21_pin_configs[] = { 11468c2ecf20Sopenharmony_ci { 0x08, 0x400001f0 }, 11478c2ecf20Sopenharmony_ci { 0x09, 0x400001f1 }, 11488c2ecf20Sopenharmony_ci { 0x0d, 0x02214030 }, 11498c2ecf20Sopenharmony_ci { 0x0e, 0x01014010 }, 11508c2ecf20Sopenharmony_ci { 0x0f, 0x02a19020 }, 11518c2ecf20Sopenharmony_ci { 0x10, 0x01a19021 }, 11528c2ecf20Sopenharmony_ci { 0x11, 0x90100140 }, 11538c2ecf20Sopenharmony_ci { 0x12, 0x01813122 }, 11548c2ecf20Sopenharmony_ci {} 11558c2ecf20Sopenharmony_ci}; 11568c2ecf20Sopenharmony_ci 11578c2ecf20Sopenharmony_ci/* 11588c2ecf20Sopenharmony_ci STAC 9200 pin configs for 11598c2ecf20Sopenharmony_ci 102801C0 11608c2ecf20Sopenharmony_ci 102801C1 11618c2ecf20Sopenharmony_ci*/ 11628c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_d22_pin_configs[] = { 11638c2ecf20Sopenharmony_ci { 0x08, 0x400001f0 }, 11648c2ecf20Sopenharmony_ci { 0x09, 0x400001f1 }, 11658c2ecf20Sopenharmony_ci { 0x0d, 0x0221401f }, 11668c2ecf20Sopenharmony_ci { 0x0e, 0x01014010 }, 11678c2ecf20Sopenharmony_ci { 0x0f, 0x01813020 }, 11688c2ecf20Sopenharmony_ci { 0x10, 0x02a19021 }, 11698c2ecf20Sopenharmony_ci { 0x11, 0x90100140 }, 11708c2ecf20Sopenharmony_ci { 0x12, 0x400001f2 }, 11718c2ecf20Sopenharmony_ci {} 11728c2ecf20Sopenharmony_ci}; 11738c2ecf20Sopenharmony_ci 11748c2ecf20Sopenharmony_ci/* 11758c2ecf20Sopenharmony_ci STAC 9200 pin configs for 11768c2ecf20Sopenharmony_ci 102801C4 (Dell Dimension E310) 11778c2ecf20Sopenharmony_ci 102801C5 11788c2ecf20Sopenharmony_ci 102801C7 11798c2ecf20Sopenharmony_ci 102801D9 11808c2ecf20Sopenharmony_ci 102801DA 11818c2ecf20Sopenharmony_ci 102801E3 11828c2ecf20Sopenharmony_ci*/ 11838c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_d23_pin_configs[] = { 11848c2ecf20Sopenharmony_ci { 0x08, 0x400001f0 }, 11858c2ecf20Sopenharmony_ci { 0x09, 0x400001f1 }, 11868c2ecf20Sopenharmony_ci { 0x0d, 0x0221401f }, 11878c2ecf20Sopenharmony_ci { 0x0e, 0x01014010 }, 11888c2ecf20Sopenharmony_ci { 0x0f, 0x01813020 }, 11898c2ecf20Sopenharmony_ci { 0x10, 0x01a19021 }, 11908c2ecf20Sopenharmony_ci { 0x11, 0x90100140 }, 11918c2ecf20Sopenharmony_ci { 0x12, 0x400001f2 }, 11928c2ecf20Sopenharmony_ci {} 11938c2ecf20Sopenharmony_ci}; 11948c2ecf20Sopenharmony_ci 11958c2ecf20Sopenharmony_ci 11968c2ecf20Sopenharmony_ci/* 11978c2ecf20Sopenharmony_ci STAC 9200-32 pin configs for 11988c2ecf20Sopenharmony_ci 102801B5 (Dell Inspiron 630m) 11998c2ecf20Sopenharmony_ci 102801D8 (Dell Inspiron 640m) 12008c2ecf20Sopenharmony_ci*/ 12018c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m21_pin_configs[] = { 12028c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 12038c2ecf20Sopenharmony_ci { 0x09, 0x03441340 }, 12048c2ecf20Sopenharmony_ci { 0x0d, 0x0321121f }, 12058c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 12068c2ecf20Sopenharmony_ci { 0x0f, 0x408003fb }, 12078c2ecf20Sopenharmony_ci { 0x10, 0x03a11020 }, 12088c2ecf20Sopenharmony_ci { 0x11, 0x401003fc }, 12098c2ecf20Sopenharmony_ci { 0x12, 0x403003fd }, 12108c2ecf20Sopenharmony_ci {} 12118c2ecf20Sopenharmony_ci}; 12128c2ecf20Sopenharmony_ci 12138c2ecf20Sopenharmony_ci/* 12148c2ecf20Sopenharmony_ci STAC 9200-32 pin configs for 12158c2ecf20Sopenharmony_ci 102801C2 (Dell Latitude D620) 12168c2ecf20Sopenharmony_ci 102801C8 12178c2ecf20Sopenharmony_ci 102801CC (Dell Latitude D820) 12188c2ecf20Sopenharmony_ci 102801D4 12198c2ecf20Sopenharmony_ci 102801D6 12208c2ecf20Sopenharmony_ci*/ 12218c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m22_pin_configs[] = { 12228c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 12238c2ecf20Sopenharmony_ci { 0x09, 0x0144131f }, 12248c2ecf20Sopenharmony_ci { 0x0d, 0x0321121f }, 12258c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 12268c2ecf20Sopenharmony_ci { 0x0f, 0x90a70321 }, 12278c2ecf20Sopenharmony_ci { 0x10, 0x03a11020 }, 12288c2ecf20Sopenharmony_ci { 0x11, 0x401003fb }, 12298c2ecf20Sopenharmony_ci { 0x12, 0x40f000fc }, 12308c2ecf20Sopenharmony_ci {} 12318c2ecf20Sopenharmony_ci}; 12328c2ecf20Sopenharmony_ci 12338c2ecf20Sopenharmony_ci/* 12348c2ecf20Sopenharmony_ci STAC 9200-32 pin configs for 12358c2ecf20Sopenharmony_ci 102801CE (Dell XPS M1710) 12368c2ecf20Sopenharmony_ci 102801CF (Dell Precision M90) 12378c2ecf20Sopenharmony_ci*/ 12388c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m23_pin_configs[] = { 12398c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 12408c2ecf20Sopenharmony_ci { 0x09, 0x01441340 }, 12418c2ecf20Sopenharmony_ci { 0x0d, 0x0421421f }, 12428c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 12438c2ecf20Sopenharmony_ci { 0x0f, 0x408003fb }, 12448c2ecf20Sopenharmony_ci { 0x10, 0x04a1102e }, 12458c2ecf20Sopenharmony_ci { 0x11, 0x90170311 }, 12468c2ecf20Sopenharmony_ci { 0x12, 0x403003fc }, 12478c2ecf20Sopenharmony_ci {} 12488c2ecf20Sopenharmony_ci}; 12498c2ecf20Sopenharmony_ci 12508c2ecf20Sopenharmony_ci/* 12518c2ecf20Sopenharmony_ci STAC 9200-32 pin configs for 12528c2ecf20Sopenharmony_ci 102801C9 12538c2ecf20Sopenharmony_ci 102801CA 12548c2ecf20Sopenharmony_ci 102801CB (Dell Latitude 120L) 12558c2ecf20Sopenharmony_ci 102801D3 12568c2ecf20Sopenharmony_ci*/ 12578c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m24_pin_configs[] = { 12588c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 12598c2ecf20Sopenharmony_ci { 0x09, 0x404003fb }, 12608c2ecf20Sopenharmony_ci { 0x0d, 0x0321121f }, 12618c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 12628c2ecf20Sopenharmony_ci { 0x0f, 0x408003fc }, 12638c2ecf20Sopenharmony_ci { 0x10, 0x03a11020 }, 12648c2ecf20Sopenharmony_ci { 0x11, 0x401003fd }, 12658c2ecf20Sopenharmony_ci { 0x12, 0x403003fe }, 12668c2ecf20Sopenharmony_ci {} 12678c2ecf20Sopenharmony_ci}; 12688c2ecf20Sopenharmony_ci 12698c2ecf20Sopenharmony_ci/* 12708c2ecf20Sopenharmony_ci STAC 9200-32 pin configs for 12718c2ecf20Sopenharmony_ci 102801BD (Dell Inspiron E1505n) 12728c2ecf20Sopenharmony_ci 102801EE 12738c2ecf20Sopenharmony_ci 102801EF 12748c2ecf20Sopenharmony_ci*/ 12758c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m25_pin_configs[] = { 12768c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 12778c2ecf20Sopenharmony_ci { 0x09, 0x01441340 }, 12788c2ecf20Sopenharmony_ci { 0x0d, 0x0421121f }, 12798c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 12808c2ecf20Sopenharmony_ci { 0x0f, 0x408003fb }, 12818c2ecf20Sopenharmony_ci { 0x10, 0x04a11020 }, 12828c2ecf20Sopenharmony_ci { 0x11, 0x401003fc }, 12838c2ecf20Sopenharmony_ci { 0x12, 0x403003fd }, 12848c2ecf20Sopenharmony_ci {} 12858c2ecf20Sopenharmony_ci}; 12868c2ecf20Sopenharmony_ci 12878c2ecf20Sopenharmony_ci/* 12888c2ecf20Sopenharmony_ci STAC 9200-32 pin configs for 12898c2ecf20Sopenharmony_ci 102801F5 (Dell Inspiron 1501) 12908c2ecf20Sopenharmony_ci 102801F6 12918c2ecf20Sopenharmony_ci*/ 12928c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m26_pin_configs[] = { 12938c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 12948c2ecf20Sopenharmony_ci { 0x09, 0x404003fb }, 12958c2ecf20Sopenharmony_ci { 0x0d, 0x0421121f }, 12968c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 12978c2ecf20Sopenharmony_ci { 0x0f, 0x408003fc }, 12988c2ecf20Sopenharmony_ci { 0x10, 0x04a11020 }, 12998c2ecf20Sopenharmony_ci { 0x11, 0x401003fd }, 13008c2ecf20Sopenharmony_ci { 0x12, 0x403003fe }, 13018c2ecf20Sopenharmony_ci {} 13028c2ecf20Sopenharmony_ci}; 13038c2ecf20Sopenharmony_ci 13048c2ecf20Sopenharmony_ci/* 13058c2ecf20Sopenharmony_ci STAC 9200-32 13068c2ecf20Sopenharmony_ci 102801CD (Dell Inspiron E1705/9400) 13078c2ecf20Sopenharmony_ci*/ 13088c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell9200_m27_pin_configs[] = { 13098c2ecf20Sopenharmony_ci { 0x08, 0x40c003fa }, 13108c2ecf20Sopenharmony_ci { 0x09, 0x01441340 }, 13118c2ecf20Sopenharmony_ci { 0x0d, 0x0421121f }, 13128c2ecf20Sopenharmony_ci { 0x0e, 0x90170310 }, 13138c2ecf20Sopenharmony_ci { 0x0f, 0x90170310 }, 13148c2ecf20Sopenharmony_ci { 0x10, 0x04a11020 }, 13158c2ecf20Sopenharmony_ci { 0x11, 0x90170310 }, 13168c2ecf20Sopenharmony_ci { 0x12, 0x40f003fc }, 13178c2ecf20Sopenharmony_ci {} 13188c2ecf20Sopenharmony_ci}; 13198c2ecf20Sopenharmony_ci 13208c2ecf20Sopenharmony_cistatic const struct hda_pintbl oqo9200_pin_configs[] = { 13218c2ecf20Sopenharmony_ci { 0x08, 0x40c000f0 }, 13228c2ecf20Sopenharmony_ci { 0x09, 0x404000f1 }, 13238c2ecf20Sopenharmony_ci { 0x0d, 0x0221121f }, 13248c2ecf20Sopenharmony_ci { 0x0e, 0x02211210 }, 13258c2ecf20Sopenharmony_ci { 0x0f, 0x90170111 }, 13268c2ecf20Sopenharmony_ci { 0x10, 0x90a70120 }, 13278c2ecf20Sopenharmony_ci { 0x11, 0x400000f2 }, 13288c2ecf20Sopenharmony_ci { 0x12, 0x400000f3 }, 13298c2ecf20Sopenharmony_ci {} 13308c2ecf20Sopenharmony_ci}; 13318c2ecf20Sopenharmony_ci 13328c2ecf20Sopenharmony_ci/* 13338c2ecf20Sopenharmony_ci * STAC 92HD700 13348c2ecf20Sopenharmony_ci * 18881000 Amigaone X1000 13358c2ecf20Sopenharmony_ci */ 13368c2ecf20Sopenharmony_cistatic const struct hda_pintbl nemo_pin_configs[] = { 13378c2ecf20Sopenharmony_ci { 0x0a, 0x02214020 }, /* Front panel HP socket */ 13388c2ecf20Sopenharmony_ci { 0x0b, 0x02a19080 }, /* Front Mic */ 13398c2ecf20Sopenharmony_ci { 0x0c, 0x0181304e }, /* Line in */ 13408c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, /* Line out */ 13418c2ecf20Sopenharmony_ci { 0x0e, 0x01a19040 }, /* Rear Mic */ 13428c2ecf20Sopenharmony_ci { 0x0f, 0x01011012 }, /* Rear speakers */ 13438c2ecf20Sopenharmony_ci { 0x10, 0x01016011 }, /* Center speaker */ 13448c2ecf20Sopenharmony_ci { 0x11, 0x01012014 }, /* Side speakers (7.1) */ 13458c2ecf20Sopenharmony_ci { 0x12, 0x103301f0 }, /* Motherboard CD line in connector */ 13468c2ecf20Sopenharmony_ci { 0x13, 0x411111f0 }, /* Unused */ 13478c2ecf20Sopenharmony_ci { 0x14, 0x411111f0 }, /* Unused */ 13488c2ecf20Sopenharmony_ci { 0x21, 0x01442170 }, /* S/PDIF line out */ 13498c2ecf20Sopenharmony_ci { 0x22, 0x411111f0 }, /* Unused */ 13508c2ecf20Sopenharmony_ci { 0x23, 0x411111f0 }, /* Unused */ 13518c2ecf20Sopenharmony_ci {} 13528c2ecf20Sopenharmony_ci}; 13538c2ecf20Sopenharmony_ci 13548c2ecf20Sopenharmony_cistatic void stac9200_fixup_panasonic(struct hda_codec *codec, 13558c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 13568c2ecf20Sopenharmony_ci{ 13578c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 13588c2ecf20Sopenharmony_ci 13598c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 13608c2ecf20Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = 0x09; 13618c2ecf20Sopenharmony_ci spec->gpio_data = 0x00; 13628c2ecf20Sopenharmony_ci /* CF-74 has no headphone detection, and the driver should *NOT* 13638c2ecf20Sopenharmony_ci * do detection and HP/speaker toggle because the hardware does it. 13648c2ecf20Sopenharmony_ci */ 13658c2ecf20Sopenharmony_ci spec->gen.suppress_auto_mute = 1; 13668c2ecf20Sopenharmony_ci } 13678c2ecf20Sopenharmony_ci} 13688c2ecf20Sopenharmony_ci 13698c2ecf20Sopenharmony_ci 13708c2ecf20Sopenharmony_cistatic const struct hda_fixup stac9200_fixups[] = { 13718c2ecf20Sopenharmony_ci [STAC_REF] = { 13728c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13738c2ecf20Sopenharmony_ci .v.pins = ref9200_pin_configs, 13748c2ecf20Sopenharmony_ci }, 13758c2ecf20Sopenharmony_ci [STAC_9200_OQO] = { 13768c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13778c2ecf20Sopenharmony_ci .v.pins = oqo9200_pin_configs, 13788c2ecf20Sopenharmony_ci .chained = true, 13798c2ecf20Sopenharmony_ci .chain_id = STAC_9200_EAPD_INIT, 13808c2ecf20Sopenharmony_ci }, 13818c2ecf20Sopenharmony_ci [STAC_9200_DELL_D21] = { 13828c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13838c2ecf20Sopenharmony_ci .v.pins = dell9200_d21_pin_configs, 13848c2ecf20Sopenharmony_ci }, 13858c2ecf20Sopenharmony_ci [STAC_9200_DELL_D22] = { 13868c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13878c2ecf20Sopenharmony_ci .v.pins = dell9200_d22_pin_configs, 13888c2ecf20Sopenharmony_ci }, 13898c2ecf20Sopenharmony_ci [STAC_9200_DELL_D23] = { 13908c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13918c2ecf20Sopenharmony_ci .v.pins = dell9200_d23_pin_configs, 13928c2ecf20Sopenharmony_ci }, 13938c2ecf20Sopenharmony_ci [STAC_9200_DELL_M21] = { 13948c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13958c2ecf20Sopenharmony_ci .v.pins = dell9200_m21_pin_configs, 13968c2ecf20Sopenharmony_ci }, 13978c2ecf20Sopenharmony_ci [STAC_9200_DELL_M22] = { 13988c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 13998c2ecf20Sopenharmony_ci .v.pins = dell9200_m22_pin_configs, 14008c2ecf20Sopenharmony_ci }, 14018c2ecf20Sopenharmony_ci [STAC_9200_DELL_M23] = { 14028c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14038c2ecf20Sopenharmony_ci .v.pins = dell9200_m23_pin_configs, 14048c2ecf20Sopenharmony_ci }, 14058c2ecf20Sopenharmony_ci [STAC_9200_DELL_M24] = { 14068c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14078c2ecf20Sopenharmony_ci .v.pins = dell9200_m24_pin_configs, 14088c2ecf20Sopenharmony_ci }, 14098c2ecf20Sopenharmony_ci [STAC_9200_DELL_M25] = { 14108c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14118c2ecf20Sopenharmony_ci .v.pins = dell9200_m25_pin_configs, 14128c2ecf20Sopenharmony_ci }, 14138c2ecf20Sopenharmony_ci [STAC_9200_DELL_M26] = { 14148c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14158c2ecf20Sopenharmony_ci .v.pins = dell9200_m26_pin_configs, 14168c2ecf20Sopenharmony_ci }, 14178c2ecf20Sopenharmony_ci [STAC_9200_DELL_M27] = { 14188c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14198c2ecf20Sopenharmony_ci .v.pins = dell9200_m27_pin_configs, 14208c2ecf20Sopenharmony_ci }, 14218c2ecf20Sopenharmony_ci [STAC_9200_M4] = { 14228c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14238c2ecf20Sopenharmony_ci .v.pins = gateway9200_m4_pin_configs, 14248c2ecf20Sopenharmony_ci .chained = true, 14258c2ecf20Sopenharmony_ci .chain_id = STAC_9200_EAPD_INIT, 14268c2ecf20Sopenharmony_ci }, 14278c2ecf20Sopenharmony_ci [STAC_9200_M4_2] = { 14288c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 14298c2ecf20Sopenharmony_ci .v.pins = gateway9200_m4_2_pin_configs, 14308c2ecf20Sopenharmony_ci .chained = true, 14318c2ecf20Sopenharmony_ci .chain_id = STAC_9200_EAPD_INIT, 14328c2ecf20Sopenharmony_ci }, 14338c2ecf20Sopenharmony_ci [STAC_9200_PANASONIC] = { 14348c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 14358c2ecf20Sopenharmony_ci .v.func = stac9200_fixup_panasonic, 14368c2ecf20Sopenharmony_ci }, 14378c2ecf20Sopenharmony_ci [STAC_9200_EAPD_INIT] = { 14388c2ecf20Sopenharmony_ci .type = HDA_FIXUP_VERBS, 14398c2ecf20Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 14408c2ecf20Sopenharmony_ci {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 14418c2ecf20Sopenharmony_ci {} 14428c2ecf20Sopenharmony_ci }, 14438c2ecf20Sopenharmony_ci }, 14448c2ecf20Sopenharmony_ci}; 14458c2ecf20Sopenharmony_ci 14468c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac9200_models[] = { 14478c2ecf20Sopenharmony_ci { .id = STAC_REF, .name = "ref" }, 14488c2ecf20Sopenharmony_ci { .id = STAC_9200_OQO, .name = "oqo" }, 14498c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_D21, .name = "dell-d21" }, 14508c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_D22, .name = "dell-d22" }, 14518c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_D23, .name = "dell-d23" }, 14528c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M21, .name = "dell-m21" }, 14538c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M22, .name = "dell-m22" }, 14548c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M23, .name = "dell-m23" }, 14558c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M24, .name = "dell-m24" }, 14568c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M25, .name = "dell-m25" }, 14578c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M26, .name = "dell-m26" }, 14588c2ecf20Sopenharmony_ci { .id = STAC_9200_DELL_M27, .name = "dell-m27" }, 14598c2ecf20Sopenharmony_ci { .id = STAC_9200_M4, .name = "gateway-m4" }, 14608c2ecf20Sopenharmony_ci { .id = STAC_9200_M4_2, .name = "gateway-m4-2" }, 14618c2ecf20Sopenharmony_ci { .id = STAC_9200_PANASONIC, .name = "panasonic" }, 14628c2ecf20Sopenharmony_ci {} 14638c2ecf20Sopenharmony_ci}; 14648c2ecf20Sopenharmony_ci 14658c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac9200_fixup_tbl[] = { 14668c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 14678c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 14688c2ecf20Sopenharmony_ci "DFI LanParty", STAC_REF), 14698c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 14708c2ecf20Sopenharmony_ci "DFI LanParty", STAC_REF), 14718c2ecf20Sopenharmony_ci /* Dell laptops have BIOS problem */ 14728c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8, 14738c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D21), 14748c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5, 14758c2ecf20Sopenharmony_ci "Dell Inspiron 630m", STAC_9200_DELL_M21), 14768c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd, 14778c2ecf20Sopenharmony_ci "Dell Inspiron E1505n", STAC_9200_DELL_M25), 14788c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0, 14798c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D22), 14808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1, 14818c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D22), 14828c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2, 14838c2ecf20Sopenharmony_ci "Dell Latitude D620", STAC_9200_DELL_M22), 14848c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5, 14858c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 14868c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7, 14878c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 14888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8, 14898c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 14908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9, 14918c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M24), 14928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca, 14938c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M24), 14948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb, 14958c2ecf20Sopenharmony_ci "Dell Latitude 120L", STAC_9200_DELL_M24), 14968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc, 14978c2ecf20Sopenharmony_ci "Dell Latitude D820", STAC_9200_DELL_M22), 14988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd, 14998c2ecf20Sopenharmony_ci "Dell Inspiron E1705/9400", STAC_9200_DELL_M27), 15008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce, 15018c2ecf20Sopenharmony_ci "Dell XPS M1710", STAC_9200_DELL_M23), 15028c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf, 15038c2ecf20Sopenharmony_ci "Dell Precision M90", STAC_9200_DELL_M23), 15048c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3, 15058c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 15068c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4, 15078c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 15088c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6, 15098c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M22), 15108c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8, 15118c2ecf20Sopenharmony_ci "Dell Inspiron 640m", STAC_9200_DELL_M21), 15128c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9, 15138c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 15148c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da, 15158c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 15168c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de, 15178c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D21), 15188c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3, 15198c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D23), 15208c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8, 15218c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_D21), 15228c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee, 15238c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M25), 15248c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef, 15258c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M25), 15268c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5, 15278c2ecf20Sopenharmony_ci "Dell Inspiron 1501", STAC_9200_DELL_M26), 15288c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6, 15298c2ecf20Sopenharmony_ci "unknown Dell", STAC_9200_DELL_M26), 15308c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0201, 15318c2ecf20Sopenharmony_ci "Dell Latitude D430", STAC_9200_DELL_M22), 15328c2ecf20Sopenharmony_ci /* Panasonic */ 15338c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC), 15348c2ecf20Sopenharmony_ci /* Gateway machines needs EAPD to be set on resume */ 15358c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4), 15368c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2), 15378c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2), 15388c2ecf20Sopenharmony_ci /* OQO Mobile */ 15398c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO), 15408c2ecf20Sopenharmony_ci {} /* terminator */ 15418c2ecf20Sopenharmony_ci}; 15428c2ecf20Sopenharmony_ci 15438c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref925x_pin_configs[] = { 15448c2ecf20Sopenharmony_ci { 0x07, 0x40c003f0 }, 15458c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 15468c2ecf20Sopenharmony_ci { 0x0a, 0x01813022 }, 15478c2ecf20Sopenharmony_ci { 0x0b, 0x02a19021 }, 15488c2ecf20Sopenharmony_ci { 0x0c, 0x90a70320 }, 15498c2ecf20Sopenharmony_ci { 0x0d, 0x02214210 }, 15508c2ecf20Sopenharmony_ci { 0x10, 0x01019020 }, 15518c2ecf20Sopenharmony_ci { 0x11, 0x9033032e }, 15528c2ecf20Sopenharmony_ci {} 15538c2ecf20Sopenharmony_ci}; 15548c2ecf20Sopenharmony_ci 15558c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM1_pin_configs[] = { 15568c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 15578c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 15588c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 15598c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 15608c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 15618c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 15628c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 15638c2ecf20Sopenharmony_ci { 0x11, 0x9033032e }, 15648c2ecf20Sopenharmony_ci {} 15658c2ecf20Sopenharmony_ci}; 15668c2ecf20Sopenharmony_ci 15678c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM1_2_pin_configs[] = { 15688c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 15698c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 15708c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 15718c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 15728c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 15738c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 15748c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 15758c2ecf20Sopenharmony_ci { 0x11, 0x9033032e }, 15768c2ecf20Sopenharmony_ci {} 15778c2ecf20Sopenharmony_ci}; 15788c2ecf20Sopenharmony_ci 15798c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM2_pin_configs[] = { 15808c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 15818c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 15828c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 15838c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 15848c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 15858c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 15868c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 15878c2ecf20Sopenharmony_ci { 0x11, 0x9033032e }, 15888c2ecf20Sopenharmony_ci {} 15898c2ecf20Sopenharmony_ci}; 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM2_2_pin_configs[] = { 15928c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 15938c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 15948c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 15958c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 15968c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 15978c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 15988c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 15998c2ecf20Sopenharmony_ci { 0x11, 0x9033032e }, 16008c2ecf20Sopenharmony_ci {} 16018c2ecf20Sopenharmony_ci}; 16028c2ecf20Sopenharmony_ci 16038c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM3_pin_configs[] = { 16048c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 16058c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 16068c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 16078c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 16088c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 16098c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 16108c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 16118c2ecf20Sopenharmony_ci { 0x11, 0x503303f3 }, 16128c2ecf20Sopenharmony_ci {} 16138c2ecf20Sopenharmony_ci}; 16148c2ecf20Sopenharmony_ci 16158c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM5_pin_configs[] = { 16168c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 16178c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 16188c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 16198c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 16208c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 16218c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 16228c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 16238c2ecf20Sopenharmony_ci { 0x11, 0x9033032e }, 16248c2ecf20Sopenharmony_ci {} 16258c2ecf20Sopenharmony_ci}; 16268c2ecf20Sopenharmony_ci 16278c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac925xM6_pin_configs[] = { 16288c2ecf20Sopenharmony_ci { 0x07, 0x40c003f4 }, 16298c2ecf20Sopenharmony_ci { 0x08, 0x424503f2 }, 16308c2ecf20Sopenharmony_ci { 0x0a, 0x400000f3 }, 16318c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 16328c2ecf20Sopenharmony_ci { 0x0c, 0x40a000f0 }, 16338c2ecf20Sopenharmony_ci { 0x0d, 0x90100210 }, 16348c2ecf20Sopenharmony_ci { 0x10, 0x400003f1 }, 16358c2ecf20Sopenharmony_ci { 0x11, 0x90330320 }, 16368c2ecf20Sopenharmony_ci {} 16378c2ecf20Sopenharmony_ci}; 16388c2ecf20Sopenharmony_ci 16398c2ecf20Sopenharmony_cistatic const struct hda_fixup stac925x_fixups[] = { 16408c2ecf20Sopenharmony_ci [STAC_REF] = { 16418c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16428c2ecf20Sopenharmony_ci .v.pins = ref925x_pin_configs, 16438c2ecf20Sopenharmony_ci }, 16448c2ecf20Sopenharmony_ci [STAC_M1] = { 16458c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16468c2ecf20Sopenharmony_ci .v.pins = stac925xM1_pin_configs, 16478c2ecf20Sopenharmony_ci }, 16488c2ecf20Sopenharmony_ci [STAC_M1_2] = { 16498c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16508c2ecf20Sopenharmony_ci .v.pins = stac925xM1_2_pin_configs, 16518c2ecf20Sopenharmony_ci }, 16528c2ecf20Sopenharmony_ci [STAC_M2] = { 16538c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16548c2ecf20Sopenharmony_ci .v.pins = stac925xM2_pin_configs, 16558c2ecf20Sopenharmony_ci }, 16568c2ecf20Sopenharmony_ci [STAC_M2_2] = { 16578c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16588c2ecf20Sopenharmony_ci .v.pins = stac925xM2_2_pin_configs, 16598c2ecf20Sopenharmony_ci }, 16608c2ecf20Sopenharmony_ci [STAC_M3] = { 16618c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16628c2ecf20Sopenharmony_ci .v.pins = stac925xM3_pin_configs, 16638c2ecf20Sopenharmony_ci }, 16648c2ecf20Sopenharmony_ci [STAC_M5] = { 16658c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16668c2ecf20Sopenharmony_ci .v.pins = stac925xM5_pin_configs, 16678c2ecf20Sopenharmony_ci }, 16688c2ecf20Sopenharmony_ci [STAC_M6] = { 16698c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 16708c2ecf20Sopenharmony_ci .v.pins = stac925xM6_pin_configs, 16718c2ecf20Sopenharmony_ci }, 16728c2ecf20Sopenharmony_ci}; 16738c2ecf20Sopenharmony_ci 16748c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac925x_models[] = { 16758c2ecf20Sopenharmony_ci { .id = STAC_REF, .name = "ref" }, 16768c2ecf20Sopenharmony_ci { .id = STAC_M1, .name = "m1" }, 16778c2ecf20Sopenharmony_ci { .id = STAC_M1_2, .name = "m1-2" }, 16788c2ecf20Sopenharmony_ci { .id = STAC_M2, .name = "m2" }, 16798c2ecf20Sopenharmony_ci { .id = STAC_M2_2, .name = "m2-2" }, 16808c2ecf20Sopenharmony_ci { .id = STAC_M3, .name = "m3" }, 16818c2ecf20Sopenharmony_ci { .id = STAC_M5, .name = "m5" }, 16828c2ecf20Sopenharmony_ci { .id = STAC_M6, .name = "m6" }, 16838c2ecf20Sopenharmony_ci {} 16848c2ecf20Sopenharmony_ci}; 16858c2ecf20Sopenharmony_ci 16868c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac925x_fixup_tbl[] = { 16878c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 16888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), 16898c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF), 16908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF), 16918c2ecf20Sopenharmony_ci 16928c2ecf20Sopenharmony_ci /* Default table for unknown ID */ 16938c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2), 16948c2ecf20Sopenharmony_ci 16958c2ecf20Sopenharmony_ci /* gateway machines are checked via codec ssid */ 16968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2), 16978c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5), 16988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1), 16998c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2), 17008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2), 17018c2ecf20Sopenharmony_ci /* Not sure about the brand name for those */ 17028c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1), 17038c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3), 17048c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6), 17058c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2), 17068c2ecf20Sopenharmony_ci {} /* terminator */ 17078c2ecf20Sopenharmony_ci}; 17088c2ecf20Sopenharmony_ci 17098c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref92hd73xx_pin_configs[] = { 17108c2ecf20Sopenharmony_ci // Port A-H 17118c2ecf20Sopenharmony_ci { 0x0a, 0x02214030 }, 17128c2ecf20Sopenharmony_ci { 0x0b, 0x02a19040 }, 17138c2ecf20Sopenharmony_ci { 0x0c, 0x01a19020 }, 17148c2ecf20Sopenharmony_ci { 0x0d, 0x02214030 }, 17158c2ecf20Sopenharmony_ci { 0x0e, 0x0181302e }, 17168c2ecf20Sopenharmony_ci { 0x0f, 0x01014010 }, 17178c2ecf20Sopenharmony_ci { 0x10, 0x01014020 }, 17188c2ecf20Sopenharmony_ci { 0x11, 0x01014030 }, 17198c2ecf20Sopenharmony_ci // CD in 17208c2ecf20Sopenharmony_ci { 0x12, 0x02319040 }, 17218c2ecf20Sopenharmony_ci // Digial Mic ins 17228c2ecf20Sopenharmony_ci { 0x13, 0x90a000f0 }, 17238c2ecf20Sopenharmony_ci { 0x14, 0x90a000f0 }, 17248c2ecf20Sopenharmony_ci // Digital outs 17258c2ecf20Sopenharmony_ci { 0x22, 0x01452050 }, 17268c2ecf20Sopenharmony_ci { 0x23, 0x01452050 }, 17278c2ecf20Sopenharmony_ci {} 17288c2ecf20Sopenharmony_ci}; 17298c2ecf20Sopenharmony_ci 17308c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_m6_pin_configs[] = { 17318c2ecf20Sopenharmony_ci { 0x0a, 0x0321101f }, 17328c2ecf20Sopenharmony_ci { 0x0b, 0x4f00000f }, 17338c2ecf20Sopenharmony_ci { 0x0c, 0x4f0000f0 }, 17348c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 17358c2ecf20Sopenharmony_ci { 0x0e, 0x03a11020 }, 17368c2ecf20Sopenharmony_ci { 0x0f, 0x0321101f }, 17378c2ecf20Sopenharmony_ci { 0x10, 0x4f0000f0 }, 17388c2ecf20Sopenharmony_ci { 0x11, 0x4f0000f0 }, 17398c2ecf20Sopenharmony_ci { 0x12, 0x4f0000f0 }, 17408c2ecf20Sopenharmony_ci { 0x13, 0x90a60160 }, 17418c2ecf20Sopenharmony_ci { 0x14, 0x4f0000f0 }, 17428c2ecf20Sopenharmony_ci { 0x22, 0x4f0000f0 }, 17438c2ecf20Sopenharmony_ci { 0x23, 0x4f0000f0 }, 17448c2ecf20Sopenharmony_ci {} 17458c2ecf20Sopenharmony_ci}; 17468c2ecf20Sopenharmony_ci 17478c2ecf20Sopenharmony_cistatic const struct hda_pintbl alienware_m17x_pin_configs[] = { 17488c2ecf20Sopenharmony_ci { 0x0a, 0x0321101f }, 17498c2ecf20Sopenharmony_ci { 0x0b, 0x0321101f }, 17508c2ecf20Sopenharmony_ci { 0x0c, 0x03a11020 }, 17518c2ecf20Sopenharmony_ci { 0x0d, 0x03014020 }, 17528c2ecf20Sopenharmony_ci { 0x0e, 0x90170110 }, 17538c2ecf20Sopenharmony_ci { 0x0f, 0x4f0000f0 }, 17548c2ecf20Sopenharmony_ci { 0x10, 0x4f0000f0 }, 17558c2ecf20Sopenharmony_ci { 0x11, 0x4f0000f0 }, 17568c2ecf20Sopenharmony_ci { 0x12, 0x4f0000f0 }, 17578c2ecf20Sopenharmony_ci { 0x13, 0x90a60160 }, 17588c2ecf20Sopenharmony_ci { 0x14, 0x4f0000f0 }, 17598c2ecf20Sopenharmony_ci { 0x22, 0x4f0000f0 }, 17608c2ecf20Sopenharmony_ci { 0x23, 0x904601b0 }, 17618c2ecf20Sopenharmony_ci {} 17628c2ecf20Sopenharmony_ci}; 17638c2ecf20Sopenharmony_ci 17648c2ecf20Sopenharmony_cistatic const struct hda_pintbl intel_dg45id_pin_configs[] = { 17658c2ecf20Sopenharmony_ci // Analog outputs 17668c2ecf20Sopenharmony_ci { 0x0a, 0x02214230 }, 17678c2ecf20Sopenharmony_ci { 0x0b, 0x02A19240 }, 17688c2ecf20Sopenharmony_ci { 0x0c, 0x01013214 }, 17698c2ecf20Sopenharmony_ci { 0x0d, 0x01014210 }, 17708c2ecf20Sopenharmony_ci { 0x0e, 0x01A19250 }, 17718c2ecf20Sopenharmony_ci { 0x0f, 0x01011212 }, 17728c2ecf20Sopenharmony_ci { 0x10, 0x01016211 }, 17738c2ecf20Sopenharmony_ci // Digital output 17748c2ecf20Sopenharmony_ci { 0x22, 0x01451380 }, 17758c2ecf20Sopenharmony_ci { 0x23, 0x40f000f0 }, 17768c2ecf20Sopenharmony_ci {} 17778c2ecf20Sopenharmony_ci}; 17788c2ecf20Sopenharmony_ci 17798c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac92hd89xx_hp_front_jack_pin_configs[] = { 17808c2ecf20Sopenharmony_ci { 0x0a, 0x02214030 }, 17818c2ecf20Sopenharmony_ci { 0x0b, 0x02A19010 }, 17828c2ecf20Sopenharmony_ci {} 17838c2ecf20Sopenharmony_ci}; 17848c2ecf20Sopenharmony_ci 17858c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs[] = { 17868c2ecf20Sopenharmony_ci { 0x0e, 0x400000f0 }, 17878c2ecf20Sopenharmony_ci {} 17888c2ecf20Sopenharmony_ci}; 17898c2ecf20Sopenharmony_ci 17908c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_ref(struct hda_codec *codec, 17918c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 17928c2ecf20Sopenharmony_ci{ 17938c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 17948c2ecf20Sopenharmony_ci 17958c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 17968c2ecf20Sopenharmony_ci return; 17978c2ecf20Sopenharmony_ci 17988c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref92hd73xx_pin_configs); 17998c2ecf20Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0; 18008c2ecf20Sopenharmony_ci} 18018c2ecf20Sopenharmony_ci 18028c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_dell(struct hda_codec *codec) 18038c2ecf20Sopenharmony_ci{ 18048c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 18058c2ecf20Sopenharmony_ci 18068c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, dell_m6_pin_configs); 18078c2ecf20Sopenharmony_ci spec->eapd_switch = 0; 18088c2ecf20Sopenharmony_ci} 18098c2ecf20Sopenharmony_ci 18108c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_dell_eq(struct hda_codec *codec, 18118c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18128c2ecf20Sopenharmony_ci{ 18138c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 18148c2ecf20Sopenharmony_ci 18158c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 18168c2ecf20Sopenharmony_ci return; 18178c2ecf20Sopenharmony_ci 18188c2ecf20Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 18198c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, dell_eq_core_init); 18208c2ecf20Sopenharmony_ci spec->volknob_init = 1; 18218c2ecf20Sopenharmony_ci} 18228c2ecf20Sopenharmony_ci 18238c2ecf20Sopenharmony_ci/* Analog Mics */ 18248c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_dell_m6_amic(struct hda_codec *codec, 18258c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18268c2ecf20Sopenharmony_ci{ 18278c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 18288c2ecf20Sopenharmony_ci return; 18298c2ecf20Sopenharmony_ci 18308c2ecf20Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 18318c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); 18328c2ecf20Sopenharmony_ci} 18338c2ecf20Sopenharmony_ci 18348c2ecf20Sopenharmony_ci/* Digital Mics */ 18358c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_dell_m6_dmic(struct hda_codec *codec, 18368c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18378c2ecf20Sopenharmony_ci{ 18388c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 18398c2ecf20Sopenharmony_ci return; 18408c2ecf20Sopenharmony_ci 18418c2ecf20Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 18428c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); 18438c2ecf20Sopenharmony_ci} 18448c2ecf20Sopenharmony_ci 18458c2ecf20Sopenharmony_ci/* Both */ 18468c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_dell_m6_both(struct hda_codec *codec, 18478c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18488c2ecf20Sopenharmony_ci{ 18498c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 18508c2ecf20Sopenharmony_ci return; 18518c2ecf20Sopenharmony_ci 18528c2ecf20Sopenharmony_ci stac92hd73xx_fixup_dell(codec); 18538c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); 18548c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); 18558c2ecf20Sopenharmony_ci} 18568c2ecf20Sopenharmony_ci 18578c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_alienware_m17x(struct hda_codec *codec, 18588c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18598c2ecf20Sopenharmony_ci{ 18608c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 18618c2ecf20Sopenharmony_ci 18628c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 18638c2ecf20Sopenharmony_ci return; 18648c2ecf20Sopenharmony_ci 18658c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, alienware_m17x_pin_configs); 18668c2ecf20Sopenharmony_ci spec->eapd_switch = 0; 18678c2ecf20Sopenharmony_ci} 18688c2ecf20Sopenharmony_ci 18698c2ecf20Sopenharmony_cistatic void stac92hd73xx_fixup_no_jd(struct hda_codec *codec, 18708c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18718c2ecf20Sopenharmony_ci{ 18728c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 18738c2ecf20Sopenharmony_ci codec->no_jack_detect = 1; 18748c2ecf20Sopenharmony_ci} 18758c2ecf20Sopenharmony_ci 18768c2ecf20Sopenharmony_ci 18778c2ecf20Sopenharmony_cistatic void stac92hd73xx_disable_automute(struct hda_codec *codec, 18788c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 18798c2ecf20Sopenharmony_ci{ 18808c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 18818c2ecf20Sopenharmony_ci 18828c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 18838c2ecf20Sopenharmony_ci return; 18848c2ecf20Sopenharmony_ci 18858c2ecf20Sopenharmony_ci spec->gen.suppress_auto_mute = 1; 18868c2ecf20Sopenharmony_ci} 18878c2ecf20Sopenharmony_ci 18888c2ecf20Sopenharmony_cistatic const struct hda_fixup stac92hd73xx_fixups[] = { 18898c2ecf20Sopenharmony_ci [STAC_92HD73XX_REF] = { 18908c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 18918c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_ref, 18928c2ecf20Sopenharmony_ci }, 18938c2ecf20Sopenharmony_ci [STAC_DELL_M6_AMIC] = { 18948c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 18958c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_m6_amic, 18968c2ecf20Sopenharmony_ci }, 18978c2ecf20Sopenharmony_ci [STAC_DELL_M6_DMIC] = { 18988c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 18998c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_m6_dmic, 19008c2ecf20Sopenharmony_ci }, 19018c2ecf20Sopenharmony_ci [STAC_DELL_M6_BOTH] = { 19028c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 19038c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_m6_both, 19048c2ecf20Sopenharmony_ci }, 19058c2ecf20Sopenharmony_ci [STAC_DELL_EQ] = { 19068c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 19078c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_dell_eq, 19088c2ecf20Sopenharmony_ci }, 19098c2ecf20Sopenharmony_ci [STAC_ALIENWARE_M17X] = { 19108c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 19118c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_alienware_m17x, 19128c2ecf20Sopenharmony_ci }, 19138c2ecf20Sopenharmony_ci [STAC_ELO_VUPOINT_15MX] = { 19148c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 19158c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_disable_automute, 19168c2ecf20Sopenharmony_ci }, 19178c2ecf20Sopenharmony_ci [STAC_92HD73XX_INTEL] = { 19188c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 19198c2ecf20Sopenharmony_ci .v.pins = intel_dg45id_pin_configs, 19208c2ecf20Sopenharmony_ci }, 19218c2ecf20Sopenharmony_ci [STAC_92HD73XX_NO_JD] = { 19228c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 19238c2ecf20Sopenharmony_ci .v.func = stac92hd73xx_fixup_no_jd, 19248c2ecf20Sopenharmony_ci }, 19258c2ecf20Sopenharmony_ci [STAC_92HD89XX_HP_FRONT_JACK] = { 19268c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 19278c2ecf20Sopenharmony_ci .v.pins = stac92hd89xx_hp_front_jack_pin_configs, 19288c2ecf20Sopenharmony_ci }, 19298c2ecf20Sopenharmony_ci [STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK] = { 19308c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 19318c2ecf20Sopenharmony_ci .v.pins = stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs, 19328c2ecf20Sopenharmony_ci }, 19338c2ecf20Sopenharmony_ci [STAC_92HD73XX_ASUS_MOBO] = { 19348c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 19358c2ecf20Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 19368c2ecf20Sopenharmony_ci /* enable 5.1 and SPDIF out */ 19378c2ecf20Sopenharmony_ci { 0x0c, 0x01014411 }, 19388c2ecf20Sopenharmony_ci { 0x0d, 0x01014410 }, 19398c2ecf20Sopenharmony_ci { 0x0e, 0x01014412 }, 19408c2ecf20Sopenharmony_ci { 0x22, 0x014b1180 }, 19418c2ecf20Sopenharmony_ci { } 19428c2ecf20Sopenharmony_ci } 19438c2ecf20Sopenharmony_ci }, 19448c2ecf20Sopenharmony_ci}; 19458c2ecf20Sopenharmony_ci 19468c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac92hd73xx_models[] = { 19478c2ecf20Sopenharmony_ci { .id = STAC_92HD73XX_NO_JD, .name = "no-jd" }, 19488c2ecf20Sopenharmony_ci { .id = STAC_92HD73XX_REF, .name = "ref" }, 19498c2ecf20Sopenharmony_ci { .id = STAC_92HD73XX_INTEL, .name = "intel" }, 19508c2ecf20Sopenharmony_ci { .id = STAC_DELL_M6_AMIC, .name = "dell-m6-amic" }, 19518c2ecf20Sopenharmony_ci { .id = STAC_DELL_M6_DMIC, .name = "dell-m6-dmic" }, 19528c2ecf20Sopenharmony_ci { .id = STAC_DELL_M6_BOTH, .name = "dell-m6" }, 19538c2ecf20Sopenharmony_ci { .id = STAC_DELL_EQ, .name = "dell-eq" }, 19548c2ecf20Sopenharmony_ci { .id = STAC_ALIENWARE_M17X, .name = "alienware" }, 19558c2ecf20Sopenharmony_ci { .id = STAC_ELO_VUPOINT_15MX, .name = "elo-vupoint-15mx" }, 19568c2ecf20Sopenharmony_ci { .id = STAC_92HD73XX_ASUS_MOBO, .name = "asus-mobo" }, 19578c2ecf20Sopenharmony_ci {} 19588c2ecf20Sopenharmony_ci}; 19598c2ecf20Sopenharmony_ci 19608c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac92hd73xx_fixup_tbl[] = { 19618c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 19628c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 19638c2ecf20Sopenharmony_ci "DFI LanParty", STAC_92HD73XX_REF), 19648c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 19658c2ecf20Sopenharmony_ci "DFI LanParty", STAC_92HD73XX_REF), 19668c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5001, 19678c2ecf20Sopenharmony_ci "Intel DP45SG", STAC_92HD73XX_INTEL), 19688c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002, 19698c2ecf20Sopenharmony_ci "Intel DG45ID", STAC_92HD73XX_INTEL), 19708c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003, 19718c2ecf20Sopenharmony_ci "Intel DG45FC", STAC_92HD73XX_INTEL), 19728c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, 19738c2ecf20Sopenharmony_ci "Dell Studio 1535", STAC_DELL_M6_DMIC), 19748c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, 19758c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_DMIC), 19768c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, 19778c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_BOTH), 19788c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, 19798c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_BOTH), 19808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, 19818c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_AMIC), 19828c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, 19838c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_AMIC), 19848c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, 19858c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_DMIC), 19868c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272, 19878c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M6_DMIC), 19888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f, 19898c2ecf20Sopenharmony_ci "Dell Studio 1537", STAC_DELL_M6_DMIC), 19908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0, 19918c2ecf20Sopenharmony_ci "Dell Studio 17", STAC_DELL_M6_DMIC), 19928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be, 19938c2ecf20Sopenharmony_ci "Dell Studio 1555", STAC_DELL_M6_DMIC), 19948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, 19958c2ecf20Sopenharmony_ci "Dell Studio 1557", STAC_DELL_M6_DMIC), 19968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe, 19978c2ecf20Sopenharmony_ci "Dell Studio XPS 1645", STAC_DELL_M6_DMIC), 19988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413, 19998c2ecf20Sopenharmony_ci "Dell Studio 1558", STAC_DELL_M6_DMIC), 20008c2ecf20Sopenharmony_ci /* codec SSID matching */ 20018c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1, 20028c2ecf20Sopenharmony_ci "Alienware M17x", STAC_ALIENWARE_M17X), 20038c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, 20048c2ecf20Sopenharmony_ci "Alienware M17x", STAC_ALIENWARE_M17X), 20058c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, 20068c2ecf20Sopenharmony_ci "Alienware M17x R3", STAC_DELL_EQ), 20078c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x1059, 0x1011, 20088c2ecf20Sopenharmony_ci "ELO VuPoint 15MX", STAC_ELO_VUPOINT_15MX), 20098c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1927, 20108c2ecf20Sopenharmony_ci "HP Z1 G2", STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK), 20118c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2b17, 20128c2ecf20Sopenharmony_ci "unknown HP", STAC_92HD89XX_HP_FRONT_JACK), 20138c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_ASUSTEK, 0x83f8, "ASUS AT4NM10", 20148c2ecf20Sopenharmony_ci STAC_92HD73XX_ASUS_MOBO), 20158c2ecf20Sopenharmony_ci {} /* terminator */ 20168c2ecf20Sopenharmony_ci}; 20178c2ecf20Sopenharmony_ci 20188c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref92hd83xxx_pin_configs[] = { 20198c2ecf20Sopenharmony_ci { 0x0a, 0x02214030 }, 20208c2ecf20Sopenharmony_ci { 0x0b, 0x02211010 }, 20218c2ecf20Sopenharmony_ci { 0x0c, 0x02a19020 }, 20228c2ecf20Sopenharmony_ci { 0x0d, 0x02170130 }, 20238c2ecf20Sopenharmony_ci { 0x0e, 0x01014050 }, 20248c2ecf20Sopenharmony_ci { 0x0f, 0x01819040 }, 20258c2ecf20Sopenharmony_ci { 0x10, 0x01014020 }, 20268c2ecf20Sopenharmony_ci { 0x11, 0x90a3014e }, 20278c2ecf20Sopenharmony_ci { 0x1f, 0x01451160 }, 20288c2ecf20Sopenharmony_ci { 0x20, 0x98560170 }, 20298c2ecf20Sopenharmony_ci {} 20308c2ecf20Sopenharmony_ci}; 20318c2ecf20Sopenharmony_ci 20328c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_s14_pin_configs[] = { 20338c2ecf20Sopenharmony_ci { 0x0a, 0x0221403f }, 20348c2ecf20Sopenharmony_ci { 0x0b, 0x0221101f }, 20358c2ecf20Sopenharmony_ci { 0x0c, 0x02a19020 }, 20368c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 20378c2ecf20Sopenharmony_ci { 0x0e, 0x40f000f0 }, 20388c2ecf20Sopenharmony_ci { 0x0f, 0x40f000f0 }, 20398c2ecf20Sopenharmony_ci { 0x10, 0x40f000f0 }, 20408c2ecf20Sopenharmony_ci { 0x11, 0x90a60160 }, 20418c2ecf20Sopenharmony_ci { 0x1f, 0x40f000f0 }, 20428c2ecf20Sopenharmony_ci { 0x20, 0x40f000f0 }, 20438c2ecf20Sopenharmony_ci {} 20448c2ecf20Sopenharmony_ci}; 20458c2ecf20Sopenharmony_ci 20468c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_vostro_3500_pin_configs[] = { 20478c2ecf20Sopenharmony_ci { 0x0a, 0x02a11020 }, 20488c2ecf20Sopenharmony_ci { 0x0b, 0x0221101f }, 20498c2ecf20Sopenharmony_ci { 0x0c, 0x400000f0 }, 20508c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 20518c2ecf20Sopenharmony_ci { 0x0e, 0x400000f1 }, 20528c2ecf20Sopenharmony_ci { 0x0f, 0x400000f2 }, 20538c2ecf20Sopenharmony_ci { 0x10, 0x400000f3 }, 20548c2ecf20Sopenharmony_ci { 0x11, 0x90a60160 }, 20558c2ecf20Sopenharmony_ci { 0x1f, 0x400000f4 }, 20568c2ecf20Sopenharmony_ci { 0x20, 0x400000f5 }, 20578c2ecf20Sopenharmony_ci {} 20588c2ecf20Sopenharmony_ci}; 20598c2ecf20Sopenharmony_ci 20608c2ecf20Sopenharmony_cistatic const struct hda_pintbl hp_dv7_4000_pin_configs[] = { 20618c2ecf20Sopenharmony_ci { 0x0a, 0x03a12050 }, 20628c2ecf20Sopenharmony_ci { 0x0b, 0x0321201f }, 20638c2ecf20Sopenharmony_ci { 0x0c, 0x40f000f0 }, 20648c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 20658c2ecf20Sopenharmony_ci { 0x0e, 0x40f000f0 }, 20668c2ecf20Sopenharmony_ci { 0x0f, 0x40f000f0 }, 20678c2ecf20Sopenharmony_ci { 0x10, 0x90170110 }, 20688c2ecf20Sopenharmony_ci { 0x11, 0xd5a30140 }, 20698c2ecf20Sopenharmony_ci { 0x1f, 0x40f000f0 }, 20708c2ecf20Sopenharmony_ci { 0x20, 0x40f000f0 }, 20718c2ecf20Sopenharmony_ci {} 20728c2ecf20Sopenharmony_ci}; 20738c2ecf20Sopenharmony_ci 20748c2ecf20Sopenharmony_cistatic const struct hda_pintbl hp_zephyr_pin_configs[] = { 20758c2ecf20Sopenharmony_ci { 0x0a, 0x01813050 }, 20768c2ecf20Sopenharmony_ci { 0x0b, 0x0421201f }, 20778c2ecf20Sopenharmony_ci { 0x0c, 0x04a1205e }, 20788c2ecf20Sopenharmony_ci { 0x0d, 0x96130310 }, 20798c2ecf20Sopenharmony_ci { 0x0e, 0x96130310 }, 20808c2ecf20Sopenharmony_ci { 0x0f, 0x0101401f }, 20818c2ecf20Sopenharmony_ci { 0x10, 0x1111611f }, 20828c2ecf20Sopenharmony_ci { 0x11, 0xd5a30130 }, 20838c2ecf20Sopenharmony_ci {} 20848c2ecf20Sopenharmony_ci}; 20858c2ecf20Sopenharmony_ci 20868c2ecf20Sopenharmony_cistatic const struct hda_pintbl hp_cNB11_intquad_pin_configs[] = { 20878c2ecf20Sopenharmony_ci { 0x0a, 0x40f000f0 }, 20888c2ecf20Sopenharmony_ci { 0x0b, 0x0221101f }, 20898c2ecf20Sopenharmony_ci { 0x0c, 0x02a11020 }, 20908c2ecf20Sopenharmony_ci { 0x0d, 0x92170110 }, 20918c2ecf20Sopenharmony_ci { 0x0e, 0x40f000f0 }, 20928c2ecf20Sopenharmony_ci { 0x0f, 0x92170110 }, 20938c2ecf20Sopenharmony_ci { 0x10, 0x40f000f0 }, 20948c2ecf20Sopenharmony_ci { 0x11, 0xd5a30130 }, 20958c2ecf20Sopenharmony_ci { 0x1f, 0x40f000f0 }, 20968c2ecf20Sopenharmony_ci { 0x20, 0x40f000f0 }, 20978c2ecf20Sopenharmony_ci {} 20988c2ecf20Sopenharmony_ci}; 20998c2ecf20Sopenharmony_ci 21008c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_hp(struct hda_codec *codec, 21018c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21028c2ecf20Sopenharmony_ci{ 21038c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21048c2ecf20Sopenharmony_ci 21058c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 21068c2ecf20Sopenharmony_ci return; 21078c2ecf20Sopenharmony_ci 21088c2ecf20Sopenharmony_ci if (hp_bnb2011_with_dock(codec)) { 21098c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f); 21108c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); 21118c2ecf20Sopenharmony_ci } 21128c2ecf20Sopenharmony_ci 21138c2ecf20Sopenharmony_ci if (find_mute_led_cfg(codec, spec->default_polarity)) 21148c2ecf20Sopenharmony_ci codec_dbg(codec, "mute LED gpio %d polarity %d\n", 21158c2ecf20Sopenharmony_ci spec->gpio_led, 21168c2ecf20Sopenharmony_ci spec->gpio_led_polarity); 21178c2ecf20Sopenharmony_ci 21188c2ecf20Sopenharmony_ci /* allow auto-switching of dock line-in */ 21198c2ecf20Sopenharmony_ci spec->gen.line_in_auto_switch = true; 21208c2ecf20Sopenharmony_ci} 21218c2ecf20Sopenharmony_ci 21228c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_zephyr(struct hda_codec *codec, 21238c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21248c2ecf20Sopenharmony_ci{ 21258c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 21268c2ecf20Sopenharmony_ci return; 21278c2ecf20Sopenharmony_ci 21288c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, hp_zephyr_pin_configs); 21298c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd83xxx_hp_zephyr_init); 21308c2ecf20Sopenharmony_ci} 21318c2ecf20Sopenharmony_ci 21328c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_led(struct hda_codec *codec, 21338c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21348c2ecf20Sopenharmony_ci{ 21358c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21368c2ecf20Sopenharmony_ci 21378c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 21388c2ecf20Sopenharmony_ci spec->default_polarity = 0; 21398c2ecf20Sopenharmony_ci} 21408c2ecf20Sopenharmony_ci 21418c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_inv_led(struct hda_codec *codec, 21428c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21438c2ecf20Sopenharmony_ci{ 21448c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21458c2ecf20Sopenharmony_ci 21468c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 21478c2ecf20Sopenharmony_ci spec->default_polarity = 1; 21488c2ecf20Sopenharmony_ci} 21498c2ecf20Sopenharmony_ci 21508c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_mic_led(struct hda_codec *codec, 21518c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21528c2ecf20Sopenharmony_ci{ 21538c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21548c2ecf20Sopenharmony_ci 21558c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 21568c2ecf20Sopenharmony_ci spec->mic_mute_led_gpio = 0x08; /* GPIO3 */ 21578c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 21588c2ecf20Sopenharmony_ci /* resetting controller clears GPIO, so we need to keep on */ 21598c2ecf20Sopenharmony_ci codec->core.power_caps &= ~AC_PWRST_CLKSTOP; 21608c2ecf20Sopenharmony_ci#endif 21618c2ecf20Sopenharmony_ci } 21628c2ecf20Sopenharmony_ci} 21638c2ecf20Sopenharmony_ci 21648c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_hp_led_gpio10(struct hda_codec *codec, 21658c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21668c2ecf20Sopenharmony_ci{ 21678c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21688c2ecf20Sopenharmony_ci 21698c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 21708c2ecf20Sopenharmony_ci spec->gpio_led = 0x10; /* GPIO4 */ 21718c2ecf20Sopenharmony_ci spec->default_polarity = 0; 21728c2ecf20Sopenharmony_ci } 21738c2ecf20Sopenharmony_ci} 21748c2ecf20Sopenharmony_ci 21758c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec, 21768c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 21778c2ecf20Sopenharmony_ci{ 21788c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21798c2ecf20Sopenharmony_ci 21808c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 21818c2ecf20Sopenharmony_ci spec->headset_jack = 1; 21828c2ecf20Sopenharmony_ci} 21838c2ecf20Sopenharmony_ci 21848c2ecf20Sopenharmony_cistatic void stac92hd83xxx_fixup_gpio10_eapd(struct hda_codec *codec, 21858c2ecf20Sopenharmony_ci const struct hda_fixup *fix, 21868c2ecf20Sopenharmony_ci int action) 21878c2ecf20Sopenharmony_ci{ 21888c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 21898c2ecf20Sopenharmony_ci 21908c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 21918c2ecf20Sopenharmony_ci return; 21928c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 21938c2ecf20Sopenharmony_ci spec->gpio_data = 0x10; 21948c2ecf20Sopenharmony_ci spec->eapd_switch = 0; 21958c2ecf20Sopenharmony_ci} 21968c2ecf20Sopenharmony_ci 21978c2ecf20Sopenharmony_cistatic void hp_envy_ts_fixup_dac_bind(struct hda_codec *codec, 21988c2ecf20Sopenharmony_ci const struct hda_fixup *fix, 21998c2ecf20Sopenharmony_ci int action) 22008c2ecf20Sopenharmony_ci{ 22018c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 22028c2ecf20Sopenharmony_ci static const hda_nid_t preferred_pairs[] = { 22038c2ecf20Sopenharmony_ci 0xd, 0x13, 22048c2ecf20Sopenharmony_ci 0 22058c2ecf20Sopenharmony_ci }; 22068c2ecf20Sopenharmony_ci 22078c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 22088c2ecf20Sopenharmony_ci return; 22098c2ecf20Sopenharmony_ci 22108c2ecf20Sopenharmony_ci spec->gen.preferred_dacs = preferred_pairs; 22118c2ecf20Sopenharmony_ci} 22128c2ecf20Sopenharmony_ci 22138c2ecf20Sopenharmony_cistatic const struct hda_verb hp_bnb13_eq_verbs[] = { 22148c2ecf20Sopenharmony_ci /* 44.1KHz base */ 22158c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 22168c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x68 }, 22178c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x17 }, 22188c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 22198c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x68 }, 22208c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x17 }, 22218c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x00 }, 22228c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22238c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x83 }, 22248c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x2F }, 22258c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xD1 }, 22268c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x83 }, 22278c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x2F }, 22288c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xD1 }, 22298c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x01 }, 22308c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22318c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 22328c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x68 }, 22338c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x17 }, 22348c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 22358c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x68 }, 22368c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x17 }, 22378c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x02 }, 22388c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22398c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x7C }, 22408c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xC6 }, 22418c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x0C }, 22428c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x7C }, 22438c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xC6 }, 22448c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x0C }, 22458c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x03 }, 22468c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22478c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xC3 }, 22488c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x25 }, 22498c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xAF }, 22508c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xC3 }, 22518c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x25 }, 22528c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xAF }, 22538c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x04 }, 22548c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22558c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 22568c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x85 }, 22578c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x73 }, 22588c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 22598c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x85 }, 22608c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x73 }, 22618c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x05 }, 22628c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22638c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x85 }, 22648c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x39 }, 22658c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xC7 }, 22668c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x85 }, 22678c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x39 }, 22688c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xC7 }, 22698c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x06 }, 22708c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22718c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3C }, 22728c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x90 }, 22738c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xB0 }, 22748c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3C }, 22758c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x90 }, 22768c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xB0 }, 22778c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x07 }, 22788c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22798c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x7A }, 22808c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xC6 }, 22818c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x39 }, 22828c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x7A }, 22838c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xC6 }, 22848c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x39 }, 22858c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x08 }, 22868c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22878c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xC4 }, 22888c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xE9 }, 22898c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xDC }, 22908c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xC4 }, 22918c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xE9 }, 22928c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xDC }, 22938c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x09 }, 22948c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 22958c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3D }, 22968c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xE1 }, 22978c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x0D }, 22988c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3D }, 22998c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xE1 }, 23008c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x0D }, 23018c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x0A }, 23028c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23038c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x89 }, 23048c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xB6 }, 23058c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xEB }, 23068c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x89 }, 23078c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xB6 }, 23088c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xEB }, 23098c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x0B }, 23108c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23118c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x39 }, 23128c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x9D }, 23138c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xFE }, 23148c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x39 }, 23158c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x9D }, 23168c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xFE }, 23178c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x0C }, 23188c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23198c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x76 }, 23208c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x49 }, 23218c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x15 }, 23228c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x76 }, 23238c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x49 }, 23248c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x15 }, 23258c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x0D }, 23268c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23278c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xC8 }, 23288c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x80 }, 23298c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xF5 }, 23308c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xC8 }, 23318c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x80 }, 23328c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xF5 }, 23338c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x0E }, 23348c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23358c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 23368c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 23378c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 23388c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 23398c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 23408c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 23418c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x0F }, 23428c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23438c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x90 }, 23448c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x68 }, 23458c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xF1 }, 23468c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x90 }, 23478c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x68 }, 23488c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xF1 }, 23498c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x10 }, 23508c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23518c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x34 }, 23528c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x47 }, 23538c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x6C }, 23548c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x34 }, 23558c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x47 }, 23568c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x6C }, 23578c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x11 }, 23588c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23598c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x6F }, 23608c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x97 }, 23618c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x0F }, 23628c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x6F }, 23638c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x97 }, 23648c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x0F }, 23658c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x12 }, 23668c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23678c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xCB }, 23688c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xB8 }, 23698c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x94 }, 23708c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xCB }, 23718c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xB8 }, 23728c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x94 }, 23738c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x13 }, 23748c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23758c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 23768c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 23778c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 23788c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 23798c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 23808c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 23818c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x14 }, 23828c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23838c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x95 }, 23848c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x76 }, 23858c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x5B }, 23868c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x95 }, 23878c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x76 }, 23888c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x5B }, 23898c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x15 }, 23908c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23918c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x31 }, 23928c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xAC }, 23938c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x31 }, 23948c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x31 }, 23958c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xAC }, 23968c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x31 }, 23978c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x16 }, 23988c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 23998c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x6A }, 24008c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x89 }, 24018c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xA5 }, 24028c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x6A }, 24038c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x89 }, 24048c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xA5 }, 24058c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x17 }, 24068c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24078c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xCE }, 24088c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x53 }, 24098c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xCF }, 24108c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xCE }, 24118c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x53 }, 24128c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xCF }, 24138c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x18 }, 24148c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24158c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 24168c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 24178c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 24188c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 24198c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 24208c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 24218c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x19 }, 24228c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24238c2ecf20Sopenharmony_ci /* 48KHz base */ 24248c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 24258c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x88 }, 24268c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xDC }, 24278c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 24288c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x88 }, 24298c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xDC }, 24308c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x1A }, 24318c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24328c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x82 }, 24338c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xEE }, 24348c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x46 }, 24358c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x82 }, 24368c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xEE }, 24378c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x46 }, 24388c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x1B }, 24398c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24408c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 24418c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x88 }, 24428c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xDC }, 24438c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 24448c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x88 }, 24458c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xDC }, 24468c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x1C }, 24478c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24488c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x7D }, 24498c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x09 }, 24508c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x28 }, 24518c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x7D }, 24528c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x09 }, 24538c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x28 }, 24548c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x1D }, 24558c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24568c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xC2 }, 24578c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xE5 }, 24588c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xB4 }, 24598c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xC2 }, 24608c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xE5 }, 24618c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xB4 }, 24628c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x1E }, 24638c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24648c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 24658c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xA3 }, 24668c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x1F }, 24678c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 24688c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xA3 }, 24698c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x1F }, 24708c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x1F }, 24718c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24728c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x84 }, 24738c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xCA }, 24748c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xF1 }, 24758c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x84 }, 24768c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xCA }, 24778c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xF1 }, 24788c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x20 }, 24798c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24808c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3C }, 24818c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xD5 }, 24828c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x9C }, 24838c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3C }, 24848c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xD5 }, 24858c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x9C }, 24868c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x21 }, 24878c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24888c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x7B }, 24898c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x35 }, 24908c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x0F }, 24918c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x7B }, 24928c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x35 }, 24938c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x0F }, 24948c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x22 }, 24958c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 24968c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xC4 }, 24978c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x87 }, 24988c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x45 }, 24998c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xC4 }, 25008c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x87 }, 25018c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x45 }, 25028c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x23 }, 25038c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25048c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3E }, 25058c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x0A }, 25068c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x78 }, 25078c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3E }, 25088c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x0A }, 25098c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x78 }, 25108c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x24 }, 25118c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25128c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x88 }, 25138c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xE2 }, 25148c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x05 }, 25158c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x88 }, 25168c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xE2 }, 25178c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x05 }, 25188c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x25 }, 25198c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25208c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x3A }, 25218c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x1A }, 25228c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xA3 }, 25238c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x3A }, 25248c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x1A }, 25258c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xA3 }, 25268c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x26 }, 25278c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25288c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x77 }, 25298c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x1D }, 25308c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xFB }, 25318c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x77 }, 25328c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x1D }, 25338c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xFB }, 25348c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x27 }, 25358c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25368c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xC7 }, 25378c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xDA }, 25388c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xE5 }, 25398c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xC7 }, 25408c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xDA }, 25418c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xE5 }, 25428c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x28 }, 25438c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25448c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 25458c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 25468c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 25478c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 25488c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 25498c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 25508c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x29 }, 25518c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25528c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x8E }, 25538c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xD7 }, 25548c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x22 }, 25558c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x8E }, 25568c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xD7 }, 25578c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x22 }, 25588c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x2A }, 25598c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25608c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x35 }, 25618c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x26 }, 25628c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xC6 }, 25638c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x35 }, 25648c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x26 }, 25658c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xC6 }, 25668c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x2B }, 25678c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25688c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x71 }, 25698c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x28 }, 25708c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xDE }, 25718c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x71 }, 25728c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x28 }, 25738c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xDE }, 25748c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x2C }, 25758c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25768c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xCA }, 25778c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xD9 }, 25788c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x3A }, 25798c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xCA }, 25808c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xD9 }, 25818c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x3A }, 25828c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x2D }, 25838c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25848c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 25858c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 25868c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 25878c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 25888c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 25898c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 25908c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x2E }, 25918c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 25928c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x93 }, 25938c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x5E }, 25948c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xD8 }, 25958c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x93 }, 25968c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x5E }, 25978c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xD8 }, 25988c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x2F }, 25998c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 26008c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x32 }, 26018c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xB7 }, 26028c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0xB1 }, 26038c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x32 }, 26048c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xB7 }, 26058c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0xB1 }, 26068c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x30 }, 26078c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 26088c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x6C }, 26098c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0xA1 }, 26108c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x28 }, 26118c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x6C }, 26128c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0xA1 }, 26138c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x28 }, 26148c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x31 }, 26158c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 26168c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0xCD }, 26178c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x48 }, 26188c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x4F }, 26198c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0xCD }, 26208c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x48 }, 26218c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x4F }, 26228c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x32 }, 26238c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 26248c2ecf20Sopenharmony_ci { 0x22, 0x7A6, 0x40 }, 26258c2ecf20Sopenharmony_ci { 0x22, 0x7A7, 0x00 }, 26268c2ecf20Sopenharmony_ci { 0x22, 0x7A8, 0x00 }, 26278c2ecf20Sopenharmony_ci { 0x22, 0x7A9, 0x40 }, 26288c2ecf20Sopenharmony_ci { 0x22, 0x7AA, 0x00 }, 26298c2ecf20Sopenharmony_ci { 0x22, 0x7AB, 0x00 }, 26308c2ecf20Sopenharmony_ci { 0x22, 0x7AC, 0x33 }, 26318c2ecf20Sopenharmony_ci { 0x22, 0x7AD, 0x80 }, 26328c2ecf20Sopenharmony_ci /* common */ 26338c2ecf20Sopenharmony_ci { 0x22, 0x782, 0xC1 }, 26348c2ecf20Sopenharmony_ci { 0x22, 0x771, 0x2C }, 26358c2ecf20Sopenharmony_ci { 0x22, 0x772, 0x2C }, 26368c2ecf20Sopenharmony_ci { 0x22, 0x788, 0x04 }, 26378c2ecf20Sopenharmony_ci { 0x01, 0x7B0, 0x08 }, 26388c2ecf20Sopenharmony_ci {} 26398c2ecf20Sopenharmony_ci}; 26408c2ecf20Sopenharmony_ci 26418c2ecf20Sopenharmony_cistatic const struct hda_fixup stac92hd83xxx_fixups[] = { 26428c2ecf20Sopenharmony_ci [STAC_92HD83XXX_REF] = { 26438c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 26448c2ecf20Sopenharmony_ci .v.pins = ref92hd83xxx_pin_configs, 26458c2ecf20Sopenharmony_ci }, 26468c2ecf20Sopenharmony_ci [STAC_92HD83XXX_PWR_REF] = { 26478c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 26488c2ecf20Sopenharmony_ci .v.pins = ref92hd83xxx_pin_configs, 26498c2ecf20Sopenharmony_ci }, 26508c2ecf20Sopenharmony_ci [STAC_DELL_S14] = { 26518c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 26528c2ecf20Sopenharmony_ci .v.pins = dell_s14_pin_configs, 26538c2ecf20Sopenharmony_ci }, 26548c2ecf20Sopenharmony_ci [STAC_DELL_VOSTRO_3500] = { 26558c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 26568c2ecf20Sopenharmony_ci .v.pins = dell_vostro_3500_pin_configs, 26578c2ecf20Sopenharmony_ci }, 26588c2ecf20Sopenharmony_ci [STAC_92HD83XXX_HP_cNB11_INTQUAD] = { 26598c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 26608c2ecf20Sopenharmony_ci .v.pins = hp_cNB11_intquad_pin_configs, 26618c2ecf20Sopenharmony_ci .chained = true, 26628c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 26638c2ecf20Sopenharmony_ci }, 26648c2ecf20Sopenharmony_ci [STAC_92HD83XXX_HP] = { 26658c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 26668c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp, 26678c2ecf20Sopenharmony_ci }, 26688c2ecf20Sopenharmony_ci [STAC_HP_DV7_4000] = { 26698c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 26708c2ecf20Sopenharmony_ci .v.pins = hp_dv7_4000_pin_configs, 26718c2ecf20Sopenharmony_ci .chained = true, 26728c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 26738c2ecf20Sopenharmony_ci }, 26748c2ecf20Sopenharmony_ci [STAC_HP_ZEPHYR] = { 26758c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 26768c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_zephyr, 26778c2ecf20Sopenharmony_ci .chained = true, 26788c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 26798c2ecf20Sopenharmony_ci }, 26808c2ecf20Sopenharmony_ci [STAC_92HD83XXX_HP_LED] = { 26818c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 26828c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_led, 26838c2ecf20Sopenharmony_ci .chained = true, 26848c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 26858c2ecf20Sopenharmony_ci }, 26868c2ecf20Sopenharmony_ci [STAC_92HD83XXX_HP_INV_LED] = { 26878c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 26888c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_inv_led, 26898c2ecf20Sopenharmony_ci .chained = true, 26908c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 26918c2ecf20Sopenharmony_ci }, 26928c2ecf20Sopenharmony_ci [STAC_92HD83XXX_HP_MIC_LED] = { 26938c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 26948c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_mic_led, 26958c2ecf20Sopenharmony_ci .chained = true, 26968c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 26978c2ecf20Sopenharmony_ci }, 26988c2ecf20Sopenharmony_ci [STAC_HP_LED_GPIO10] = { 26998c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 27008c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_hp_led_gpio10, 27018c2ecf20Sopenharmony_ci .chained = true, 27028c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP, 27038c2ecf20Sopenharmony_ci }, 27048c2ecf20Sopenharmony_ci [STAC_92HD83XXX_HEADSET_JACK] = { 27058c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 27068c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_headset_jack, 27078c2ecf20Sopenharmony_ci }, 27088c2ecf20Sopenharmony_ci [STAC_HP_ENVY_BASS] = { 27098c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 27108c2ecf20Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 27118c2ecf20Sopenharmony_ci { 0x0f, 0x90170111 }, 27128c2ecf20Sopenharmony_ci {} 27138c2ecf20Sopenharmony_ci }, 27148c2ecf20Sopenharmony_ci }, 27158c2ecf20Sopenharmony_ci [STAC_HP_BNB13_EQ] = { 27168c2ecf20Sopenharmony_ci .type = HDA_FIXUP_VERBS, 27178c2ecf20Sopenharmony_ci .v.verbs = hp_bnb13_eq_verbs, 27188c2ecf20Sopenharmony_ci .chained = true, 27198c2ecf20Sopenharmony_ci .chain_id = STAC_92HD83XXX_HP_MIC_LED, 27208c2ecf20Sopenharmony_ci }, 27218c2ecf20Sopenharmony_ci [STAC_HP_ENVY_TS_BASS] = { 27228c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 27238c2ecf20Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 27248c2ecf20Sopenharmony_ci { 0x10, 0x92170111 }, 27258c2ecf20Sopenharmony_ci {} 27268c2ecf20Sopenharmony_ci }, 27278c2ecf20Sopenharmony_ci }, 27288c2ecf20Sopenharmony_ci [STAC_HP_ENVY_TS_DAC_BIND] = { 27298c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 27308c2ecf20Sopenharmony_ci .v.func = hp_envy_ts_fixup_dac_bind, 27318c2ecf20Sopenharmony_ci .chained = true, 27328c2ecf20Sopenharmony_ci .chain_id = STAC_HP_ENVY_TS_BASS, 27338c2ecf20Sopenharmony_ci }, 27348c2ecf20Sopenharmony_ci [STAC_92HD83XXX_GPIO10_EAPD] = { 27358c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 27368c2ecf20Sopenharmony_ci .v.func = stac92hd83xxx_fixup_gpio10_eapd, 27378c2ecf20Sopenharmony_ci }, 27388c2ecf20Sopenharmony_ci}; 27398c2ecf20Sopenharmony_ci 27408c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac92hd83xxx_models[] = { 27418c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_REF, .name = "ref" }, 27428c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_PWR_REF, .name = "mic-ref" }, 27438c2ecf20Sopenharmony_ci { .id = STAC_DELL_S14, .name = "dell-s14" }, 27448c2ecf20Sopenharmony_ci { .id = STAC_DELL_VOSTRO_3500, .name = "dell-vostro-3500" }, 27458c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_HP_cNB11_INTQUAD, .name = "hp_cNB11_intquad" }, 27468c2ecf20Sopenharmony_ci { .id = STAC_HP_DV7_4000, .name = "hp-dv7-4000" }, 27478c2ecf20Sopenharmony_ci { .id = STAC_HP_ZEPHYR, .name = "hp-zephyr" }, 27488c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_HP_LED, .name = "hp-led" }, 27498c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_HP_INV_LED, .name = "hp-inv-led" }, 27508c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_HP_MIC_LED, .name = "hp-mic-led" }, 27518c2ecf20Sopenharmony_ci { .id = STAC_92HD83XXX_HEADSET_JACK, .name = "headset-jack" }, 27528c2ecf20Sopenharmony_ci { .id = STAC_HP_ENVY_BASS, .name = "hp-envy-bass" }, 27538c2ecf20Sopenharmony_ci { .id = STAC_HP_BNB13_EQ, .name = "hp-bnb13-eq" }, 27548c2ecf20Sopenharmony_ci { .id = STAC_HP_ENVY_TS_BASS, .name = "hp-envy-ts-bass" }, 27558c2ecf20Sopenharmony_ci {} 27568c2ecf20Sopenharmony_ci}; 27578c2ecf20Sopenharmony_ci 27588c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { 27598c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 27608c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 27618c2ecf20Sopenharmony_ci "DFI LanParty", STAC_92HD83XXX_REF), 27628c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 27638c2ecf20Sopenharmony_ci "DFI LanParty", STAC_92HD83XXX_REF), 27648c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, 27658c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_S14), 27668c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0532, 27678c2ecf20Sopenharmony_ci "Dell Latitude E6230", STAC_92HD83XXX_HEADSET_JACK), 27688c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0533, 27698c2ecf20Sopenharmony_ci "Dell Latitude E6330", STAC_92HD83XXX_HEADSET_JACK), 27708c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0534, 27718c2ecf20Sopenharmony_ci "Dell Latitude E6430", STAC_92HD83XXX_HEADSET_JACK), 27728c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0535, 27738c2ecf20Sopenharmony_ci "Dell Latitude E6530", STAC_92HD83XXX_HEADSET_JACK), 27748c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x053c, 27758c2ecf20Sopenharmony_ci "Dell Latitude E5430", STAC_92HD83XXX_HEADSET_JACK), 27768c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x053d, 27778c2ecf20Sopenharmony_ci "Dell Latitude E5530", STAC_92HD83XXX_HEADSET_JACK), 27788c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0549, 27798c2ecf20Sopenharmony_ci "Dell Latitude E5430", STAC_92HD83XXX_HEADSET_JACK), 27808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x057d, 27818c2ecf20Sopenharmony_ci "Dell Latitude E6430s", STAC_92HD83XXX_HEADSET_JACK), 27828c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0584, 27838c2ecf20Sopenharmony_ci "Dell Latitude E6430U", STAC_92HD83XXX_HEADSET_JACK), 27848c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028, 27858c2ecf20Sopenharmony_ci "Dell Vostro 3500", STAC_DELL_VOSTRO_3500), 27868c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656, 27878c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 27888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657, 27898c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 27908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658, 27918c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 27928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659, 27938c2ecf20Sopenharmony_ci "HP Pavilion dv7", STAC_HP_DV7_4000), 27948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A, 27958c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 27968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B, 27978c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 27988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888, 27998c2ecf20Sopenharmony_ci "HP Envy Spectre", STAC_HP_ENVY_BASS), 28008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1899, 28018c2ecf20Sopenharmony_ci "HP Folio 13", STAC_HP_LED_GPIO10), 28028c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df, 28038c2ecf20Sopenharmony_ci "HP Folio", STAC_HP_BNB13_EQ), 28048c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8, 28058c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28068c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1909, 28078c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28088c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190A, 28098c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28108c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190e, 28118c2ecf20Sopenharmony_ci "HP ENVY TS", STAC_HP_ENVY_TS_BASS), 28128c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1967, 28138c2ecf20Sopenharmony_ci "HP ENVY TS", STAC_HP_ENVY_TS_DAC_BIND), 28148c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940, 28158c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28168c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941, 28178c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28188c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1942, 28198c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28208c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1943, 28218c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28228c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1944, 28238c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28248c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1945, 28258c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28268c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1946, 28278c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28288c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1948, 28298c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28308c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1949, 28318c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28328c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194A, 28338c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28348c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194B, 28358c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28368c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194C, 28378c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28388c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194E, 28398c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28408c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194F, 28418c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28428c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1950, 28438c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28448c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1951, 28458c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28468c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195A, 28478c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28488c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195B, 28498c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28508c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195C, 28518c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28528c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1991, 28538c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28548c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2103, 28558c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28568c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2104, 28578c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28588c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2105, 28598c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28608c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2106, 28618c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28628c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2107, 28638c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28648c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2108, 28658c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28668c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2109, 28678c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28688c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210A, 28698c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28708c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210B, 28718c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28728c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211C, 28738c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28748c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211D, 28758c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28768c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211E, 28778c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28788c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211F, 28798c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2120, 28818c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28828c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2121, 28838c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28848c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2122, 28858c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28868c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2123, 28878c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213E, 28898c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213F, 28918c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2140, 28938c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B2, 28958c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B3, 28978c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 28988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B5, 28998c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 29008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B6, 29018c2ecf20Sopenharmony_ci "HP bNB13", STAC_HP_BNB13_EQ), 29028c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x1900, 29038c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_MIC_LED), 29048c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2000, 29058c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_MIC_LED), 29068c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2100, 29078c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_MIC_LED), 29088c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3388, 29098c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29108c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3389, 29118c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29128c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355B, 29138c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29148c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355C, 29158c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29168c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355D, 29178c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29188c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355E, 29198c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29208c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355F, 29218c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29228c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3560, 29238c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29248c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358B, 29258c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29268c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358C, 29278c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29288c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358D, 29298c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29308c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3591, 29318c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29328c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3592, 29338c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29348c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3593, 29358c2ecf20Sopenharmony_ci "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 29368c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3561, 29378c2ecf20Sopenharmony_ci "HP", STAC_HP_ZEPHYR), 29388c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3660, 29398c2ecf20Sopenharmony_ci "HP Mini", STAC_92HD83XXX_HP_LED), 29408c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x144E, 29418c2ecf20Sopenharmony_ci "HP Pavilion dv5", STAC_92HD83XXX_HP_INV_LED), 29428c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a, 29438c2ecf20Sopenharmony_ci "HP Mini", STAC_92HD83XXX_HP_LED), 29448c2ecf20Sopenharmony_ci SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP), 29458c2ecf20Sopenharmony_ci /* match both for 0xfa91 and 0xfa93 */ 29468c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_TOSHIBA, 0xfffd, 0xfa91, 29478c2ecf20Sopenharmony_ci "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD), 29488c2ecf20Sopenharmony_ci {} /* terminator */ 29498c2ecf20Sopenharmony_ci}; 29508c2ecf20Sopenharmony_ci 29518c2ecf20Sopenharmony_ci/* HP dv7 bass switch - GPIO5 */ 29528c2ecf20Sopenharmony_ci#define stac_hp_bass_gpio_info snd_ctl_boolean_mono_info 29538c2ecf20Sopenharmony_cistatic int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol, 29548c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 29558c2ecf20Sopenharmony_ci{ 29568c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 29578c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 29588c2ecf20Sopenharmony_ci ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20); 29598c2ecf20Sopenharmony_ci return 0; 29608c2ecf20Sopenharmony_ci} 29618c2ecf20Sopenharmony_ci 29628c2ecf20Sopenharmony_cistatic int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol, 29638c2ecf20Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 29648c2ecf20Sopenharmony_ci{ 29658c2ecf20Sopenharmony_ci struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 29668c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 29678c2ecf20Sopenharmony_ci unsigned int gpio_data; 29688c2ecf20Sopenharmony_ci 29698c2ecf20Sopenharmony_ci gpio_data = (spec->gpio_data & ~0x20) | 29708c2ecf20Sopenharmony_ci (ucontrol->value.integer.value[0] ? 0x20 : 0); 29718c2ecf20Sopenharmony_ci if (gpio_data == spec->gpio_data) 29728c2ecf20Sopenharmony_ci return 0; 29738c2ecf20Sopenharmony_ci spec->gpio_data = gpio_data; 29748c2ecf20Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 29758c2ecf20Sopenharmony_ci return 1; 29768c2ecf20Sopenharmony_ci} 29778c2ecf20Sopenharmony_ci 29788c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new stac_hp_bass_sw_ctrl = { 29798c2ecf20Sopenharmony_ci .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 29808c2ecf20Sopenharmony_ci .info = stac_hp_bass_gpio_info, 29818c2ecf20Sopenharmony_ci .get = stac_hp_bass_gpio_get, 29828c2ecf20Sopenharmony_ci .put = stac_hp_bass_gpio_put, 29838c2ecf20Sopenharmony_ci}; 29848c2ecf20Sopenharmony_ci 29858c2ecf20Sopenharmony_cistatic int stac_add_hp_bass_switch(struct hda_codec *codec) 29868c2ecf20Sopenharmony_ci{ 29878c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 29888c2ecf20Sopenharmony_ci 29898c2ecf20Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, "Bass Speaker Playback Switch", 29908c2ecf20Sopenharmony_ci &stac_hp_bass_sw_ctrl)) 29918c2ecf20Sopenharmony_ci return -ENOMEM; 29928c2ecf20Sopenharmony_ci 29938c2ecf20Sopenharmony_ci spec->gpio_mask |= 0x20; 29948c2ecf20Sopenharmony_ci spec->gpio_dir |= 0x20; 29958c2ecf20Sopenharmony_ci spec->gpio_data |= 0x20; 29968c2ecf20Sopenharmony_ci return 0; 29978c2ecf20Sopenharmony_ci} 29988c2ecf20Sopenharmony_ci 29998c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref92hd71bxx_pin_configs[] = { 30008c2ecf20Sopenharmony_ci { 0x0a, 0x02214030 }, 30018c2ecf20Sopenharmony_ci { 0x0b, 0x02a19040 }, 30028c2ecf20Sopenharmony_ci { 0x0c, 0x01a19020 }, 30038c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 30048c2ecf20Sopenharmony_ci { 0x0e, 0x0181302e }, 30058c2ecf20Sopenharmony_ci { 0x0f, 0x01014010 }, 30068c2ecf20Sopenharmony_ci { 0x14, 0x01019020 }, 30078c2ecf20Sopenharmony_ci { 0x18, 0x90a000f0 }, 30088c2ecf20Sopenharmony_ci { 0x19, 0x90a000f0 }, 30098c2ecf20Sopenharmony_ci { 0x1e, 0x01452050 }, 30108c2ecf20Sopenharmony_ci { 0x1f, 0x01452050 }, 30118c2ecf20Sopenharmony_ci {} 30128c2ecf20Sopenharmony_ci}; 30138c2ecf20Sopenharmony_ci 30148c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_m4_1_pin_configs[] = { 30158c2ecf20Sopenharmony_ci { 0x0a, 0x0421101f }, 30168c2ecf20Sopenharmony_ci { 0x0b, 0x04a11221 }, 30178c2ecf20Sopenharmony_ci { 0x0c, 0x40f000f0 }, 30188c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 30198c2ecf20Sopenharmony_ci { 0x0e, 0x23a1902e }, 30208c2ecf20Sopenharmony_ci { 0x0f, 0x23014250 }, 30218c2ecf20Sopenharmony_ci { 0x14, 0x40f000f0 }, 30228c2ecf20Sopenharmony_ci { 0x18, 0x90a000f0 }, 30238c2ecf20Sopenharmony_ci { 0x19, 0x40f000f0 }, 30248c2ecf20Sopenharmony_ci { 0x1e, 0x4f0000f0 }, 30258c2ecf20Sopenharmony_ci { 0x1f, 0x4f0000f0 }, 30268c2ecf20Sopenharmony_ci {} 30278c2ecf20Sopenharmony_ci}; 30288c2ecf20Sopenharmony_ci 30298c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_m4_2_pin_configs[] = { 30308c2ecf20Sopenharmony_ci { 0x0a, 0x0421101f }, 30318c2ecf20Sopenharmony_ci { 0x0b, 0x04a11221 }, 30328c2ecf20Sopenharmony_ci { 0x0c, 0x90a70330 }, 30338c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 30348c2ecf20Sopenharmony_ci { 0x0e, 0x23a1902e }, 30358c2ecf20Sopenharmony_ci { 0x0f, 0x23014250 }, 30368c2ecf20Sopenharmony_ci { 0x14, 0x40f000f0 }, 30378c2ecf20Sopenharmony_ci { 0x18, 0x40f000f0 }, 30388c2ecf20Sopenharmony_ci { 0x19, 0x40f000f0 }, 30398c2ecf20Sopenharmony_ci { 0x1e, 0x044413b0 }, 30408c2ecf20Sopenharmony_ci { 0x1f, 0x044413b0 }, 30418c2ecf20Sopenharmony_ci {} 30428c2ecf20Sopenharmony_ci}; 30438c2ecf20Sopenharmony_ci 30448c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_m4_3_pin_configs[] = { 30458c2ecf20Sopenharmony_ci { 0x0a, 0x0421101f }, 30468c2ecf20Sopenharmony_ci { 0x0b, 0x04a11221 }, 30478c2ecf20Sopenharmony_ci { 0x0c, 0x90a70330 }, 30488c2ecf20Sopenharmony_ci { 0x0d, 0x90170110 }, 30498c2ecf20Sopenharmony_ci { 0x0e, 0x40f000f0 }, 30508c2ecf20Sopenharmony_ci { 0x0f, 0x40f000f0 }, 30518c2ecf20Sopenharmony_ci { 0x14, 0x40f000f0 }, 30528c2ecf20Sopenharmony_ci { 0x18, 0x90a000f0 }, 30538c2ecf20Sopenharmony_ci { 0x19, 0x40f000f0 }, 30548c2ecf20Sopenharmony_ci { 0x1e, 0x044413b0 }, 30558c2ecf20Sopenharmony_ci { 0x1f, 0x044413b0 }, 30568c2ecf20Sopenharmony_ci {} 30578c2ecf20Sopenharmony_ci}; 30588c2ecf20Sopenharmony_ci 30598c2ecf20Sopenharmony_cistatic void stac92hd71bxx_fixup_ref(struct hda_codec *codec, 30608c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 30618c2ecf20Sopenharmony_ci{ 30628c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 30638c2ecf20Sopenharmony_ci 30648c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 30658c2ecf20Sopenharmony_ci return; 30668c2ecf20Sopenharmony_ci 30678c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref92hd71bxx_pin_configs); 30688c2ecf20Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0; 30698c2ecf20Sopenharmony_ci} 30708c2ecf20Sopenharmony_ci 30718c2ecf20Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_m4(struct hda_codec *codec, 30728c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 30738c2ecf20Sopenharmony_ci{ 30748c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 30758c2ecf20Sopenharmony_ci struct hda_jack_callback *jack; 30768c2ecf20Sopenharmony_ci 30778c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 30788c2ecf20Sopenharmony_ci return; 30798c2ecf20Sopenharmony_ci 30808c2ecf20Sopenharmony_ci /* Enable VREF power saving on GPIO1 detect */ 30818c2ecf20Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 30828c2ecf20Sopenharmony_ci AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); 30838c2ecf20Sopenharmony_ci jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg, 30848c2ecf20Sopenharmony_ci stac_vref_event); 30858c2ecf20Sopenharmony_ci if (!IS_ERR(jack)) 30868c2ecf20Sopenharmony_ci jack->private_data = 0x02; 30878c2ecf20Sopenharmony_ci 30888c2ecf20Sopenharmony_ci spec->gpio_mask |= 0x02; 30898c2ecf20Sopenharmony_ci 30908c2ecf20Sopenharmony_ci /* enable internal microphone */ 30918c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040); 30928c2ecf20Sopenharmony_ci} 30938c2ecf20Sopenharmony_ci 30948c2ecf20Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_dv4(struct hda_codec *codec, 30958c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 30968c2ecf20Sopenharmony_ci{ 30978c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 30988c2ecf20Sopenharmony_ci 30998c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 31008c2ecf20Sopenharmony_ci return; 31018c2ecf20Sopenharmony_ci spec->gpio_led = 0x01; 31028c2ecf20Sopenharmony_ci} 31038c2ecf20Sopenharmony_ci 31048c2ecf20Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_dv5(struct hda_codec *codec, 31058c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 31068c2ecf20Sopenharmony_ci{ 31078c2ecf20Sopenharmony_ci unsigned int cap; 31088c2ecf20Sopenharmony_ci 31098c2ecf20Sopenharmony_ci switch (action) { 31108c2ecf20Sopenharmony_ci case HDA_FIXUP_ACT_PRE_PROBE: 31118c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); 31128c2ecf20Sopenharmony_ci break; 31138c2ecf20Sopenharmony_ci 31148c2ecf20Sopenharmony_ci case HDA_FIXUP_ACT_PROBE: 31158c2ecf20Sopenharmony_ci /* enable bass on HP dv7 */ 31168c2ecf20Sopenharmony_ci cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP); 31178c2ecf20Sopenharmony_ci cap &= AC_GPIO_IO_COUNT; 31188c2ecf20Sopenharmony_ci if (cap >= 6) 31198c2ecf20Sopenharmony_ci stac_add_hp_bass_switch(codec); 31208c2ecf20Sopenharmony_ci break; 31218c2ecf20Sopenharmony_ci } 31228c2ecf20Sopenharmony_ci} 31238c2ecf20Sopenharmony_ci 31248c2ecf20Sopenharmony_cistatic void stac92hd71bxx_fixup_hp_hdx(struct hda_codec *codec, 31258c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 31268c2ecf20Sopenharmony_ci{ 31278c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 31288c2ecf20Sopenharmony_ci 31298c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 31308c2ecf20Sopenharmony_ci return; 31318c2ecf20Sopenharmony_ci spec->gpio_led = 0x08; 31328c2ecf20Sopenharmony_ci} 31338c2ecf20Sopenharmony_ci 31348c2ecf20Sopenharmony_cistatic bool is_hp_output(struct hda_codec *codec, hda_nid_t pin) 31358c2ecf20Sopenharmony_ci{ 31368c2ecf20Sopenharmony_ci unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin); 31378c2ecf20Sopenharmony_ci 31388c2ecf20Sopenharmony_ci /* count line-out, too, as BIOS sets often so */ 31398c2ecf20Sopenharmony_ci return get_defcfg_connect(pin_cfg) != AC_JACK_PORT_NONE && 31408c2ecf20Sopenharmony_ci (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || 31418c2ecf20Sopenharmony_ci get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT); 31428c2ecf20Sopenharmony_ci} 31438c2ecf20Sopenharmony_ci 31448c2ecf20Sopenharmony_cistatic void fixup_hp_headphone(struct hda_codec *codec, hda_nid_t pin) 31458c2ecf20Sopenharmony_ci{ 31468c2ecf20Sopenharmony_ci unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin); 31478c2ecf20Sopenharmony_ci 31488c2ecf20Sopenharmony_ci /* It was changed in the BIOS to just satisfy MS DTM. 31498c2ecf20Sopenharmony_ci * Lets turn it back into follower HP 31508c2ecf20Sopenharmony_ci */ 31518c2ecf20Sopenharmony_ci pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) | 31528c2ecf20Sopenharmony_ci (AC_JACK_HP_OUT << AC_DEFCFG_DEVICE_SHIFT); 31538c2ecf20Sopenharmony_ci pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | AC_DEFCFG_SEQUENCE))) | 31548c2ecf20Sopenharmony_ci 0x1f; 31558c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, pin, pin_cfg); 31568c2ecf20Sopenharmony_ci} 31578c2ecf20Sopenharmony_ci 31588c2ecf20Sopenharmony_cistatic void stac92hd71bxx_fixup_hp(struct hda_codec *codec, 31598c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 31608c2ecf20Sopenharmony_ci{ 31618c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 31628c2ecf20Sopenharmony_ci 31638c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 31648c2ecf20Sopenharmony_ci return; 31658c2ecf20Sopenharmony_ci 31668c2ecf20Sopenharmony_ci /* when both output A and F are assigned, these are supposedly 31678c2ecf20Sopenharmony_ci * dock and built-in headphones; fix both pin configs 31688c2ecf20Sopenharmony_ci */ 31698c2ecf20Sopenharmony_ci if (is_hp_output(codec, 0x0a) && is_hp_output(codec, 0x0f)) { 31708c2ecf20Sopenharmony_ci fixup_hp_headphone(codec, 0x0a); 31718c2ecf20Sopenharmony_ci fixup_hp_headphone(codec, 0x0f); 31728c2ecf20Sopenharmony_ci } 31738c2ecf20Sopenharmony_ci 31748c2ecf20Sopenharmony_ci if (find_mute_led_cfg(codec, 1)) 31758c2ecf20Sopenharmony_ci codec_dbg(codec, "mute LED gpio %d polarity %d\n", 31768c2ecf20Sopenharmony_ci spec->gpio_led, 31778c2ecf20Sopenharmony_ci spec->gpio_led_polarity); 31788c2ecf20Sopenharmony_ci 31798c2ecf20Sopenharmony_ci} 31808c2ecf20Sopenharmony_ci 31818c2ecf20Sopenharmony_cistatic const struct hda_fixup stac92hd71bxx_fixups[] = { 31828c2ecf20Sopenharmony_ci [STAC_92HD71BXX_REF] = { 31838c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 31848c2ecf20Sopenharmony_ci .v.func = stac92hd71bxx_fixup_ref, 31858c2ecf20Sopenharmony_ci }, 31868c2ecf20Sopenharmony_ci [STAC_DELL_M4_1] = { 31878c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 31888c2ecf20Sopenharmony_ci .v.pins = dell_m4_1_pin_configs, 31898c2ecf20Sopenharmony_ci }, 31908c2ecf20Sopenharmony_ci [STAC_DELL_M4_2] = { 31918c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 31928c2ecf20Sopenharmony_ci .v.pins = dell_m4_2_pin_configs, 31938c2ecf20Sopenharmony_ci }, 31948c2ecf20Sopenharmony_ci [STAC_DELL_M4_3] = { 31958c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 31968c2ecf20Sopenharmony_ci .v.pins = dell_m4_3_pin_configs, 31978c2ecf20Sopenharmony_ci }, 31988c2ecf20Sopenharmony_ci [STAC_HP_M4] = { 31998c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 32008c2ecf20Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_m4, 32018c2ecf20Sopenharmony_ci .chained = true, 32028c2ecf20Sopenharmony_ci .chain_id = STAC_92HD71BXX_HP, 32038c2ecf20Sopenharmony_ci }, 32048c2ecf20Sopenharmony_ci [STAC_HP_DV4] = { 32058c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 32068c2ecf20Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_dv4, 32078c2ecf20Sopenharmony_ci .chained = true, 32088c2ecf20Sopenharmony_ci .chain_id = STAC_HP_DV5, 32098c2ecf20Sopenharmony_ci }, 32108c2ecf20Sopenharmony_ci [STAC_HP_DV5] = { 32118c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 32128c2ecf20Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_dv5, 32138c2ecf20Sopenharmony_ci .chained = true, 32148c2ecf20Sopenharmony_ci .chain_id = STAC_92HD71BXX_HP, 32158c2ecf20Sopenharmony_ci }, 32168c2ecf20Sopenharmony_ci [STAC_HP_HDX] = { 32178c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 32188c2ecf20Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp_hdx, 32198c2ecf20Sopenharmony_ci .chained = true, 32208c2ecf20Sopenharmony_ci .chain_id = STAC_92HD71BXX_HP, 32218c2ecf20Sopenharmony_ci }, 32228c2ecf20Sopenharmony_ci [STAC_92HD71BXX_HP] = { 32238c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 32248c2ecf20Sopenharmony_ci .v.func = stac92hd71bxx_fixup_hp, 32258c2ecf20Sopenharmony_ci }, 32268c2ecf20Sopenharmony_ci}; 32278c2ecf20Sopenharmony_ci 32288c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac92hd71bxx_models[] = { 32298c2ecf20Sopenharmony_ci { .id = STAC_92HD71BXX_REF, .name = "ref" }, 32308c2ecf20Sopenharmony_ci { .id = STAC_DELL_M4_1, .name = "dell-m4-1" }, 32318c2ecf20Sopenharmony_ci { .id = STAC_DELL_M4_2, .name = "dell-m4-2" }, 32328c2ecf20Sopenharmony_ci { .id = STAC_DELL_M4_3, .name = "dell-m4-3" }, 32338c2ecf20Sopenharmony_ci { .id = STAC_HP_M4, .name = "hp-m4" }, 32348c2ecf20Sopenharmony_ci { .id = STAC_HP_DV4, .name = "hp-dv4" }, 32358c2ecf20Sopenharmony_ci { .id = STAC_HP_DV5, .name = "hp-dv5" }, 32368c2ecf20Sopenharmony_ci { .id = STAC_HP_HDX, .name = "hp-hdx" }, 32378c2ecf20Sopenharmony_ci { .id = STAC_HP_DV4, .name = "hp-dv4-1222nr" }, 32388c2ecf20Sopenharmony_ci {} 32398c2ecf20Sopenharmony_ci}; 32408c2ecf20Sopenharmony_ci 32418c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac92hd71bxx_fixup_tbl[] = { 32428c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 32438c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 32448c2ecf20Sopenharmony_ci "DFI LanParty", STAC_92HD71BXX_REF), 32458c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 32468c2ecf20Sopenharmony_ci "DFI LanParty", STAC_92HD71BXX_REF), 32478c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720, 32488c2ecf20Sopenharmony_ci "HP", STAC_HP_DV5), 32498c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, 32508c2ecf20Sopenharmony_ci "HP", STAC_HP_DV5), 32518c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, 32528c2ecf20Sopenharmony_ci "HP dv4-7", STAC_HP_DV4), 32538c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600, 32548c2ecf20Sopenharmony_ci "HP dv4-7", STAC_HP_DV5), 32558c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610, 32568c2ecf20Sopenharmony_ci "HP HDX", STAC_HP_HDX), /* HDX18 */ 32578c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, 32588c2ecf20Sopenharmony_ci "HP mini 1000", STAC_HP_M4), 32598c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b, 32608c2ecf20Sopenharmony_ci "HP HDX", STAC_HP_HDX), /* HDX16 */ 32618c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620, 32628c2ecf20Sopenharmony_ci "HP dv6", STAC_HP_DV5), 32638c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061, 32648c2ecf20Sopenharmony_ci "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */ 32658c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e, 32668c2ecf20Sopenharmony_ci "HP DV6", STAC_HP_DV5), 32678c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010, 32688c2ecf20Sopenharmony_ci "HP", STAC_HP_DV5), 32698c2ecf20Sopenharmony_ci SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD71BXX_HP), 32708c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, 32718c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32728c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234, 32738c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32748c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250, 32758c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32768c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f, 32778c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32788c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d, 32798c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251, 32818c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32828c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277, 32838c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_1), 32848c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263, 32858c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 32868c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265, 32878c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 32888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262, 32898c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 32908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, 32918c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_2), 32928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa, 32938c2ecf20Sopenharmony_ci "unknown Dell", STAC_DELL_M4_3), 32948c2ecf20Sopenharmony_ci {} /* terminator */ 32958c2ecf20Sopenharmony_ci}; 32968c2ecf20Sopenharmony_ci 32978c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref922x_pin_configs[] = { 32988c2ecf20Sopenharmony_ci { 0x0a, 0x01014010 }, 32998c2ecf20Sopenharmony_ci { 0x0b, 0x01016011 }, 33008c2ecf20Sopenharmony_ci { 0x0c, 0x01012012 }, 33018c2ecf20Sopenharmony_ci { 0x0d, 0x0221401f }, 33028c2ecf20Sopenharmony_ci { 0x0e, 0x01813122 }, 33038c2ecf20Sopenharmony_ci { 0x0f, 0x01011014 }, 33048c2ecf20Sopenharmony_ci { 0x10, 0x01441030 }, 33058c2ecf20Sopenharmony_ci { 0x11, 0x01c41030 }, 33068c2ecf20Sopenharmony_ci { 0x15, 0x40000100 }, 33078c2ecf20Sopenharmony_ci { 0x1b, 0x40000100 }, 33088c2ecf20Sopenharmony_ci {} 33098c2ecf20Sopenharmony_ci}; 33108c2ecf20Sopenharmony_ci 33118c2ecf20Sopenharmony_ci/* 33128c2ecf20Sopenharmony_ci STAC 922X pin configs for 33138c2ecf20Sopenharmony_ci 102801A7 33148c2ecf20Sopenharmony_ci 102801AB 33158c2ecf20Sopenharmony_ci 102801A9 33168c2ecf20Sopenharmony_ci 102801D1 33178c2ecf20Sopenharmony_ci 102801D2 33188c2ecf20Sopenharmony_ci*/ 33198c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_922x_d81_pin_configs[] = { 33208c2ecf20Sopenharmony_ci { 0x0a, 0x02214030 }, 33218c2ecf20Sopenharmony_ci { 0x0b, 0x01a19021 }, 33228c2ecf20Sopenharmony_ci { 0x0c, 0x01111012 }, 33238c2ecf20Sopenharmony_ci { 0x0d, 0x01114010 }, 33248c2ecf20Sopenharmony_ci { 0x0e, 0x02a19020 }, 33258c2ecf20Sopenharmony_ci { 0x0f, 0x01117011 }, 33268c2ecf20Sopenharmony_ci { 0x10, 0x400001f0 }, 33278c2ecf20Sopenharmony_ci { 0x11, 0x400001f1 }, 33288c2ecf20Sopenharmony_ci { 0x15, 0x01813122 }, 33298c2ecf20Sopenharmony_ci { 0x1b, 0x400001f2 }, 33308c2ecf20Sopenharmony_ci {} 33318c2ecf20Sopenharmony_ci}; 33328c2ecf20Sopenharmony_ci 33338c2ecf20Sopenharmony_ci/* 33348c2ecf20Sopenharmony_ci STAC 922X pin configs for 33358c2ecf20Sopenharmony_ci 102801AC 33368c2ecf20Sopenharmony_ci 102801D0 33378c2ecf20Sopenharmony_ci*/ 33388c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_922x_d82_pin_configs[] = { 33398c2ecf20Sopenharmony_ci { 0x0a, 0x02214030 }, 33408c2ecf20Sopenharmony_ci { 0x0b, 0x01a19021 }, 33418c2ecf20Sopenharmony_ci { 0x0c, 0x01111012 }, 33428c2ecf20Sopenharmony_ci { 0x0d, 0x01114010 }, 33438c2ecf20Sopenharmony_ci { 0x0e, 0x02a19020 }, 33448c2ecf20Sopenharmony_ci { 0x0f, 0x01117011 }, 33458c2ecf20Sopenharmony_ci { 0x10, 0x01451140 }, 33468c2ecf20Sopenharmony_ci { 0x11, 0x400001f0 }, 33478c2ecf20Sopenharmony_ci { 0x15, 0x01813122 }, 33488c2ecf20Sopenharmony_ci { 0x1b, 0x400001f1 }, 33498c2ecf20Sopenharmony_ci {} 33508c2ecf20Sopenharmony_ci}; 33518c2ecf20Sopenharmony_ci 33528c2ecf20Sopenharmony_ci/* 33538c2ecf20Sopenharmony_ci STAC 922X pin configs for 33548c2ecf20Sopenharmony_ci 102801BF 33558c2ecf20Sopenharmony_ci*/ 33568c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_922x_m81_pin_configs[] = { 33578c2ecf20Sopenharmony_ci { 0x0a, 0x0321101f }, 33588c2ecf20Sopenharmony_ci { 0x0b, 0x01112024 }, 33598c2ecf20Sopenharmony_ci { 0x0c, 0x01111222 }, 33608c2ecf20Sopenharmony_ci { 0x0d, 0x91174220 }, 33618c2ecf20Sopenharmony_ci { 0x0e, 0x03a11050 }, 33628c2ecf20Sopenharmony_ci { 0x0f, 0x01116221 }, 33638c2ecf20Sopenharmony_ci { 0x10, 0x90a70330 }, 33648c2ecf20Sopenharmony_ci { 0x11, 0x01452340 }, 33658c2ecf20Sopenharmony_ci { 0x15, 0x40C003f1 }, 33668c2ecf20Sopenharmony_ci { 0x1b, 0x405003f0 }, 33678c2ecf20Sopenharmony_ci {} 33688c2ecf20Sopenharmony_ci}; 33698c2ecf20Sopenharmony_ci 33708c2ecf20Sopenharmony_ci/* 33718c2ecf20Sopenharmony_ci STAC 9221 A1 pin configs for 33728c2ecf20Sopenharmony_ci 102801D7 (Dell XPS M1210) 33738c2ecf20Sopenharmony_ci*/ 33748c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_922x_m82_pin_configs[] = { 33758c2ecf20Sopenharmony_ci { 0x0a, 0x02211211 }, 33768c2ecf20Sopenharmony_ci { 0x0b, 0x408103ff }, 33778c2ecf20Sopenharmony_ci { 0x0c, 0x02a1123e }, 33788c2ecf20Sopenharmony_ci { 0x0d, 0x90100310 }, 33798c2ecf20Sopenharmony_ci { 0x0e, 0x408003f1 }, 33808c2ecf20Sopenharmony_ci { 0x0f, 0x0221121f }, 33818c2ecf20Sopenharmony_ci { 0x10, 0x03451340 }, 33828c2ecf20Sopenharmony_ci { 0x11, 0x40c003f2 }, 33838c2ecf20Sopenharmony_ci { 0x15, 0x508003f3 }, 33848c2ecf20Sopenharmony_ci { 0x1b, 0x405003f4 }, 33858c2ecf20Sopenharmony_ci {} 33868c2ecf20Sopenharmony_ci}; 33878c2ecf20Sopenharmony_ci 33888c2ecf20Sopenharmony_cistatic const struct hda_pintbl d945gtp3_pin_configs[] = { 33898c2ecf20Sopenharmony_ci { 0x0a, 0x0221401f }, 33908c2ecf20Sopenharmony_ci { 0x0b, 0x01a19022 }, 33918c2ecf20Sopenharmony_ci { 0x0c, 0x01813021 }, 33928c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 33938c2ecf20Sopenharmony_ci { 0x0e, 0x40000100 }, 33948c2ecf20Sopenharmony_ci { 0x0f, 0x40000100 }, 33958c2ecf20Sopenharmony_ci { 0x10, 0x40000100 }, 33968c2ecf20Sopenharmony_ci { 0x11, 0x40000100 }, 33978c2ecf20Sopenharmony_ci { 0x15, 0x02a19120 }, 33988c2ecf20Sopenharmony_ci { 0x1b, 0x40000100 }, 33998c2ecf20Sopenharmony_ci {} 34008c2ecf20Sopenharmony_ci}; 34018c2ecf20Sopenharmony_ci 34028c2ecf20Sopenharmony_cistatic const struct hda_pintbl d945gtp5_pin_configs[] = { 34038c2ecf20Sopenharmony_ci { 0x0a, 0x0221401f }, 34048c2ecf20Sopenharmony_ci { 0x0b, 0x01011012 }, 34058c2ecf20Sopenharmony_ci { 0x0c, 0x01813024 }, 34068c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 34078c2ecf20Sopenharmony_ci { 0x0e, 0x01a19021 }, 34088c2ecf20Sopenharmony_ci { 0x0f, 0x01016011 }, 34098c2ecf20Sopenharmony_ci { 0x10, 0x01452130 }, 34108c2ecf20Sopenharmony_ci { 0x11, 0x40000100 }, 34118c2ecf20Sopenharmony_ci { 0x15, 0x02a19320 }, 34128c2ecf20Sopenharmony_ci { 0x1b, 0x40000100 }, 34138c2ecf20Sopenharmony_ci {} 34148c2ecf20Sopenharmony_ci}; 34158c2ecf20Sopenharmony_ci 34168c2ecf20Sopenharmony_cistatic const struct hda_pintbl intel_mac_v1_pin_configs[] = { 34178c2ecf20Sopenharmony_ci { 0x0a, 0x0121e21f }, 34188c2ecf20Sopenharmony_ci { 0x0b, 0x400000ff }, 34198c2ecf20Sopenharmony_ci { 0x0c, 0x9017e110 }, 34208c2ecf20Sopenharmony_ci { 0x0d, 0x400000fd }, 34218c2ecf20Sopenharmony_ci { 0x0e, 0x400000fe }, 34228c2ecf20Sopenharmony_ci { 0x0f, 0x0181e020 }, 34238c2ecf20Sopenharmony_ci { 0x10, 0x1145e030 }, 34248c2ecf20Sopenharmony_ci { 0x11, 0x11c5e240 }, 34258c2ecf20Sopenharmony_ci { 0x15, 0x400000fc }, 34268c2ecf20Sopenharmony_ci { 0x1b, 0x400000fb }, 34278c2ecf20Sopenharmony_ci {} 34288c2ecf20Sopenharmony_ci}; 34298c2ecf20Sopenharmony_ci 34308c2ecf20Sopenharmony_cistatic const struct hda_pintbl intel_mac_v2_pin_configs[] = { 34318c2ecf20Sopenharmony_ci { 0x0a, 0x0121e21f }, 34328c2ecf20Sopenharmony_ci { 0x0b, 0x90a7012e }, 34338c2ecf20Sopenharmony_ci { 0x0c, 0x9017e110 }, 34348c2ecf20Sopenharmony_ci { 0x0d, 0x400000fd }, 34358c2ecf20Sopenharmony_ci { 0x0e, 0x400000fe }, 34368c2ecf20Sopenharmony_ci { 0x0f, 0x0181e020 }, 34378c2ecf20Sopenharmony_ci { 0x10, 0x1145e230 }, 34388c2ecf20Sopenharmony_ci { 0x11, 0x500000fa }, 34398c2ecf20Sopenharmony_ci { 0x15, 0x400000fc }, 34408c2ecf20Sopenharmony_ci { 0x1b, 0x400000fb }, 34418c2ecf20Sopenharmony_ci {} 34428c2ecf20Sopenharmony_ci}; 34438c2ecf20Sopenharmony_ci 34448c2ecf20Sopenharmony_cistatic const struct hda_pintbl intel_mac_v3_pin_configs[] = { 34458c2ecf20Sopenharmony_ci { 0x0a, 0x0121e21f }, 34468c2ecf20Sopenharmony_ci { 0x0b, 0x90a7012e }, 34478c2ecf20Sopenharmony_ci { 0x0c, 0x9017e110 }, 34488c2ecf20Sopenharmony_ci { 0x0d, 0x400000fd }, 34498c2ecf20Sopenharmony_ci { 0x0e, 0x400000fe }, 34508c2ecf20Sopenharmony_ci { 0x0f, 0x0181e020 }, 34518c2ecf20Sopenharmony_ci { 0x10, 0x1145e230 }, 34528c2ecf20Sopenharmony_ci { 0x11, 0x11c5e240 }, 34538c2ecf20Sopenharmony_ci { 0x15, 0x400000fc }, 34548c2ecf20Sopenharmony_ci { 0x1b, 0x400000fb }, 34558c2ecf20Sopenharmony_ci {} 34568c2ecf20Sopenharmony_ci}; 34578c2ecf20Sopenharmony_ci 34588c2ecf20Sopenharmony_cistatic const struct hda_pintbl intel_mac_v4_pin_configs[] = { 34598c2ecf20Sopenharmony_ci { 0x0a, 0x0321e21f }, 34608c2ecf20Sopenharmony_ci { 0x0b, 0x03a1e02e }, 34618c2ecf20Sopenharmony_ci { 0x0c, 0x9017e110 }, 34628c2ecf20Sopenharmony_ci { 0x0d, 0x9017e11f }, 34638c2ecf20Sopenharmony_ci { 0x0e, 0x400000fe }, 34648c2ecf20Sopenharmony_ci { 0x0f, 0x0381e020 }, 34658c2ecf20Sopenharmony_ci { 0x10, 0x1345e230 }, 34668c2ecf20Sopenharmony_ci { 0x11, 0x13c5e240 }, 34678c2ecf20Sopenharmony_ci { 0x15, 0x400000fc }, 34688c2ecf20Sopenharmony_ci { 0x1b, 0x400000fb }, 34698c2ecf20Sopenharmony_ci {} 34708c2ecf20Sopenharmony_ci}; 34718c2ecf20Sopenharmony_ci 34728c2ecf20Sopenharmony_cistatic const struct hda_pintbl intel_mac_v5_pin_configs[] = { 34738c2ecf20Sopenharmony_ci { 0x0a, 0x0321e21f }, 34748c2ecf20Sopenharmony_ci { 0x0b, 0x03a1e02e }, 34758c2ecf20Sopenharmony_ci { 0x0c, 0x9017e110 }, 34768c2ecf20Sopenharmony_ci { 0x0d, 0x9017e11f }, 34778c2ecf20Sopenharmony_ci { 0x0e, 0x400000fe }, 34788c2ecf20Sopenharmony_ci { 0x0f, 0x0381e020 }, 34798c2ecf20Sopenharmony_ci { 0x10, 0x1345e230 }, 34808c2ecf20Sopenharmony_ci { 0x11, 0x13c5e240 }, 34818c2ecf20Sopenharmony_ci { 0x15, 0x400000fc }, 34828c2ecf20Sopenharmony_ci { 0x1b, 0x400000fb }, 34838c2ecf20Sopenharmony_ci {} 34848c2ecf20Sopenharmony_ci}; 34858c2ecf20Sopenharmony_ci 34868c2ecf20Sopenharmony_cistatic const struct hda_pintbl ecs202_pin_configs[] = { 34878c2ecf20Sopenharmony_ci { 0x0a, 0x0221401f }, 34888c2ecf20Sopenharmony_ci { 0x0b, 0x02a19020 }, 34898c2ecf20Sopenharmony_ci { 0x0c, 0x01a19020 }, 34908c2ecf20Sopenharmony_ci { 0x0d, 0x01114010 }, 34918c2ecf20Sopenharmony_ci { 0x0e, 0x408000f0 }, 34928c2ecf20Sopenharmony_ci { 0x0f, 0x01813022 }, 34938c2ecf20Sopenharmony_ci { 0x10, 0x074510a0 }, 34948c2ecf20Sopenharmony_ci { 0x11, 0x40c400f1 }, 34958c2ecf20Sopenharmony_ci { 0x15, 0x9037012e }, 34968c2ecf20Sopenharmony_ci { 0x1b, 0x40e000f2 }, 34978c2ecf20Sopenharmony_ci {} 34988c2ecf20Sopenharmony_ci}; 34998c2ecf20Sopenharmony_ci 35008c2ecf20Sopenharmony_ci/* codec SSIDs for Intel Mac sharing the same PCI SSID 8384:7680 */ 35018c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac922x_intel_mac_fixup_tbl[] = { 35028c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x0000, 0x0100, "Mac Mini", STAC_INTEL_MAC_V3), 35038c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0800, "Mac", STAC_INTEL_MAC_V1), 35048c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0600, "Mac", STAC_INTEL_MAC_V2), 35058c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0700, "Mac", STAC_INTEL_MAC_V2), 35068c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0e00, "Mac", STAC_INTEL_MAC_V3), 35078c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0f00, "Mac", STAC_INTEL_MAC_V3), 35088c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1600, "Mac", STAC_INTEL_MAC_V3), 35098c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1700, "Mac", STAC_INTEL_MAC_V3), 35108c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0200, "Mac", STAC_INTEL_MAC_V3), 35118c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1e00, "Mac", STAC_INTEL_MAC_V3), 35128c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x1a00, "Mac", STAC_INTEL_MAC_V4), 35138c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x0a00, "Mac", STAC_INTEL_MAC_V5), 35148c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x106b, 0x2200, "Mac", STAC_INTEL_MAC_V5), 35158c2ecf20Sopenharmony_ci {} 35168c2ecf20Sopenharmony_ci}; 35178c2ecf20Sopenharmony_ci 35188c2ecf20Sopenharmony_cistatic const struct hda_fixup stac922x_fixups[]; 35198c2ecf20Sopenharmony_ci 35208c2ecf20Sopenharmony_ci/* remap the fixup from codec SSID and apply it */ 35218c2ecf20Sopenharmony_cistatic void stac922x_fixup_intel_mac_auto(struct hda_codec *codec, 35228c2ecf20Sopenharmony_ci const struct hda_fixup *fix, 35238c2ecf20Sopenharmony_ci int action) 35248c2ecf20Sopenharmony_ci{ 35258c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 35268c2ecf20Sopenharmony_ci return; 35278c2ecf20Sopenharmony_ci 35288c2ecf20Sopenharmony_ci codec->fixup_id = HDA_FIXUP_ID_NOT_SET; 35298c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, NULL, stac922x_intel_mac_fixup_tbl, 35308c2ecf20Sopenharmony_ci stac922x_fixups); 35318c2ecf20Sopenharmony_ci if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET) 35328c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, action); 35338c2ecf20Sopenharmony_ci} 35348c2ecf20Sopenharmony_ci 35358c2ecf20Sopenharmony_cistatic void stac922x_fixup_intel_mac_gpio(struct hda_codec *codec, 35368c2ecf20Sopenharmony_ci const struct hda_fixup *fix, 35378c2ecf20Sopenharmony_ci int action) 35388c2ecf20Sopenharmony_ci{ 35398c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 35408c2ecf20Sopenharmony_ci 35418c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 35428c2ecf20Sopenharmony_ci spec->gpio_mask = spec->gpio_dir = 0x03; 35438c2ecf20Sopenharmony_ci spec->gpio_data = 0x03; 35448c2ecf20Sopenharmony_ci } 35458c2ecf20Sopenharmony_ci} 35468c2ecf20Sopenharmony_ci 35478c2ecf20Sopenharmony_cistatic const struct hda_fixup stac922x_fixups[] = { 35488c2ecf20Sopenharmony_ci [STAC_D945_REF] = { 35498c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35508c2ecf20Sopenharmony_ci .v.pins = ref922x_pin_configs, 35518c2ecf20Sopenharmony_ci }, 35528c2ecf20Sopenharmony_ci [STAC_D945GTP3] = { 35538c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35548c2ecf20Sopenharmony_ci .v.pins = d945gtp3_pin_configs, 35558c2ecf20Sopenharmony_ci }, 35568c2ecf20Sopenharmony_ci [STAC_D945GTP5] = { 35578c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35588c2ecf20Sopenharmony_ci .v.pins = d945gtp5_pin_configs, 35598c2ecf20Sopenharmony_ci }, 35608c2ecf20Sopenharmony_ci [STAC_INTEL_MAC_AUTO] = { 35618c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 35628c2ecf20Sopenharmony_ci .v.func = stac922x_fixup_intel_mac_auto, 35638c2ecf20Sopenharmony_ci }, 35648c2ecf20Sopenharmony_ci [STAC_INTEL_MAC_V1] = { 35658c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35668c2ecf20Sopenharmony_ci .v.pins = intel_mac_v1_pin_configs, 35678c2ecf20Sopenharmony_ci .chained = true, 35688c2ecf20Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 35698c2ecf20Sopenharmony_ci }, 35708c2ecf20Sopenharmony_ci [STAC_INTEL_MAC_V2] = { 35718c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35728c2ecf20Sopenharmony_ci .v.pins = intel_mac_v2_pin_configs, 35738c2ecf20Sopenharmony_ci .chained = true, 35748c2ecf20Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 35758c2ecf20Sopenharmony_ci }, 35768c2ecf20Sopenharmony_ci [STAC_INTEL_MAC_V3] = { 35778c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35788c2ecf20Sopenharmony_ci .v.pins = intel_mac_v3_pin_configs, 35798c2ecf20Sopenharmony_ci .chained = true, 35808c2ecf20Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 35818c2ecf20Sopenharmony_ci }, 35828c2ecf20Sopenharmony_ci [STAC_INTEL_MAC_V4] = { 35838c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35848c2ecf20Sopenharmony_ci .v.pins = intel_mac_v4_pin_configs, 35858c2ecf20Sopenharmony_ci .chained = true, 35868c2ecf20Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 35878c2ecf20Sopenharmony_ci }, 35888c2ecf20Sopenharmony_ci [STAC_INTEL_MAC_V5] = { 35898c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 35908c2ecf20Sopenharmony_ci .v.pins = intel_mac_v5_pin_configs, 35918c2ecf20Sopenharmony_ci .chained = true, 35928c2ecf20Sopenharmony_ci .chain_id = STAC_922X_INTEL_MAC_GPIO, 35938c2ecf20Sopenharmony_ci }, 35948c2ecf20Sopenharmony_ci [STAC_922X_INTEL_MAC_GPIO] = { 35958c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 35968c2ecf20Sopenharmony_ci .v.func = stac922x_fixup_intel_mac_gpio, 35978c2ecf20Sopenharmony_ci }, 35988c2ecf20Sopenharmony_ci [STAC_ECS_202] = { 35998c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 36008c2ecf20Sopenharmony_ci .v.pins = ecs202_pin_configs, 36018c2ecf20Sopenharmony_ci }, 36028c2ecf20Sopenharmony_ci [STAC_922X_DELL_D81] = { 36038c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 36048c2ecf20Sopenharmony_ci .v.pins = dell_922x_d81_pin_configs, 36058c2ecf20Sopenharmony_ci }, 36068c2ecf20Sopenharmony_ci [STAC_922X_DELL_D82] = { 36078c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 36088c2ecf20Sopenharmony_ci .v.pins = dell_922x_d82_pin_configs, 36098c2ecf20Sopenharmony_ci }, 36108c2ecf20Sopenharmony_ci [STAC_922X_DELL_M81] = { 36118c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 36128c2ecf20Sopenharmony_ci .v.pins = dell_922x_m81_pin_configs, 36138c2ecf20Sopenharmony_ci }, 36148c2ecf20Sopenharmony_ci [STAC_922X_DELL_M82] = { 36158c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 36168c2ecf20Sopenharmony_ci .v.pins = dell_922x_m82_pin_configs, 36178c2ecf20Sopenharmony_ci }, 36188c2ecf20Sopenharmony_ci}; 36198c2ecf20Sopenharmony_ci 36208c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac922x_models[] = { 36218c2ecf20Sopenharmony_ci { .id = STAC_D945_REF, .name = "ref" }, 36228c2ecf20Sopenharmony_ci { .id = STAC_D945GTP5, .name = "5stack" }, 36238c2ecf20Sopenharmony_ci { .id = STAC_D945GTP3, .name = "3stack" }, 36248c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V1, .name = "intel-mac-v1" }, 36258c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V2, .name = "intel-mac-v2" }, 36268c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "intel-mac-v3" }, 36278c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V4, .name = "intel-mac-v4" }, 36288c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V5, .name = "intel-mac-v5" }, 36298c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_AUTO, .name = "intel-mac-auto" }, 36308c2ecf20Sopenharmony_ci { .id = STAC_ECS_202, .name = "ecs202" }, 36318c2ecf20Sopenharmony_ci { .id = STAC_922X_DELL_D81, .name = "dell-d81" }, 36328c2ecf20Sopenharmony_ci { .id = STAC_922X_DELL_D82, .name = "dell-d82" }, 36338c2ecf20Sopenharmony_ci { .id = STAC_922X_DELL_M81, .name = "dell-m81" }, 36348c2ecf20Sopenharmony_ci { .id = STAC_922X_DELL_M82, .name = "dell-m82" }, 36358c2ecf20Sopenharmony_ci /* for backward compatibility */ 36368c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "macmini" }, 36378c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V5, .name = "macbook" }, 36388c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "macbook-pro-v1" }, 36398c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "macbook-pro" }, 36408c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V2, .name = "imac-intel" }, 36418c2ecf20Sopenharmony_ci { .id = STAC_INTEL_MAC_V3, .name = "imac-intel-20" }, 36428c2ecf20Sopenharmony_ci {} 36438c2ecf20Sopenharmony_ci}; 36448c2ecf20Sopenharmony_ci 36458c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac922x_fixup_tbl[] = { 36468c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 36478c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 36488c2ecf20Sopenharmony_ci "DFI LanParty", STAC_D945_REF), 36498c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 36508c2ecf20Sopenharmony_ci "DFI LanParty", STAC_D945_REF), 36518c2ecf20Sopenharmony_ci /* Intel 945G based systems */ 36528c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101, 36538c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36548c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202, 36558c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36568c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606, 36578c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36588c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601, 36598c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36608c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111, 36618c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36628c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115, 36638c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36648c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116, 36658c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36668c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117, 36678c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36688c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118, 36698c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36708c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119, 36718c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36728c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826, 36738c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36748c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049, 36758c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36768c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055, 36778c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36788c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048, 36798c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110, 36818c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP3), 36828c2ecf20Sopenharmony_ci /* Intel D945G 5-stack systems */ 36838c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404, 36848c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 36858c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303, 36868c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 36878c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013, 36888c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 36898c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417, 36908c2ecf20Sopenharmony_ci "Intel D945G", STAC_D945GTP5), 36918c2ecf20Sopenharmony_ci /* Intel 945P based systems */ 36928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b, 36938c2ecf20Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 36948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112, 36958c2ecf20Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 36968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d, 36978c2ecf20Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 36988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909, 36998c2ecf20Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 37008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505, 37018c2ecf20Sopenharmony_ci "Intel D945P", STAC_D945GTP3), 37028c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707, 37038c2ecf20Sopenharmony_ci "Intel D945P", STAC_D945GTP5), 37048c2ecf20Sopenharmony_ci /* other intel */ 37058c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204, 37068c2ecf20Sopenharmony_ci "Intel D945", STAC_D945_REF), 37078c2ecf20Sopenharmony_ci /* other systems */ 37088c2ecf20Sopenharmony_ci 37098c2ecf20Sopenharmony_ci /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */ 37108c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x8384, 0x7680, "Mac", STAC_INTEL_MAC_AUTO), 37118c2ecf20Sopenharmony_ci 37128c2ecf20Sopenharmony_ci /* Dell systems */ 37138c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7, 37148c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 37158c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9, 37168c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 37178c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab, 37188c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 37198c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac, 37208c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D82), 37218c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf, 37228c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_M81), 37238c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0, 37248c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D82), 37258c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1, 37268c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 37278c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2, 37288c2ecf20Sopenharmony_ci "unknown Dell", STAC_922X_DELL_D81), 37298c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7, 37308c2ecf20Sopenharmony_ci "Dell XPS M1210", STAC_922X_DELL_M82), 37318c2ecf20Sopenharmony_ci /* ECS/PC Chips boards */ 37328c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000, 37338c2ecf20Sopenharmony_ci "ECS/PC chips", STAC_ECS_202), 37348c2ecf20Sopenharmony_ci {} /* terminator */ 37358c2ecf20Sopenharmony_ci}; 37368c2ecf20Sopenharmony_ci 37378c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref927x_pin_configs[] = { 37388c2ecf20Sopenharmony_ci { 0x0a, 0x02214020 }, 37398c2ecf20Sopenharmony_ci { 0x0b, 0x02a19080 }, 37408c2ecf20Sopenharmony_ci { 0x0c, 0x0181304e }, 37418c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 37428c2ecf20Sopenharmony_ci { 0x0e, 0x01a19040 }, 37438c2ecf20Sopenharmony_ci { 0x0f, 0x01011012 }, 37448c2ecf20Sopenharmony_ci { 0x10, 0x01016011 }, 37458c2ecf20Sopenharmony_ci { 0x11, 0x0101201f }, 37468c2ecf20Sopenharmony_ci { 0x12, 0x183301f0 }, 37478c2ecf20Sopenharmony_ci { 0x13, 0x18a001f0 }, 37488c2ecf20Sopenharmony_ci { 0x14, 0x18a001f0 }, 37498c2ecf20Sopenharmony_ci { 0x21, 0x01442070 }, 37508c2ecf20Sopenharmony_ci { 0x22, 0x01c42190 }, 37518c2ecf20Sopenharmony_ci { 0x23, 0x40000100 }, 37528c2ecf20Sopenharmony_ci {} 37538c2ecf20Sopenharmony_ci}; 37548c2ecf20Sopenharmony_ci 37558c2ecf20Sopenharmony_cistatic const struct hda_pintbl d965_3st_pin_configs[] = { 37568c2ecf20Sopenharmony_ci { 0x0a, 0x0221401f }, 37578c2ecf20Sopenharmony_ci { 0x0b, 0x02a19120 }, 37588c2ecf20Sopenharmony_ci { 0x0c, 0x40000100 }, 37598c2ecf20Sopenharmony_ci { 0x0d, 0x01014011 }, 37608c2ecf20Sopenharmony_ci { 0x0e, 0x01a19021 }, 37618c2ecf20Sopenharmony_ci { 0x0f, 0x01813024 }, 37628c2ecf20Sopenharmony_ci { 0x10, 0x40000100 }, 37638c2ecf20Sopenharmony_ci { 0x11, 0x40000100 }, 37648c2ecf20Sopenharmony_ci { 0x12, 0x40000100 }, 37658c2ecf20Sopenharmony_ci { 0x13, 0x40000100 }, 37668c2ecf20Sopenharmony_ci { 0x14, 0x40000100 }, 37678c2ecf20Sopenharmony_ci { 0x21, 0x40000100 }, 37688c2ecf20Sopenharmony_ci { 0x22, 0x40000100 }, 37698c2ecf20Sopenharmony_ci { 0x23, 0x40000100 }, 37708c2ecf20Sopenharmony_ci {} 37718c2ecf20Sopenharmony_ci}; 37728c2ecf20Sopenharmony_ci 37738c2ecf20Sopenharmony_cistatic const struct hda_pintbl d965_5st_pin_configs[] = { 37748c2ecf20Sopenharmony_ci { 0x0a, 0x02214020 }, 37758c2ecf20Sopenharmony_ci { 0x0b, 0x02a19080 }, 37768c2ecf20Sopenharmony_ci { 0x0c, 0x0181304e }, 37778c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 37788c2ecf20Sopenharmony_ci { 0x0e, 0x01a19040 }, 37798c2ecf20Sopenharmony_ci { 0x0f, 0x01011012 }, 37808c2ecf20Sopenharmony_ci { 0x10, 0x01016011 }, 37818c2ecf20Sopenharmony_ci { 0x11, 0x40000100 }, 37828c2ecf20Sopenharmony_ci { 0x12, 0x40000100 }, 37838c2ecf20Sopenharmony_ci { 0x13, 0x40000100 }, 37848c2ecf20Sopenharmony_ci { 0x14, 0x40000100 }, 37858c2ecf20Sopenharmony_ci { 0x21, 0x01442070 }, 37868c2ecf20Sopenharmony_ci { 0x22, 0x40000100 }, 37878c2ecf20Sopenharmony_ci { 0x23, 0x40000100 }, 37888c2ecf20Sopenharmony_ci {} 37898c2ecf20Sopenharmony_ci}; 37908c2ecf20Sopenharmony_ci 37918c2ecf20Sopenharmony_cistatic const struct hda_pintbl d965_5st_no_fp_pin_configs[] = { 37928c2ecf20Sopenharmony_ci { 0x0a, 0x40000100 }, 37938c2ecf20Sopenharmony_ci { 0x0b, 0x40000100 }, 37948c2ecf20Sopenharmony_ci { 0x0c, 0x0181304e }, 37958c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 37968c2ecf20Sopenharmony_ci { 0x0e, 0x01a19040 }, 37978c2ecf20Sopenharmony_ci { 0x0f, 0x01011012 }, 37988c2ecf20Sopenharmony_ci { 0x10, 0x01016011 }, 37998c2ecf20Sopenharmony_ci { 0x11, 0x40000100 }, 38008c2ecf20Sopenharmony_ci { 0x12, 0x40000100 }, 38018c2ecf20Sopenharmony_ci { 0x13, 0x40000100 }, 38028c2ecf20Sopenharmony_ci { 0x14, 0x40000100 }, 38038c2ecf20Sopenharmony_ci { 0x21, 0x01442070 }, 38048c2ecf20Sopenharmony_ci { 0x22, 0x40000100 }, 38058c2ecf20Sopenharmony_ci { 0x23, 0x40000100 }, 38068c2ecf20Sopenharmony_ci {} 38078c2ecf20Sopenharmony_ci}; 38088c2ecf20Sopenharmony_ci 38098c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_3st_pin_configs[] = { 38108c2ecf20Sopenharmony_ci { 0x0a, 0x02211230 }, 38118c2ecf20Sopenharmony_ci { 0x0b, 0x02a11220 }, 38128c2ecf20Sopenharmony_ci { 0x0c, 0x01a19040 }, 38138c2ecf20Sopenharmony_ci { 0x0d, 0x01114210 }, 38148c2ecf20Sopenharmony_ci { 0x0e, 0x01111212 }, 38158c2ecf20Sopenharmony_ci { 0x0f, 0x01116211 }, 38168c2ecf20Sopenharmony_ci { 0x10, 0x01813050 }, 38178c2ecf20Sopenharmony_ci { 0x11, 0x01112214 }, 38188c2ecf20Sopenharmony_ci { 0x12, 0x403003fa }, 38198c2ecf20Sopenharmony_ci { 0x13, 0x90a60040 }, 38208c2ecf20Sopenharmony_ci { 0x14, 0x90a60040 }, 38218c2ecf20Sopenharmony_ci { 0x21, 0x404003fb }, 38228c2ecf20Sopenharmony_ci { 0x22, 0x40c003fc }, 38238c2ecf20Sopenharmony_ci { 0x23, 0x40000100 }, 38248c2ecf20Sopenharmony_ci {} 38258c2ecf20Sopenharmony_ci}; 38268c2ecf20Sopenharmony_ci 38278c2ecf20Sopenharmony_cistatic void stac927x_fixup_ref_no_jd(struct hda_codec *codec, 38288c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 38298c2ecf20Sopenharmony_ci{ 38308c2ecf20Sopenharmony_ci /* no jack detecion for ref-no-jd model */ 38318c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 38328c2ecf20Sopenharmony_ci codec->no_jack_detect = 1; 38338c2ecf20Sopenharmony_ci} 38348c2ecf20Sopenharmony_ci 38358c2ecf20Sopenharmony_cistatic void stac927x_fixup_ref(struct hda_codec *codec, 38368c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 38378c2ecf20Sopenharmony_ci{ 38388c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 38398c2ecf20Sopenharmony_ci 38408c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 38418c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref927x_pin_configs); 38428c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = 0; 38438c2ecf20Sopenharmony_ci spec->gpio_dir = spec->gpio_data = 0; 38448c2ecf20Sopenharmony_ci } 38458c2ecf20Sopenharmony_ci} 38468c2ecf20Sopenharmony_ci 38478c2ecf20Sopenharmony_cistatic void stac927x_fixup_dell_dmic(struct hda_codec *codec, 38488c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 38498c2ecf20Sopenharmony_ci{ 38508c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 38518c2ecf20Sopenharmony_ci 38528c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 38538c2ecf20Sopenharmony_ci return; 38548c2ecf20Sopenharmony_ci 38558c2ecf20Sopenharmony_ci if (codec->core.subsystem_id != 0x1028022f) { 38568c2ecf20Sopenharmony_ci /* GPIO2 High = Enable EAPD */ 38578c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = 0x04; 38588c2ecf20Sopenharmony_ci spec->gpio_dir = spec->gpio_data = 0x04; 38598c2ecf20Sopenharmony_ci } 38608c2ecf20Sopenharmony_ci 38618c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, dell_3st_core_init); 38628c2ecf20Sopenharmony_ci spec->volknob_init = 1; 38638c2ecf20Sopenharmony_ci} 38648c2ecf20Sopenharmony_ci 38658c2ecf20Sopenharmony_cistatic void stac927x_fixup_volknob(struct hda_codec *codec, 38668c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 38678c2ecf20Sopenharmony_ci{ 38688c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 38698c2ecf20Sopenharmony_ci 38708c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 38718c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac927x_volknob_core_init); 38728c2ecf20Sopenharmony_ci spec->volknob_init = 1; 38738c2ecf20Sopenharmony_ci } 38748c2ecf20Sopenharmony_ci} 38758c2ecf20Sopenharmony_ci 38768c2ecf20Sopenharmony_cistatic const struct hda_fixup stac927x_fixups[] = { 38778c2ecf20Sopenharmony_ci [STAC_D965_REF_NO_JD] = { 38788c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 38798c2ecf20Sopenharmony_ci .v.func = stac927x_fixup_ref_no_jd, 38808c2ecf20Sopenharmony_ci .chained = true, 38818c2ecf20Sopenharmony_ci .chain_id = STAC_D965_REF, 38828c2ecf20Sopenharmony_ci }, 38838c2ecf20Sopenharmony_ci [STAC_D965_REF] = { 38848c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 38858c2ecf20Sopenharmony_ci .v.func = stac927x_fixup_ref, 38868c2ecf20Sopenharmony_ci }, 38878c2ecf20Sopenharmony_ci [STAC_D965_3ST] = { 38888c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 38898c2ecf20Sopenharmony_ci .v.pins = d965_3st_pin_configs, 38908c2ecf20Sopenharmony_ci .chained = true, 38918c2ecf20Sopenharmony_ci .chain_id = STAC_D965_VERBS, 38928c2ecf20Sopenharmony_ci }, 38938c2ecf20Sopenharmony_ci [STAC_D965_5ST] = { 38948c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 38958c2ecf20Sopenharmony_ci .v.pins = d965_5st_pin_configs, 38968c2ecf20Sopenharmony_ci .chained = true, 38978c2ecf20Sopenharmony_ci .chain_id = STAC_D965_VERBS, 38988c2ecf20Sopenharmony_ci }, 38998c2ecf20Sopenharmony_ci [STAC_D965_VERBS] = { 39008c2ecf20Sopenharmony_ci .type = HDA_FIXUP_VERBS, 39018c2ecf20Sopenharmony_ci .v.verbs = d965_core_init, 39028c2ecf20Sopenharmony_ci }, 39038c2ecf20Sopenharmony_ci [STAC_D965_5ST_NO_FP] = { 39048c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 39058c2ecf20Sopenharmony_ci .v.pins = d965_5st_no_fp_pin_configs, 39068c2ecf20Sopenharmony_ci }, 39078c2ecf20Sopenharmony_ci [STAC_NEMO_DEFAULT] = { 39088c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 39098c2ecf20Sopenharmony_ci .v.pins = nemo_pin_configs, 39108c2ecf20Sopenharmony_ci }, 39118c2ecf20Sopenharmony_ci [STAC_DELL_3ST] = { 39128c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 39138c2ecf20Sopenharmony_ci .v.pins = dell_3st_pin_configs, 39148c2ecf20Sopenharmony_ci .chained = true, 39158c2ecf20Sopenharmony_ci .chain_id = STAC_927X_DELL_DMIC, 39168c2ecf20Sopenharmony_ci }, 39178c2ecf20Sopenharmony_ci [STAC_DELL_BIOS] = { 39188c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 39198c2ecf20Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 39208c2ecf20Sopenharmony_ci /* correct the front output jack as a hp out */ 39218c2ecf20Sopenharmony_ci { 0x0f, 0x0221101f }, 39228c2ecf20Sopenharmony_ci /* correct the front input jack as a mic */ 39238c2ecf20Sopenharmony_ci { 0x0e, 0x02a79130 }, 39248c2ecf20Sopenharmony_ci {} 39258c2ecf20Sopenharmony_ci }, 39268c2ecf20Sopenharmony_ci .chained = true, 39278c2ecf20Sopenharmony_ci .chain_id = STAC_927X_DELL_DMIC, 39288c2ecf20Sopenharmony_ci }, 39298c2ecf20Sopenharmony_ci [STAC_DELL_BIOS_AMIC] = { 39308c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 39318c2ecf20Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 39328c2ecf20Sopenharmony_ci /* configure the analog microphone on some laptops */ 39338c2ecf20Sopenharmony_ci { 0x0c, 0x90a79130 }, 39348c2ecf20Sopenharmony_ci {} 39358c2ecf20Sopenharmony_ci }, 39368c2ecf20Sopenharmony_ci .chained = true, 39378c2ecf20Sopenharmony_ci .chain_id = STAC_DELL_BIOS, 39388c2ecf20Sopenharmony_ci }, 39398c2ecf20Sopenharmony_ci [STAC_DELL_BIOS_SPDIF] = { 39408c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 39418c2ecf20Sopenharmony_ci .v.pins = (const struct hda_pintbl[]) { 39428c2ecf20Sopenharmony_ci /* correct the device field to SPDIF out */ 39438c2ecf20Sopenharmony_ci { 0x21, 0x01442070 }, 39448c2ecf20Sopenharmony_ci {} 39458c2ecf20Sopenharmony_ci }, 39468c2ecf20Sopenharmony_ci .chained = true, 39478c2ecf20Sopenharmony_ci .chain_id = STAC_DELL_BIOS, 39488c2ecf20Sopenharmony_ci }, 39498c2ecf20Sopenharmony_ci [STAC_927X_DELL_DMIC] = { 39508c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 39518c2ecf20Sopenharmony_ci .v.func = stac927x_fixup_dell_dmic, 39528c2ecf20Sopenharmony_ci }, 39538c2ecf20Sopenharmony_ci [STAC_927X_VOLKNOB] = { 39548c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 39558c2ecf20Sopenharmony_ci .v.func = stac927x_fixup_volknob, 39568c2ecf20Sopenharmony_ci }, 39578c2ecf20Sopenharmony_ci}; 39588c2ecf20Sopenharmony_ci 39598c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac927x_models[] = { 39608c2ecf20Sopenharmony_ci { .id = STAC_D965_REF_NO_JD, .name = "ref-no-jd" }, 39618c2ecf20Sopenharmony_ci { .id = STAC_D965_REF, .name = "ref" }, 39628c2ecf20Sopenharmony_ci { .id = STAC_D965_3ST, .name = "3stack" }, 39638c2ecf20Sopenharmony_ci { .id = STAC_D965_5ST, .name = "5stack" }, 39648c2ecf20Sopenharmony_ci { .id = STAC_D965_5ST_NO_FP, .name = "5stack-no-fp" }, 39658c2ecf20Sopenharmony_ci { .id = STAC_DELL_3ST, .name = "dell-3stack" }, 39668c2ecf20Sopenharmony_ci { .id = STAC_DELL_BIOS, .name = "dell-bios" }, 39678c2ecf20Sopenharmony_ci { .id = STAC_NEMO_DEFAULT, .name = "nemo-default" }, 39688c2ecf20Sopenharmony_ci { .id = STAC_DELL_BIOS_AMIC, .name = "dell-bios-amic" }, 39698c2ecf20Sopenharmony_ci { .id = STAC_927X_VOLKNOB, .name = "volknob" }, 39708c2ecf20Sopenharmony_ci {} 39718c2ecf20Sopenharmony_ci}; 39728c2ecf20Sopenharmony_ci 39738c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac927x_fixup_tbl[] = { 39748c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 39758c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 39768c2ecf20Sopenharmony_ci "DFI LanParty", STAC_D965_REF), 39778c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 39788c2ecf20Sopenharmony_ci "DFI LanParty", STAC_D965_REF), 39798c2ecf20Sopenharmony_ci /* Intel 946 based systems */ 39808c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST), 39818c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST), 39828c2ecf20Sopenharmony_ci /* 965 based 3 stack systems */ 39838c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100, 39848c2ecf20Sopenharmony_ci "Intel D965", STAC_D965_3ST), 39858c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000, 39868c2ecf20Sopenharmony_ci "Intel D965", STAC_D965_3ST), 39878c2ecf20Sopenharmony_ci /* Dell 3 stack systems */ 39888c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST), 39898c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST), 39908c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST), 39918c2ecf20Sopenharmony_ci /* Dell 3 stack systems with verb table in BIOS */ 39928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS), 39938c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_BIOS), 39948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS), 39958c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS_SPDIF), 39968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS), 39978c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS), 39988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS), 39998c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS), 40008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS_SPDIF), 40018c2ecf20Sopenharmony_ci /* 965 based 5 stack systems */ 40028c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300, 40038c2ecf20Sopenharmony_ci "Intel D965", STAC_D965_5ST), 40048c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500, 40058c2ecf20Sopenharmony_ci "Intel D965", STAC_D965_5ST), 40068c2ecf20Sopenharmony_ci /* Nemo */ 40078c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x1888, 0x1000, "AmigaOne X1000", STAC_NEMO_DEFAULT), 40088c2ecf20Sopenharmony_ci /* volume-knob fixes */ 40098c2ecf20Sopenharmony_ci SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB), 40108c2ecf20Sopenharmony_ci {} /* terminator */ 40118c2ecf20Sopenharmony_ci}; 40128c2ecf20Sopenharmony_ci 40138c2ecf20Sopenharmony_cistatic const struct hda_pintbl ref9205_pin_configs[] = { 40148c2ecf20Sopenharmony_ci { 0x0a, 0x40000100 }, 40158c2ecf20Sopenharmony_ci { 0x0b, 0x40000100 }, 40168c2ecf20Sopenharmony_ci { 0x0c, 0x01016011 }, 40178c2ecf20Sopenharmony_ci { 0x0d, 0x01014010 }, 40188c2ecf20Sopenharmony_ci { 0x0e, 0x01813122 }, 40198c2ecf20Sopenharmony_ci { 0x0f, 0x01a19021 }, 40208c2ecf20Sopenharmony_ci { 0x14, 0x01019020 }, 40218c2ecf20Sopenharmony_ci { 0x16, 0x40000100 }, 40228c2ecf20Sopenharmony_ci { 0x17, 0x90a000f0 }, 40238c2ecf20Sopenharmony_ci { 0x18, 0x90a000f0 }, 40248c2ecf20Sopenharmony_ci { 0x21, 0x01441030 }, 40258c2ecf20Sopenharmony_ci { 0x22, 0x01c41030 }, 40268c2ecf20Sopenharmony_ci {} 40278c2ecf20Sopenharmony_ci}; 40288c2ecf20Sopenharmony_ci 40298c2ecf20Sopenharmony_ci/* 40308c2ecf20Sopenharmony_ci STAC 9205 pin configs for 40318c2ecf20Sopenharmony_ci 102801F1 40328c2ecf20Sopenharmony_ci 102801F2 40338c2ecf20Sopenharmony_ci 102801FC 40348c2ecf20Sopenharmony_ci 102801FD 40358c2ecf20Sopenharmony_ci 10280204 40368c2ecf20Sopenharmony_ci 1028021F 40378c2ecf20Sopenharmony_ci 10280228 (Dell Vostro 1500) 40388c2ecf20Sopenharmony_ci 10280229 (Dell Vostro 1700) 40398c2ecf20Sopenharmony_ci*/ 40408c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_9205_m42_pin_configs[] = { 40418c2ecf20Sopenharmony_ci { 0x0a, 0x0321101F }, 40428c2ecf20Sopenharmony_ci { 0x0b, 0x03A11020 }, 40438c2ecf20Sopenharmony_ci { 0x0c, 0x400003FA }, 40448c2ecf20Sopenharmony_ci { 0x0d, 0x90170310 }, 40458c2ecf20Sopenharmony_ci { 0x0e, 0x400003FB }, 40468c2ecf20Sopenharmony_ci { 0x0f, 0x400003FC }, 40478c2ecf20Sopenharmony_ci { 0x14, 0x400003FD }, 40488c2ecf20Sopenharmony_ci { 0x16, 0x40F000F9 }, 40498c2ecf20Sopenharmony_ci { 0x17, 0x90A60330 }, 40508c2ecf20Sopenharmony_ci { 0x18, 0x400003FF }, 40518c2ecf20Sopenharmony_ci { 0x21, 0x0144131F }, 40528c2ecf20Sopenharmony_ci { 0x22, 0x40C003FE }, 40538c2ecf20Sopenharmony_ci {} 40548c2ecf20Sopenharmony_ci}; 40558c2ecf20Sopenharmony_ci 40568c2ecf20Sopenharmony_ci/* 40578c2ecf20Sopenharmony_ci STAC 9205 pin configs for 40588c2ecf20Sopenharmony_ci 102801F9 40598c2ecf20Sopenharmony_ci 102801FA 40608c2ecf20Sopenharmony_ci 102801FE 40618c2ecf20Sopenharmony_ci 102801FF (Dell Precision M4300) 40628c2ecf20Sopenharmony_ci 10280206 40638c2ecf20Sopenharmony_ci 10280200 40648c2ecf20Sopenharmony_ci 10280201 40658c2ecf20Sopenharmony_ci*/ 40668c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_9205_m43_pin_configs[] = { 40678c2ecf20Sopenharmony_ci { 0x0a, 0x0321101f }, 40688c2ecf20Sopenharmony_ci { 0x0b, 0x03a11020 }, 40698c2ecf20Sopenharmony_ci { 0x0c, 0x90a70330 }, 40708c2ecf20Sopenharmony_ci { 0x0d, 0x90170310 }, 40718c2ecf20Sopenharmony_ci { 0x0e, 0x400000fe }, 40728c2ecf20Sopenharmony_ci { 0x0f, 0x400000ff }, 40738c2ecf20Sopenharmony_ci { 0x14, 0x400000fd }, 40748c2ecf20Sopenharmony_ci { 0x16, 0x40f000f9 }, 40758c2ecf20Sopenharmony_ci { 0x17, 0x400000fa }, 40768c2ecf20Sopenharmony_ci { 0x18, 0x400000fc }, 40778c2ecf20Sopenharmony_ci { 0x21, 0x0144131f }, 40788c2ecf20Sopenharmony_ci { 0x22, 0x40c003f8 }, 40798c2ecf20Sopenharmony_ci /* Enable SPDIF in/out */ 40808c2ecf20Sopenharmony_ci { 0x1f, 0x01441030 }, 40818c2ecf20Sopenharmony_ci { 0x20, 0x1c410030 }, 40828c2ecf20Sopenharmony_ci {} 40838c2ecf20Sopenharmony_ci}; 40848c2ecf20Sopenharmony_ci 40858c2ecf20Sopenharmony_cistatic const struct hda_pintbl dell_9205_m44_pin_configs[] = { 40868c2ecf20Sopenharmony_ci { 0x0a, 0x0421101f }, 40878c2ecf20Sopenharmony_ci { 0x0b, 0x04a11020 }, 40888c2ecf20Sopenharmony_ci { 0x0c, 0x400003fa }, 40898c2ecf20Sopenharmony_ci { 0x0d, 0x90170310 }, 40908c2ecf20Sopenharmony_ci { 0x0e, 0x400003fb }, 40918c2ecf20Sopenharmony_ci { 0x0f, 0x400003fc }, 40928c2ecf20Sopenharmony_ci { 0x14, 0x400003fd }, 40938c2ecf20Sopenharmony_ci { 0x16, 0x400003f9 }, 40948c2ecf20Sopenharmony_ci { 0x17, 0x90a60330 }, 40958c2ecf20Sopenharmony_ci { 0x18, 0x400003ff }, 40968c2ecf20Sopenharmony_ci { 0x21, 0x01441340 }, 40978c2ecf20Sopenharmony_ci { 0x22, 0x40c003fe }, 40988c2ecf20Sopenharmony_ci {} 40998c2ecf20Sopenharmony_ci}; 41008c2ecf20Sopenharmony_ci 41018c2ecf20Sopenharmony_cistatic void stac9205_fixup_ref(struct hda_codec *codec, 41028c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 41038c2ecf20Sopenharmony_ci{ 41048c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 41058c2ecf20Sopenharmony_ci 41068c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 41078c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, ref9205_pin_configs); 41088c2ecf20Sopenharmony_ci /* SPDIF-In enabled */ 41098c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0; 41108c2ecf20Sopenharmony_ci } 41118c2ecf20Sopenharmony_ci} 41128c2ecf20Sopenharmony_ci 41138c2ecf20Sopenharmony_cistatic void stac9205_fixup_dell_m43(struct hda_codec *codec, 41148c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 41158c2ecf20Sopenharmony_ci{ 41168c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 41178c2ecf20Sopenharmony_ci struct hda_jack_callback *jack; 41188c2ecf20Sopenharmony_ci 41198c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) { 41208c2ecf20Sopenharmony_ci snd_hda_apply_pincfgs(codec, dell_9205_m43_pin_configs); 41218c2ecf20Sopenharmony_ci 41228c2ecf20Sopenharmony_ci /* Enable unsol response for GPIO4/Dock HP connection */ 41238c2ecf20Sopenharmony_ci snd_hda_codec_write_cache(codec, codec->core.afg, 0, 41248c2ecf20Sopenharmony_ci AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); 41258c2ecf20Sopenharmony_ci jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg, 41268c2ecf20Sopenharmony_ci stac_vref_event); 41278c2ecf20Sopenharmony_ci if (!IS_ERR(jack)) 41288c2ecf20Sopenharmony_ci jack->private_data = 0x01; 41298c2ecf20Sopenharmony_ci 41308c2ecf20Sopenharmony_ci spec->gpio_dir = 0x0b; 41318c2ecf20Sopenharmony_ci spec->eapd_mask = 0x01; 41328c2ecf20Sopenharmony_ci spec->gpio_mask = 0x1b; 41338c2ecf20Sopenharmony_ci spec->gpio_mute = 0x10; 41348c2ecf20Sopenharmony_ci /* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute, 41358c2ecf20Sopenharmony_ci * GPIO3 Low = DRM 41368c2ecf20Sopenharmony_ci */ 41378c2ecf20Sopenharmony_ci spec->gpio_data = 0x01; 41388c2ecf20Sopenharmony_ci } 41398c2ecf20Sopenharmony_ci} 41408c2ecf20Sopenharmony_ci 41418c2ecf20Sopenharmony_cistatic void stac9205_fixup_eapd(struct hda_codec *codec, 41428c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 41438c2ecf20Sopenharmony_ci{ 41448c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 41458c2ecf20Sopenharmony_ci 41468c2ecf20Sopenharmony_ci if (action == HDA_FIXUP_ACT_PRE_PROBE) 41478c2ecf20Sopenharmony_ci spec->eapd_switch = 0; 41488c2ecf20Sopenharmony_ci} 41498c2ecf20Sopenharmony_ci 41508c2ecf20Sopenharmony_cistatic const struct hda_fixup stac9205_fixups[] = { 41518c2ecf20Sopenharmony_ci [STAC_9205_REF] = { 41528c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 41538c2ecf20Sopenharmony_ci .v.func = stac9205_fixup_ref, 41548c2ecf20Sopenharmony_ci }, 41558c2ecf20Sopenharmony_ci [STAC_9205_DELL_M42] = { 41568c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 41578c2ecf20Sopenharmony_ci .v.pins = dell_9205_m42_pin_configs, 41588c2ecf20Sopenharmony_ci }, 41598c2ecf20Sopenharmony_ci [STAC_9205_DELL_M43] = { 41608c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 41618c2ecf20Sopenharmony_ci .v.func = stac9205_fixup_dell_m43, 41628c2ecf20Sopenharmony_ci }, 41638c2ecf20Sopenharmony_ci [STAC_9205_DELL_M44] = { 41648c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 41658c2ecf20Sopenharmony_ci .v.pins = dell_9205_m44_pin_configs, 41668c2ecf20Sopenharmony_ci }, 41678c2ecf20Sopenharmony_ci [STAC_9205_EAPD] = { 41688c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 41698c2ecf20Sopenharmony_ci .v.func = stac9205_fixup_eapd, 41708c2ecf20Sopenharmony_ci }, 41718c2ecf20Sopenharmony_ci {} 41728c2ecf20Sopenharmony_ci}; 41738c2ecf20Sopenharmony_ci 41748c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac9205_models[] = { 41758c2ecf20Sopenharmony_ci { .id = STAC_9205_REF, .name = "ref" }, 41768c2ecf20Sopenharmony_ci { .id = STAC_9205_DELL_M42, .name = "dell-m42" }, 41778c2ecf20Sopenharmony_ci { .id = STAC_9205_DELL_M43, .name = "dell-m43" }, 41788c2ecf20Sopenharmony_ci { .id = STAC_9205_DELL_M44, .name = "dell-m44" }, 41798c2ecf20Sopenharmony_ci { .id = STAC_9205_EAPD, .name = "eapd" }, 41808c2ecf20Sopenharmony_ci {} 41818c2ecf20Sopenharmony_ci}; 41828c2ecf20Sopenharmony_ci 41838c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac9205_fixup_tbl[] = { 41848c2ecf20Sopenharmony_ci /* SigmaTel reference board */ 41858c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 41868c2ecf20Sopenharmony_ci "DFI LanParty", STAC_9205_REF), 41878c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30, 41888c2ecf20Sopenharmony_ci "SigmaTel", STAC_9205_REF), 41898c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 41908c2ecf20Sopenharmony_ci "DFI LanParty", STAC_9205_REF), 41918c2ecf20Sopenharmony_ci /* Dell */ 41928c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1, 41938c2ecf20Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 41948c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2, 41958c2ecf20Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 41968c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8, 41978c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 41988c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9, 41998c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 42008c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa, 42018c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 42028c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc, 42038c2ecf20Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 42048c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd, 42058c2ecf20Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 42068c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe, 42078c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 42088c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff, 42098c2ecf20Sopenharmony_ci "Dell Precision M4300", STAC_9205_DELL_M43), 42108c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204, 42118c2ecf20Sopenharmony_ci "unknown Dell", STAC_9205_DELL_M42), 42128c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206, 42138c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 42148c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b, 42158c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 42168c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c, 42178c2ecf20Sopenharmony_ci "Dell Precision", STAC_9205_DELL_M43), 42188c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f, 42198c2ecf20Sopenharmony_ci "Dell Inspiron", STAC_9205_DELL_M44), 42208c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228, 42218c2ecf20Sopenharmony_ci "Dell Vostro 1500", STAC_9205_DELL_M42), 42228c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0229, 42238c2ecf20Sopenharmony_ci "Dell Vostro 1700", STAC_9205_DELL_M42), 42248c2ecf20Sopenharmony_ci /* Gateway */ 42258c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD), 42268c2ecf20Sopenharmony_ci SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD), 42278c2ecf20Sopenharmony_ci {} /* terminator */ 42288c2ecf20Sopenharmony_ci}; 42298c2ecf20Sopenharmony_ci 42308c2ecf20Sopenharmony_cistatic void stac92hd95_fixup_hp_led(struct hda_codec *codec, 42318c2ecf20Sopenharmony_ci const struct hda_fixup *fix, int action) 42328c2ecf20Sopenharmony_ci{ 42338c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 42348c2ecf20Sopenharmony_ci 42358c2ecf20Sopenharmony_ci if (action != HDA_FIXUP_ACT_PRE_PROBE) 42368c2ecf20Sopenharmony_ci return; 42378c2ecf20Sopenharmony_ci 42388c2ecf20Sopenharmony_ci if (find_mute_led_cfg(codec, spec->default_polarity)) 42398c2ecf20Sopenharmony_ci codec_dbg(codec, "mute LED gpio %d polarity %d\n", 42408c2ecf20Sopenharmony_ci spec->gpio_led, 42418c2ecf20Sopenharmony_ci spec->gpio_led_polarity); 42428c2ecf20Sopenharmony_ci} 42438c2ecf20Sopenharmony_ci 42448c2ecf20Sopenharmony_cistatic const struct hda_fixup stac92hd95_fixups[] = { 42458c2ecf20Sopenharmony_ci [STAC_92HD95_HP_LED] = { 42468c2ecf20Sopenharmony_ci .type = HDA_FIXUP_FUNC, 42478c2ecf20Sopenharmony_ci .v.func = stac92hd95_fixup_hp_led, 42488c2ecf20Sopenharmony_ci }, 42498c2ecf20Sopenharmony_ci [STAC_92HD95_HP_BASS] = { 42508c2ecf20Sopenharmony_ci .type = HDA_FIXUP_VERBS, 42518c2ecf20Sopenharmony_ci .v.verbs = (const struct hda_verb[]) { 42528c2ecf20Sopenharmony_ci {0x1a, 0x795, 0x00}, /* HPF to 100Hz */ 42538c2ecf20Sopenharmony_ci {} 42548c2ecf20Sopenharmony_ci }, 42558c2ecf20Sopenharmony_ci .chained = true, 42568c2ecf20Sopenharmony_ci .chain_id = STAC_92HD95_HP_LED, 42578c2ecf20Sopenharmony_ci }, 42588c2ecf20Sopenharmony_ci}; 42598c2ecf20Sopenharmony_ci 42608c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac92hd95_fixup_tbl[] = { 42618c2ecf20Sopenharmony_ci SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1911, "HP Spectre 13", STAC_92HD95_HP_BASS), 42628c2ecf20Sopenharmony_ci {} /* terminator */ 42638c2ecf20Sopenharmony_ci}; 42648c2ecf20Sopenharmony_ci 42658c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac92hd95_models[] = { 42668c2ecf20Sopenharmony_ci { .id = STAC_92HD95_HP_LED, .name = "hp-led" }, 42678c2ecf20Sopenharmony_ci { .id = STAC_92HD95_HP_BASS, .name = "hp-bass" }, 42688c2ecf20Sopenharmony_ci {} 42698c2ecf20Sopenharmony_ci}; 42708c2ecf20Sopenharmony_ci 42718c2ecf20Sopenharmony_ci 42728c2ecf20Sopenharmony_cistatic int stac_parse_auto_config(struct hda_codec *codec) 42738c2ecf20Sopenharmony_ci{ 42748c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 42758c2ecf20Sopenharmony_ci int err; 42768c2ecf20Sopenharmony_ci int flags = 0; 42778c2ecf20Sopenharmony_ci 42788c2ecf20Sopenharmony_ci if (spec->headset_jack) 42798c2ecf20Sopenharmony_ci flags |= HDA_PINCFG_HEADSET_MIC; 42808c2ecf20Sopenharmony_ci 42818c2ecf20Sopenharmony_ci err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, flags); 42828c2ecf20Sopenharmony_ci if (err < 0) 42838c2ecf20Sopenharmony_ci return err; 42848c2ecf20Sopenharmony_ci 42858c2ecf20Sopenharmony_ci /* add hooks */ 42868c2ecf20Sopenharmony_ci spec->gen.pcm_playback_hook = stac_playback_pcm_hook; 42878c2ecf20Sopenharmony_ci spec->gen.pcm_capture_hook = stac_capture_pcm_hook; 42888c2ecf20Sopenharmony_ci 42898c2ecf20Sopenharmony_ci spec->gen.automute_hook = stac_update_outputs; 42908c2ecf20Sopenharmony_ci 42918c2ecf20Sopenharmony_ci err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg); 42928c2ecf20Sopenharmony_ci if (err < 0) 42938c2ecf20Sopenharmony_ci return err; 42948c2ecf20Sopenharmony_ci 42958c2ecf20Sopenharmony_ci if (spec->vref_mute_led_nid) { 42968c2ecf20Sopenharmony_ci err = snd_hda_gen_fix_pin_power(codec, spec->vref_mute_led_nid); 42978c2ecf20Sopenharmony_ci if (err < 0) 42988c2ecf20Sopenharmony_ci return err; 42998c2ecf20Sopenharmony_ci } 43008c2ecf20Sopenharmony_ci 43018c2ecf20Sopenharmony_ci /* setup analog beep controls */ 43028c2ecf20Sopenharmony_ci if (spec->anabeep_nid > 0) { 43038c2ecf20Sopenharmony_ci err = stac_auto_create_beep_ctls(codec, 43048c2ecf20Sopenharmony_ci spec->anabeep_nid); 43058c2ecf20Sopenharmony_ci if (err < 0) 43068c2ecf20Sopenharmony_ci return err; 43078c2ecf20Sopenharmony_ci } 43088c2ecf20Sopenharmony_ci 43098c2ecf20Sopenharmony_ci /* setup digital beep controls and input device */ 43108c2ecf20Sopenharmony_ci#ifdef CONFIG_SND_HDA_INPUT_BEEP 43118c2ecf20Sopenharmony_ci if (spec->gen.beep_nid) { 43128c2ecf20Sopenharmony_ci hda_nid_t nid = spec->gen.beep_nid; 43138c2ecf20Sopenharmony_ci unsigned int caps; 43148c2ecf20Sopenharmony_ci 43158c2ecf20Sopenharmony_ci err = stac_auto_create_beep_ctls(codec, nid); 43168c2ecf20Sopenharmony_ci if (err < 0) 43178c2ecf20Sopenharmony_ci return err; 43188c2ecf20Sopenharmony_ci if (codec->beep) { 43198c2ecf20Sopenharmony_ci /* IDT/STAC codecs have linear beep tone parameter */ 43208c2ecf20Sopenharmony_ci codec->beep->linear_tone = spec->linear_tone_beep; 43218c2ecf20Sopenharmony_ci /* keep power up while beep is enabled */ 43228c2ecf20Sopenharmony_ci codec->beep->keep_power_at_enable = 1; 43238c2ecf20Sopenharmony_ci /* if no beep switch is available, make its own one */ 43248c2ecf20Sopenharmony_ci caps = query_amp_caps(codec, nid, HDA_OUTPUT); 43258c2ecf20Sopenharmony_ci if (!(caps & AC_AMPCAP_MUTE)) { 43268c2ecf20Sopenharmony_ci err = stac_beep_switch_ctl(codec); 43278c2ecf20Sopenharmony_ci if (err < 0) 43288c2ecf20Sopenharmony_ci return err; 43298c2ecf20Sopenharmony_ci } 43308c2ecf20Sopenharmony_ci } 43318c2ecf20Sopenharmony_ci } 43328c2ecf20Sopenharmony_ci#endif 43338c2ecf20Sopenharmony_ci 43348c2ecf20Sopenharmony_ci if (spec->gpio_led) 43358c2ecf20Sopenharmony_ci snd_hda_gen_add_mute_led_cdev(codec, stac_vmaster_hook); 43368c2ecf20Sopenharmony_ci 43378c2ecf20Sopenharmony_ci if (spec->aloopback_ctl && 43388c2ecf20Sopenharmony_ci snd_hda_get_bool_hint(codec, "loopback") == 1) { 43398c2ecf20Sopenharmony_ci unsigned int wr_verb = 43408c2ecf20Sopenharmony_ci spec->aloopback_ctl->private_value >> 16; 43418c2ecf20Sopenharmony_ci if (snd_hdac_regmap_add_vendor_verb(&codec->core, wr_verb)) 43428c2ecf20Sopenharmony_ci return -ENOMEM; 43438c2ecf20Sopenharmony_ci if (!snd_hda_gen_add_kctl(&spec->gen, NULL, spec->aloopback_ctl)) 43448c2ecf20Sopenharmony_ci return -ENOMEM; 43458c2ecf20Sopenharmony_ci } 43468c2ecf20Sopenharmony_ci 43478c2ecf20Sopenharmony_ci if (spec->have_spdif_mux) { 43488c2ecf20Sopenharmony_ci err = stac_create_spdif_mux_ctls(codec); 43498c2ecf20Sopenharmony_ci if (err < 0) 43508c2ecf20Sopenharmony_ci return err; 43518c2ecf20Sopenharmony_ci } 43528c2ecf20Sopenharmony_ci 43538c2ecf20Sopenharmony_ci stac_init_power_map(codec); 43548c2ecf20Sopenharmony_ci 43558c2ecf20Sopenharmony_ci return 0; 43568c2ecf20Sopenharmony_ci} 43578c2ecf20Sopenharmony_ci 43588c2ecf20Sopenharmony_cistatic int stac_init(struct hda_codec *codec) 43598c2ecf20Sopenharmony_ci{ 43608c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 43618c2ecf20Sopenharmony_ci int i; 43628c2ecf20Sopenharmony_ci 43638c2ecf20Sopenharmony_ci /* override some hints */ 43648c2ecf20Sopenharmony_ci stac_store_hints(codec); 43658c2ecf20Sopenharmony_ci 43668c2ecf20Sopenharmony_ci /* set up GPIO */ 43678c2ecf20Sopenharmony_ci /* turn on EAPD statically when spec->eapd_switch isn't set. 43688c2ecf20Sopenharmony_ci * otherwise, unsol event will turn it on/off dynamically 43698c2ecf20Sopenharmony_ci */ 43708c2ecf20Sopenharmony_ci if (!spec->eapd_switch) 43718c2ecf20Sopenharmony_ci spec->gpio_data |= spec->eapd_mask; 43728c2ecf20Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 43738c2ecf20Sopenharmony_ci 43748c2ecf20Sopenharmony_ci snd_hda_gen_init(codec); 43758c2ecf20Sopenharmony_ci 43768c2ecf20Sopenharmony_ci /* sync the power-map */ 43778c2ecf20Sopenharmony_ci if (spec->num_pwrs) 43788c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, codec->core.afg, 0, 43798c2ecf20Sopenharmony_ci AC_VERB_IDT_SET_POWER_MAP, 43808c2ecf20Sopenharmony_ci spec->power_map_bits); 43818c2ecf20Sopenharmony_ci 43828c2ecf20Sopenharmony_ci /* power down inactive ADCs */ 43838c2ecf20Sopenharmony_ci if (spec->powerdown_adcs) { 43848c2ecf20Sopenharmony_ci for (i = 0; i < spec->gen.num_all_adcs; i++) { 43858c2ecf20Sopenharmony_ci if (spec->active_adcs & (1 << i)) 43868c2ecf20Sopenharmony_ci continue; 43878c2ecf20Sopenharmony_ci snd_hda_codec_write(codec, spec->gen.all_adcs[i], 0, 43888c2ecf20Sopenharmony_ci AC_VERB_SET_POWER_STATE, 43898c2ecf20Sopenharmony_ci AC_PWRST_D3); 43908c2ecf20Sopenharmony_ci } 43918c2ecf20Sopenharmony_ci } 43928c2ecf20Sopenharmony_ci 43938c2ecf20Sopenharmony_ci return 0; 43948c2ecf20Sopenharmony_ci} 43958c2ecf20Sopenharmony_ci 43968c2ecf20Sopenharmony_cistatic void stac_shutup(struct hda_codec *codec) 43978c2ecf20Sopenharmony_ci{ 43988c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 43998c2ecf20Sopenharmony_ci 44008c2ecf20Sopenharmony_ci snd_hda_shutup_pins(codec); 44018c2ecf20Sopenharmony_ci 44028c2ecf20Sopenharmony_ci if (spec->eapd_mask) 44038c2ecf20Sopenharmony_ci stac_gpio_set(codec, spec->gpio_mask, 44048c2ecf20Sopenharmony_ci spec->gpio_dir, spec->gpio_data & 44058c2ecf20Sopenharmony_ci ~spec->eapd_mask); 44068c2ecf20Sopenharmony_ci} 44078c2ecf20Sopenharmony_ci 44088c2ecf20Sopenharmony_ci#define stac_free snd_hda_gen_free 44098c2ecf20Sopenharmony_ci 44108c2ecf20Sopenharmony_ci#ifdef CONFIG_SND_PROC_FS 44118c2ecf20Sopenharmony_cistatic void stac92hd_proc_hook(struct snd_info_buffer *buffer, 44128c2ecf20Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 44138c2ecf20Sopenharmony_ci{ 44148c2ecf20Sopenharmony_ci if (nid == codec->core.afg) 44158c2ecf20Sopenharmony_ci snd_iprintf(buffer, "Power-Map: 0x%02x\n", 44168c2ecf20Sopenharmony_ci snd_hda_codec_read(codec, nid, 0, 44178c2ecf20Sopenharmony_ci AC_VERB_IDT_GET_POWER_MAP, 0)); 44188c2ecf20Sopenharmony_ci} 44198c2ecf20Sopenharmony_ci 44208c2ecf20Sopenharmony_cistatic void analog_loop_proc_hook(struct snd_info_buffer *buffer, 44218c2ecf20Sopenharmony_ci struct hda_codec *codec, 44228c2ecf20Sopenharmony_ci unsigned int verb) 44238c2ecf20Sopenharmony_ci{ 44248c2ecf20Sopenharmony_ci snd_iprintf(buffer, "Analog Loopback: 0x%02x\n", 44258c2ecf20Sopenharmony_ci snd_hda_codec_read(codec, codec->core.afg, 0, verb, 0)); 44268c2ecf20Sopenharmony_ci} 44278c2ecf20Sopenharmony_ci 44288c2ecf20Sopenharmony_ci/* stac92hd71bxx, stac92hd73xx */ 44298c2ecf20Sopenharmony_cistatic void stac92hd7x_proc_hook(struct snd_info_buffer *buffer, 44308c2ecf20Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 44318c2ecf20Sopenharmony_ci{ 44328c2ecf20Sopenharmony_ci stac92hd_proc_hook(buffer, codec, nid); 44338c2ecf20Sopenharmony_ci if (nid == codec->core.afg) 44348c2ecf20Sopenharmony_ci analog_loop_proc_hook(buffer, codec, 0xfa0); 44358c2ecf20Sopenharmony_ci} 44368c2ecf20Sopenharmony_ci 44378c2ecf20Sopenharmony_cistatic void stac9205_proc_hook(struct snd_info_buffer *buffer, 44388c2ecf20Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 44398c2ecf20Sopenharmony_ci{ 44408c2ecf20Sopenharmony_ci if (nid == codec->core.afg) 44418c2ecf20Sopenharmony_ci analog_loop_proc_hook(buffer, codec, 0xfe0); 44428c2ecf20Sopenharmony_ci} 44438c2ecf20Sopenharmony_ci 44448c2ecf20Sopenharmony_cistatic void stac927x_proc_hook(struct snd_info_buffer *buffer, 44458c2ecf20Sopenharmony_ci struct hda_codec *codec, hda_nid_t nid) 44468c2ecf20Sopenharmony_ci{ 44478c2ecf20Sopenharmony_ci if (nid == codec->core.afg) 44488c2ecf20Sopenharmony_ci analog_loop_proc_hook(buffer, codec, 0xfeb); 44498c2ecf20Sopenharmony_ci} 44508c2ecf20Sopenharmony_ci#else 44518c2ecf20Sopenharmony_ci#define stac92hd_proc_hook NULL 44528c2ecf20Sopenharmony_ci#define stac92hd7x_proc_hook NULL 44538c2ecf20Sopenharmony_ci#define stac9205_proc_hook NULL 44548c2ecf20Sopenharmony_ci#define stac927x_proc_hook NULL 44558c2ecf20Sopenharmony_ci#endif 44568c2ecf20Sopenharmony_ci 44578c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 44588c2ecf20Sopenharmony_cistatic int stac_suspend(struct hda_codec *codec) 44598c2ecf20Sopenharmony_ci{ 44608c2ecf20Sopenharmony_ci stac_shutup(codec); 44618c2ecf20Sopenharmony_ci return 0; 44628c2ecf20Sopenharmony_ci} 44638c2ecf20Sopenharmony_ci#else 44648c2ecf20Sopenharmony_ci#define stac_suspend NULL 44658c2ecf20Sopenharmony_ci#endif /* CONFIG_PM */ 44668c2ecf20Sopenharmony_ci 44678c2ecf20Sopenharmony_cistatic const struct hda_codec_ops stac_patch_ops = { 44688c2ecf20Sopenharmony_ci .build_controls = snd_hda_gen_build_controls, 44698c2ecf20Sopenharmony_ci .build_pcms = snd_hda_gen_build_pcms, 44708c2ecf20Sopenharmony_ci .init = stac_init, 44718c2ecf20Sopenharmony_ci .free = stac_free, 44728c2ecf20Sopenharmony_ci .unsol_event = snd_hda_jack_unsol_event, 44738c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 44748c2ecf20Sopenharmony_ci .suspend = stac_suspend, 44758c2ecf20Sopenharmony_ci#endif 44768c2ecf20Sopenharmony_ci .reboot_notify = stac_shutup, 44778c2ecf20Sopenharmony_ci}; 44788c2ecf20Sopenharmony_ci 44798c2ecf20Sopenharmony_cistatic int alloc_stac_spec(struct hda_codec *codec) 44808c2ecf20Sopenharmony_ci{ 44818c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 44828c2ecf20Sopenharmony_ci 44838c2ecf20Sopenharmony_ci spec = kzalloc(sizeof(*spec), GFP_KERNEL); 44848c2ecf20Sopenharmony_ci if (!spec) 44858c2ecf20Sopenharmony_ci return -ENOMEM; 44868c2ecf20Sopenharmony_ci snd_hda_gen_spec_init(&spec->gen); 44878c2ecf20Sopenharmony_ci codec->spec = spec; 44888c2ecf20Sopenharmony_ci codec->no_trigger_sense = 1; /* seems common with STAC/IDT codecs */ 44898c2ecf20Sopenharmony_ci spec->gen.dac_min_mute = true; 44908c2ecf20Sopenharmony_ci codec->patch_ops = stac_patch_ops; 44918c2ecf20Sopenharmony_ci return 0; 44928c2ecf20Sopenharmony_ci} 44938c2ecf20Sopenharmony_ci 44948c2ecf20Sopenharmony_cistatic int patch_stac9200(struct hda_codec *codec) 44958c2ecf20Sopenharmony_ci{ 44968c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 44978c2ecf20Sopenharmony_ci int err; 44988c2ecf20Sopenharmony_ci 44998c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 45008c2ecf20Sopenharmony_ci if (err < 0) 45018c2ecf20Sopenharmony_ci return err; 45028c2ecf20Sopenharmony_ci 45038c2ecf20Sopenharmony_ci spec = codec->spec; 45048c2ecf20Sopenharmony_ci spec->linear_tone_beep = 1; 45058c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 45068c2ecf20Sopenharmony_ci 45078c2ecf20Sopenharmony_ci codec->power_filter = snd_hda_codec_eapd_power_filter; 45088c2ecf20Sopenharmony_ci 45098c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac9200_eapd_init); 45108c2ecf20Sopenharmony_ci 45118c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac9200_models, stac9200_fixup_tbl, 45128c2ecf20Sopenharmony_ci stac9200_fixups); 45138c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 45148c2ecf20Sopenharmony_ci 45158c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 45168c2ecf20Sopenharmony_ci if (err < 0) { 45178c2ecf20Sopenharmony_ci stac_free(codec); 45188c2ecf20Sopenharmony_ci return err; 45198c2ecf20Sopenharmony_ci } 45208c2ecf20Sopenharmony_ci 45218c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 45228c2ecf20Sopenharmony_ci 45238c2ecf20Sopenharmony_ci return 0; 45248c2ecf20Sopenharmony_ci} 45258c2ecf20Sopenharmony_ci 45268c2ecf20Sopenharmony_cistatic int patch_stac925x(struct hda_codec *codec) 45278c2ecf20Sopenharmony_ci{ 45288c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 45298c2ecf20Sopenharmony_ci int err; 45308c2ecf20Sopenharmony_ci 45318c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 45328c2ecf20Sopenharmony_ci if (err < 0) 45338c2ecf20Sopenharmony_ci return err; 45348c2ecf20Sopenharmony_ci 45358c2ecf20Sopenharmony_ci spec = codec->spec; 45368c2ecf20Sopenharmony_ci spec->linear_tone_beep = 1; 45378c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 45388c2ecf20Sopenharmony_ci 45398c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac925x_core_init); 45408c2ecf20Sopenharmony_ci 45418c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac925x_models, stac925x_fixup_tbl, 45428c2ecf20Sopenharmony_ci stac925x_fixups); 45438c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 45448c2ecf20Sopenharmony_ci 45458c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 45468c2ecf20Sopenharmony_ci if (err < 0) { 45478c2ecf20Sopenharmony_ci stac_free(codec); 45488c2ecf20Sopenharmony_ci return err; 45498c2ecf20Sopenharmony_ci } 45508c2ecf20Sopenharmony_ci 45518c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 45528c2ecf20Sopenharmony_ci 45538c2ecf20Sopenharmony_ci return 0; 45548c2ecf20Sopenharmony_ci} 45558c2ecf20Sopenharmony_ci 45568c2ecf20Sopenharmony_cistatic int patch_stac92hd73xx(struct hda_codec *codec) 45578c2ecf20Sopenharmony_ci{ 45588c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 45598c2ecf20Sopenharmony_ci int err; 45608c2ecf20Sopenharmony_ci int num_dacs; 45618c2ecf20Sopenharmony_ci 45628c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 45638c2ecf20Sopenharmony_ci if (err < 0) 45648c2ecf20Sopenharmony_ci return err; 45658c2ecf20Sopenharmony_ci 45668c2ecf20Sopenharmony_ci spec = codec->spec; 45678c2ecf20Sopenharmony_ci /* enable power_save_node only for new 92HD89xx chips, as it causes 45688c2ecf20Sopenharmony_ci * click noises on old 92HD73xx chips. 45698c2ecf20Sopenharmony_ci */ 45708c2ecf20Sopenharmony_ci if ((codec->core.vendor_id & 0xfffffff0) != 0x111d7670) 45718c2ecf20Sopenharmony_ci codec->power_save_node = 1; 45728c2ecf20Sopenharmony_ci spec->linear_tone_beep = 0; 45738c2ecf20Sopenharmony_ci spec->gen.mixer_nid = 0x1d; 45748c2ecf20Sopenharmony_ci spec->have_spdif_mux = 1; 45758c2ecf20Sopenharmony_ci 45768c2ecf20Sopenharmony_ci num_dacs = snd_hda_get_num_conns(codec, 0x0a) - 1; 45778c2ecf20Sopenharmony_ci if (num_dacs < 3 || num_dacs > 5) { 45788c2ecf20Sopenharmony_ci codec_warn(codec, 45798c2ecf20Sopenharmony_ci "Could not determine number of channels defaulting to DAC count\n"); 45808c2ecf20Sopenharmony_ci num_dacs = 5; 45818c2ecf20Sopenharmony_ci } 45828c2ecf20Sopenharmony_ci 45838c2ecf20Sopenharmony_ci switch (num_dacs) { 45848c2ecf20Sopenharmony_ci case 0x3: /* 6 Channel */ 45858c2ecf20Sopenharmony_ci spec->aloopback_ctl = &stac92hd73xx_6ch_loopback; 45868c2ecf20Sopenharmony_ci break; 45878c2ecf20Sopenharmony_ci case 0x4: /* 8 Channel */ 45888c2ecf20Sopenharmony_ci spec->aloopback_ctl = &stac92hd73xx_8ch_loopback; 45898c2ecf20Sopenharmony_ci break; 45908c2ecf20Sopenharmony_ci case 0x5: /* 10 Channel */ 45918c2ecf20Sopenharmony_ci spec->aloopback_ctl = &stac92hd73xx_10ch_loopback; 45928c2ecf20Sopenharmony_ci break; 45938c2ecf20Sopenharmony_ci } 45948c2ecf20Sopenharmony_ci 45958c2ecf20Sopenharmony_ci spec->aloopback_mask = 0x01; 45968c2ecf20Sopenharmony_ci spec->aloopback_shift = 8; 45978c2ecf20Sopenharmony_ci 45988c2ecf20Sopenharmony_ci spec->gen.beep_nid = 0x1c; /* digital beep */ 45998c2ecf20Sopenharmony_ci 46008c2ecf20Sopenharmony_ci /* GPIO0 High = Enable EAPD */ 46018c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1; 46028c2ecf20Sopenharmony_ci spec->gpio_data = 0x01; 46038c2ecf20Sopenharmony_ci 46048c2ecf20Sopenharmony_ci spec->eapd_switch = 1; 46058c2ecf20Sopenharmony_ci 46068c2ecf20Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids); 46078c2ecf20Sopenharmony_ci spec->pwr_nids = stac92hd73xx_pwr_nids; 46088c2ecf20Sopenharmony_ci 46098c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 46108c2ecf20Sopenharmony_ci spec->gen.power_down_unused = 1; 46118c2ecf20Sopenharmony_ci 46128c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd73xx_models, stac92hd73xx_fixup_tbl, 46138c2ecf20Sopenharmony_ci stac92hd73xx_fixups); 46148c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 46158c2ecf20Sopenharmony_ci 46168c2ecf20Sopenharmony_ci if (!spec->volknob_init) 46178c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd73xx_core_init); 46188c2ecf20Sopenharmony_ci 46198c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 46208c2ecf20Sopenharmony_ci if (err < 0) { 46218c2ecf20Sopenharmony_ci stac_free(codec); 46228c2ecf20Sopenharmony_ci return err; 46238c2ecf20Sopenharmony_ci } 46248c2ecf20Sopenharmony_ci 46258c2ecf20Sopenharmony_ci /* Don't GPIO-mute speakers if there are no internal speakers, because 46268c2ecf20Sopenharmony_ci * the GPIO might be necessary for Headphone 46278c2ecf20Sopenharmony_ci */ 46288c2ecf20Sopenharmony_ci if (spec->eapd_switch && !has_builtin_speaker(codec)) 46298c2ecf20Sopenharmony_ci spec->eapd_switch = 0; 46308c2ecf20Sopenharmony_ci 46318c2ecf20Sopenharmony_ci codec->proc_widget_hook = stac92hd7x_proc_hook; 46328c2ecf20Sopenharmony_ci 46338c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 46348c2ecf20Sopenharmony_ci 46358c2ecf20Sopenharmony_ci return 0; 46368c2ecf20Sopenharmony_ci} 46378c2ecf20Sopenharmony_ci 46388c2ecf20Sopenharmony_cistatic void stac_setup_gpio(struct hda_codec *codec) 46398c2ecf20Sopenharmony_ci{ 46408c2ecf20Sopenharmony_ci struct sigmatel_spec *spec = codec->spec; 46418c2ecf20Sopenharmony_ci 46428c2ecf20Sopenharmony_ci spec->gpio_mask |= spec->eapd_mask; 46438c2ecf20Sopenharmony_ci if (spec->gpio_led) { 46448c2ecf20Sopenharmony_ci if (!spec->vref_mute_led_nid) { 46458c2ecf20Sopenharmony_ci spec->gpio_mask |= spec->gpio_led; 46468c2ecf20Sopenharmony_ci spec->gpio_dir |= spec->gpio_led; 46478c2ecf20Sopenharmony_ci spec->gpio_data |= spec->gpio_led; 46488c2ecf20Sopenharmony_ci } else { 46498c2ecf20Sopenharmony_ci codec->power_filter = stac_vref_led_power_filter; 46508c2ecf20Sopenharmony_ci } 46518c2ecf20Sopenharmony_ci } 46528c2ecf20Sopenharmony_ci 46538c2ecf20Sopenharmony_ci if (spec->mic_mute_led_gpio) { 46548c2ecf20Sopenharmony_ci spec->gpio_mask |= spec->mic_mute_led_gpio; 46558c2ecf20Sopenharmony_ci spec->gpio_dir |= spec->mic_mute_led_gpio; 46568c2ecf20Sopenharmony_ci spec->mic_enabled = 0; 46578c2ecf20Sopenharmony_ci spec->gpio_data |= spec->mic_mute_led_gpio; 46588c2ecf20Sopenharmony_ci snd_hda_gen_add_micmute_led_cdev(codec, stac_capture_led_update); 46598c2ecf20Sopenharmony_ci } 46608c2ecf20Sopenharmony_ci} 46618c2ecf20Sopenharmony_ci 46628c2ecf20Sopenharmony_cistatic int patch_stac92hd83xxx(struct hda_codec *codec) 46638c2ecf20Sopenharmony_ci{ 46648c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 46658c2ecf20Sopenharmony_ci int err; 46668c2ecf20Sopenharmony_ci 46678c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 46688c2ecf20Sopenharmony_ci if (err < 0) 46698c2ecf20Sopenharmony_ci return err; 46708c2ecf20Sopenharmony_ci 46718c2ecf20Sopenharmony_ci /* longer delay needed for D3 */ 46728c2ecf20Sopenharmony_ci codec->core.power_caps &= ~AC_PWRST_EPSS; 46738c2ecf20Sopenharmony_ci 46748c2ecf20Sopenharmony_ci spec = codec->spec; 46758c2ecf20Sopenharmony_ci codec->power_save_node = 1; 46768c2ecf20Sopenharmony_ci spec->linear_tone_beep = 0; 46778c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 46788c2ecf20Sopenharmony_ci spec->gen.power_down_unused = 1; 46798c2ecf20Sopenharmony_ci spec->gen.mixer_nid = 0x1b; 46808c2ecf20Sopenharmony_ci 46818c2ecf20Sopenharmony_ci spec->gen.beep_nid = 0x21; /* digital beep */ 46828c2ecf20Sopenharmony_ci spec->pwr_nids = stac92hd83xxx_pwr_nids; 46838c2ecf20Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); 46848c2ecf20Sopenharmony_ci spec->default_polarity = -1; /* no default cfg */ 46858c2ecf20Sopenharmony_ci 46868c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd83xxx_core_init); 46878c2ecf20Sopenharmony_ci 46888c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd83xxx_models, stac92hd83xxx_fixup_tbl, 46898c2ecf20Sopenharmony_ci stac92hd83xxx_fixups); 46908c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 46918c2ecf20Sopenharmony_ci 46928c2ecf20Sopenharmony_ci stac_setup_gpio(codec); 46938c2ecf20Sopenharmony_ci 46948c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 46958c2ecf20Sopenharmony_ci if (err < 0) { 46968c2ecf20Sopenharmony_ci stac_free(codec); 46978c2ecf20Sopenharmony_ci return err; 46988c2ecf20Sopenharmony_ci } 46998c2ecf20Sopenharmony_ci 47008c2ecf20Sopenharmony_ci codec->proc_widget_hook = stac92hd_proc_hook; 47018c2ecf20Sopenharmony_ci 47028c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 47038c2ecf20Sopenharmony_ci 47048c2ecf20Sopenharmony_ci return 0; 47058c2ecf20Sopenharmony_ci} 47068c2ecf20Sopenharmony_ci 47078c2ecf20Sopenharmony_cistatic const hda_nid_t stac92hd95_pwr_nids[] = { 47088c2ecf20Sopenharmony_ci 0x0a, 0x0b, 0x0c, 0x0d 47098c2ecf20Sopenharmony_ci}; 47108c2ecf20Sopenharmony_ci 47118c2ecf20Sopenharmony_cistatic int patch_stac92hd95(struct hda_codec *codec) 47128c2ecf20Sopenharmony_ci{ 47138c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 47148c2ecf20Sopenharmony_ci int err; 47158c2ecf20Sopenharmony_ci 47168c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 47178c2ecf20Sopenharmony_ci if (err < 0) 47188c2ecf20Sopenharmony_ci return err; 47198c2ecf20Sopenharmony_ci 47208c2ecf20Sopenharmony_ci /* longer delay needed for D3 */ 47218c2ecf20Sopenharmony_ci codec->core.power_caps &= ~AC_PWRST_EPSS; 47228c2ecf20Sopenharmony_ci 47238c2ecf20Sopenharmony_ci spec = codec->spec; 47248c2ecf20Sopenharmony_ci codec->power_save_node = 1; 47258c2ecf20Sopenharmony_ci spec->linear_tone_beep = 0; 47268c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 47278c2ecf20Sopenharmony_ci spec->gen.power_down_unused = 1; 47288c2ecf20Sopenharmony_ci 47298c2ecf20Sopenharmony_ci spec->gen.beep_nid = 0x19; /* digital beep */ 47308c2ecf20Sopenharmony_ci spec->pwr_nids = stac92hd95_pwr_nids; 47318c2ecf20Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd95_pwr_nids); 47328c2ecf20Sopenharmony_ci spec->default_polarity = 0; 47338c2ecf20Sopenharmony_ci 47348c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd95_models, stac92hd95_fixup_tbl, 47358c2ecf20Sopenharmony_ci stac92hd95_fixups); 47368c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 47378c2ecf20Sopenharmony_ci 47388c2ecf20Sopenharmony_ci stac_setup_gpio(codec); 47398c2ecf20Sopenharmony_ci 47408c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 47418c2ecf20Sopenharmony_ci if (err < 0) { 47428c2ecf20Sopenharmony_ci stac_free(codec); 47438c2ecf20Sopenharmony_ci return err; 47448c2ecf20Sopenharmony_ci } 47458c2ecf20Sopenharmony_ci 47468c2ecf20Sopenharmony_ci codec->proc_widget_hook = stac92hd_proc_hook; 47478c2ecf20Sopenharmony_ci 47488c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 47498c2ecf20Sopenharmony_ci 47508c2ecf20Sopenharmony_ci return 0; 47518c2ecf20Sopenharmony_ci} 47528c2ecf20Sopenharmony_ci 47538c2ecf20Sopenharmony_cistatic int patch_stac92hd71bxx(struct hda_codec *codec) 47548c2ecf20Sopenharmony_ci{ 47558c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 47568c2ecf20Sopenharmony_ci const hda_nid_t *unmute_nids = stac92hd71bxx_unmute_nids; 47578c2ecf20Sopenharmony_ci int err; 47588c2ecf20Sopenharmony_ci 47598c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 47608c2ecf20Sopenharmony_ci if (err < 0) 47618c2ecf20Sopenharmony_ci return err; 47628c2ecf20Sopenharmony_ci 47638c2ecf20Sopenharmony_ci spec = codec->spec; 47648c2ecf20Sopenharmony_ci /* disabled power_save_node since it causes noises on a Dell machine */ 47658c2ecf20Sopenharmony_ci /* codec->power_save_node = 1; */ 47668c2ecf20Sopenharmony_ci spec->linear_tone_beep = 0; 47678c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 47688c2ecf20Sopenharmony_ci spec->gen.power_down_unused = 1; 47698c2ecf20Sopenharmony_ci spec->gen.mixer_nid = 0x17; 47708c2ecf20Sopenharmony_ci spec->have_spdif_mux = 1; 47718c2ecf20Sopenharmony_ci 47728c2ecf20Sopenharmony_ci /* GPIO0 = EAPD */ 47738c2ecf20Sopenharmony_ci spec->gpio_mask = 0x01; 47748c2ecf20Sopenharmony_ci spec->gpio_dir = 0x01; 47758c2ecf20Sopenharmony_ci spec->gpio_data = 0x01; 47768c2ecf20Sopenharmony_ci 47778c2ecf20Sopenharmony_ci switch (codec->core.vendor_id) { 47788c2ecf20Sopenharmony_ci case 0x111d76b6: /* 4 Port without Analog Mixer */ 47798c2ecf20Sopenharmony_ci case 0x111d76b7: 47808c2ecf20Sopenharmony_ci unmute_nids++; 47818c2ecf20Sopenharmony_ci break; 47828c2ecf20Sopenharmony_ci case 0x111d7608: /* 5 Port with Analog Mixer */ 47838c2ecf20Sopenharmony_ci if ((codec->core.revision_id & 0xf) == 0 || 47848c2ecf20Sopenharmony_ci (codec->core.revision_id & 0xf) == 1) 47858c2ecf20Sopenharmony_ci spec->stream_delay = 40; /* 40 milliseconds */ 47868c2ecf20Sopenharmony_ci 47878c2ecf20Sopenharmony_ci /* disable VSW */ 47888c2ecf20Sopenharmony_ci unmute_nids++; 47898c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0); 47908c2ecf20Sopenharmony_ci snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3); 47918c2ecf20Sopenharmony_ci break; 47928c2ecf20Sopenharmony_ci case 0x111d7603: /* 6 Port with Analog Mixer */ 47938c2ecf20Sopenharmony_ci if ((codec->core.revision_id & 0xf) == 1) 47948c2ecf20Sopenharmony_ci spec->stream_delay = 40; /* 40 milliseconds */ 47958c2ecf20Sopenharmony_ci 47968c2ecf20Sopenharmony_ci break; 47978c2ecf20Sopenharmony_ci } 47988c2ecf20Sopenharmony_ci 47998c2ecf20Sopenharmony_ci if (get_wcaps_type(get_wcaps(codec, 0x28)) == AC_WID_VOL_KNB) 48008c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac92hd71bxx_core_init); 48018c2ecf20Sopenharmony_ci 48028c2ecf20Sopenharmony_ci if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) { 48038c2ecf20Sopenharmony_ci const hda_nid_t *p; 48048c2ecf20Sopenharmony_ci for (p = unmute_nids; *p; p++) 48058c2ecf20Sopenharmony_ci snd_hda_codec_amp_init_stereo(codec, *p, HDA_INPUT, 0, 48068c2ecf20Sopenharmony_ci 0xff, 0x00); 48078c2ecf20Sopenharmony_ci } 48088c2ecf20Sopenharmony_ci 48098c2ecf20Sopenharmony_ci spec->aloopback_ctl = &stac92hd71bxx_loopback; 48108c2ecf20Sopenharmony_ci spec->aloopback_mask = 0x50; 48118c2ecf20Sopenharmony_ci spec->aloopback_shift = 0; 48128c2ecf20Sopenharmony_ci 48138c2ecf20Sopenharmony_ci spec->powerdown_adcs = 1; 48148c2ecf20Sopenharmony_ci spec->gen.beep_nid = 0x26; /* digital beep */ 48158c2ecf20Sopenharmony_ci spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids); 48168c2ecf20Sopenharmony_ci spec->pwr_nids = stac92hd71bxx_pwr_nids; 48178c2ecf20Sopenharmony_ci 48188c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac92hd71bxx_models, stac92hd71bxx_fixup_tbl, 48198c2ecf20Sopenharmony_ci stac92hd71bxx_fixups); 48208c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 48218c2ecf20Sopenharmony_ci 48228c2ecf20Sopenharmony_ci stac_setup_gpio(codec); 48238c2ecf20Sopenharmony_ci 48248c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 48258c2ecf20Sopenharmony_ci if (err < 0) { 48268c2ecf20Sopenharmony_ci stac_free(codec); 48278c2ecf20Sopenharmony_ci return err; 48288c2ecf20Sopenharmony_ci } 48298c2ecf20Sopenharmony_ci 48308c2ecf20Sopenharmony_ci codec->proc_widget_hook = stac92hd7x_proc_hook; 48318c2ecf20Sopenharmony_ci 48328c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 48338c2ecf20Sopenharmony_ci 48348c2ecf20Sopenharmony_ci return 0; 48358c2ecf20Sopenharmony_ci} 48368c2ecf20Sopenharmony_ci 48378c2ecf20Sopenharmony_cistatic int patch_stac922x(struct hda_codec *codec) 48388c2ecf20Sopenharmony_ci{ 48398c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 48408c2ecf20Sopenharmony_ci int err; 48418c2ecf20Sopenharmony_ci 48428c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 48438c2ecf20Sopenharmony_ci if (err < 0) 48448c2ecf20Sopenharmony_ci return err; 48458c2ecf20Sopenharmony_ci 48468c2ecf20Sopenharmony_ci spec = codec->spec; 48478c2ecf20Sopenharmony_ci spec->linear_tone_beep = 1; 48488c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 48498c2ecf20Sopenharmony_ci 48508c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac922x_core_init); 48518c2ecf20Sopenharmony_ci 48528c2ecf20Sopenharmony_ci /* Fix Mux capture level; max to 2 */ 48538c2ecf20Sopenharmony_ci snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT, 48548c2ecf20Sopenharmony_ci (0 << AC_AMPCAP_OFFSET_SHIFT) | 48558c2ecf20Sopenharmony_ci (2 << AC_AMPCAP_NUM_STEPS_SHIFT) | 48568c2ecf20Sopenharmony_ci (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) | 48578c2ecf20Sopenharmony_ci (0 << AC_AMPCAP_MUTE_SHIFT)); 48588c2ecf20Sopenharmony_ci 48598c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac922x_models, stac922x_fixup_tbl, 48608c2ecf20Sopenharmony_ci stac922x_fixups); 48618c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 48628c2ecf20Sopenharmony_ci 48638c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 48648c2ecf20Sopenharmony_ci if (err < 0) { 48658c2ecf20Sopenharmony_ci stac_free(codec); 48668c2ecf20Sopenharmony_ci return err; 48678c2ecf20Sopenharmony_ci } 48688c2ecf20Sopenharmony_ci 48698c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 48708c2ecf20Sopenharmony_ci 48718c2ecf20Sopenharmony_ci return 0; 48728c2ecf20Sopenharmony_ci} 48738c2ecf20Sopenharmony_ci 48748c2ecf20Sopenharmony_cistatic const char * const stac927x_spdif_labels[] = { 48758c2ecf20Sopenharmony_ci "Digital Playback", "ADAT", "Analog Mux 1", 48768c2ecf20Sopenharmony_ci "Analog Mux 2", "Analog Mux 3", NULL 48778c2ecf20Sopenharmony_ci}; 48788c2ecf20Sopenharmony_ci 48798c2ecf20Sopenharmony_cistatic int patch_stac927x(struct hda_codec *codec) 48808c2ecf20Sopenharmony_ci{ 48818c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 48828c2ecf20Sopenharmony_ci int err; 48838c2ecf20Sopenharmony_ci 48848c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 48858c2ecf20Sopenharmony_ci if (err < 0) 48868c2ecf20Sopenharmony_ci return err; 48878c2ecf20Sopenharmony_ci 48888c2ecf20Sopenharmony_ci spec = codec->spec; 48898c2ecf20Sopenharmony_ci spec->linear_tone_beep = 1; 48908c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 48918c2ecf20Sopenharmony_ci spec->have_spdif_mux = 1; 48928c2ecf20Sopenharmony_ci spec->spdif_labels = stac927x_spdif_labels; 48938c2ecf20Sopenharmony_ci 48948c2ecf20Sopenharmony_ci spec->gen.beep_nid = 0x23; /* digital beep */ 48958c2ecf20Sopenharmony_ci 48968c2ecf20Sopenharmony_ci /* GPIO0 High = Enable EAPD */ 48978c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = 0x01; 48988c2ecf20Sopenharmony_ci spec->gpio_dir = spec->gpio_data = 0x01; 48998c2ecf20Sopenharmony_ci 49008c2ecf20Sopenharmony_ci spec->aloopback_ctl = &stac927x_loopback; 49018c2ecf20Sopenharmony_ci spec->aloopback_mask = 0x40; 49028c2ecf20Sopenharmony_ci spec->aloopback_shift = 0; 49038c2ecf20Sopenharmony_ci spec->eapd_switch = 1; 49048c2ecf20Sopenharmony_ci 49058c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac927x_models, stac927x_fixup_tbl, 49068c2ecf20Sopenharmony_ci stac927x_fixups); 49078c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 49088c2ecf20Sopenharmony_ci 49098c2ecf20Sopenharmony_ci if (!spec->volknob_init) 49108c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac927x_core_init); 49118c2ecf20Sopenharmony_ci 49128c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 49138c2ecf20Sopenharmony_ci if (err < 0) { 49148c2ecf20Sopenharmony_ci stac_free(codec); 49158c2ecf20Sopenharmony_ci return err; 49168c2ecf20Sopenharmony_ci } 49178c2ecf20Sopenharmony_ci 49188c2ecf20Sopenharmony_ci codec->proc_widget_hook = stac927x_proc_hook; 49198c2ecf20Sopenharmony_ci 49208c2ecf20Sopenharmony_ci /* 49218c2ecf20Sopenharmony_ci * !!FIXME!! 49228c2ecf20Sopenharmony_ci * The STAC927x seem to require fairly long delays for certain 49238c2ecf20Sopenharmony_ci * command sequences. With too short delays (even if the answer 49248c2ecf20Sopenharmony_ci * is set to RIRB properly), it results in the silence output 49258c2ecf20Sopenharmony_ci * on some hardwares like Dell. 49268c2ecf20Sopenharmony_ci * 49278c2ecf20Sopenharmony_ci * The below flag enables the longer delay (see get_response 49288c2ecf20Sopenharmony_ci * in hda_intel.c). 49298c2ecf20Sopenharmony_ci */ 49308c2ecf20Sopenharmony_ci codec->bus->core.needs_damn_long_delay = 1; 49318c2ecf20Sopenharmony_ci 49328c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 49338c2ecf20Sopenharmony_ci 49348c2ecf20Sopenharmony_ci return 0; 49358c2ecf20Sopenharmony_ci} 49368c2ecf20Sopenharmony_ci 49378c2ecf20Sopenharmony_cistatic int patch_stac9205(struct hda_codec *codec) 49388c2ecf20Sopenharmony_ci{ 49398c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 49408c2ecf20Sopenharmony_ci int err; 49418c2ecf20Sopenharmony_ci 49428c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 49438c2ecf20Sopenharmony_ci if (err < 0) 49448c2ecf20Sopenharmony_ci return err; 49458c2ecf20Sopenharmony_ci 49468c2ecf20Sopenharmony_ci spec = codec->spec; 49478c2ecf20Sopenharmony_ci spec->linear_tone_beep = 1; 49488c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 49498c2ecf20Sopenharmony_ci spec->have_spdif_mux = 1; 49508c2ecf20Sopenharmony_ci 49518c2ecf20Sopenharmony_ci spec->gen.beep_nid = 0x23; /* digital beep */ 49528c2ecf20Sopenharmony_ci 49538c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac9205_core_init); 49548c2ecf20Sopenharmony_ci spec->aloopback_ctl = &stac9205_loopback; 49558c2ecf20Sopenharmony_ci 49568c2ecf20Sopenharmony_ci spec->aloopback_mask = 0x40; 49578c2ecf20Sopenharmony_ci spec->aloopback_shift = 0; 49588c2ecf20Sopenharmony_ci 49598c2ecf20Sopenharmony_ci /* GPIO0 High = EAPD */ 49608c2ecf20Sopenharmony_ci spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1; 49618c2ecf20Sopenharmony_ci spec->gpio_data = 0x01; 49628c2ecf20Sopenharmony_ci 49638c2ecf20Sopenharmony_ci /* Turn on/off EAPD per HP plugging */ 49648c2ecf20Sopenharmony_ci spec->eapd_switch = 1; 49658c2ecf20Sopenharmony_ci 49668c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac9205_models, stac9205_fixup_tbl, 49678c2ecf20Sopenharmony_ci stac9205_fixups); 49688c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 49698c2ecf20Sopenharmony_ci 49708c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 49718c2ecf20Sopenharmony_ci if (err < 0) { 49728c2ecf20Sopenharmony_ci stac_free(codec); 49738c2ecf20Sopenharmony_ci return err; 49748c2ecf20Sopenharmony_ci } 49758c2ecf20Sopenharmony_ci 49768c2ecf20Sopenharmony_ci codec->proc_widget_hook = stac9205_proc_hook; 49778c2ecf20Sopenharmony_ci 49788c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 49798c2ecf20Sopenharmony_ci 49808c2ecf20Sopenharmony_ci return 0; 49818c2ecf20Sopenharmony_ci} 49828c2ecf20Sopenharmony_ci 49838c2ecf20Sopenharmony_ci/* 49848c2ecf20Sopenharmony_ci * STAC9872 hack 49858c2ecf20Sopenharmony_ci */ 49868c2ecf20Sopenharmony_ci 49878c2ecf20Sopenharmony_cistatic const struct hda_verb stac9872_core_init[] = { 49888c2ecf20Sopenharmony_ci {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */ 49898c2ecf20Sopenharmony_ci {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */ 49908c2ecf20Sopenharmony_ci {} 49918c2ecf20Sopenharmony_ci}; 49928c2ecf20Sopenharmony_ci 49938c2ecf20Sopenharmony_cistatic const struct hda_pintbl stac9872_vaio_pin_configs[] = { 49948c2ecf20Sopenharmony_ci { 0x0a, 0x03211020 }, 49958c2ecf20Sopenharmony_ci { 0x0b, 0x411111f0 }, 49968c2ecf20Sopenharmony_ci { 0x0c, 0x411111f0 }, 49978c2ecf20Sopenharmony_ci { 0x0d, 0x03a15030 }, 49988c2ecf20Sopenharmony_ci { 0x0e, 0x411111f0 }, 49998c2ecf20Sopenharmony_ci { 0x0f, 0x90170110 }, 50008c2ecf20Sopenharmony_ci { 0x11, 0x411111f0 }, 50018c2ecf20Sopenharmony_ci { 0x13, 0x411111f0 }, 50028c2ecf20Sopenharmony_ci { 0x14, 0x90a7013e }, 50038c2ecf20Sopenharmony_ci {} 50048c2ecf20Sopenharmony_ci}; 50058c2ecf20Sopenharmony_ci 50068c2ecf20Sopenharmony_cistatic const struct hda_model_fixup stac9872_models[] = { 50078c2ecf20Sopenharmony_ci { .id = STAC_9872_VAIO, .name = "vaio" }, 50088c2ecf20Sopenharmony_ci {} 50098c2ecf20Sopenharmony_ci}; 50108c2ecf20Sopenharmony_ci 50118c2ecf20Sopenharmony_cistatic const struct hda_fixup stac9872_fixups[] = { 50128c2ecf20Sopenharmony_ci [STAC_9872_VAIO] = { 50138c2ecf20Sopenharmony_ci .type = HDA_FIXUP_PINS, 50148c2ecf20Sopenharmony_ci .v.pins = stac9872_vaio_pin_configs, 50158c2ecf20Sopenharmony_ci }, 50168c2ecf20Sopenharmony_ci}; 50178c2ecf20Sopenharmony_ci 50188c2ecf20Sopenharmony_cistatic const struct snd_pci_quirk stac9872_fixup_tbl[] = { 50198c2ecf20Sopenharmony_ci SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0, 50208c2ecf20Sopenharmony_ci "Sony VAIO F/S", STAC_9872_VAIO), 50218c2ecf20Sopenharmony_ci {} /* terminator */ 50228c2ecf20Sopenharmony_ci}; 50238c2ecf20Sopenharmony_ci 50248c2ecf20Sopenharmony_cistatic int patch_stac9872(struct hda_codec *codec) 50258c2ecf20Sopenharmony_ci{ 50268c2ecf20Sopenharmony_ci struct sigmatel_spec *spec; 50278c2ecf20Sopenharmony_ci int err; 50288c2ecf20Sopenharmony_ci 50298c2ecf20Sopenharmony_ci err = alloc_stac_spec(codec); 50308c2ecf20Sopenharmony_ci if (err < 0) 50318c2ecf20Sopenharmony_ci return err; 50328c2ecf20Sopenharmony_ci 50338c2ecf20Sopenharmony_ci spec = codec->spec; 50348c2ecf20Sopenharmony_ci spec->linear_tone_beep = 1; 50358c2ecf20Sopenharmony_ci spec->gen.own_eapd_ctl = 1; 50368c2ecf20Sopenharmony_ci 50378c2ecf20Sopenharmony_ci snd_hda_add_verbs(codec, stac9872_core_init); 50388c2ecf20Sopenharmony_ci 50398c2ecf20Sopenharmony_ci snd_hda_pick_fixup(codec, stac9872_models, stac9872_fixup_tbl, 50408c2ecf20Sopenharmony_ci stac9872_fixups); 50418c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); 50428c2ecf20Sopenharmony_ci 50438c2ecf20Sopenharmony_ci err = stac_parse_auto_config(codec); 50448c2ecf20Sopenharmony_ci if (err < 0) { 50458c2ecf20Sopenharmony_ci stac_free(codec); 50468c2ecf20Sopenharmony_ci return -EINVAL; 50478c2ecf20Sopenharmony_ci } 50488c2ecf20Sopenharmony_ci 50498c2ecf20Sopenharmony_ci snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); 50508c2ecf20Sopenharmony_ci 50518c2ecf20Sopenharmony_ci return 0; 50528c2ecf20Sopenharmony_ci} 50538c2ecf20Sopenharmony_ci 50548c2ecf20Sopenharmony_ci 50558c2ecf20Sopenharmony_ci/* 50568c2ecf20Sopenharmony_ci * patch entries 50578c2ecf20Sopenharmony_ci */ 50588c2ecf20Sopenharmony_cistatic const struct hda_device_id snd_hda_id_sigmatel[] = { 50598c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847690, "STAC9200", patch_stac9200), 50608c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847882, "STAC9220 A1", patch_stac922x), 50618c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847680, "STAC9221 A1", patch_stac922x), 50628c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847880, "STAC9220 A2", patch_stac922x), 50638c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847681, "STAC9220D/9223D A2", patch_stac922x), 50648c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847682, "STAC9221 A2", patch_stac922x), 50658c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847683, "STAC9221D A2", patch_stac922x), 50668c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847618, "STAC9227", patch_stac927x), 50678c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847619, "STAC9227", patch_stac927x), 50688c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847638, "STAC92HD700", patch_stac927x), 50698c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847616, "STAC9228", patch_stac927x), 50708c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847617, "STAC9228", patch_stac927x), 50718c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847614, "STAC9229", patch_stac927x), 50728c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847615, "STAC9229", patch_stac927x), 50738c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847620, "STAC9274", patch_stac927x), 50748c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847621, "STAC9274D", patch_stac927x), 50758c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847622, "STAC9273X", patch_stac927x), 50768c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847623, "STAC9273D", patch_stac927x), 50778c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847624, "STAC9272X", patch_stac927x), 50788c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847625, "STAC9272D", patch_stac927x), 50798c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847626, "STAC9271X", patch_stac927x), 50808c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847627, "STAC9271D", patch_stac927x), 50818c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847628, "STAC9274X5NH", patch_stac927x), 50828c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847629, "STAC9274D5NH", patch_stac927x), 50838c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847632, "STAC9202", patch_stac925x), 50848c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847633, "STAC9202D", patch_stac925x), 50858c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847634, "STAC9250", patch_stac925x), 50868c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847635, "STAC9250D", patch_stac925x), 50878c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847636, "STAC9251", patch_stac925x), 50888c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847637, "STAC9250D", patch_stac925x), 50898c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847645, "92HD206X", patch_stac927x), 50908c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847646, "92HD206D", patch_stac927x), 50918c2ecf20Sopenharmony_ci /* The following does not take into account .id=0x83847661 when subsys = 50928c2ecf20Sopenharmony_ci * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are 50938c2ecf20Sopenharmony_ci * currently not fully supported. 50948c2ecf20Sopenharmony_ci */ 50958c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847661, "CXD9872RD/K", patch_stac9872), 50968c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847662, "STAC9872AK", patch_stac9872), 50978c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847664, "CXD9872AKD", patch_stac9872), 50988c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x83847698, "STAC9205", patch_stac9205), 50998c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a0, "STAC9205", patch_stac9205), 51008c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a1, "STAC9205D", patch_stac9205), 51018c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a2, "STAC9204", patch_stac9205), 51028c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a3, "STAC9204D", patch_stac9205), 51038c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a4, "STAC9255", patch_stac9205), 51048c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a5, "STAC9255D", patch_stac9205), 51058c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a6, "STAC9254", patch_stac9205), 51068c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x838476a7, "STAC9254D", patch_stac9205), 51078c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7603, "92HD75B3X5", patch_stac92hd71bxx), 51088c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7604, "92HD83C1X5", patch_stac92hd83xxx), 51098c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d4, "92HD83C1C5", patch_stac92hd83xxx), 51108c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7605, "92HD81B1X5", patch_stac92hd83xxx), 51118c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d5, "92HD81B1C5", patch_stac92hd83xxx), 51128c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d1, "92HD87B1/3", patch_stac92hd83xxx), 51138c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76d9, "92HD87B2/4", patch_stac92hd83xxx), 51148c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7666, "92HD88B3", patch_stac92hd83xxx), 51158c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7667, "92HD88B1", patch_stac92hd83xxx), 51168c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7668, "92HD88B2", patch_stac92hd83xxx), 51178c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7669, "92HD88B4", patch_stac92hd83xxx), 51188c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7608, "92HD75B2X5", patch_stac92hd71bxx), 51198c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7674, "92HD73D1X5", patch_stac92hd73xx), 51208c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7675, "92HD73C1X5", patch_stac92hd73xx), 51218c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7676, "92HD73E1X5", patch_stac92hd73xx), 51228c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d7695, "92HD95", patch_stac92hd95), 51238c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b0, "92HD71B8X", patch_stac92hd71bxx), 51248c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b1, "92HD71B8X", patch_stac92hd71bxx), 51258c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b2, "92HD71B7X", patch_stac92hd71bxx), 51268c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b3, "92HD71B7X", patch_stac92hd71bxx), 51278c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b4, "92HD71B6X", patch_stac92hd71bxx), 51288c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b5, "92HD71B6X", patch_stac92hd71bxx), 51298c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b6, "92HD71B5X", patch_stac92hd71bxx), 51308c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76b7, "92HD71B5X", patch_stac92hd71bxx), 51318c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c0, "92HD89C3", patch_stac92hd73xx), 51328c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c1, "92HD89C2", patch_stac92hd73xx), 51338c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c2, "92HD89C1", patch_stac92hd73xx), 51348c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c3, "92HD89B3", patch_stac92hd73xx), 51358c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c4, "92HD89B2", patch_stac92hd73xx), 51368c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c5, "92HD89B1", patch_stac92hd73xx), 51378c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c6, "92HD89E3", patch_stac92hd73xx), 51388c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c7, "92HD89E2", patch_stac92hd73xx), 51398c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c8, "92HD89E1", patch_stac92hd73xx), 51408c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76c9, "92HD89D3", patch_stac92hd73xx), 51418c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ca, "92HD89D2", patch_stac92hd73xx), 51428c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76cb, "92HD89D1", patch_stac92hd73xx), 51438c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76cc, "92HD89F3", patch_stac92hd73xx), 51448c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76cd, "92HD89F2", patch_stac92hd73xx), 51458c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ce, "92HD89F1", patch_stac92hd73xx), 51468c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76df, "92HD93BXX", patch_stac92hd83xxx), 51478c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e0, "92HD91BXX", patch_stac92hd83xxx), 51488c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e3, "92HD98BXX", patch_stac92hd83xxx), 51498c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e5, "92HD99BXX", patch_stac92hd83xxx), 51508c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e7, "92HD90BXX", patch_stac92hd83xxx), 51518c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e8, "92HD66B1X5", patch_stac92hd83xxx), 51528c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76e9, "92HD66B2X5", patch_stac92hd83xxx), 51538c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ea, "92HD66B3X5", patch_stac92hd83xxx), 51548c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76eb, "92HD66C1X5", patch_stac92hd83xxx), 51558c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ec, "92HD66C2X5", patch_stac92hd83xxx), 51568c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ed, "92HD66C3X5", patch_stac92hd83xxx), 51578c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ee, "92HD66B1X3", patch_stac92hd83xxx), 51588c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76ef, "92HD66B2X3", patch_stac92hd83xxx), 51598c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f0, "92HD66B3X3", patch_stac92hd83xxx), 51608c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f1, "92HD66C1X3", patch_stac92hd83xxx), 51618c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f2, "92HD66C2X3", patch_stac92hd83xxx), 51628c2ecf20Sopenharmony_ci HDA_CODEC_ENTRY(0x111d76f3, "92HD66C3/65", patch_stac92hd83xxx), 51638c2ecf20Sopenharmony_ci {} /* terminator */ 51648c2ecf20Sopenharmony_ci}; 51658c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(hdaudio, snd_hda_id_sigmatel); 51668c2ecf20Sopenharmony_ci 51678c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 51688c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec"); 51698c2ecf20Sopenharmony_ci 51708c2ecf20Sopenharmony_cistatic struct hda_codec_driver sigmatel_driver = { 51718c2ecf20Sopenharmony_ci .id = snd_hda_id_sigmatel, 51728c2ecf20Sopenharmony_ci}; 51738c2ecf20Sopenharmony_ci 51748c2ecf20Sopenharmony_cimodule_hda_codec_driver(sigmatel_driver); 5175