Path: blob/master/sound/hda/codecs/cirrus/cs8409-tables.c
26490 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* cs8409-tables.c -- HD audio codec driver for Cirrus Logic CS8409 HDA bridge chip3*4* Copyright (C) 2021 Cirrus Logic, Inc. and5* Cirrus Logic International Semiconductor Ltd.6*7* Author: Lucas Tanure <[email protected]>8*/910#include "cs8409.h"1112/******************************************************************************13* CS42L42 Specific Data14*15******************************************************************************/1617static const DECLARE_TLV_DB_SCALE(cs42l42_dac_db_scale, CS42L42_HP_VOL_REAL_MIN * 100, 100, 1);1819static const DECLARE_TLV_DB_SCALE(cs42l42_adc_db_scale, CS42L42_AMIC_VOL_REAL_MIN * 100, 100, 1);2021const struct snd_kcontrol_new cs42l42_dac_volume_mixer = {22.iface = SNDRV_CTL_ELEM_IFACE_MIXER,23.index = 0,24.subdevice = (HDA_SUBDEV_AMP_FLAG | HDA_SUBDEV_NID_FLAG),25.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ),26.info = cs42l42_volume_info,27.get = cs42l42_volume_get,28.put = cs42l42_volume_put,29.tlv = { .p = cs42l42_dac_db_scale },30.private_value = HDA_COMPOSE_AMP_VAL_OFS(CS8409_PIN_ASP1_TRANSMITTER_A, 3, CS8409_CODEC0,31HDA_OUTPUT, CS42L42_VOL_DAC) | HDA_AMP_VAL_MIN_MUTE32};3334const struct snd_kcontrol_new cs42l42_adc_volume_mixer = {35.iface = SNDRV_CTL_ELEM_IFACE_MIXER,36.index = 0,37.subdevice = (HDA_SUBDEV_AMP_FLAG | HDA_SUBDEV_NID_FLAG),38.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ),39.info = cs42l42_volume_info,40.get = cs42l42_volume_get,41.put = cs42l42_volume_put,42.tlv = { .p = cs42l42_adc_db_scale },43.private_value = HDA_COMPOSE_AMP_VAL_OFS(CS8409_PIN_ASP1_RECEIVER_A, 1, CS8409_CODEC0,44HDA_INPUT, CS42L42_VOL_ADC) | HDA_AMP_VAL_MIN_MUTE45};4647const struct hda_pcm_stream cs42l42_48k_pcm_analog_playback = {48.rates = SNDRV_PCM_RATE_48000, /* fixed rate */49};5051const struct hda_pcm_stream cs42l42_48k_pcm_analog_capture = {52.rates = SNDRV_PCM_RATE_48000, /* fixed rate */53};5455/******************************************************************************56* BULLSEYE / WARLOCK / CYBORG Specific Arrays57* CS8409/CS42L4258******************************************************************************/5960const struct hda_verb cs8409_cs42l42_init_verbs[] = {61{ CS8409_PIN_AFG, AC_VERB_SET_GPIO_WAKE_MASK, 0x0018 }, /* WAKE from GPIO 3,4 */62{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_STATE, 0x0001 }, /* Enable VPW processing */63{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x0002 }, /* Configure GPIO 6,7 */64{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0080 }, /* I2C mode */65{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x005b }, /* Set I2C bus speed */66{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0200 }, /* 100kHz I2C_STO = 2 */67{} /* terminator */68};6970static const struct hda_pintbl cs8409_cs42l42_pincfgs[] = {71{ CS8409_PIN_ASP1_TRANSMITTER_A, 0x042120f0 }, /* ASP-1-TX */72{ CS8409_PIN_ASP1_RECEIVER_A, 0x04a12050 }, /* ASP-1-RX */73{ CS8409_PIN_ASP2_TRANSMITTER_A, 0x901000f0 }, /* ASP-2-TX */74{ CS8409_PIN_DMIC1_IN, 0x90a00090 }, /* DMIC-1 */75{} /* terminator */76};7778static const struct hda_pintbl cs8409_cs42l42_pincfgs_no_dmic[] = {79{ CS8409_PIN_ASP1_TRANSMITTER_A, 0x042120f0 }, /* ASP-1-TX */80{ CS8409_PIN_ASP1_RECEIVER_A, 0x04a12050 }, /* ASP-1-RX */81{ CS8409_PIN_ASP2_TRANSMITTER_A, 0x901000f0 }, /* ASP-2-TX */82{} /* terminator */83};8485/* Vendor specific HW configuration for CS42L42 */86static const struct cs8409_i2c_param cs42l42_init_reg_seq[] = {87{ CS42L42_I2C_TIMEOUT, 0xB0 },88{ CS42L42_ADC_CTL, 0x00 },89{ 0x1D02, 0x06 },90{ CS42L42_ADC_VOLUME, 0x9F },91{ CS42L42_OSC_SWITCH, 0x01 },92{ CS42L42_MCLK_CTL, 0x02 },93{ CS42L42_SRC_CTL, 0x03 },94{ CS42L42_MCLK_SRC_SEL, 0x00 },95{ CS42L42_ASP_FRM_CFG, 0x13 },96{ CS42L42_FSYNC_P_LOWER, 0xFF },97{ CS42L42_FSYNC_P_UPPER, 0x00 },98{ CS42L42_ASP_CLK_CFG, 0x20 },99{ CS42L42_SPDIF_CLK_CFG, 0x0D },100{ CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x02 },101{ CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },102{ CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x00 },103{ CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x02 },104{ CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },105{ CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0x20 },106{ CS42L42_ASP_RX_DAI0_CH3_AP_RES, 0x02 },107{ CS42L42_ASP_RX_DAI0_CH3_BIT_MSB, 0x00 },108{ CS42L42_ASP_RX_DAI0_CH3_BIT_LSB, 0x80 },109{ CS42L42_ASP_RX_DAI0_CH4_AP_RES, 0x02 },110{ CS42L42_ASP_RX_DAI0_CH4_BIT_MSB, 0x00 },111{ CS42L42_ASP_RX_DAI0_CH4_BIT_LSB, 0xA0 },112{ CS42L42_ASP_RX_DAI0_EN, 0x0C },113{ CS42L42_ASP_TX_CH_EN, 0x01 },114{ CS42L42_ASP_TX_CH_AP_RES, 0x02 },115{ CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },116{ CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },117{ CS42L42_ASP_TX_SZ_EN, 0x01 },118{ CS42L42_PWR_CTL1, 0x0A },119{ CS42L42_PWR_CTL2, 0x84 },120{ CS42L42_MIXER_CHA_VOL, 0x3F },121{ CS42L42_MIXER_CHB_VOL, 0x3F },122{ CS42L42_MIXER_ADC_VOL, 0x3f },123{ CS42L42_HP_CTL, 0x0D },124{ CS42L42_MIC_DET_CTL1, 0xB6 },125{ CS42L42_TIPSENSE_CTL, 0xC2 },126{ CS42L42_HS_CLAMP_DISABLE, 0x01 },127{ CS42L42_HS_SWITCH_CTL, 0xF3 },128{ CS42L42_PWR_CTL3, 0x20 },129{ CS42L42_RSENSE_CTL2, 0x00 },130{ CS42L42_RSENSE_CTL3, 0x00 },131{ CS42L42_TSENSE_CTL, 0x80 },132{ CS42L42_HS_BIAS_CTL, 0xC0 },133{ CS42L42_PWR_CTL1, 0x02, 10000 },134{ CS42L42_ADC_OVFL_INT_MASK, 0xff },135{ CS42L42_MIXER_INT_MASK, 0xff },136{ CS42L42_SRC_INT_MASK, 0xff },137{ CS42L42_ASP_RX_INT_MASK, 0xff },138{ CS42L42_ASP_TX_INT_MASK, 0xff },139{ CS42L42_CODEC_INT_MASK, 0xff },140{ CS42L42_SRCPL_INT_MASK, 0xff },141{ CS42L42_VPMON_INT_MASK, 0xff },142{ CS42L42_PLL_LOCK_INT_MASK, 0xff },143{ CS42L42_TSRS_PLUG_INT_MASK, 0xff },144{ CS42L42_DET_INT1_MASK, 0xff },145{ CS42L42_DET_INT2_MASK, 0xff },146};147148/* Vendor specific hw configuration for CS8409 */149const struct cs8409_cir_param cs8409_cs42l42_hw_cfg[] = {150/* +PLL1/2_EN, +I2C_EN */151{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0xb008 },152/* ASP1/2_EN=0, ASP1_STP=1 */153{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0002 },154/* ASP1/2_BUS_IDLE=10, +GPIO_I2C */155{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG3, 0x0a80 },156/* ASP1.A: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=0 */157{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL1, 0x0800 },158/* ASP1.A: TX.RAP=0, TX.RSZ=24 bits, TX.RCS=32 */159{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL2, 0x0820 },160/* ASP2.A: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=0 */161{ CS8409_PIN_VENDOR_WIDGET, ASP2_A_TX_CTRL1, 0x0800 },162/* ASP2.A: TX.RAP=1, TX.RSZ=24 bits, TX.RCS=0 */163{ CS8409_PIN_VENDOR_WIDGET, ASP2_A_TX_CTRL2, 0x2800 },164/* ASP1.A: RX.LAP=0, RX.LSZ=24 bits, RX.LCS=0 */165{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL1, 0x0800 },166/* ASP1.A: RX.RAP=0, RX.RSZ=24 bits, RX.RCS=0 */167{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL2, 0x0800 },168/* ASP1: LCHI = 00h */169{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL1, 0x8000 },170/* ASP1: MC/SC_SRCSEL=PLL1, LCPR=FFh */171{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL2, 0x28ff },172/* ASP1: MCEN=0, FSD=011, SCPOL_IN/OUT=0, SCDIV=1:4 */173{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL3, 0x0062 },174/* ASP2: LCHI=1Fh */175{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP2_CLK_CTRL1, 0x801f },176/* ASP2: MC/SC_SRCSEL=PLL1, LCPR=3Fh */177{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP2_CLK_CTRL2, 0x283f },178/* ASP2: 5050=1, MCEN=0, FSD=010, SCPOL_IN/OUT=1, SCDIV=1:16 */179{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP2_CLK_CTRL3, 0x805c },180/* DMIC1_MO=10b, DMIC1/2_SR=1 */181{ CS8409_PIN_VENDOR_WIDGET, CS8409_DMIC_CFG, 0x0023 },182/* ASP1/2_BEEP=0 */183{ CS8409_PIN_VENDOR_WIDGET, CS8409_BEEP_CFG, 0x0000 },184/* ASP1/2_EN=1, ASP1_STP=1 */185{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0062 },186/* -PLL2_EN */187{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0x9008 },188/* TX2.A: pre-scale att.=0 dB */189{ CS8409_PIN_VENDOR_WIDGET, CS8409_PRE_SCALE_ATTN2, 0x0000 },190/* ASP1/2_xxx_EN=1, ASP1/2_MCLK_EN=0, DMIC1_SCL_EN=1 */191{ CS8409_PIN_VENDOR_WIDGET, CS8409_PAD_CFG_SLW_RATE_CTRL, 0xfc03 },192/* test mode on */193{ CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x9999 },194/* GPIO hysteresis = 30 us */195{ CS8409_PIN_VENDOR_WIDGET, 0xc5, 0x0000 },196/* test mode off */197{ CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x0000 },198{} /* Terminator */199};200201const struct cs8409_cir_param cs8409_cs42l42_bullseye_atn[] = {202/* EQ_SEL=1, EQ1/2_EN=0 */203{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_CTRL1, 0x4000 },204/* +EQ_ACC */205{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0x4000 },206/* +EQ2_EN */207{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_CTRL1, 0x4010 },208/* EQ_DATA_HI=0x0647 */209{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x0647 },210/* +EQ_WRT, +EQ_ACC, EQ_ADR=0, EQ_DATA_LO=0x67 */211{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc0c7 },212/* EQ_DATA_HI=0x0647 */213{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x0647 },214/* +EQ_WRT, +EQ_ACC, EQ_ADR=1, EQ_DATA_LO=0x67 */215{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc1c7 },216/* EQ_DATA_HI=0xf370 */217{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xf370 },218/* +EQ_WRT, +EQ_ACC, EQ_ADR=2, EQ_DATA_LO=0x71 */219{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc271 },220/* EQ_DATA_HI=0x1ef8 */221{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1ef8 },222/* +EQ_WRT, +EQ_ACC, EQ_ADR=3, EQ_DATA_LO=0x48 */223{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc348 },224/* EQ_DATA_HI=0xc110 */225{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xc110 },226/* +EQ_WRT, +EQ_ACC, EQ_ADR=4, EQ_DATA_LO=0x5a */227{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc45a },228/* EQ_DATA_HI=0x1f29 */229{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1f29 },230/* +EQ_WRT, +EQ_ACC, EQ_ADR=5, EQ_DATA_LO=0x74 */231{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc574 },232/* EQ_DATA_HI=0x1d7a */233{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1d7a },234/* +EQ_WRT, +EQ_ACC, EQ_ADR=6, EQ_DATA_LO=0x53 */235{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc653 },236/* EQ_DATA_HI=0xc38c */237{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xc38c },238/* +EQ_WRT, +EQ_ACC, EQ_ADR=7, EQ_DATA_LO=0x14 */239{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc714 },240/* EQ_DATA_HI=0x1ca3 */241{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1ca3 },242/* +EQ_WRT, +EQ_ACC, EQ_ADR=8, EQ_DATA_LO=0xc7 */243{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc8c7 },244/* EQ_DATA_HI=0xc38c */245{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xc38c },246/* +EQ_WRT, +EQ_ACC, EQ_ADR=9, EQ_DATA_LO=0x14 */247{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc914 },248/* -EQ_ACC, -EQ_WRT */249{ CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0x0000 },250{} /* Terminator */251};252253struct sub_codec cs8409_cs42l42_codec = {254.addr = CS42L42_I2C_ADDR,255.reset_gpio = CS8409_CS42L42_RESET,256.irq_mask = CS8409_CS42L42_INT,257.init_seq = cs42l42_init_reg_seq,258.init_seq_num = ARRAY_SIZE(cs42l42_init_reg_seq),259.hp_jack_in = 0,260.mic_jack_in = 0,261.paged = 1,262.suspended = 1,263.no_type_dect = 0,264};265266/******************************************************************************267* Dolphin Specific Arrays268* CS8409/ 2 X CS42L42269******************************************************************************/270271const struct hda_verb dolphin_init_verbs[] = {272{ 0x01, AC_VERB_SET_GPIO_WAKE_MASK, DOLPHIN_WAKE }, /* WAKE from GPIO 0,4 */273{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_STATE, 0x0001 }, /* Enable VPW processing */274{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x0002 }, /* Configure GPIO 6,7 */275{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0080 }, /* I2C mode */276{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x005b }, /* Set I2C bus speed */277{ CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0200 }, /* 100kHz I2C_STO = 2 */278{} /* terminator */279};280281static const struct hda_pintbl dolphin_pincfgs[] = {282{ 0x24, 0x022210f0 }, /* ASP-1-TX-A */283{ 0x25, 0x010240f0 }, /* ASP-1-TX-B */284{ 0x34, 0x02a21050 }, /* ASP-1-RX */285{} /* terminator */286};287288/* Vendor specific HW configuration for CS42L42 */289static const struct cs8409_i2c_param dolphin_c0_init_reg_seq[] = {290{ CS42L42_I2C_TIMEOUT, 0xB0 },291{ CS42L42_ADC_CTL, 0x00 },292{ 0x1D02, 0x06 },293{ CS42L42_ADC_VOLUME, 0x9F },294{ CS42L42_OSC_SWITCH, 0x01 },295{ CS42L42_MCLK_CTL, 0x02 },296{ CS42L42_SRC_CTL, 0x03 },297{ CS42L42_MCLK_SRC_SEL, 0x00 },298{ CS42L42_ASP_FRM_CFG, 0x13 },299{ CS42L42_FSYNC_P_LOWER, 0xFF },300{ CS42L42_FSYNC_P_UPPER, 0x00 },301{ CS42L42_ASP_CLK_CFG, 0x20 },302{ CS42L42_SPDIF_CLK_CFG, 0x0D },303{ CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x02 },304{ CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },305{ CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x00 },306{ CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x02 },307{ CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },308{ CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0x20 },309{ CS42L42_ASP_RX_DAI0_EN, 0x0C },310{ CS42L42_ASP_TX_CH_EN, 0x01 },311{ CS42L42_ASP_TX_CH_AP_RES, 0x02 },312{ CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },313{ CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },314{ CS42L42_ASP_TX_SZ_EN, 0x01 },315{ CS42L42_PWR_CTL1, 0x0A },316{ CS42L42_PWR_CTL2, 0x84 },317{ CS42L42_HP_CTL, 0x0D },318{ CS42L42_MIXER_CHA_VOL, 0x3F },319{ CS42L42_MIXER_CHB_VOL, 0x3F },320{ CS42L42_MIXER_ADC_VOL, 0x3f },321{ CS42L42_MIC_DET_CTL1, 0xB6 },322{ CS42L42_TIPSENSE_CTL, 0xC2 },323{ CS42L42_HS_CLAMP_DISABLE, 0x01 },324{ CS42L42_HS_SWITCH_CTL, 0xF3 },325{ CS42L42_PWR_CTL3, 0x20 },326{ CS42L42_RSENSE_CTL2, 0x00 },327{ CS42L42_RSENSE_CTL3, 0x00 },328{ CS42L42_TSENSE_CTL, 0x80 },329{ CS42L42_HS_BIAS_CTL, 0xC0 },330{ CS42L42_PWR_CTL1, 0x02, 10000 },331{ CS42L42_ADC_OVFL_INT_MASK, 0xff },332{ CS42L42_MIXER_INT_MASK, 0xff },333{ CS42L42_SRC_INT_MASK, 0xff },334{ CS42L42_ASP_RX_INT_MASK, 0xff },335{ CS42L42_ASP_TX_INT_MASK, 0xff },336{ CS42L42_CODEC_INT_MASK, 0xff },337{ CS42L42_SRCPL_INT_MASK, 0xff },338{ CS42L42_VPMON_INT_MASK, 0xff },339{ CS42L42_PLL_LOCK_INT_MASK, 0xff },340{ CS42L42_TSRS_PLUG_INT_MASK, 0xff },341{ CS42L42_DET_INT1_MASK, 0xff },342{ CS42L42_DET_INT2_MASK, 0xff }343};344345static const struct cs8409_i2c_param dolphin_c1_init_reg_seq[] = {346{ CS42L42_I2C_TIMEOUT, 0xB0 },347{ CS42L42_ADC_CTL, 0x00 },348{ 0x1D02, 0x06 },349{ CS42L42_ADC_VOLUME, 0x9F },350{ CS42L42_OSC_SWITCH, 0x01 },351{ CS42L42_MCLK_CTL, 0x02 },352{ CS42L42_SRC_CTL, 0x03 },353{ CS42L42_MCLK_SRC_SEL, 0x00 },354{ CS42L42_ASP_FRM_CFG, 0x13 },355{ CS42L42_FSYNC_P_LOWER, 0xFF },356{ CS42L42_FSYNC_P_UPPER, 0x00 },357{ CS42L42_ASP_CLK_CFG, 0x20 },358{ CS42L42_SPDIF_CLK_CFG, 0x0D },359{ CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x02 },360{ CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },361{ CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x80 },362{ CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x02 },363{ CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },364{ CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0xA0 },365{ CS42L42_ASP_RX_DAI0_EN, 0x0C },366{ CS42L42_ASP_TX_CH_EN, 0x00 },367{ CS42L42_ASP_TX_CH_AP_RES, 0x02 },368{ CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },369{ CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },370{ CS42L42_ASP_TX_SZ_EN, 0x00 },371{ CS42L42_PWR_CTL1, 0x0E },372{ CS42L42_PWR_CTL2, 0x84 },373{ CS42L42_HP_CTL, 0x0D },374{ CS42L42_MIXER_CHA_VOL, 0x3F },375{ CS42L42_MIXER_CHB_VOL, 0x3F },376{ CS42L42_MIXER_ADC_VOL, 0x3f },377{ CS42L42_MIC_DET_CTL1, 0xB6 },378{ CS42L42_TIPSENSE_CTL, 0xC2 },379{ CS42L42_HS_CLAMP_DISABLE, 0x01 },380{ CS42L42_HS_SWITCH_CTL, 0xF3 },381{ CS42L42_PWR_CTL3, 0x20 },382{ CS42L42_RSENSE_CTL2, 0x00 },383{ CS42L42_RSENSE_CTL3, 0x00 },384{ CS42L42_TSENSE_CTL, 0x80 },385{ CS42L42_HS_BIAS_CTL, 0xC0 },386{ CS42L42_PWR_CTL1, 0x06, 10000 },387{ CS42L42_ADC_OVFL_INT_MASK, 0xff },388{ CS42L42_MIXER_INT_MASK, 0xff },389{ CS42L42_SRC_INT_MASK, 0xff },390{ CS42L42_ASP_RX_INT_MASK, 0xff },391{ CS42L42_ASP_TX_INT_MASK, 0xff },392{ CS42L42_CODEC_INT_MASK, 0xff },393{ CS42L42_SRCPL_INT_MASK, 0xff },394{ CS42L42_VPMON_INT_MASK, 0xff },395{ CS42L42_PLL_LOCK_INT_MASK, 0xff },396{ CS42L42_TSRS_PLUG_INT_MASK, 0xff },397{ CS42L42_DET_INT1_MASK, 0xff },398{ CS42L42_DET_INT2_MASK, 0xff }399};400401/* Vendor specific hw configuration for CS8409 */402const struct cs8409_cir_param dolphin_hw_cfg[] = {403/* +PLL1/2_EN, +I2C_EN */404{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0xb008 },405/* ASP1_EN=0, ASP1_STP=1 */406{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0002 },407/* ASP1/2_BUS_IDLE=10, +GPIO_I2C */408{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG3, 0x0a80 },409/* ASP1.A: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=0 */410{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL1, 0x0800 },411/* ASP1.A: TX.RAP=0, TX.RSZ=24 bits, TX.RCS=32 */412{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL2, 0x0820 },413/* ASP1.B: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=128 */414{ CS8409_PIN_VENDOR_WIDGET, ASP1_B_TX_CTRL1, 0x0880 },415/* ASP1.B: TX.RAP=0, TX.RSZ=24 bits, TX.RCS=160 */416{ CS8409_PIN_VENDOR_WIDGET, ASP1_B_TX_CTRL2, 0x08a0 },417/* ASP1.A: RX.LAP=0, RX.LSZ=24 bits, RX.LCS=0 */418{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL1, 0x0800 },419/* ASP1.A: RX.RAP=0, RX.RSZ=24 bits, RX.RCS=0 */420{ CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL2, 0x0800 },421/* ASP1: LCHI = 00h */422{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL1, 0x8000 },423/* ASP1: MC/SC_SRCSEL=PLL1, LCPR=FFh */424{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL2, 0x28ff },425/* ASP1: MCEN=0, FSD=011, SCPOL_IN/OUT=0, SCDIV=1:4 */426{ CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL3, 0x0062 },427/* ASP1/2_BEEP=0 */428{ CS8409_PIN_VENDOR_WIDGET, CS8409_BEEP_CFG, 0x0000 },429/* ASP1_EN=1, ASP1_STP=1 */430{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0022 },431/* -PLL2_EN */432{ CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0x9008 },433/* ASP1_xxx_EN=1, ASP1_MCLK_EN=0 */434{ CS8409_PIN_VENDOR_WIDGET, CS8409_PAD_CFG_SLW_RATE_CTRL, 0x5400 },435/* test mode on */436{ CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x9999 },437/* GPIO hysteresis = 30 us */438{ CS8409_PIN_VENDOR_WIDGET, 0xc5, 0x0000 },439/* test mode off */440{ CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x0000 },441{} /* Terminator */442};443444struct sub_codec dolphin_cs42l42_0 = {445.addr = DOLPHIN_C0_I2C_ADDR,446.reset_gpio = DOLPHIN_C0_RESET,447.irq_mask = DOLPHIN_C0_INT,448.init_seq = dolphin_c0_init_reg_seq,449.init_seq_num = ARRAY_SIZE(dolphin_c0_init_reg_seq),450.hp_jack_in = 0,451.mic_jack_in = 0,452.paged = 1,453.suspended = 1,454.no_type_dect = 0,455};456457struct sub_codec dolphin_cs42l42_1 = {458.addr = DOLPHIN_C1_I2C_ADDR,459.reset_gpio = DOLPHIN_C1_RESET,460.irq_mask = DOLPHIN_C1_INT,461.init_seq = dolphin_c1_init_reg_seq,462.init_seq_num = ARRAY_SIZE(dolphin_c1_init_reg_seq),463.hp_jack_in = 0,464.mic_jack_in = 0,465.paged = 1,466.suspended = 1,467.no_type_dect = 1,468};469470/******************************************************************************471* CS8409 Patch Driver Structs472* Arrays Used for all projects using CS8409473******************************************************************************/474475const struct hda_quirk cs8409_fixup_tbl[] = {476SND_PCI_QUIRK(0x1028, 0x0A11, "Bullseye", CS8409_BULLSEYE),477SND_PCI_QUIRK(0x1028, 0x0A12, "Bullseye", CS8409_BULLSEYE),478SND_PCI_QUIRK(0x1028, 0x0A23, "Bullseye", CS8409_BULLSEYE),479SND_PCI_QUIRK(0x1028, 0x0A24, "Bullseye", CS8409_BULLSEYE),480SND_PCI_QUIRK(0x1028, 0x0A25, "Bullseye", CS8409_BULLSEYE),481SND_PCI_QUIRK(0x1028, 0x0A29, "Bullseye", CS8409_BULLSEYE),482SND_PCI_QUIRK(0x1028, 0x0A2A, "Bullseye", CS8409_BULLSEYE),483SND_PCI_QUIRK(0x1028, 0x0A2B, "Bullseye", CS8409_BULLSEYE),484SND_PCI_QUIRK(0x1028, 0x0A77, "Cyborg", CS8409_CYBORG),485SND_PCI_QUIRK(0x1028, 0x0A78, "Cyborg", CS8409_CYBORG),486SND_PCI_QUIRK(0x1028, 0x0A79, "Cyborg", CS8409_CYBORG),487SND_PCI_QUIRK(0x1028, 0x0A7A, "Cyborg", CS8409_CYBORG),488SND_PCI_QUIRK(0x1028, 0x0A7D, "Cyborg", CS8409_CYBORG),489SND_PCI_QUIRK(0x1028, 0x0A7E, "Cyborg", CS8409_CYBORG),490SND_PCI_QUIRK(0x1028, 0x0A7F, "Cyborg", CS8409_CYBORG),491SND_PCI_QUIRK(0x1028, 0x0A80, "Cyborg", CS8409_CYBORG),492SND_PCI_QUIRK(0x1028, 0x0AB0, "Warlock", CS8409_WARLOCK),493SND_PCI_QUIRK(0x1028, 0x0AB2, "Warlock", CS8409_WARLOCK),494SND_PCI_QUIRK(0x1028, 0x0AB1, "Warlock", CS8409_WARLOCK),495SND_PCI_QUIRK(0x1028, 0x0AB3, "Warlock", CS8409_WARLOCK),496SND_PCI_QUIRK(0x1028, 0x0AB4, "Warlock", CS8409_WARLOCK),497SND_PCI_QUIRK(0x1028, 0x0AB5, "Warlock", CS8409_WARLOCK),498SND_PCI_QUIRK(0x1028, 0x0ACF, "Dolphin", CS8409_DOLPHIN),499SND_PCI_QUIRK(0x1028, 0x0AD0, "Dolphin", CS8409_DOLPHIN),500SND_PCI_QUIRK(0x1028, 0x0AD1, "Dolphin", CS8409_DOLPHIN),501SND_PCI_QUIRK(0x1028, 0x0AD2, "Dolphin", CS8409_DOLPHIN),502SND_PCI_QUIRK(0x1028, 0x0AD3, "Dolphin", CS8409_DOLPHIN),503SND_PCI_QUIRK(0x1028, 0x0AD9, "Warlock", CS8409_WARLOCK),504SND_PCI_QUIRK(0x1028, 0x0ADA, "Warlock", CS8409_WARLOCK),505SND_PCI_QUIRK(0x1028, 0x0ADB, "Warlock", CS8409_WARLOCK),506SND_PCI_QUIRK(0x1028, 0x0ADC, "Warlock", CS8409_WARLOCK),507SND_PCI_QUIRK(0x1028, 0x0ADF, "Cyborg", CS8409_CYBORG),508SND_PCI_QUIRK(0x1028, 0x0AE0, "Cyborg", CS8409_CYBORG),509SND_PCI_QUIRK(0x1028, 0x0AE1, "Cyborg", CS8409_CYBORG),510SND_PCI_QUIRK(0x1028, 0x0AE2, "Cyborg", CS8409_CYBORG),511SND_PCI_QUIRK(0x1028, 0x0AE9, "Cyborg", CS8409_CYBORG),512SND_PCI_QUIRK(0x1028, 0x0AEA, "Cyborg", CS8409_CYBORG),513SND_PCI_QUIRK(0x1028, 0x0AEB, "Cyborg", CS8409_CYBORG),514SND_PCI_QUIRK(0x1028, 0x0AEC, "Cyborg", CS8409_CYBORG),515SND_PCI_QUIRK(0x1028, 0x0AED, "Cyborg", CS8409_CYBORG),516SND_PCI_QUIRK(0x1028, 0x0AEE, "Cyborg", CS8409_CYBORG),517SND_PCI_QUIRK(0x1028, 0x0AEF, "Cyborg", CS8409_CYBORG),518SND_PCI_QUIRK(0x1028, 0x0AF0, "Cyborg", CS8409_CYBORG),519SND_PCI_QUIRK(0x1028, 0x0AF4, "Warlock", CS8409_WARLOCK),520SND_PCI_QUIRK(0x1028, 0x0AF5, "Warlock", CS8409_WARLOCK),521SND_PCI_QUIRK(0x1028, 0x0B92, "Warlock MLK", CS8409_WARLOCK_MLK),522SND_PCI_QUIRK(0x1028, 0x0B93, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),523SND_PCI_QUIRK(0x1028, 0x0B94, "Warlock MLK", CS8409_WARLOCK_MLK),524SND_PCI_QUIRK(0x1028, 0x0B95, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),525SND_PCI_QUIRK(0x1028, 0x0B96, "Warlock MLK", CS8409_WARLOCK_MLK),526SND_PCI_QUIRK(0x1028, 0x0B97, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),527SND_PCI_QUIRK(0x1028, 0x0BA5, "Odin", CS8409_ODIN),528SND_PCI_QUIRK(0x1028, 0x0BA6, "Odin", CS8409_ODIN),529SND_PCI_QUIRK(0x1028, 0x0BA8, "Odin", CS8409_ODIN),530SND_PCI_QUIRK(0x1028, 0x0BAA, "Odin", CS8409_ODIN),531SND_PCI_QUIRK(0x1028, 0x0BAE, "Odin", CS8409_ODIN),532SND_PCI_QUIRK(0x1028, 0x0BB2, "Warlock MLK", CS8409_WARLOCK_MLK),533SND_PCI_QUIRK(0x1028, 0x0BB3, "Warlock MLK", CS8409_WARLOCK_MLK),534SND_PCI_QUIRK(0x1028, 0x0BB4, "Warlock MLK", CS8409_WARLOCK_MLK),535SND_PCI_QUIRK(0x1028, 0x0BB5, "Warlock N3 15 TGL-U Nuvoton EC", CS8409_WARLOCK),536SND_PCI_QUIRK(0x1028, 0x0BB6, "Warlock V3 15 TGL-U Nuvoton EC", CS8409_WARLOCK),537SND_PCI_QUIRK(0x1028, 0x0BB8, "Warlock MLK", CS8409_WARLOCK_MLK),538SND_PCI_QUIRK(0x1028, 0x0BB9, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),539SND_PCI_QUIRK(0x1028, 0x0BBA, "Warlock MLK", CS8409_WARLOCK_MLK),540SND_PCI_QUIRK(0x1028, 0x0BBB, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),541SND_PCI_QUIRK(0x1028, 0x0BBC, "Warlock MLK", CS8409_WARLOCK_MLK),542SND_PCI_QUIRK(0x1028, 0x0BBD, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),543SND_PCI_QUIRK(0x1028, 0x0BD4, "Dolphin", CS8409_DOLPHIN),544SND_PCI_QUIRK(0x1028, 0x0BD5, "Dolphin", CS8409_DOLPHIN),545SND_PCI_QUIRK(0x1028, 0x0BD6, "Dolphin", CS8409_DOLPHIN),546SND_PCI_QUIRK(0x1028, 0x0BD7, "Dolphin", CS8409_DOLPHIN),547SND_PCI_QUIRK(0x1028, 0x0BD8, "Dolphin", CS8409_DOLPHIN),548SND_PCI_QUIRK(0x1028, 0x0C43, "Dolphin", CS8409_DOLPHIN),549SND_PCI_QUIRK(0x1028, 0x0C50, "Dolphin", CS8409_DOLPHIN),550SND_PCI_QUIRK(0x1028, 0x0C51, "Dolphin", CS8409_DOLPHIN),551SND_PCI_QUIRK(0x1028, 0x0C52, "Dolphin", CS8409_DOLPHIN),552SND_PCI_QUIRK(0x1028, 0x0C73, "Dolphin", CS8409_DOLPHIN),553SND_PCI_QUIRK(0x1028, 0x0C75, "Dolphin", CS8409_DOLPHIN),554SND_PCI_QUIRK(0x1028, 0x0C7D, "Dolphin", CS8409_DOLPHIN),555SND_PCI_QUIRK(0x1028, 0x0C7F, "Dolphin", CS8409_DOLPHIN),556{} /* terminator */557};558559/* Dell Inspiron models with cs8409/cs42l42 */560const struct hda_model_fixup cs8409_models[] = {561{ .id = CS8409_BULLSEYE, .name = "bullseye" },562{ .id = CS8409_WARLOCK, .name = "warlock" },563{ .id = CS8409_WARLOCK_MLK, .name = "warlock mlk" },564{ .id = CS8409_WARLOCK_MLK_DUAL_MIC, .name = "warlock mlk dual mic" },565{ .id = CS8409_CYBORG, .name = "cyborg" },566{ .id = CS8409_DOLPHIN, .name = "dolphin" },567{ .id = CS8409_ODIN, .name = "odin" },568{}569};570571const struct hda_fixup cs8409_fixups[] = {572[CS8409_BULLSEYE] = {573.type = HDA_FIXUP_PINS,574.v.pins = cs8409_cs42l42_pincfgs,575.chained = true,576.chain_id = CS8409_FIXUPS,577},578[CS8409_WARLOCK] = {579.type = HDA_FIXUP_PINS,580.v.pins = cs8409_cs42l42_pincfgs,581.chained = true,582.chain_id = CS8409_FIXUPS,583},584[CS8409_WARLOCK_MLK] = {585.type = HDA_FIXUP_PINS,586.v.pins = cs8409_cs42l42_pincfgs,587.chained = true,588.chain_id = CS8409_FIXUPS,589},590[CS8409_WARLOCK_MLK_DUAL_MIC] = {591.type = HDA_FIXUP_PINS,592.v.pins = cs8409_cs42l42_pincfgs,593.chained = true,594.chain_id = CS8409_FIXUPS,595},596[CS8409_CYBORG] = {597.type = HDA_FIXUP_PINS,598.v.pins = cs8409_cs42l42_pincfgs,599.chained = true,600.chain_id = CS8409_FIXUPS,601},602[CS8409_FIXUPS] = {603.type = HDA_FIXUP_FUNC,604.v.func = cs8409_cs42l42_fixups,605},606[CS8409_DOLPHIN] = {607.type = HDA_FIXUP_PINS,608.v.pins = dolphin_pincfgs,609.chained = true,610.chain_id = CS8409_DOLPHIN_FIXUPS,611},612[CS8409_DOLPHIN_FIXUPS] = {613.type = HDA_FIXUP_FUNC,614.v.func = dolphin_fixups,615},616[CS8409_ODIN] = {617.type = HDA_FIXUP_PINS,618.v.pins = cs8409_cs42l42_pincfgs_no_dmic,619.chained = true,620.chain_id = CS8409_FIXUPS,621},622};623624625