162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * HD audio interface patch for Cirrus Logic CS8409 HDA bridge chip 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2021 Cirrus Logic, Inc. and 662306a36Sopenharmony_ci * Cirrus Logic International Semiconductor Ltd. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __CS8409_PATCH_H 1062306a36Sopenharmony_ci#define __CS8409_PATCH_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/pci.h> 1362306a36Sopenharmony_ci#include <sound/tlv.h> 1462306a36Sopenharmony_ci#include <linux/workqueue.h> 1562306a36Sopenharmony_ci#include <sound/cs42l42.h> 1662306a36Sopenharmony_ci#include <sound/hda_codec.h> 1762306a36Sopenharmony_ci#include "hda_local.h" 1862306a36Sopenharmony_ci#include "hda_auto_parser.h" 1962306a36Sopenharmony_ci#include "hda_jack.h" 2062306a36Sopenharmony_ci#include "hda_generic.h" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* CS8409 Specific Definitions */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cienum cs8409_pins { 2562306a36Sopenharmony_ci CS8409_PIN_ROOT, 2662306a36Sopenharmony_ci CS8409_PIN_AFG, 2762306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_A, 2862306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_B, 2962306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_C, 3062306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_D, 3162306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_E, 3262306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_F, 3362306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_G, 3462306a36Sopenharmony_ci CS8409_PIN_ASP1_OUT_H, 3562306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_A, 3662306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_B, 3762306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_C, 3862306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_D, 3962306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_E, 4062306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_F, 4162306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_G, 4262306a36Sopenharmony_ci CS8409_PIN_ASP2_OUT_H, 4362306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_A, 4462306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_B, 4562306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_C, 4662306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_D, 4762306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_E, 4862306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_F, 4962306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_G, 5062306a36Sopenharmony_ci CS8409_PIN_ASP1_IN_H, 5162306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_A, 5262306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_B, 5362306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_C, 5462306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_D, 5562306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_E, 5662306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_F, 5762306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_G, 5862306a36Sopenharmony_ci CS8409_PIN_ASP2_IN_H, 5962306a36Sopenharmony_ci CS8409_PIN_DMIC1, 6062306a36Sopenharmony_ci CS8409_PIN_DMIC2, 6162306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_A, 6262306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_B, 6362306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_C, 6462306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_D, 6562306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_E, 6662306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_F, 6762306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_G, 6862306a36Sopenharmony_ci CS8409_PIN_ASP1_TRANSMITTER_H, 6962306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_A, 7062306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_B, 7162306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_C, 7262306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_D, 7362306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_E, 7462306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_F, 7562306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_G, 7662306a36Sopenharmony_ci CS8409_PIN_ASP2_TRANSMITTER_H, 7762306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_A, 7862306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_B, 7962306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_C, 8062306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_D, 8162306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_E, 8262306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_F, 8362306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_G, 8462306a36Sopenharmony_ci CS8409_PIN_ASP1_RECEIVER_H, 8562306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_A, 8662306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_B, 8762306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_C, 8862306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_D, 8962306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_E, 9062306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_F, 9162306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_G, 9262306a36Sopenharmony_ci CS8409_PIN_ASP2_RECEIVER_H, 9362306a36Sopenharmony_ci CS8409_PIN_DMIC1_IN, 9462306a36Sopenharmony_ci CS8409_PIN_DMIC2_IN, 9562306a36Sopenharmony_ci CS8409_PIN_BEEP_GEN, 9662306a36Sopenharmony_ci CS8409_PIN_VENDOR_WIDGET 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cienum cs8409_coefficient_index_registers { 10062306a36Sopenharmony_ci CS8409_DEV_CFG1, 10162306a36Sopenharmony_ci CS8409_DEV_CFG2, 10262306a36Sopenharmony_ci CS8409_DEV_CFG3, 10362306a36Sopenharmony_ci CS8409_ASP1_CLK_CTRL1, 10462306a36Sopenharmony_ci CS8409_ASP1_CLK_CTRL2, 10562306a36Sopenharmony_ci CS8409_ASP1_CLK_CTRL3, 10662306a36Sopenharmony_ci CS8409_ASP2_CLK_CTRL1, 10762306a36Sopenharmony_ci CS8409_ASP2_CLK_CTRL2, 10862306a36Sopenharmony_ci CS8409_ASP2_CLK_CTRL3, 10962306a36Sopenharmony_ci CS8409_DMIC_CFG, 11062306a36Sopenharmony_ci CS8409_BEEP_CFG, 11162306a36Sopenharmony_ci ASP1_RX_NULL_INS_RMV, 11262306a36Sopenharmony_ci ASP1_Rx_RATE1, 11362306a36Sopenharmony_ci ASP1_Rx_RATE2, 11462306a36Sopenharmony_ci ASP1_Tx_NULL_INS_RMV, 11562306a36Sopenharmony_ci ASP1_Tx_RATE1, 11662306a36Sopenharmony_ci ASP1_Tx_RATE2, 11762306a36Sopenharmony_ci ASP2_Rx_NULL_INS_RMV, 11862306a36Sopenharmony_ci ASP2_Rx_RATE1, 11962306a36Sopenharmony_ci ASP2_Rx_RATE2, 12062306a36Sopenharmony_ci ASP2_Tx_NULL_INS_RMV, 12162306a36Sopenharmony_ci ASP2_Tx_RATE1, 12262306a36Sopenharmony_ci ASP2_Tx_RATE2, 12362306a36Sopenharmony_ci ASP1_SYNC_CTRL, 12462306a36Sopenharmony_ci ASP2_SYNC_CTRL, 12562306a36Sopenharmony_ci ASP1_A_TX_CTRL1, 12662306a36Sopenharmony_ci ASP1_A_TX_CTRL2, 12762306a36Sopenharmony_ci ASP1_B_TX_CTRL1, 12862306a36Sopenharmony_ci ASP1_B_TX_CTRL2, 12962306a36Sopenharmony_ci ASP1_C_TX_CTRL1, 13062306a36Sopenharmony_ci ASP1_C_TX_CTRL2, 13162306a36Sopenharmony_ci ASP1_D_TX_CTRL1, 13262306a36Sopenharmony_ci ASP1_D_TX_CTRL2, 13362306a36Sopenharmony_ci ASP1_E_TX_CTRL1, 13462306a36Sopenharmony_ci ASP1_E_TX_CTRL2, 13562306a36Sopenharmony_ci ASP1_F_TX_CTRL1, 13662306a36Sopenharmony_ci ASP1_F_TX_CTRL2, 13762306a36Sopenharmony_ci ASP1_G_TX_CTRL1, 13862306a36Sopenharmony_ci ASP1_G_TX_CTRL2, 13962306a36Sopenharmony_ci ASP1_H_TX_CTRL1, 14062306a36Sopenharmony_ci ASP1_H_TX_CTRL2, 14162306a36Sopenharmony_ci ASP2_A_TX_CTRL1, 14262306a36Sopenharmony_ci ASP2_A_TX_CTRL2, 14362306a36Sopenharmony_ci ASP2_B_TX_CTRL1, 14462306a36Sopenharmony_ci ASP2_B_TX_CTRL2, 14562306a36Sopenharmony_ci ASP2_C_TX_CTRL1, 14662306a36Sopenharmony_ci ASP2_C_TX_CTRL2, 14762306a36Sopenharmony_ci ASP2_D_TX_CTRL1, 14862306a36Sopenharmony_ci ASP2_D_TX_CTRL2, 14962306a36Sopenharmony_ci ASP2_E_TX_CTRL1, 15062306a36Sopenharmony_ci ASP2_E_TX_CTRL2, 15162306a36Sopenharmony_ci ASP2_F_TX_CTRL1, 15262306a36Sopenharmony_ci ASP2_F_TX_CTRL2, 15362306a36Sopenharmony_ci ASP2_G_TX_CTRL1, 15462306a36Sopenharmony_ci ASP2_G_TX_CTRL2, 15562306a36Sopenharmony_ci ASP2_H_TX_CTRL1, 15662306a36Sopenharmony_ci ASP2_H_TX_CTRL2, 15762306a36Sopenharmony_ci ASP1_A_RX_CTRL1, 15862306a36Sopenharmony_ci ASP1_A_RX_CTRL2, 15962306a36Sopenharmony_ci ASP1_B_RX_CTRL1, 16062306a36Sopenharmony_ci ASP1_B_RX_CTRL2, 16162306a36Sopenharmony_ci ASP1_C_RX_CTRL1, 16262306a36Sopenharmony_ci ASP1_C_RX_CTRL2, 16362306a36Sopenharmony_ci ASP1_D_RX_CTRL1, 16462306a36Sopenharmony_ci ASP1_D_RX_CTRL2, 16562306a36Sopenharmony_ci ASP1_E_RX_CTRL1, 16662306a36Sopenharmony_ci ASP1_E_RX_CTRL2, 16762306a36Sopenharmony_ci ASP1_F_RX_CTRL1, 16862306a36Sopenharmony_ci ASP1_F_RX_CTRL2, 16962306a36Sopenharmony_ci ASP1_G_RX_CTRL1, 17062306a36Sopenharmony_ci ASP1_G_RX_CTRL2, 17162306a36Sopenharmony_ci ASP1_H_RX_CTRL1, 17262306a36Sopenharmony_ci ASP1_H_RX_CTRL2, 17362306a36Sopenharmony_ci ASP2_A_RX_CTRL1, 17462306a36Sopenharmony_ci ASP2_A_RX_CTRL2, 17562306a36Sopenharmony_ci ASP2_B_RX_CTRL1, 17662306a36Sopenharmony_ci ASP2_B_RX_CTRL2, 17762306a36Sopenharmony_ci ASP2_C_RX_CTRL1, 17862306a36Sopenharmony_ci ASP2_C_RX_CTRL2, 17962306a36Sopenharmony_ci ASP2_D_RX_CTRL1, 18062306a36Sopenharmony_ci ASP2_D_RX_CTRL2, 18162306a36Sopenharmony_ci ASP2_E_RX_CTRL1, 18262306a36Sopenharmony_ci ASP2_E_RX_CTRL2, 18362306a36Sopenharmony_ci ASP2_F_RX_CTRL1, 18462306a36Sopenharmony_ci ASP2_F_RX_CTRL2, 18562306a36Sopenharmony_ci ASP2_G_RX_CTRL1, 18662306a36Sopenharmony_ci ASP2_G_RX_CTRL2, 18762306a36Sopenharmony_ci ASP2_H_RX_CTRL1, 18862306a36Sopenharmony_ci ASP2_H_RX_CTRL2, 18962306a36Sopenharmony_ci CS8409_I2C_ADDR, 19062306a36Sopenharmony_ci CS8409_I2C_DATA, 19162306a36Sopenharmony_ci CS8409_I2C_CTRL, 19262306a36Sopenharmony_ci CS8409_I2C_STS, 19362306a36Sopenharmony_ci CS8409_I2C_QWRITE, 19462306a36Sopenharmony_ci CS8409_I2C_QREAD, 19562306a36Sopenharmony_ci CS8409_SPI_CTRL, 19662306a36Sopenharmony_ci CS8409_SPI_TX_DATA, 19762306a36Sopenharmony_ci CS8409_SPI_RX_DATA, 19862306a36Sopenharmony_ci CS8409_SPI_STS, 19962306a36Sopenharmony_ci CS8409_PFE_COEF_W1, /* Parametric filter engine coefficient write 1*/ 20062306a36Sopenharmony_ci CS8409_PFE_COEF_W2, 20162306a36Sopenharmony_ci CS8409_PFE_CTRL1, 20262306a36Sopenharmony_ci CS8409_PFE_CTRL2, 20362306a36Sopenharmony_ci CS8409_PRE_SCALE_ATTN1, 20462306a36Sopenharmony_ci CS8409_PRE_SCALE_ATTN2, 20562306a36Sopenharmony_ci CS8409_PFE_COEF_MON1, /* Parametric filter engine coefficient monitor 1*/ 20662306a36Sopenharmony_ci CS8409_PFE_COEF_MON2, 20762306a36Sopenharmony_ci CS8409_ASP1_INTRN_STS, 20862306a36Sopenharmony_ci CS8409_ASP2_INTRN_STS, 20962306a36Sopenharmony_ci CS8409_ASP1_RX_SCLK_COUNT, 21062306a36Sopenharmony_ci CS8409_ASP1_TX_SCLK_COUNT, 21162306a36Sopenharmony_ci CS8409_ASP2_RX_SCLK_COUNT, 21262306a36Sopenharmony_ci CS8409_ASP2_TX_SCLK_COUNT, 21362306a36Sopenharmony_ci CS8409_ASP_UNS_RESP_MASK, 21462306a36Sopenharmony_ci CS8409_LOOPBACK_CTRL = 0x80, 21562306a36Sopenharmony_ci CS8409_PAD_CFG_SLW_RATE_CTRL = 0x82, /* Pad Config and Slew Rate Control (CIR = 0x0082) */ 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/* CS42L42 Specific Definitions */ 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci#define CS8409_MAX_CODECS 8 22162306a36Sopenharmony_ci#define CS42L42_VOLUMES (4U) 22262306a36Sopenharmony_ci#define CS42L42_HP_VOL_REAL_MIN (-63) 22362306a36Sopenharmony_ci#define CS42L42_HP_VOL_REAL_MAX (0) 22462306a36Sopenharmony_ci#define CS42L42_AMIC_VOL_REAL_MIN (-97) 22562306a36Sopenharmony_ci#define CS42L42_AMIC_VOL_REAL_MAX (12) 22662306a36Sopenharmony_ci#define CS42L42_REG_AMIC_VOL_MASK (0x00FF) 22762306a36Sopenharmony_ci#define CS42L42_HSTYPE_MASK (0x03) 22862306a36Sopenharmony_ci#define CS42L42_I2C_TIMEOUT_US (20000) 22962306a36Sopenharmony_ci#define CS42L42_I2C_SLEEP_US (2000) 23062306a36Sopenharmony_ci#define CS42L42_PDN_TIMEOUT_US (250000) 23162306a36Sopenharmony_ci#define CS42L42_PDN_SLEEP_US (2000) 23262306a36Sopenharmony_ci#define CS42L42_INIT_TIMEOUT_MS (45) 23362306a36Sopenharmony_ci#define CS42L42_FULL_SCALE_VOL_MASK (2) 23462306a36Sopenharmony_ci#define CS42L42_FULL_SCALE_VOL_0DB (1) 23562306a36Sopenharmony_ci#define CS42L42_FULL_SCALE_VOL_MINUS6DB (0) 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci/* Dell BULLSEYE / WARLOCK / CYBORG Specific Definitions */ 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci#define CS42L42_I2C_ADDR (0x48 << 1) 24062306a36Sopenharmony_ci#define CS8409_CS42L42_RESET GENMASK(5, 5) /* CS8409_GPIO5 */ 24162306a36Sopenharmony_ci#define CS8409_CS42L42_INT GENMASK(4, 4) /* CS8409_GPIO4 */ 24262306a36Sopenharmony_ci#define CS8409_CYBORG_SPEAKER_PDN GENMASK(2, 2) /* CS8409_GPIO2 */ 24362306a36Sopenharmony_ci#define CS8409_WARLOCK_SPEAKER_PDN GENMASK(1, 1) /* CS8409_GPIO1 */ 24462306a36Sopenharmony_ci#define CS8409_CS42L42_HP_PIN_NID CS8409_PIN_ASP1_TRANSMITTER_A 24562306a36Sopenharmony_ci#define CS8409_CS42L42_SPK_PIN_NID CS8409_PIN_ASP2_TRANSMITTER_A 24662306a36Sopenharmony_ci#define CS8409_CS42L42_AMIC_PIN_NID CS8409_PIN_ASP1_RECEIVER_A 24762306a36Sopenharmony_ci#define CS8409_CS42L42_DMIC_PIN_NID CS8409_PIN_DMIC1_IN 24862306a36Sopenharmony_ci#define CS8409_CS42L42_DMIC_ADC_PIN_NID CS8409_PIN_DMIC1 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci/* Dolphin */ 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci#define DOLPHIN_C0_I2C_ADDR (0x48 << 1) 25362306a36Sopenharmony_ci#define DOLPHIN_C1_I2C_ADDR (0x49 << 1) 25462306a36Sopenharmony_ci#define DOLPHIN_HP_PIN_NID CS8409_PIN_ASP1_TRANSMITTER_A 25562306a36Sopenharmony_ci#define DOLPHIN_LO_PIN_NID CS8409_PIN_ASP1_TRANSMITTER_B 25662306a36Sopenharmony_ci#define DOLPHIN_AMIC_PIN_NID CS8409_PIN_ASP1_RECEIVER_A 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci#define DOLPHIN_C0_INT GENMASK(4, 4) 25962306a36Sopenharmony_ci#define DOLPHIN_C1_INT GENMASK(0, 0) 26062306a36Sopenharmony_ci#define DOLPHIN_C0_RESET GENMASK(5, 5) 26162306a36Sopenharmony_ci#define DOLPHIN_C1_RESET GENMASK(1, 1) 26262306a36Sopenharmony_ci#define DOLPHIN_WAKE (DOLPHIN_C0_INT | DOLPHIN_C1_INT) 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cienum { 26562306a36Sopenharmony_ci CS8409_BULLSEYE, 26662306a36Sopenharmony_ci CS8409_WARLOCK, 26762306a36Sopenharmony_ci CS8409_WARLOCK_MLK, 26862306a36Sopenharmony_ci CS8409_WARLOCK_MLK_DUAL_MIC, 26962306a36Sopenharmony_ci CS8409_CYBORG, 27062306a36Sopenharmony_ci CS8409_FIXUPS, 27162306a36Sopenharmony_ci CS8409_DOLPHIN, 27262306a36Sopenharmony_ci CS8409_DOLPHIN_FIXUPS, 27362306a36Sopenharmony_ci CS8409_ODIN, 27462306a36Sopenharmony_ci}; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cienum { 27762306a36Sopenharmony_ci CS8409_CODEC0, 27862306a36Sopenharmony_ci CS8409_CODEC1 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cienum { 28262306a36Sopenharmony_ci CS42L42_VOL_ADC, 28362306a36Sopenharmony_ci CS42L42_VOL_DAC, 28462306a36Sopenharmony_ci}; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci#define CS42L42_ADC_VOL_OFFSET (CS42L42_VOL_ADC) 28762306a36Sopenharmony_ci#define CS42L42_DAC_CH0_VOL_OFFSET (CS42L42_VOL_DAC) 28862306a36Sopenharmony_ci#define CS42L42_DAC_CH1_VOL_OFFSET (CS42L42_VOL_DAC + 1) 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistruct cs8409_i2c_param { 29162306a36Sopenharmony_ci unsigned int addr; 29262306a36Sopenharmony_ci unsigned int value; 29362306a36Sopenharmony_ci}; 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_cistruct cs8409_cir_param { 29662306a36Sopenharmony_ci unsigned int nid; 29762306a36Sopenharmony_ci unsigned int cir; 29862306a36Sopenharmony_ci unsigned int coeff; 29962306a36Sopenharmony_ci}; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_cistruct sub_codec { 30262306a36Sopenharmony_ci struct hda_codec *codec; 30362306a36Sopenharmony_ci unsigned int addr; 30462306a36Sopenharmony_ci unsigned int reset_gpio; 30562306a36Sopenharmony_ci unsigned int irq_mask; 30662306a36Sopenharmony_ci const struct cs8409_i2c_param *init_seq; 30762306a36Sopenharmony_ci unsigned int init_seq_num; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci unsigned int hp_jack_in:1; 31062306a36Sopenharmony_ci unsigned int mic_jack_in:1; 31162306a36Sopenharmony_ci unsigned int suspended:1; 31262306a36Sopenharmony_ci unsigned int paged:1; 31362306a36Sopenharmony_ci unsigned int last_page; 31462306a36Sopenharmony_ci unsigned int hsbias_hiz; 31562306a36Sopenharmony_ci unsigned int full_scale_vol:1; 31662306a36Sopenharmony_ci unsigned int no_type_dect:1; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci s8 vol[CS42L42_VOLUMES]; 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistruct cs8409_spec { 32262306a36Sopenharmony_ci struct hda_gen_spec gen; 32362306a36Sopenharmony_ci struct hda_codec *codec; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci struct sub_codec *scodecs[CS8409_MAX_CODECS]; 32662306a36Sopenharmony_ci unsigned int num_scodecs; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci unsigned int gpio_mask; 32962306a36Sopenharmony_ci unsigned int gpio_dir; 33062306a36Sopenharmony_ci unsigned int gpio_data; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci int speaker_pdn_gpio; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci struct mutex i2c_mux; 33562306a36Sopenharmony_ci unsigned int i2c_clck_enabled; 33662306a36Sopenharmony_ci unsigned int dev_addr; 33762306a36Sopenharmony_ci struct delayed_work i2c_clk_work; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci unsigned int playback_started:1; 34062306a36Sopenharmony_ci unsigned int capture_started:1; 34162306a36Sopenharmony_ci unsigned int init_done:1; 34262306a36Sopenharmony_ci unsigned int build_ctrl_done:1; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci /* verb exec op override */ 34562306a36Sopenharmony_ci int (*exec_verb)(struct hdac_device *dev, unsigned int cmd, unsigned int flags, 34662306a36Sopenharmony_ci unsigned int *res); 34762306a36Sopenharmony_ci}; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ciextern const struct snd_kcontrol_new cs42l42_dac_volume_mixer; 35062306a36Sopenharmony_ciextern const struct snd_kcontrol_new cs42l42_adc_volume_mixer; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ciint cs42l42_volume_info(struct snd_kcontrol *kctrl, struct snd_ctl_elem_info *uinfo); 35362306a36Sopenharmony_ciint cs42l42_volume_get(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uctrl); 35462306a36Sopenharmony_ciint cs42l42_volume_put(struct snd_kcontrol *kctrl, struct snd_ctl_elem_value *uctrl); 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ciextern const struct hda_pcm_stream cs42l42_48k_pcm_analog_playback; 35762306a36Sopenharmony_ciextern const struct hda_pcm_stream cs42l42_48k_pcm_analog_capture; 35862306a36Sopenharmony_ciextern const struct snd_pci_quirk cs8409_fixup_tbl[]; 35962306a36Sopenharmony_ciextern const struct hda_model_fixup cs8409_models[]; 36062306a36Sopenharmony_ciextern const struct hda_fixup cs8409_fixups[]; 36162306a36Sopenharmony_ciextern const struct hda_verb cs8409_cs42l42_init_verbs[]; 36262306a36Sopenharmony_ciextern const struct cs8409_cir_param cs8409_cs42l42_hw_cfg[]; 36362306a36Sopenharmony_ciextern const struct cs8409_cir_param cs8409_cs42l42_bullseye_atn[]; 36462306a36Sopenharmony_ciextern struct sub_codec cs8409_cs42l42_codec; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ciextern const struct hda_verb dolphin_init_verbs[]; 36762306a36Sopenharmony_ciextern const struct cs8409_cir_param dolphin_hw_cfg[]; 36862306a36Sopenharmony_ciextern struct sub_codec dolphin_cs42l42_0; 36962306a36Sopenharmony_ciextern struct sub_codec dolphin_cs42l42_1; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_civoid cs8409_cs42l42_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int action); 37262306a36Sopenharmony_civoid dolphin_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int action); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci#endif 375