1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* Copyright (c) 2017 Maxim Integrated */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _MAX98373_H 5*4882a593Smuzhiyun #define _MAX98373_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define MAX98373_R2000_SW_RESET 0x2000 8*4882a593Smuzhiyun #define MAX98373_R2001_INT_RAW1 0x2001 9*4882a593Smuzhiyun #define MAX98373_R2002_INT_RAW2 0x2002 10*4882a593Smuzhiyun #define MAX98373_R2003_INT_RAW3 0x2003 11*4882a593Smuzhiyun #define MAX98373_R2004_INT_STATE1 0x2004 12*4882a593Smuzhiyun #define MAX98373_R2005_INT_STATE2 0x2005 13*4882a593Smuzhiyun #define MAX98373_R2006_INT_STATE3 0x2006 14*4882a593Smuzhiyun #define MAX98373_R2007_INT_FLAG1 0x2007 15*4882a593Smuzhiyun #define MAX98373_R2008_INT_FLAG2 0x2008 16*4882a593Smuzhiyun #define MAX98373_R2009_INT_FLAG3 0x2009 17*4882a593Smuzhiyun #define MAX98373_R200A_INT_EN1 0x200A 18*4882a593Smuzhiyun #define MAX98373_R200B_INT_EN2 0x200B 19*4882a593Smuzhiyun #define MAX98373_R200C_INT_EN3 0x200C 20*4882a593Smuzhiyun #define MAX98373_R200D_INT_FLAG_CLR1 0x200D 21*4882a593Smuzhiyun #define MAX98373_R200E_INT_FLAG_CLR2 0x200E 22*4882a593Smuzhiyun #define MAX98373_R200F_INT_FLAG_CLR3 0x200F 23*4882a593Smuzhiyun #define MAX98373_R2010_IRQ_CTRL 0x2010 24*4882a593Smuzhiyun #define MAX98373_R2014_THERM_WARN_THRESH 0x2014 25*4882a593Smuzhiyun #define MAX98373_R2015_THERM_SHDN_THRESH 0x2015 26*4882a593Smuzhiyun #define MAX98373_R2016_THERM_HYSTERESIS 0x2016 27*4882a593Smuzhiyun #define MAX98373_R2017_THERM_FOLDBACK_SET 0x2017 28*4882a593Smuzhiyun #define MAX98373_R2018_THERM_FOLDBACK_EN 0x2018 29*4882a593Smuzhiyun #define MAX98373_R201E_PIN_DRIVE_STRENGTH 0x201E 30*4882a593Smuzhiyun #define MAX98373_R2020_PCM_TX_HIZ_EN_1 0x2020 31*4882a593Smuzhiyun #define MAX98373_R2021_PCM_TX_HIZ_EN_2 0x2021 32*4882a593Smuzhiyun #define MAX98373_R2022_PCM_TX_SRC_1 0x2022 33*4882a593Smuzhiyun #define MAX98373_R2023_PCM_TX_SRC_2 0x2023 34*4882a593Smuzhiyun #define MAX98373_R2024_PCM_DATA_FMT_CFG 0x2024 35*4882a593Smuzhiyun #define MAX98373_R2025_AUDIO_IF_MODE 0x2025 36*4882a593Smuzhiyun #define MAX98373_R2026_PCM_CLOCK_RATIO 0x2026 37*4882a593Smuzhiyun #define MAX98373_R2027_PCM_SR_SETUP_1 0x2027 38*4882a593Smuzhiyun #define MAX98373_R2028_PCM_SR_SETUP_2 0x2028 39*4882a593Smuzhiyun #define MAX98373_R2029_PCM_TO_SPK_MONO_MIX_1 0x2029 40*4882a593Smuzhiyun #define MAX98373_R202A_PCM_TO_SPK_MONO_MIX_2 0x202A 41*4882a593Smuzhiyun #define MAX98373_R202B_PCM_RX_EN 0x202B 42*4882a593Smuzhiyun #define MAX98373_R202C_PCM_TX_EN 0x202C 43*4882a593Smuzhiyun #define MAX98373_R202E_ICC_RX_CH_EN_1 0x202E 44*4882a593Smuzhiyun #define MAX98373_R202F_ICC_RX_CH_EN_2 0x202F 45*4882a593Smuzhiyun #define MAX98373_R2030_ICC_TX_HIZ_EN_1 0x2030 46*4882a593Smuzhiyun #define MAX98373_R2031_ICC_TX_HIZ_EN_2 0x2031 47*4882a593Smuzhiyun #define MAX98373_R2032_ICC_LINK_EN_CFG 0x2032 48*4882a593Smuzhiyun #define MAX98373_R2034_ICC_TX_CNTL 0x2034 49*4882a593Smuzhiyun #define MAX98373_R2035_ICC_TX_EN 0x2035 50*4882a593Smuzhiyun #define MAX98373_R2036_SOUNDWIRE_CTRL 0x2036 51*4882a593Smuzhiyun #define MAX98373_R203D_AMP_DIG_VOL_CTRL 0x203D 52*4882a593Smuzhiyun #define MAX98373_R203E_AMP_PATH_GAIN 0x203E 53*4882a593Smuzhiyun #define MAX98373_R203F_AMP_DSP_CFG 0x203F 54*4882a593Smuzhiyun #define MAX98373_R2040_TONE_GEN_CFG 0x2040 55*4882a593Smuzhiyun #define MAX98373_R2041_AMP_CFG 0x2041 56*4882a593Smuzhiyun #define MAX98373_R2042_AMP_EDGE_RATE_CFG 0x2042 57*4882a593Smuzhiyun #define MAX98373_R2043_AMP_EN 0x2043 58*4882a593Smuzhiyun #define MAX98373_R2046_IV_SENSE_ADC_DSP_CFG 0x2046 59*4882a593Smuzhiyun #define MAX98373_R2047_IV_SENSE_ADC_EN 0x2047 60*4882a593Smuzhiyun #define MAX98373_R2051_MEAS_ADC_SAMPLING_RATE 0x2051 61*4882a593Smuzhiyun #define MAX98373_R2052_MEAS_ADC_PVDD_FLT_CFG 0x2052 62*4882a593Smuzhiyun #define MAX98373_R2053_MEAS_ADC_THERM_FLT_CFG 0x2053 63*4882a593Smuzhiyun #define MAX98373_R2054_MEAS_ADC_PVDD_CH_READBACK 0x2054 64*4882a593Smuzhiyun #define MAX98373_R2055_MEAS_ADC_THERM_CH_READBACK 0x2055 65*4882a593Smuzhiyun #define MAX98373_R2056_MEAS_ADC_PVDD_CH_EN 0x2056 66*4882a593Smuzhiyun #define MAX98373_R2090_BDE_LVL_HOLD 0x2090 67*4882a593Smuzhiyun #define MAX98373_R2091_BDE_GAIN_ATK_REL_RATE 0x2091 68*4882a593Smuzhiyun #define MAX98373_R2092_BDE_CLIPPER_MODE 0x2092 69*4882a593Smuzhiyun #define MAX98373_R2097_BDE_L1_THRESH 0x2097 70*4882a593Smuzhiyun #define MAX98373_R2098_BDE_L2_THRESH 0x2098 71*4882a593Smuzhiyun #define MAX98373_R2099_BDE_L3_THRESH 0x2099 72*4882a593Smuzhiyun #define MAX98373_R209A_BDE_L4_THRESH 0x209A 73*4882a593Smuzhiyun #define MAX98373_R209B_BDE_THRESH_HYST 0x209B 74*4882a593Smuzhiyun #define MAX98373_R20A8_BDE_L1_CFG_1 0x20A8 75*4882a593Smuzhiyun #define MAX98373_R20A9_BDE_L1_CFG_2 0x20A9 76*4882a593Smuzhiyun #define MAX98373_R20AA_BDE_L1_CFG_3 0x20AA 77*4882a593Smuzhiyun #define MAX98373_R20AB_BDE_L2_CFG_1 0x20AB 78*4882a593Smuzhiyun #define MAX98373_R20AC_BDE_L2_CFG_2 0x20AC 79*4882a593Smuzhiyun #define MAX98373_R20AD_BDE_L2_CFG_3 0x20AD 80*4882a593Smuzhiyun #define MAX98373_R20AE_BDE_L3_CFG_1 0x20AE 81*4882a593Smuzhiyun #define MAX98373_R20AF_BDE_L3_CFG_2 0x20AF 82*4882a593Smuzhiyun #define MAX98373_R20B0_BDE_L3_CFG_3 0x20B0 83*4882a593Smuzhiyun #define MAX98373_R20B1_BDE_L4_CFG_1 0x20B1 84*4882a593Smuzhiyun #define MAX98373_R20B2_BDE_L4_CFG_2 0x20B2 85*4882a593Smuzhiyun #define MAX98373_R20B3_BDE_L4_CFG_3 0x20B3 86*4882a593Smuzhiyun #define MAX98373_R20B4_BDE_INFINITE_HOLD_RELEASE 0x20B4 87*4882a593Smuzhiyun #define MAX98373_R20B5_BDE_EN 0x20B5 88*4882a593Smuzhiyun #define MAX98373_R20B6_BDE_CUR_STATE_READBACK 0x20B6 89*4882a593Smuzhiyun #define MAX98373_R20D1_DHT_CFG 0x20D1 90*4882a593Smuzhiyun #define MAX98373_R20D2_DHT_ATTACK_CFG 0x20D2 91*4882a593Smuzhiyun #define MAX98373_R20D3_DHT_RELEASE_CFG 0x20D3 92*4882a593Smuzhiyun #define MAX98373_R20D4_DHT_EN 0x20D4 93*4882a593Smuzhiyun #define MAX98373_R20E0_LIMITER_THRESH_CFG 0x20E0 94*4882a593Smuzhiyun #define MAX98373_R20E1_LIMITER_ATK_REL_RATES 0x20E1 95*4882a593Smuzhiyun #define MAX98373_R20E2_LIMITER_EN 0x20E2 96*4882a593Smuzhiyun #define MAX98373_R20FE_DEVICE_AUTO_RESTART_CFG 0x20FE 97*4882a593Smuzhiyun #define MAX98373_R20FF_GLOBAL_SHDN 0x20FF 98*4882a593Smuzhiyun #define MAX98373_R21FF_REV_ID 0x21FF 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* MAX98373_R2022_PCM_TX_SRC_1 */ 101*4882a593Smuzhiyun #define MAX98373_PCM_TX_CH_SRC_A_V_SHIFT (0) 102*4882a593Smuzhiyun #define MAX98373_PCM_TX_CH_SRC_A_I_SHIFT (4) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* MAX98373_R2024_PCM_DATA_FMT_CFG */ 105*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_FORMAT_MASK (0x7 << 3) 106*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_FORMAT_SHIFT (3) 107*4882a593Smuzhiyun #define MAX98373_PCM_TX_CH_INTERLEAVE_MASK (0x1 << 2) 108*4882a593Smuzhiyun #define MAX98373_PCM_FORMAT_I2S (0x0 << 0) 109*4882a593Smuzhiyun #define MAX98373_PCM_FORMAT_LJ (0x1 << 0) 110*4882a593Smuzhiyun #define MAX98373_PCM_FORMAT_TDM_MODE0 (0x3 << 0) 111*4882a593Smuzhiyun #define MAX98373_PCM_FORMAT_TDM_MODE1 (0x4 << 0) 112*4882a593Smuzhiyun #define MAX98373_PCM_FORMAT_TDM_MODE2 (0x5 << 0) 113*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_CHANSZ_MASK (0x3 << 6) 114*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_CHANSZ_16 (0x1 << 6) 115*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_CHANSZ_24 (0x2 << 6) 116*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_CHANSZ_32 (0x3 << 6) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* MAX98373_R2026_PCM_CLOCK_RATIO */ 119*4882a593Smuzhiyun #define MAX98373_PCM_MODE_CFG_PCM_BCLKEDGE (0x1 << 4) 120*4882a593Smuzhiyun #define MAX98373_PCM_CLK_SETUP_BSEL_MASK (0xF << 0) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* MAX98373_R2027_PCM_SR_SETUP_1 */ 123*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_MASK (0xF << 0) 124*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_8000 (0x0 << 0) 125*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_11025 (0x1 << 0) 126*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_12000 (0x2 << 0) 127*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_16000 (0x3 << 0) 128*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_22050 (0x4 << 0) 129*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_24000 (0x5 << 0) 130*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_32000 (0x6 << 0) 131*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_44100 (0x7 << 0) 132*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_48000 (0x8 << 0) 133*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_88200 (0x9 << 0) 134*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET1_SR_96000 (0xA << 0) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* MAX98373_R2028_PCM_SR_SETUP_2 */ 137*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET2_SR_MASK (0xF << 4) 138*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET2_SR_SHIFT (4) 139*4882a593Smuzhiyun #define MAX98373_PCM_SR_SET2_IVADC_SR_MASK (0xF << 0) 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* MAX98373_R2029_PCM_TO_SPK_MONO_MIX_1 */ 142*4882a593Smuzhiyun #define MAX98373_PCM_TO_SPK_MONOMIX_CFG_MASK (0x3 << 6) 143*4882a593Smuzhiyun #define MAX98373_PCM_TO_SPK_MONOMIX_CFG_SHIFT (6) 144*4882a593Smuzhiyun #define MAX98373_PCM_TO_SPK_CH0_SRC_MASK (0xF << 0) 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* MAX98373_R203E_AMP_PATH_GAIN */ 147*4882a593Smuzhiyun #define MAX98373_SPK_DIGI_GAIN_MASK (0xF << 4) 148*4882a593Smuzhiyun #define MAX98373_SPK_DIGI_GAIN_SHIFT (4) 149*4882a593Smuzhiyun #define MAX98373_FS_GAIN_MAX_MASK (0xF << 0) 150*4882a593Smuzhiyun #define MAX98373_FS_GAIN_MAX_SHIFT (0) 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* MAX98373_R203F_AMP_DSP_CFG */ 153*4882a593Smuzhiyun #define MAX98373_AMP_DSP_CFG_DCBLK_SHIFT (0) 154*4882a593Smuzhiyun #define MAX98373_AMP_DSP_CFG_DITH_SHIFT (1) 155*4882a593Smuzhiyun #define MAX98373_AMP_DSP_CFG_RMP_UP_SHIFT (2) 156*4882a593Smuzhiyun #define MAX98373_AMP_DSP_CFG_RMP_DN_SHIFT (3) 157*4882a593Smuzhiyun #define MAX98373_AMP_DSP_CFG_DAC_INV_SHIFT (5) 158*4882a593Smuzhiyun #define MAX98373_AMP_VOL_SEL_SHIFT (7) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* MAX98373_R2043_AMP_EN */ 161*4882a593Smuzhiyun #define MAX98373_SPKFB_EN_MASK (0x1 << 1) 162*4882a593Smuzhiyun #define MAX98373_SPK_EN_MASK (0x1 << 0) 163*4882a593Smuzhiyun #define MAX98373_SPKFB_EN_SHIFT (1) 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /*MAX98373_R2052_MEAS_ADC_PVDD_FLT_CFG */ 166*4882a593Smuzhiyun #define MAX98373_FLT_EN_SHIFT (4) 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* MAX98373_R20B2_BDE_L4_CFG_2 */ 169*4882a593Smuzhiyun #define MAX98373_LVL4_MUTE_EN_SHIFT (7) 170*4882a593Smuzhiyun #define MAX98373_LVL4_HOLD_EN_SHIFT (6) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* MAX98373_R20B5_BDE_EN */ 173*4882a593Smuzhiyun #define MAX98373_BDE_EN_SHIFT (0) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* MAX98373_R20D1_DHT_CFG */ 176*4882a593Smuzhiyun #define MAX98373_DHT_SPK_GAIN_MIN_SHIFT (4) 177*4882a593Smuzhiyun #define MAX98373_DHT_ROT_PNT_SHIFT (0) 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* MAX98373_R20D2_DHT_ATTACK_CFG */ 180*4882a593Smuzhiyun #define MAX98373_DHT_ATTACK_STEP_SHIFT (3) 181*4882a593Smuzhiyun #define MAX98373_DHT_ATTACK_RATE_SHIFT (0) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* MAX98373_R20D3_DHT_RELEASE_CFG */ 184*4882a593Smuzhiyun #define MAX98373_DHT_RELEASE_STEP_SHIFT (3) 185*4882a593Smuzhiyun #define MAX98373_DHT_RELEASE_RATE_SHIFT (0) 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* MAX98373_R20D4_DHT_EN */ 188*4882a593Smuzhiyun #define MAX98373_DHT_EN_SHIFT (0) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* MAX98373_R20E0_LIMITER_THRESH_CFG */ 191*4882a593Smuzhiyun #define MAX98373_LIMITER_THRESH_SHIFT (2) 192*4882a593Smuzhiyun #define MAX98373_LIMITER_THRESH_SRC_SHIFT (0) 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* MAX98373_R20E2_LIMITER_EN */ 195*4882a593Smuzhiyun #define MAX98373_LIMITER_EN_SHIFT (0) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* MAX98373_R20FE_DEVICE_AUTO_RESTART_CFG */ 198*4882a593Smuzhiyun #define MAX98373_CLOCK_MON_SHIFT (0) 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* MAX98373_R20FF_GLOBAL_SHDN */ 201*4882a593Smuzhiyun #define MAX98373_GLOBAL_EN_MASK (0x1 << 0) 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* MAX98373_R2000_SW_RESET */ 204*4882a593Smuzhiyun #define MAX98373_SOFT_RESET (0x1 << 0) 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun struct max98373_priv { 207*4882a593Smuzhiyun struct regmap *regmap; 208*4882a593Smuzhiyun int reset_gpio; 209*4882a593Smuzhiyun unsigned int v_slot; 210*4882a593Smuzhiyun unsigned int i_slot; 211*4882a593Smuzhiyun unsigned int spkfb_slot; 212*4882a593Smuzhiyun bool interleave_mode; 213*4882a593Smuzhiyun unsigned int ch_size; 214*4882a593Smuzhiyun bool tdm_mode; 215*4882a593Smuzhiyun /* variables to support soundwire */ 216*4882a593Smuzhiyun struct sdw_slave *slave; 217*4882a593Smuzhiyun bool hw_init; 218*4882a593Smuzhiyun bool first_hw_init; 219*4882a593Smuzhiyun int slot; 220*4882a593Smuzhiyun unsigned int rx_mask; 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun extern const struct snd_soc_component_driver soc_codec_dev_max98373; 224*4882a593Smuzhiyun extern const struct snd_soc_component_driver soc_codec_dev_max98373_sdw; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun void max98373_reset(struct max98373_priv *max98373, struct device *dev); 227*4882a593Smuzhiyun void max98373_slot_config(struct device *dev, 228*4882a593Smuzhiyun struct max98373_priv *max98373); 229*4882a593Smuzhiyun #endif 230