1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (c) 2022, Analog Devices Inc. 3 4 #include <linux/gpio/consumer.h> 5 #include <linux/i2c.h> 6 #include <linux/module.h> 7 #include <sound/pcm_params.h> 8 #include <linux/regulator/consumer.h> 9 #include <sound/soc.h> 10 #include <sound/tlv.h> 11 #include "max98396.h" 12 13 static const char * const max98396_core_supplies[MAX98396_NUM_CORE_SUPPLIES] = { 14 "avdd", 15 "dvdd", 16 "dvddio", 17 }; 18 19 static const struct reg_default max98396_reg[] = { 20 {MAX98396_R2000_SW_RESET, 0x00}, 21 {MAX98396_R2001_INT_RAW1, 0x00}, 22 {MAX98396_R2002_INT_RAW2, 0x00}, 23 {MAX98396_R2003_INT_RAW3, 0x00}, 24 {MAX98396_R2004_INT_RAW4, 0x00}, 25 {MAX98396_R2006_INT_STATE1, 0x00}, 26 {MAX98396_R2007_INT_STATE2, 0x00}, 27 {MAX98396_R2008_INT_STATE3, 0x00}, 28 {MAX98396_R2009_INT_STATE4, 0x00}, 29 {MAX98396_R200B_INT_FLAG1, 0x00}, 30 {MAX98396_R200C_INT_FLAG2, 0x00}, 31 {MAX98396_R200D_INT_FLAG3, 0x00}, 32 {MAX98396_R200E_INT_FLAG4, 0x00}, 33 {MAX98396_R2010_INT_EN1, 0x02}, 34 {MAX98396_R2011_INT_EN2, 0x00}, 35 {MAX98396_R2012_INT_EN3, 0x00}, 36 {MAX98396_R2013_INT_EN4, 0x00}, 37 {MAX98396_R2015_INT_FLAG_CLR1, 0x00}, 38 {MAX98396_R2016_INT_FLAG_CLR2, 0x00}, 39 {MAX98396_R2017_INT_FLAG_CLR3, 0x00}, 40 {MAX98396_R2018_INT_FLAG_CLR4, 0x00}, 41 {MAX98396_R201F_IRQ_CTRL, 0x00}, 42 {MAX98396_R2020_THERM_WARN_THRESH, 0x46}, 43 {MAX98396_R2021_THERM_WARN_THRESH2, 0x46}, 44 {MAX98396_R2022_THERM_SHDN_THRESH, 0x64}, 45 {MAX98396_R2023_THERM_HYSTERESIS, 0x02}, 46 {MAX98396_R2024_THERM_FOLDBACK_SET, 0xC5}, 47 {MAX98396_R2027_THERM_FOLDBACK_EN, 0x01}, 48 {MAX98396_R2030_NOISEGATE_MODE_CTRL, 0x32}, 49 {MAX98396_R2033_NOISEGATE_MODE_EN, 0x00}, 50 {MAX98396_R2038_CLK_MON_CTRL, 0x00}, 51 {MAX98396_R2039_DATA_MON_CTRL, 0x00}, 52 {MAX98396_R203F_ENABLE_CTRLS, 0x0F}, 53 {MAX98396_R2040_PIN_CFG, 0x55}, 54 {MAX98396_R2041_PCM_MODE_CFG, 0xC0}, 55 {MAX98396_R2042_PCM_CLK_SETUP, 0x04}, 56 {MAX98396_R2043_PCM_SR_SETUP, 0x88}, 57 {MAX98396_R2044_PCM_TX_CTRL_1, 0x00}, 58 {MAX98396_R2045_PCM_TX_CTRL_2, 0x00}, 59 {MAX98396_R2046_PCM_TX_CTRL_3, 0x00}, 60 {MAX98396_R2047_PCM_TX_CTRL_4, 0x00}, 61 {MAX98396_R2048_PCM_TX_CTRL_5, 0x00}, 62 {MAX98396_R2049_PCM_TX_CTRL_6, 0x00}, 63 {MAX98396_R204A_PCM_TX_CTRL_7, 0x00}, 64 {MAX98396_R204B_PCM_TX_CTRL_8, 0x00}, 65 {MAX98396_R204C_PCM_TX_HIZ_CTRL_1, 0xFF}, 66 {MAX98396_R204D_PCM_TX_HIZ_CTRL_2, 0xFF}, 67 {MAX98396_R204E_PCM_TX_HIZ_CTRL_3, 0xFF}, 68 {MAX98396_R204F_PCM_TX_HIZ_CTRL_4, 0xFF}, 69 {MAX98396_R2050_PCM_TX_HIZ_CTRL_5, 0xFF}, 70 {MAX98396_R2051_PCM_TX_HIZ_CTRL_6, 0xFF}, 71 {MAX98396_R2052_PCM_TX_HIZ_CTRL_7, 0xFF}, 72 {MAX98396_R2053_PCM_TX_HIZ_CTRL_8, 0xFF}, 73 {MAX98396_R2055_PCM_RX_SRC1, 0x00}, 74 {MAX98396_R2056_PCM_RX_SRC2, 0x00}, 75 {MAX98396_R2058_PCM_BYPASS_SRC, 0x00}, 76 {MAX98396_R205D_PCM_TX_SRC_EN, 0x00}, 77 {MAX98396_R205E_PCM_RX_EN, 0x00}, 78 {MAX98396_R205F_PCM_TX_EN, 0x00}, 79 {MAX98396_R2070_ICC_RX_EN_A, 0x00}, 80 {MAX98396_R2071_ICC_RX_EN_B, 0x00}, 81 {MAX98396_R2072_ICC_TX_CTRL, 0x00}, 82 {MAX98396_R207F_ICC_EN, 0x00}, 83 {MAX98396_R2083_TONE_GEN_DC_CFG, 0x04}, 84 {MAX98396_R2084_TONE_GEN_DC_LVL1, 0x00}, 85 {MAX98396_R2085_TONE_GEN_DC_LVL2, 0x00}, 86 {MAX98396_R2086_TONE_GEN_DC_LVL3, 0x00}, 87 {MAX98396_R208F_TONE_GEN_EN, 0x00}, 88 {MAX98396_R2090_AMP_VOL_CTRL, 0x00}, 89 {MAX98396_R2091_AMP_PATH_GAIN, 0x0B}, 90 {MAX98396_R2092_AMP_DSP_CFG, 0x23}, 91 {MAX98396_R2093_SSM_CFG, 0x0D}, 92 {MAX98396_R2094_SPK_CLS_DG_THRESH, 0x12}, 93 {MAX98396_R2095_SPK_CLS_DG_HDR, 0x17}, 94 {MAX98396_R2096_SPK_CLS_DG_HOLD_TIME, 0x17}, 95 {MAX98396_R2097_SPK_CLS_DG_DELAY, 0x00}, 96 {MAX98396_R2098_SPK_CLS_DG_MODE, 0x00}, 97 {MAX98396_R2099_SPK_CLS_DG_VBAT_LVL, 0x03}, 98 {MAX98396_R209A_SPK_EDGE_CTRL, 0x00}, 99 {MAX98396_R209C_SPK_EDGE_CTRL1, 0x0A}, 100 {MAX98396_R209D_SPK_EDGE_CTRL2, 0xAA}, 101 {MAX98396_R209E_AMP_CLIP_GAIN, 0x00}, 102 {MAX98396_R209F_BYPASS_PATH_CFG, 0x00}, 103 {MAX98396_R20A0_AMP_SUPPLY_CTL, 0x00}, 104 {MAX98396_R20AF_AMP_EN, 0x00}, 105 {MAX98396_R20B0_ADC_SR, 0x30}, 106 {MAX98396_R20B1_ADC_PVDD_CFG, 0x00}, 107 {MAX98396_R20B2_ADC_VBAT_CFG, 0x00}, 108 {MAX98396_R20B3_ADC_THERMAL_CFG, 0x00}, 109 {MAX98396_R20B4_ADC_READBACK_CTRL1, 0x00}, 110 {MAX98396_R20B5_ADC_READBACK_CTRL2, 0x00}, 111 {MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0x00}, 112 {MAX98396_R20B7_ADC_PVDD_READBACK_LSB, 0x00}, 113 {MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0x00}, 114 {MAX98396_R20B9_ADC_VBAT_READBACK_LSB, 0x00}, 115 {MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0x00}, 116 {MAX98396_R20BB_ADC_TEMP_READBACK_LSB, 0x00}, 117 {MAX98396_R20BC_ADC_LO_PVDD_READBACK_MSB, 0x00}, 118 {MAX98396_R20BD_ADC_LO_PVDD_READBACK_LSB, 0x00}, 119 {MAX98396_R20BE_ADC_LO_VBAT_READBACK_MSB, 0x00}, 120 {MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB, 0x00}, 121 {MAX98396_R20C7_ADC_CFG, 0x00}, 122 {MAX98396_R20D0_DHT_CFG1, 0x00}, 123 {MAX98396_R20D1_LIMITER_CFG1, 0x08}, 124 {MAX98396_R20D2_LIMITER_CFG2, 0x00}, 125 {MAX98396_R20D3_DHT_CFG2, 0x14}, 126 {MAX98396_R20D4_DHT_CFG3, 0x02}, 127 {MAX98396_R20D5_DHT_CFG4, 0x04}, 128 {MAX98396_R20D6_DHT_HYSTERESIS_CFG, 0x07}, 129 {MAX98396_R20DF_DHT_EN, 0x00}, 130 {MAX98396_R20E0_IV_SENSE_PATH_CFG, 0x04}, 131 {MAX98396_R20E4_IV_SENSE_PATH_EN, 0x00}, 132 {MAX98396_R20E5_BPE_STATE, 0x00}, 133 {MAX98396_R20E6_BPE_L3_THRESH_MSB, 0x00}, 134 {MAX98396_R20E7_BPE_L3_THRESH_LSB, 0x00}, 135 {MAX98396_R20E8_BPE_L2_THRESH_MSB, 0x00}, 136 {MAX98396_R20E9_BPE_L2_THRESH_LSB, 0x00}, 137 {MAX98396_R20EA_BPE_L1_THRESH_MSB, 0x00}, 138 {MAX98396_R20EB_BPE_L1_THRESH_LSB, 0x00}, 139 {MAX98396_R20EC_BPE_L0_THRESH_MSB, 0x00}, 140 {MAX98396_R20ED_BPE_L0_THRESH_LSB, 0x00}, 141 {MAX98396_R20EE_BPE_L3_DWELL_HOLD_TIME, 0x00}, 142 {MAX98396_R20EF_BPE_L2_DWELL_HOLD_TIME, 0x00}, 143 {MAX98396_R20F0_BPE_L1_DWELL_HOLD_TIME, 0x00}, 144 {MAX98396_R20F1_BPE_L0_HOLD_TIME, 0x00}, 145 {MAX98396_R20F2_BPE_L3_ATTACK_REL_STEP, 0x00}, 146 {MAX98396_R20F3_BPE_L2_ATTACK_REL_STEP, 0x00}, 147 {MAX98396_R20F4_BPE_L1_ATTACK_REL_STEP, 0x00}, 148 {MAX98396_R20F5_BPE_L0_ATTACK_REL_STEP, 0x00}, 149 {MAX98396_R20F6_BPE_L3_MAX_GAIN_ATTN, 0x00}, 150 {MAX98396_R20F7_BPE_L2_MAX_GAIN_ATTN, 0x00}, 151 {MAX98396_R20F8_BPE_L1_MAX_GAIN_ATTN, 0x00}, 152 {MAX98396_R20F9_BPE_L0_MAX_GAIN_ATTN, 0x00}, 153 {MAX98396_R20FA_BPE_L3_ATT_REL_RATE, 0x00}, 154 {MAX98396_R20FB_BPE_L2_ATT_REL_RATE, 0x00}, 155 {MAX98396_R20FC_BPE_L1_ATT_REL_RATE, 0x00}, 156 {MAX98396_R20FD_BPE_L0_ATT_REL_RATE, 0x00}, 157 {MAX98396_R20FE_BPE_L3_LIMITER_CFG, 0x00}, 158 {MAX98396_R20FF_BPE_L2_LIMITER_CFG, 0x00}, 159 {MAX98396_R2100_BPE_L1_LIMITER_CFG, 0x00}, 160 {MAX98396_R2101_BPE_L0_LIMITER_CFG, 0x00}, 161 {MAX98396_R2102_BPE_L3_LIM_ATT_REL_RATE, 0x00}, 162 {MAX98396_R2103_BPE_L2_LIM_ATT_REL_RATE, 0x00}, 163 {MAX98396_R2104_BPE_L1_LIM_ATT_REL_RATE, 0x00}, 164 {MAX98396_R2105_BPE_L0_LIM_ATT_REL_RATE, 0x00}, 165 {MAX98396_R2106_BPE_THRESH_HYSTERESIS, 0x00}, 166 {MAX98396_R2107_BPE_INFINITE_HOLD_CLR, 0x00}, 167 {MAX98396_R2108_BPE_SUPPLY_SRC, 0x00}, 168 {MAX98396_R2109_BPE_LOW_STATE, 0x00}, 169 {MAX98396_R210A_BPE_LOW_GAIN, 0x00}, 170 {MAX98396_R210B_BPE_LOW_LIMITER, 0x00}, 171 {MAX98396_R210D_BPE_EN, 0x00}, 172 {MAX98396_R210E_AUTO_RESTART, 0x00}, 173 {MAX98396_R210F_GLOBAL_EN, 0x00}, 174 {MAX98396_R21FF_REVISION_ID, 0x00}, 175 }; 176 177 static const struct reg_default max98397_reg[] = { 178 {MAX98396_R2000_SW_RESET, 0x00}, 179 {MAX98396_R2001_INT_RAW1, 0x00}, 180 {MAX98396_R2002_INT_RAW2, 0x00}, 181 {MAX98396_R2003_INT_RAW3, 0x00}, 182 {MAX98396_R2004_INT_RAW4, 0x00}, 183 {MAX98396_R2006_INT_STATE1, 0x00}, 184 {MAX98396_R2007_INT_STATE2, 0x00}, 185 {MAX98396_R2008_INT_STATE3, 0x00}, 186 {MAX98396_R2009_INT_STATE4, 0x00}, 187 {MAX98396_R200B_INT_FLAG1, 0x00}, 188 {MAX98396_R200C_INT_FLAG2, 0x00}, 189 {MAX98396_R200D_INT_FLAG3, 0x00}, 190 {MAX98396_R200E_INT_FLAG4, 0x00}, 191 {MAX98396_R2010_INT_EN1, 0x02}, 192 {MAX98396_R2011_INT_EN2, 0x00}, 193 {MAX98396_R2012_INT_EN3, 0x00}, 194 {MAX98396_R2013_INT_EN4, 0x00}, 195 {MAX98396_R2015_INT_FLAG_CLR1, 0x00}, 196 {MAX98396_R2016_INT_FLAG_CLR2, 0x00}, 197 {MAX98396_R2017_INT_FLAG_CLR3, 0x00}, 198 {MAX98396_R2018_INT_FLAG_CLR4, 0x00}, 199 {MAX98396_R201F_IRQ_CTRL, 0x00}, 200 {MAX98396_R2020_THERM_WARN_THRESH, 0x46}, 201 {MAX98396_R2021_THERM_WARN_THRESH2, 0x46}, 202 {MAX98396_R2022_THERM_SHDN_THRESH, 0x64}, 203 {MAX98396_R2023_THERM_HYSTERESIS, 0x02}, 204 {MAX98396_R2024_THERM_FOLDBACK_SET, 0xC5}, 205 {MAX98396_R2027_THERM_FOLDBACK_EN, 0x01}, 206 {MAX98396_R2030_NOISEGATE_MODE_CTRL, 0x32}, 207 {MAX98396_R2033_NOISEGATE_MODE_EN, 0x00}, 208 {MAX98396_R2038_CLK_MON_CTRL, 0x00}, 209 {MAX98396_R2039_DATA_MON_CTRL, 0x00}, 210 {MAX98397_R203A_SPK_MON_THRESH, 0x03}, 211 {MAX98396_R203F_ENABLE_CTRLS, 0x0F}, 212 {MAX98396_R2040_PIN_CFG, 0x55}, 213 {MAX98396_R2041_PCM_MODE_CFG, 0xC0}, 214 {MAX98396_R2042_PCM_CLK_SETUP, 0x04}, 215 {MAX98396_R2043_PCM_SR_SETUP, 0x88}, 216 {MAX98396_R2044_PCM_TX_CTRL_1, 0x00}, 217 {MAX98396_R2045_PCM_TX_CTRL_2, 0x00}, 218 {MAX98396_R2046_PCM_TX_CTRL_3, 0x00}, 219 {MAX98396_R2047_PCM_TX_CTRL_4, 0x00}, 220 {MAX98396_R2048_PCM_TX_CTRL_5, 0x00}, 221 {MAX98396_R2049_PCM_TX_CTRL_6, 0x00}, 222 {MAX98396_R204A_PCM_TX_CTRL_7, 0x00}, 223 {MAX98396_R204B_PCM_TX_CTRL_8, 0x00}, 224 {MAX98397_R204C_PCM_TX_CTRL_9, 0x00}, 225 {MAX98397_R204D_PCM_TX_HIZ_CTRL_1, 0xFF}, 226 {MAX98397_R204E_PCM_TX_HIZ_CTRL_2, 0xFF}, 227 {MAX98397_R204F_PCM_TX_HIZ_CTRL_3, 0xFF}, 228 {MAX98397_R2050_PCM_TX_HIZ_CTRL_4, 0xFF}, 229 {MAX98397_R2051_PCM_TX_HIZ_CTRL_5, 0xFF}, 230 {MAX98397_R2052_PCM_TX_HIZ_CTRL_6, 0xFF}, 231 {MAX98397_R2053_PCM_TX_HIZ_CTRL_7, 0xFF}, 232 {MAX98397_R2054_PCM_TX_HIZ_CTRL_8, 0xFF}, 233 {MAX98397_R2056_PCM_RX_SRC1, 0x00}, 234 {MAX98397_R2057_PCM_RX_SRC2, 0x00}, 235 {MAX98396_R2058_PCM_BYPASS_SRC, 0x00}, 236 {MAX98396_R205D_PCM_TX_SRC_EN, 0x00}, 237 {MAX98396_R205E_PCM_RX_EN, 0x00}, 238 {MAX98396_R205F_PCM_TX_EN, 0x00}, 239 {MAX98397_R2060_PCM_TX_SUPPLY_SEL, 0x00}, 240 {MAX98396_R2070_ICC_RX_EN_A, 0x00}, 241 {MAX98396_R2071_ICC_RX_EN_B, 0x00}, 242 {MAX98396_R2072_ICC_TX_CTRL, 0x00}, 243 {MAX98396_R207F_ICC_EN, 0x00}, 244 {MAX98396_R2083_TONE_GEN_DC_CFG, 0x04}, 245 {MAX98396_R2084_TONE_GEN_DC_LVL1, 0x00}, 246 {MAX98396_R2085_TONE_GEN_DC_LVL2, 0x00}, 247 {MAX98396_R2086_TONE_GEN_DC_LVL3, 0x00}, 248 {MAX98396_R208F_TONE_GEN_EN, 0x00}, 249 {MAX98396_R2090_AMP_VOL_CTRL, 0x00}, 250 {MAX98396_R2091_AMP_PATH_GAIN, 0x12}, 251 {MAX98396_R2092_AMP_DSP_CFG, 0x22}, 252 {MAX98396_R2093_SSM_CFG, 0x08}, 253 {MAX98396_R2094_SPK_CLS_DG_THRESH, 0x12}, 254 {MAX98396_R2095_SPK_CLS_DG_HDR, 0x17}, 255 {MAX98396_R2096_SPK_CLS_DG_HOLD_TIME, 0x17}, 256 {MAX98396_R2097_SPK_CLS_DG_DELAY, 0x00}, 257 {MAX98396_R2098_SPK_CLS_DG_MODE, 0x00}, 258 {MAX98396_R2099_SPK_CLS_DG_VBAT_LVL, 0x03}, 259 {MAX98396_R209A_SPK_EDGE_CTRL, 0x00}, 260 {MAX98397_R209B_SPK_PATH_WB_ONLY, 0x00}, 261 {MAX98396_R209C_SPK_EDGE_CTRL1, 0x03}, 262 {MAX98396_R209D_SPK_EDGE_CTRL2, 0xFC}, 263 {MAX98396_R209E_AMP_CLIP_GAIN, 0x00}, 264 {MAX98396_R209F_BYPASS_PATH_CFG, 0x00}, 265 {MAX98396_R20AF_AMP_EN, 0x00}, 266 {MAX98396_R20B0_ADC_SR, 0x30}, 267 {MAX98396_R20B1_ADC_PVDD_CFG, 0x00}, 268 {MAX98396_R20B2_ADC_VBAT_CFG, 0x00}, 269 {MAX98396_R20B3_ADC_THERMAL_CFG, 0x00}, 270 {MAX98397_R20B4_ADC_VDDH_CFG, 0x00}, 271 {MAX98397_R20B5_ADC_READBACK_CTRL1, 0x00}, 272 {MAX98397_R20B6_ADC_READBACK_CTRL2, 0x00}, 273 {MAX98397_R20B7_ADC_PVDD_READBACK_MSB, 0x00}, 274 {MAX98397_R20B8_ADC_PVDD_READBACK_LSB, 0x00}, 275 {MAX98397_R20B9_ADC_VBAT_READBACK_MSB, 0x00}, 276 {MAX98397_R20BA_ADC_VBAT_READBACK_LSB, 0x00}, 277 {MAX98397_R20BB_ADC_TEMP_READBACK_MSB, 0x00}, 278 {MAX98397_R20BC_ADC_TEMP_READBACK_LSB, 0x00}, 279 {MAX98397_R20BD_ADC_VDDH__READBACK_MSB, 0x00}, 280 {MAX98397_R20BE_ADC_VDDH_READBACK_LSB, 0x00}, 281 {MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB, 0x00}, 282 {MAX98397_R20C3_ADC_LO_VDDH_READBACK_MSB, 0x00}, 283 {MAX98397_R20C4_ADC_LO_VDDH_READBACK_LSB, 0x00}, 284 {MAX98397_R20C5_MEAS_ADC_OPTIMAL_MODE, 0x04}, 285 {MAX98396_R20C7_ADC_CFG, 0x00}, 286 {MAX98396_R20D0_DHT_CFG1, 0x00}, 287 {MAX98396_R20D1_LIMITER_CFG1, 0x08}, 288 {MAX98396_R20D2_LIMITER_CFG2, 0x00}, 289 {MAX98396_R20D3_DHT_CFG2, 0x14}, 290 {MAX98396_R20D4_DHT_CFG3, 0x02}, 291 {MAX98396_R20D5_DHT_CFG4, 0x04}, 292 {MAX98396_R20D6_DHT_HYSTERESIS_CFG, 0x07}, 293 {MAX98396_R20DF_DHT_EN, 0x00}, 294 {MAX98396_R20E0_IV_SENSE_PATH_CFG, 0x04}, 295 {MAX98396_R20E4_IV_SENSE_PATH_EN, 0x00}, 296 {MAX98396_R20E5_BPE_STATE, 0x00}, 297 {MAX98396_R20E6_BPE_L3_THRESH_MSB, 0x00}, 298 {MAX98396_R20E7_BPE_L3_THRESH_LSB, 0x00}, 299 {MAX98396_R20E8_BPE_L2_THRESH_MSB, 0x00}, 300 {MAX98396_R20E9_BPE_L2_THRESH_LSB, 0x00}, 301 {MAX98396_R20EA_BPE_L1_THRESH_MSB, 0x00}, 302 {MAX98396_R20EB_BPE_L1_THRESH_LSB, 0x00}, 303 {MAX98396_R20EC_BPE_L0_THRESH_MSB, 0x00}, 304 {MAX98396_R20ED_BPE_L0_THRESH_LSB, 0x00}, 305 {MAX98396_R20EE_BPE_L3_DWELL_HOLD_TIME, 0x00}, 306 {MAX98396_R20EF_BPE_L2_DWELL_HOLD_TIME, 0x00}, 307 {MAX98396_R20F0_BPE_L1_DWELL_HOLD_TIME, 0x00}, 308 {MAX98396_R20F1_BPE_L0_HOLD_TIME, 0x00}, 309 {MAX98396_R20F2_BPE_L3_ATTACK_REL_STEP, 0x00}, 310 {MAX98396_R20F3_BPE_L2_ATTACK_REL_STEP, 0x00}, 311 {MAX98396_R20F4_BPE_L1_ATTACK_REL_STEP, 0x00}, 312 {MAX98396_R20F5_BPE_L0_ATTACK_REL_STEP, 0x00}, 313 {MAX98396_R20F6_BPE_L3_MAX_GAIN_ATTN, 0x00}, 314 {MAX98396_R20F7_BPE_L2_MAX_GAIN_ATTN, 0x00}, 315 {MAX98396_R20F8_BPE_L1_MAX_GAIN_ATTN, 0x00}, 316 {MAX98396_R20F9_BPE_L0_MAX_GAIN_ATTN, 0x00}, 317 {MAX98396_R20FA_BPE_L3_ATT_REL_RATE, 0x00}, 318 {MAX98396_R20FB_BPE_L2_ATT_REL_RATE, 0x00}, 319 {MAX98396_R20FC_BPE_L1_ATT_REL_RATE, 0x00}, 320 {MAX98396_R20FD_BPE_L0_ATT_REL_RATE, 0x00}, 321 {MAX98396_R20FE_BPE_L3_LIMITER_CFG, 0x00}, 322 {MAX98396_R20FF_BPE_L2_LIMITER_CFG, 0x00}, 323 {MAX98396_R2100_BPE_L1_LIMITER_CFG, 0x00}, 324 {MAX98396_R2101_BPE_L0_LIMITER_CFG, 0x00}, 325 {MAX98396_R2102_BPE_L3_LIM_ATT_REL_RATE, 0x00}, 326 {MAX98396_R2103_BPE_L2_LIM_ATT_REL_RATE, 0x00}, 327 {MAX98396_R2104_BPE_L1_LIM_ATT_REL_RATE, 0x00}, 328 {MAX98396_R2105_BPE_L0_LIM_ATT_REL_RATE, 0x00}, 329 {MAX98396_R2106_BPE_THRESH_HYSTERESIS, 0x00}, 330 {MAX98396_R2107_BPE_INFINITE_HOLD_CLR, 0x00}, 331 {MAX98396_R2108_BPE_SUPPLY_SRC, 0x00}, 332 {MAX98396_R2109_BPE_LOW_STATE, 0x00}, 333 {MAX98396_R210A_BPE_LOW_GAIN, 0x00}, 334 {MAX98396_R210B_BPE_LOW_LIMITER, 0x00}, 335 {MAX98396_R210D_BPE_EN, 0x00}, 336 {MAX98396_R210E_AUTO_RESTART, 0x00}, 337 {MAX98396_R210F_GLOBAL_EN, 0x00}, 338 {MAX98397_R22FF_REVISION_ID, 0x00}, 339 }; 340 341 static void max98396_global_enable_onoff(struct regmap *regmap, bool onoff) 342 { 343 regmap_write(regmap, MAX98396_R210F_GLOBAL_EN, onoff ? 1 : 0); 344 usleep_range(11000, 12000); 345 } 346 347 static int max98396_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 348 { 349 struct snd_soc_component *component = codec_dai->component; 350 struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component); 351 unsigned int format_mask, format = 0; 352 unsigned int bclk_pol = 0; 353 int ret, status; 354 int reg; 355 bool update = false; 356 357 format_mask = MAX98396_PCM_MODE_CFG_FORMAT_MASK | 358 MAX98396_PCM_MODE_CFG_LRCLKEDGE; 359 360 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); 361 362 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 363 case SND_SOC_DAIFMT_NB_NF: 364 break; 365 case SND_SOC_DAIFMT_NB_IF: 366 format = MAX98396_PCM_MODE_CFG_LRCLKEDGE; 367 break; 368 case SND_SOC_DAIFMT_IB_NF: 369 bclk_pol = MAX98396_PCM_MODE_CFG_BCLKEDGE; 370 break; 371 case SND_SOC_DAIFMT_IB_IF: 372 bclk_pol = MAX98396_PCM_MODE_CFG_BCLKEDGE; 373 format = MAX98396_PCM_MODE_CFG_LRCLKEDGE; 374 break; 375 376 default: 377 dev_err(component->dev, "DAI invert mode %d unsupported\n", 378 fmt & SND_SOC_DAIFMT_INV_MASK); 379 return -EINVAL; 380 } 381 382 /* interface format */ 383 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 384 case SND_SOC_DAIFMT_I2S: 385 format |= MAX98396_PCM_FORMAT_I2S; 386 break; 387 case SND_SOC_DAIFMT_LEFT_J: 388 format |= MAX98396_PCM_FORMAT_LJ; 389 break; 390 case SND_SOC_DAIFMT_DSP_A: 391 format |= MAX98396_PCM_FORMAT_TDM_MODE1; 392 break; 393 case SND_SOC_DAIFMT_DSP_B: 394 format |= MAX98396_PCM_FORMAT_TDM_MODE0; 395 break; 396 default: 397 dev_err(component->dev, "DAI format %d unsupported\n", 398 fmt & SND_SOC_DAIFMT_FORMAT_MASK); 399 return -EINVAL; 400 } 401 402 ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status); 403 if (ret < 0) 404 return -EINVAL; 405 406 if (status) { 407 ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, ®); 408 if (ret < 0) 409 return -EINVAL; 410 if (format != (reg & format_mask)) { 411 update = true; 412 } else { 413 ret = regmap_read(max98396->regmap, 414 MAX98396_R2042_PCM_CLK_SETUP, ®); 415 if (ret < 0) 416 return -EINVAL; 417 if (bclk_pol != (reg & MAX98396_PCM_MODE_CFG_BCLKEDGE)) 418 update = true; 419 } 420 /* GLOBAL_EN OFF prior to pcm mode, clock configuration change */ 421 if (update) 422 max98396_global_enable_onoff(max98396->regmap, false); 423 } 424 425 regmap_update_bits(max98396->regmap, 426 MAX98396_R2041_PCM_MODE_CFG, 427 format_mask, format); 428 429 regmap_update_bits(max98396->regmap, 430 MAX98396_R2042_PCM_CLK_SETUP, 431 MAX98396_PCM_MODE_CFG_BCLKEDGE, 432 bclk_pol); 433 434 if (status && update) 435 max98396_global_enable_onoff(max98396->regmap, true); 436 437 return 0; 438 } 439 440 #define MAX98396_BSEL_32 0x2 441 #define MAX98396_BSEL_48 0x3 442 #define MAX98396_BSEL_64 0x4 443 #define MAX98396_BSEL_96 0x5 444 #define MAX98396_BSEL_128 0x6 445 #define MAX98396_BSEL_192 0x7 446 #define MAX98396_BSEL_256 0x8 447 #define MAX98396_BSEL_384 0x9 448 #define MAX98396_BSEL_512 0xa 449 #define MAX98396_BSEL_320 0xb 450 #define MAX98396_BSEL_250 0xc 451 #define MAX98396_BSEL_125 0xd 452 453 /* Refer to table 5 in the datasheet */ 454 static const struct max98396_pcm_config { 455 int in, out, width, bsel, max_sr; 456 } max98396_pcm_configs[] = { 457 { .in = 2, .out = 4, .width = 16, .bsel = MAX98396_BSEL_32, .max_sr = 192000 }, 458 { .in = 2, .out = 6, .width = 24, .bsel = MAX98396_BSEL_48, .max_sr = 192000 }, 459 { .in = 2, .out = 8, .width = 32, .bsel = MAX98396_BSEL_64, .max_sr = 192000 }, 460 { .in = 3, .out = 15, .width = 32, .bsel = MAX98396_BSEL_125, .max_sr = 192000 }, 461 { .in = 4, .out = 8, .width = 16, .bsel = MAX98396_BSEL_64, .max_sr = 192000 }, 462 { .in = 4, .out = 12, .width = 24, .bsel = MAX98396_BSEL_96, .max_sr = 192000 }, 463 { .in = 4, .out = 16, .width = 32, .bsel = MAX98396_BSEL_128, .max_sr = 192000 }, 464 { .in = 5, .out = 15, .width = 24, .bsel = MAX98396_BSEL_125, .max_sr = 192000 }, 465 { .in = 7, .out = 15, .width = 16, .bsel = MAX98396_BSEL_125, .max_sr = 192000 }, 466 { .in = 2, .out = 4, .width = 16, .bsel = MAX98396_BSEL_32, .max_sr = 96000 }, 467 { .in = 2, .out = 6, .width = 24, .bsel = MAX98396_BSEL_48, .max_sr = 96000 }, 468 { .in = 2, .out = 8, .width = 32, .bsel = MAX98396_BSEL_64, .max_sr = 96000 }, 469 { .in = 3, .out = 15, .width = 32, .bsel = MAX98396_BSEL_125, .max_sr = 96000 }, 470 { .in = 4, .out = 8, .width = 16, .bsel = MAX98396_BSEL_64, .max_sr = 96000 }, 471 { .in = 4, .out = 12, .width = 24, .bsel = MAX98396_BSEL_96, .max_sr = 96000 }, 472 { .in = 4, .out = 16, .width = 32, .bsel = MAX98396_BSEL_128, .max_sr = 96000 }, 473 { .in = 5, .out = 15, .width = 24, .bsel = MAX98396_BSEL_125, .max_sr = 96000 }, 474 { .in = 7, .out = 15, .width = 16, .bsel = MAX98396_BSEL_125, .max_sr = 96000 }, 475 { .in = 7, .out = 31, .width = 32, .bsel = MAX98396_BSEL_250, .max_sr = 96000 }, 476 { .in = 8, .out = 16, .width = 16, .bsel = MAX98396_BSEL_128, .max_sr = 96000 }, 477 { .in = 8, .out = 24, .width = 24, .bsel = MAX98396_BSEL_192, .max_sr = 96000 }, 478 { .in = 8, .out = 32, .width = 32, .bsel = MAX98396_BSEL_256, .max_sr = 96000 }, 479 { .in = 10, .out = 31, .width = 24, .bsel = MAX98396_BSEL_250, .max_sr = 96000 }, 480 { .in = 15, .out = 31, .width = 16, .bsel = MAX98396_BSEL_250, .max_sr = 96000 }, 481 { .in = 16, .out = 32, .width = 16, .bsel = MAX98396_BSEL_256, .max_sr = 96000 }, 482 { .in = 7, .out = 31, .width = 32, .bsel = MAX98396_BSEL_250, .max_sr = 48000 }, 483 { .in = 10, .out = 31, .width = 24, .bsel = MAX98396_BSEL_250, .max_sr = 48000 }, 484 { .in = 10, .out = 40, .width = 32, .bsel = MAX98396_BSEL_320, .max_sr = 48000 }, 485 { .in = 15, .out = 31, .width = 16, .bsel = MAX98396_BSEL_250, .max_sr = 48000 }, 486 { .in = 16, .out = 48, .width = 24, .bsel = MAX98396_BSEL_384, .max_sr = 48000 }, 487 { .in = 16, .out = 64, .width = 32, .bsel = MAX98396_BSEL_512, .max_sr = 48000 }, 488 }; 489 490 static int max98396_pcm_config_index(int in_slots, int out_slots, int width) 491 { 492 int i; 493 494 for (i = 0; i < ARRAY_SIZE(max98396_pcm_configs); i++) { 495 const struct max98396_pcm_config *c = &max98396_pcm_configs[i]; 496 497 if (in_slots == c->in && out_slots <= c->out && width == c->width) 498 return i; 499 } 500 501 return -1; 502 } 503 504 static int max98396_dai_hw_params(struct snd_pcm_substream *substream, 505 struct snd_pcm_hw_params *params, 506 struct snd_soc_dai *dai) 507 { 508 struct snd_soc_component *component = dai->component; 509 struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component); 510 unsigned int sampling_rate = 0; 511 unsigned int chan_sz = 0; 512 int ret, reg, status, bsel = 0; 513 bool update = false; 514 515 /* pcm mode configuration */ 516 switch (snd_pcm_format_width(params_format(params))) { 517 case 16: 518 chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_16; 519 break; 520 case 24: 521 chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_24; 522 break; 523 case 32: 524 chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_32; 525 break; 526 default: 527 dev_err(component->dev, "format unsupported %d\n", 528 params_format(params)); 529 goto err; 530 } 531 532 dev_dbg(component->dev, "format supported %d", 533 params_format(params)); 534 535 /* sampling rate configuration */ 536 switch (params_rate(params)) { 537 case 8000: 538 sampling_rate = MAX98396_PCM_SR_8000; 539 break; 540 case 11025: 541 sampling_rate = MAX98396_PCM_SR_11025; 542 break; 543 case 12000: 544 sampling_rate = MAX98396_PCM_SR_12000; 545 break; 546 case 16000: 547 sampling_rate = MAX98396_PCM_SR_16000; 548 break; 549 case 22050: 550 sampling_rate = MAX98396_PCM_SR_22050; 551 break; 552 case 24000: 553 sampling_rate = MAX98396_PCM_SR_24000; 554 break; 555 case 32000: 556 sampling_rate = MAX98396_PCM_SR_32000; 557 break; 558 case 44100: 559 sampling_rate = MAX98396_PCM_SR_44100; 560 break; 561 case 48000: 562 sampling_rate = MAX98396_PCM_SR_48000; 563 break; 564 case 88200: 565 sampling_rate = MAX98396_PCM_SR_88200; 566 break; 567 case 96000: 568 sampling_rate = MAX98396_PCM_SR_96000; 569 break; 570 case 192000: 571 sampling_rate = MAX98396_PCM_SR_192000; 572 break; 573 default: 574 dev_err(component->dev, "rate %d not supported\n", 575 params_rate(params)); 576 goto err; 577 } 578 579 if (max98396->tdm_mode) { 580 if (params_rate(params) > max98396->tdm_max_samplerate) { 581 dev_err(component->dev, "TDM sample rate %d too high", 582 params_rate(params)); 583 goto err; 584 } 585 } else { 586 /* BCLK configuration */ 587 ret = max98396_pcm_config_index(params_channels(params), 588 params_channels(params), 589 snd_pcm_format_width(params_format(params))); 590 if (ret < 0) { 591 dev_err(component->dev, 592 "no PCM config for %d channels, format %d\n", 593 params_channels(params), params_format(params)); 594 goto err; 595 } 596 597 bsel = max98396_pcm_configs[ret].bsel; 598 599 if (params_rate(params) > max98396_pcm_configs[ret].max_sr) { 600 dev_err(component->dev, "sample rate %d too high", 601 params_rate(params)); 602 goto err; 603 } 604 } 605 606 ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status); 607 if (ret < 0) 608 goto err; 609 610 if (status) { 611 ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, ®); 612 if (ret < 0) 613 goto err; 614 if (chan_sz != (reg & MAX98396_PCM_MODE_CFG_CHANSZ_MASK)) { 615 update = true; 616 } else { 617 ret = regmap_read(max98396->regmap, MAX98396_R2043_PCM_SR_SETUP, ®); 618 if (ret < 0) 619 goto err; 620 if (sampling_rate != (reg & MAX98396_PCM_SR_MASK)) 621 update = true; 622 } 623 624 /* GLOBAL_EN OFF prior to channel size and sampling rate change */ 625 if (update) 626 max98396_global_enable_onoff(max98396->regmap, false); 627 } 628 629 /* set channel size */ 630 regmap_update_bits(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, 631 MAX98396_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); 632 633 /* set DAI_SR to correct LRCLK frequency */ 634 regmap_update_bits(max98396->regmap, MAX98396_R2043_PCM_SR_SETUP, 635 MAX98396_PCM_SR_MASK, sampling_rate); 636 637 /* set sampling rate of IV */ 638 if (max98396->interleave_mode && 639 sampling_rate > MAX98396_PCM_SR_16000) 640 regmap_update_bits(max98396->regmap, 641 MAX98396_R2043_PCM_SR_SETUP, 642 MAX98396_IVADC_SR_MASK, 643 (sampling_rate - 3) 644 << MAX98396_IVADC_SR_SHIFT); 645 else 646 regmap_update_bits(max98396->regmap, 647 MAX98396_R2043_PCM_SR_SETUP, 648 MAX98396_IVADC_SR_MASK, 649 sampling_rate << MAX98396_IVADC_SR_SHIFT); 650 651 if (bsel) 652 regmap_update_bits(max98396->regmap, 653 MAX98396_R2042_PCM_CLK_SETUP, 654 MAX98396_PCM_CLK_SETUP_BSEL_MASK, 655 bsel); 656 657 if (status && update) 658 max98396_global_enable_onoff(max98396->regmap, true); 659 660 return 0; 661 662 err: 663 return -EINVAL; 664 } 665 666 static int max98396_dai_tdm_slot(struct snd_soc_dai *dai, 667 unsigned int tx_mask, unsigned int rx_mask, 668 int slots, int slot_width) 669 { 670 struct snd_soc_component *component = dai->component; 671 struct max98396_priv *max98396 = 672 snd_soc_component_get_drvdata(component); 673 int bsel; 674 unsigned int chan_sz = 0; 675 int ret, status; 676 int reg; 677 bool update = false; 678 679 if (!tx_mask && !rx_mask && !slots && !slot_width) 680 max98396->tdm_mode = false; 681 else 682 max98396->tdm_mode = true; 683 684 /* BCLK configuration */ 685 ret = max98396_pcm_config_index(slots, slots, slot_width); 686 if (ret < 0) { 687 dev_err(component->dev, "no TDM config for %d slots %d bits\n", 688 slots, slot_width); 689 return -EINVAL; 690 } 691 692 bsel = max98396_pcm_configs[ret].bsel; 693 max98396->tdm_max_samplerate = max98396_pcm_configs[ret].max_sr; 694 695 /* Channel size configuration */ 696 switch (slot_width) { 697 case 16: 698 chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_16; 699 break; 700 case 24: 701 chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_24; 702 break; 703 case 32: 704 chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_32; 705 break; 706 default: 707 dev_err(component->dev, "slot width %d unsupported\n", 708 slot_width); 709 return -EINVAL; 710 } 711 712 ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status); 713 if (ret < 0) 714 return -EINVAL; 715 716 if (status) { 717 ret = regmap_read(max98396->regmap, MAX98396_R2042_PCM_CLK_SETUP, ®); 718 if (ret < 0) 719 return -EINVAL; 720 if (bsel != (reg & MAX98396_PCM_CLK_SETUP_BSEL_MASK)) { 721 update = true; 722 } else { 723 ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, ®); 724 if (ret < 0) 725 return -EINVAL; 726 if (chan_sz != (reg & MAX98396_PCM_MODE_CFG_CHANSZ_MASK)) 727 update = true; 728 } 729 730 /* GLOBAL_EN OFF prior to channel size and BCLK per LRCLK change */ 731 if (update) 732 max98396_global_enable_onoff(max98396->regmap, false); 733 } 734 735 regmap_update_bits(max98396->regmap, 736 MAX98396_R2042_PCM_CLK_SETUP, 737 MAX98396_PCM_CLK_SETUP_BSEL_MASK, 738 bsel); 739 740 regmap_update_bits(max98396->regmap, 741 MAX98396_R2041_PCM_MODE_CFG, 742 MAX98396_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); 743 744 /* Rx slot configuration */ 745 if (max98396->device_id == CODEC_TYPE_MAX98396) { 746 regmap_update_bits(max98396->regmap, 747 MAX98396_R2056_PCM_RX_SRC2, 748 MAX98396_PCM_DMIX_CH0_SRC_MASK, 749 rx_mask); 750 regmap_update_bits(max98396->regmap, 751 MAX98396_R2056_PCM_RX_SRC2, 752 MAX98396_PCM_DMIX_CH1_SRC_MASK, 753 rx_mask << MAX98396_PCM_DMIX_CH1_SHIFT); 754 } else { 755 regmap_update_bits(max98396->regmap, 756 MAX98397_R2057_PCM_RX_SRC2, 757 MAX98396_PCM_DMIX_CH0_SRC_MASK, 758 rx_mask); 759 regmap_update_bits(max98396->regmap, 760 MAX98397_R2057_PCM_RX_SRC2, 761 MAX98396_PCM_DMIX_CH1_SRC_MASK, 762 rx_mask << MAX98396_PCM_DMIX_CH1_SHIFT); 763 } 764 765 /* Tx slot Hi-Z configuration */ 766 if (max98396->device_id == CODEC_TYPE_MAX98396) { 767 regmap_write(max98396->regmap, 768 MAX98396_R2053_PCM_TX_HIZ_CTRL_8, 769 ~tx_mask & 0xFF); 770 regmap_write(max98396->regmap, 771 MAX98396_R2052_PCM_TX_HIZ_CTRL_7, 772 (~tx_mask & 0xFF00) >> 8); 773 } else { 774 regmap_write(max98396->regmap, 775 MAX98397_R2054_PCM_TX_HIZ_CTRL_8, 776 ~tx_mask & 0xFF); 777 regmap_write(max98396->regmap, 778 MAX98397_R2053_PCM_TX_HIZ_CTRL_7, 779 (~tx_mask & 0xFF00) >> 8); 780 } 781 782 if (status && update) 783 max98396_global_enable_onoff(max98396->regmap, true); 784 785 return 0; 786 } 787 788 #define MAX98396_RATES SNDRV_PCM_RATE_8000_192000 789 790 #define MAX98396_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 791 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 792 793 static const struct snd_soc_dai_ops max98396_dai_ops = { 794 .set_fmt = max98396_dai_set_fmt, 795 .hw_params = max98396_dai_hw_params, 796 .set_tdm_slot = max98396_dai_tdm_slot, 797 }; 798 799 static int max98396_dac_event(struct snd_soc_dapm_widget *w, 800 struct snd_kcontrol *kcontrol, int event) 801 { 802 struct snd_soc_component *component = 803 snd_soc_dapm_to_component(w->dapm); 804 struct max98396_priv *max98396 = 805 snd_soc_component_get_drvdata(component); 806 807 switch (event) { 808 case SND_SOC_DAPM_POST_PMU: 809 max98396_global_enable_onoff(max98396->regmap, true); 810 break; 811 case SND_SOC_DAPM_PRE_PMD: 812 max98396_global_enable_onoff(max98396->regmap, false); 813 814 max98396->tdm_mode = false; 815 break; 816 default: 817 return 0; 818 } 819 return 0; 820 } 821 822 static bool max98396_readable_register(struct device *dev, unsigned int reg) 823 { 824 switch (reg) { 825 case MAX98396_R2001_INT_RAW1 ... MAX98396_R2004_INT_RAW4: 826 case MAX98396_R2006_INT_STATE1 ... MAX98396_R2009_INT_STATE4: 827 case MAX98396_R200B_INT_FLAG1 ... MAX98396_R200E_INT_FLAG4: 828 case MAX98396_R2010_INT_EN1 ... MAX98396_R2013_INT_EN4: 829 case MAX98396_R2015_INT_FLAG_CLR1 ... MAX98396_R2018_INT_FLAG_CLR4: 830 case MAX98396_R201F_IRQ_CTRL ... MAX98396_R2024_THERM_FOLDBACK_SET: 831 case MAX98396_R2027_THERM_FOLDBACK_EN: 832 case MAX98396_R2030_NOISEGATE_MODE_CTRL: 833 case MAX98396_R2033_NOISEGATE_MODE_EN: 834 case MAX98396_R2038_CLK_MON_CTRL ... MAX98396_R2039_DATA_MON_CTRL: 835 case MAX98396_R203F_ENABLE_CTRLS ... MAX98396_R2053_PCM_TX_HIZ_CTRL_8: 836 case MAX98396_R2055_PCM_RX_SRC1 ... MAX98396_R2056_PCM_RX_SRC2: 837 case MAX98396_R2058_PCM_BYPASS_SRC: 838 case MAX98396_R205D_PCM_TX_SRC_EN ... MAX98396_R205F_PCM_TX_EN: 839 case MAX98396_R2070_ICC_RX_EN_A... MAX98396_R2072_ICC_TX_CTRL: 840 case MAX98396_R207F_ICC_EN: 841 case MAX98396_R2083_TONE_GEN_DC_CFG ... MAX98396_R2086_TONE_GEN_DC_LVL3: 842 case MAX98396_R208F_TONE_GEN_EN ... MAX98396_R209A_SPK_EDGE_CTRL: 843 case MAX98396_R209C_SPK_EDGE_CTRL1 ... MAX98396_R20A0_AMP_SUPPLY_CTL: 844 case MAX98396_R20AF_AMP_EN ... MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB: 845 case MAX98396_R20C7_ADC_CFG: 846 case MAX98396_R20D0_DHT_CFG1 ... MAX98396_R20D6_DHT_HYSTERESIS_CFG: 847 case MAX98396_R20DF_DHT_EN: 848 case MAX98396_R20E0_IV_SENSE_PATH_CFG: 849 case MAX98396_R20E4_IV_SENSE_PATH_EN 850 ... MAX98396_R2106_BPE_THRESH_HYSTERESIS: 851 case MAX98396_R2108_BPE_SUPPLY_SRC ... MAX98396_R210B_BPE_LOW_LIMITER: 852 case MAX98396_R210D_BPE_EN ... MAX98396_R210F_GLOBAL_EN: 853 case MAX98396_R21FF_REVISION_ID: 854 return true; 855 default: 856 return false; 857 } 858 }; 859 860 static bool max98396_volatile_reg(struct device *dev, unsigned int reg) 861 { 862 switch (reg) { 863 case MAX98396_R2000_SW_RESET: 864 case MAX98396_R2001_INT_RAW1 ... MAX98396_R200E_INT_FLAG4: 865 case MAX98396_R2041_PCM_MODE_CFG: 866 case MAX98396_R20B6_ADC_PVDD_READBACK_MSB 867 ... MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB: 868 case MAX98396_R20E5_BPE_STATE: 869 case MAX98396_R2109_BPE_LOW_STATE 870 ... MAX98396_R210B_BPE_LOW_LIMITER: 871 case MAX98396_R210F_GLOBAL_EN: 872 case MAX98396_R21FF_REVISION_ID: 873 return true; 874 default: 875 return false; 876 } 877 } 878 879 static bool max98397_readable_register(struct device *dev, unsigned int reg) 880 { 881 switch (reg) { 882 case MAX98396_R2001_INT_RAW1 ... MAX98396_R2004_INT_RAW4: 883 case MAX98396_R2006_INT_STATE1 ... MAX98396_R2009_INT_STATE4: 884 case MAX98396_R200B_INT_FLAG1 ... MAX98396_R200E_INT_FLAG4: 885 case MAX98396_R2010_INT_EN1 ... MAX98396_R2013_INT_EN4: 886 case MAX98396_R2015_INT_FLAG_CLR1 ... MAX98396_R2018_INT_FLAG_CLR4: 887 case MAX98396_R201F_IRQ_CTRL ... MAX98396_R2024_THERM_FOLDBACK_SET: 888 case MAX98396_R2027_THERM_FOLDBACK_EN: 889 case MAX98396_R2030_NOISEGATE_MODE_CTRL: 890 case MAX98396_R2033_NOISEGATE_MODE_EN: 891 case MAX98396_R2038_CLK_MON_CTRL ... MAX98397_R203A_SPK_MON_THRESH: 892 case MAX98396_R203F_ENABLE_CTRLS ... MAX98397_R2054_PCM_TX_HIZ_CTRL_8: 893 case MAX98397_R2056_PCM_RX_SRC1... MAX98396_R2058_PCM_BYPASS_SRC: 894 case MAX98396_R205D_PCM_TX_SRC_EN ... MAX98397_R2060_PCM_TX_SUPPLY_SEL: 895 case MAX98396_R2070_ICC_RX_EN_A... MAX98396_R2072_ICC_TX_CTRL: 896 case MAX98396_R207F_ICC_EN: 897 case MAX98396_R2083_TONE_GEN_DC_CFG ... MAX98396_R2086_TONE_GEN_DC_LVL3: 898 case MAX98396_R208F_TONE_GEN_EN ... MAX98396_R209F_BYPASS_PATH_CFG: 899 case MAX98396_R20AF_AMP_EN ... MAX98397_R20C5_MEAS_ADC_OPTIMAL_MODE: 900 case MAX98396_R20C7_ADC_CFG: 901 case MAX98396_R20D0_DHT_CFG1 ... MAX98396_R20D6_DHT_HYSTERESIS_CFG: 902 case MAX98396_R20DF_DHT_EN: 903 case MAX98396_R20E0_IV_SENSE_PATH_CFG: 904 case MAX98396_R20E4_IV_SENSE_PATH_EN 905 ... MAX98396_R2106_BPE_THRESH_HYSTERESIS: 906 case MAX98396_R2108_BPE_SUPPLY_SRC ... MAX98396_R210B_BPE_LOW_LIMITER: 907 case MAX98396_R210D_BPE_EN ... MAX98396_R210F_GLOBAL_EN: 908 case MAX98397_R22FF_REVISION_ID: 909 return true; 910 default: 911 return false; 912 } 913 }; 914 915 static bool max98397_volatile_reg(struct device *dev, unsigned int reg) 916 { 917 switch (reg) { 918 case MAX98396_R2001_INT_RAW1 ... MAX98396_R200E_INT_FLAG4: 919 case MAX98396_R2041_PCM_MODE_CFG: 920 case MAX98397_R20B7_ADC_PVDD_READBACK_MSB 921 ... MAX98397_R20C4_ADC_LO_VDDH_READBACK_LSB: 922 case MAX98396_R20E5_BPE_STATE: 923 case MAX98396_R2109_BPE_LOW_STATE 924 ... MAX98396_R210B_BPE_LOW_LIMITER: 925 case MAX98396_R210F_GLOBAL_EN: 926 case MAX98397_R22FF_REVISION_ID: 927 return true; 928 default: 929 return false; 930 } 931 } 932 933 static const char * const max98396_op_mod_text[] = { 934 "DG", "PVDD", "VBAT", 935 }; 936 937 static SOC_ENUM_SINGLE_DECL(max98396_op_mod_enum, 938 MAX98396_R2098_SPK_CLS_DG_MODE, 939 0, max98396_op_mod_text); 940 941 static DECLARE_TLV_DB_SCALE(max98396_digital_tlv, -6350, 50, 1); 942 static const DECLARE_TLV_DB_RANGE(max98396_spk_tlv, 943 0, 0x11, TLV_DB_SCALE_ITEM(400, 100, 0), 944 ); 945 static DECLARE_TLV_DB_RANGE(max98397_digital_tlv, 946 0, 0x4A, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1), 947 0x4B, 0xFF, TLV_DB_SCALE_ITEM(-9000, 50, 0), 948 ); 949 static const DECLARE_TLV_DB_RANGE(max98397_spk_tlv, 950 0, 0x15, TLV_DB_SCALE_ITEM(600, 100, 0), 951 ); 952 953 static int max98396_mux_get(struct snd_kcontrol *kcontrol, 954 struct snd_ctl_elem_value *ucontrol) 955 { 956 struct snd_soc_component *component = snd_soc_dapm_kcontrol_to_component(kcontrol); 957 struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component); 958 int reg, val; 959 960 if (max98396->device_id == CODEC_TYPE_MAX98396) 961 reg = MAX98396_R2055_PCM_RX_SRC1; 962 else 963 reg = MAX98397_R2056_PCM_RX_SRC1; 964 965 regmap_read(max98396->regmap, reg, &val); 966 967 ucontrol->value.enumerated.item[0] = val; 968 969 return 0; 970 } 971 972 static int max98396_mux_put(struct snd_kcontrol *kcontrol, 973 struct snd_ctl_elem_value *ucontrol) 974 { 975 struct snd_soc_component *component = snd_soc_dapm_kcontrol_to_component(kcontrol); 976 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol); 977 struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component); 978 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 979 unsigned int *item = ucontrol->value.enumerated.item; 980 int reg, val; 981 int change; 982 983 if (item[0] >= e->items) 984 return -EINVAL; 985 986 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; 987 988 if (max98396->device_id == CODEC_TYPE_MAX98396) 989 reg = MAX98396_R2055_PCM_RX_SRC1; 990 else 991 reg = MAX98397_R2056_PCM_RX_SRC1; 992 993 change = snd_soc_component_test_bits(component, reg, 994 MAX98396_PCM_RX_MASK, val); 995 996 if (change) 997 regmap_update_bits(max98396->regmap, reg, 998 MAX98396_PCM_RX_MASK, val); 999 1000 snd_soc_dapm_mux_update_power(dapm, kcontrol, item[0], e, NULL); 1001 1002 return change; 1003 } 1004 1005 static const char * const max98396_switch_text[] = { 1006 "Left", "Right", "LeftRight"}; 1007 1008 static SOC_ENUM_SINGLE_DECL(dai_sel_enum, SND_SOC_NOPM, 0, 1009 max98396_switch_text); 1010 1011 static const struct snd_kcontrol_new max98396_dai_mux = 1012 SOC_DAPM_ENUM_EXT("DAI Sel Mux", dai_sel_enum, 1013 max98396_mux_get, max98396_mux_put); 1014 1015 static const struct snd_kcontrol_new max98396_vi_control = 1016 SOC_DAPM_SINGLE("Switch", MAX98396_R205F_PCM_TX_EN, 0, 1, 0); 1017 1018 static const struct snd_soc_dapm_widget max98396_dapm_widgets[] = { 1019 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", 1020 MAX98396_R20AF_AMP_EN, 0, 0, max98396_dac_event, 1021 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 1022 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0, 1023 &max98396_dai_mux), 1024 SND_SOC_DAPM_OUTPUT("BE_OUT"), 1025 SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0, 1026 MAX98396_R20E4_IV_SENSE_PATH_EN, 0, 0), 1027 SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0, 1028 MAX98396_R20E4_IV_SENSE_PATH_EN, 1, 0), 1029 SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0, 1030 &max98396_vi_control), 1031 SND_SOC_DAPM_SIGGEN("VMON"), 1032 SND_SOC_DAPM_SIGGEN("IMON"), 1033 SND_SOC_DAPM_SIGGEN("FBMON"), 1034 }; 1035 1036 static const char * const max98396_thermal_thresh_text[] = { 1037 "50C", "51C", "52C", "53C", "54C", "55C", "56C", "57C", 1038 "58C", "59C", "60C", "61C", "62C", "63C", "64C", "65C", 1039 "66C", "67C", "68C", "69C", "70C", "71C", "72C", "73C", 1040 "74C", "75C", "76C", "77C", "78C", "79C", "80C", "81C", 1041 "82C", "83C", "84C", "85C", "86C", "87C", "88C", "89C", 1042 "90C", "91C", "92C", "93C", "94C", "95C", "96C", "97C", 1043 "98C", "99C", "100C", "101C", "102C", "103C", "104C", "105C", 1044 "106C", "107C", "108C", "109C", "110C", "111C", "112C", "113C", 1045 "114C", "115C", "116C", "117C", "118C", "119C", "120C", "121C", 1046 "122C", "123C", "124C", "125C", "126C", "127C", "128C", "129C", 1047 "130C", "131C", "132C", "133C", "134C", "135C", "136C", "137C", 1048 "138C", "139C", "140C", "141C", "142C", "143C", "144C", "145C", 1049 "146C", "147C", "148C", "149C", "150C" 1050 }; 1051 1052 static SOC_ENUM_SINGLE_DECL(max98396_thermal_warn_thresh1_enum, 1053 MAX98396_R2020_THERM_WARN_THRESH, 0, 1054 max98396_thermal_thresh_text); 1055 1056 static SOC_ENUM_SINGLE_DECL(max98396_thermal_warn_thresh2_enum, 1057 MAX98396_R2021_THERM_WARN_THRESH2, 0, 1058 max98396_thermal_thresh_text); 1059 1060 static SOC_ENUM_SINGLE_DECL(max98396_thermal_shdn_thresh_enum, 1061 MAX98396_R2022_THERM_SHDN_THRESH, 0, 1062 max98396_thermal_thresh_text); 1063 1064 static const char * const max98396_thermal_hyteresis_text[] = { 1065 "2C", "5C", "7C", "10C" 1066 }; 1067 1068 static SOC_ENUM_SINGLE_DECL(max98396_thermal_hysteresis_enum, 1069 MAX98396_R2023_THERM_HYSTERESIS, 0, 1070 max98396_thermal_hyteresis_text); 1071 1072 static const char * const max98396_foldback_slope_text[] = { 1073 "0.25", "0.5", "1.0", "2.0" 1074 }; 1075 1076 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_slope1_enum, 1077 MAX98396_R2024_THERM_FOLDBACK_SET, 1078 MAX98396_THERM_FB_SLOPE1_SHIFT, 1079 max98396_foldback_slope_text); 1080 1081 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_slope2_enum, 1082 MAX98396_R2024_THERM_FOLDBACK_SET, 1083 MAX98396_THERM_FB_SLOPE2_SHIFT, 1084 max98396_foldback_slope_text); 1085 1086 static const char * const max98396_foldback_reltime_text[] = { 1087 "3ms", "10ms", "100ms", "300ms" 1088 }; 1089 1090 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_reltime_enum, 1091 MAX98396_R2024_THERM_FOLDBACK_SET, 1092 MAX98396_THERM_FB_REL_SHIFT, 1093 max98396_foldback_reltime_text); 1094 1095 static const char * const max98396_foldback_holdtime_text[] = { 1096 "0ms", "20ms", "40ms", "80ms" 1097 }; 1098 1099 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_holdtime_enum, 1100 MAX98396_R2024_THERM_FOLDBACK_SET, 1101 MAX98396_THERM_FB_HOLD_SHIFT, 1102 max98396_foldback_holdtime_text); 1103 1104 static int max98396_adc_value_get(struct snd_kcontrol *kcontrol, 1105 struct snd_ctl_elem_value *ucontrol) 1106 { 1107 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 1108 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component); 1109 struct soc_mixer_control *mc = 1110 (struct soc_mixer_control *)kcontrol->private_value; 1111 struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component); 1112 int ret; 1113 u8 val[2]; 1114 int reg = mc->reg; 1115 1116 /* ADC value is not available if the device is powered down */ 1117 if (snd_soc_dapm_get_bias_level(dapm) == SND_SOC_BIAS_OFF) 1118 goto exit; 1119 1120 if (max98396->device_id == CODEC_TYPE_MAX98397) { 1121 switch (mc->reg) { 1122 case MAX98396_R20B6_ADC_PVDD_READBACK_MSB: 1123 reg = MAX98397_R20B7_ADC_PVDD_READBACK_MSB; 1124 break; 1125 case MAX98396_R20B8_ADC_VBAT_READBACK_MSB: 1126 reg = MAX98397_R20B9_ADC_VBAT_READBACK_MSB; 1127 break; 1128 case MAX98396_R20BA_ADC_TEMP_READBACK_MSB: 1129 reg = MAX98397_R20BB_ADC_TEMP_READBACK_MSB; 1130 break; 1131 default: 1132 goto exit; 1133 } 1134 } 1135 1136 ret = regmap_raw_read(max98396->regmap, reg, &val, 2); 1137 if (ret) 1138 goto exit; 1139 1140 /* ADC readback bits[8:0] rearrangement */ 1141 ucontrol->value.integer.value[0] = (val[0] << 1) | (val[1] & 1); 1142 return 0; 1143 1144 exit: 1145 ucontrol->value.integer.value[0] = 0; 1146 return 0; 1147 } 1148 1149 static const struct snd_kcontrol_new max98396_snd_controls[] = { 1150 /* Volume */ 1151 SOC_SINGLE_TLV("Digital Volume", MAX98396_R2090_AMP_VOL_CTRL, 1152 0, 0x7F, 1, max98396_digital_tlv), 1153 SOC_SINGLE_TLV("Speaker Volume", MAX98396_R2091_AMP_PATH_GAIN, 1154 0, 0x11, 0, max98396_spk_tlv), 1155 /* Volume Ramp Up/Down Enable*/ 1156 SOC_SINGLE("Ramp Up Switch", MAX98396_R2092_AMP_DSP_CFG, 1157 MAX98396_DSP_SPK_VOL_RMPUP_SHIFT, 1, 0), 1158 SOC_SINGLE("Ramp Down Switch", MAX98396_R2092_AMP_DSP_CFG, 1159 MAX98396_DSP_SPK_VOL_RMPDN_SHIFT, 1, 0), 1160 /* Clock Monitor Enable */ 1161 SOC_SINGLE("CLK Monitor Switch", MAX98396_R203F_ENABLE_CTRLS, 1162 MAX98396_CTRL_CMON_EN_SHIFT, 1, 0), 1163 /* Dither Enable */ 1164 SOC_SINGLE("Dither Switch", MAX98396_R2092_AMP_DSP_CFG, 1165 MAX98396_DSP_SPK_DITH_EN_SHIFT, 1, 0), 1166 SOC_SINGLE("IV Dither Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG, 1167 MAX98396_IV_SENSE_DITH_EN_SHIFT, 1, 0), 1168 /* DC Blocker Enable */ 1169 SOC_SINGLE("DC Blocker Switch", MAX98396_R2092_AMP_DSP_CFG, 1170 MAX98396_DSP_SPK_DCBLK_EN_SHIFT, 1, 0), 1171 SOC_SINGLE("IV DC Blocker Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG, 1172 MAX98396_IV_SENSE_DCBLK_EN_SHIFT, 3, 0), 1173 /* Speaker Safe Mode Enable */ 1174 SOC_SINGLE("Safe Mode Switch", MAX98396_R2092_AMP_DSP_CFG, 1175 MAX98396_DSP_SPK_SAFE_EN_SHIFT, 1, 0), 1176 /* Wideband Filter Enable */ 1177 SOC_SINGLE("WB Filter Switch", MAX98396_R2092_AMP_DSP_CFG, 1178 MAX98396_DSP_SPK_WB_FLT_EN_SHIFT, 1, 0), 1179 SOC_SINGLE("IV WB Filter Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG, 1180 MAX98396_IV_SENSE_WB_FLT_EN_SHIFT, 1, 0), 1181 /* Dynamic Headroom Tracking */ 1182 SOC_SINGLE("DHT Switch", MAX98396_R20DF_DHT_EN, 0, 1, 0), 1183 /* Brownout Protection Engine */ 1184 SOC_SINGLE("BPE Switch", MAX98396_R210D_BPE_EN, 0, 1, 0), 1185 SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0), 1186 /* Bypass Path Enable */ 1187 SOC_SINGLE("Bypass Path Switch", 1188 MAX98396_R205E_PCM_RX_EN, 1, 1, 0), 1189 /* Speaker Operation Mode */ 1190 SOC_ENUM("OP Mode", max98396_op_mod_enum), 1191 /* Auto Restart functions */ 1192 SOC_SINGLE("CMON Auto Restart Switch", MAX98396_R2038_CLK_MON_CTRL, 1193 MAX98396_CLK_MON_AUTO_RESTART_SHIFT, 1, 0), 1194 SOC_SINGLE("PVDD Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1195 MAX98396_PVDD_UVLO_RESTART_SHFT, 1, 0), 1196 SOC_SINGLE("VBAT Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1197 MAX98396_VBAT_UVLO_RESTART_SHFT, 1, 0), 1198 SOC_SINGLE("THERM Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1199 MAX98396_THEM_SHDN_RESTART_SHFT, 1, 0), 1200 SOC_SINGLE("OVC Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1201 MAX98396_OVC_RESTART_SHFT, 1, 0), 1202 /* Thermal Threshold */ 1203 SOC_ENUM("THERM Thresh1", max98396_thermal_warn_thresh1_enum), 1204 SOC_ENUM("THERM Thresh2", max98396_thermal_warn_thresh2_enum), 1205 SOC_ENUM("THERM SHDN Thresh", max98396_thermal_shdn_thresh_enum), 1206 SOC_ENUM("THERM Hysteresis", max98396_thermal_hysteresis_enum), 1207 SOC_SINGLE("THERM Foldback Switch", 1208 MAX98396_R2027_THERM_FOLDBACK_EN, 0, 1, 0), 1209 SOC_ENUM("THERM Slope1", max98396_thermal_fb_slope1_enum), 1210 SOC_ENUM("THERM Slope2", max98396_thermal_fb_slope2_enum), 1211 SOC_ENUM("THERM Release", max98396_thermal_fb_reltime_enum), 1212 SOC_ENUM("THERM Hold", max98396_thermal_fb_holdtime_enum), 1213 /* ADC */ 1214 SOC_SINGLE_EXT("ADC PVDD", MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0, 0x1FF, 0, 1215 max98396_adc_value_get, NULL), 1216 SOC_SINGLE_EXT("ADC VBAT", MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0, 0x1FF, 0, 1217 max98396_adc_value_get, NULL), 1218 SOC_SINGLE_EXT("ADC TEMP", MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0, 0x1FF, 0, 1219 max98396_adc_value_get, NULL), 1220 }; 1221 1222 static const struct snd_kcontrol_new max98397_snd_controls[] = { 1223 /* Volume */ 1224 SOC_SINGLE_TLV("Digital Volume", MAX98396_R2090_AMP_VOL_CTRL, 1225 0, 0xFF, 1, max98397_digital_tlv), 1226 SOC_SINGLE_TLV("Speaker Volume", MAX98396_R2091_AMP_PATH_GAIN, 1227 0, 0x15, 0, max98397_spk_tlv), 1228 /* Volume Ramp Up/Down Enable*/ 1229 SOC_SINGLE("Ramp Up Switch", MAX98396_R2092_AMP_DSP_CFG, 1230 MAX98396_DSP_SPK_VOL_RMPUP_SHIFT, 1, 0), 1231 SOC_SINGLE("Ramp Down Switch", MAX98396_R2092_AMP_DSP_CFG, 1232 MAX98396_DSP_SPK_VOL_RMPDN_SHIFT, 1, 0), 1233 /* Clock Monitor Enable */ 1234 SOC_SINGLE("CLK Monitor Switch", MAX98396_R203F_ENABLE_CTRLS, 1235 MAX98396_CTRL_CMON_EN_SHIFT, 1, 0), 1236 /* Dither Enable */ 1237 SOC_SINGLE("Dither Switch", MAX98396_R2092_AMP_DSP_CFG, 1238 MAX98396_DSP_SPK_DITH_EN_SHIFT, 1, 0), 1239 SOC_SINGLE("IV Dither Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG, 1240 MAX98396_IV_SENSE_DITH_EN_SHIFT, 1, 0), 1241 /* DC Blocker Enable */ 1242 SOC_SINGLE("DC Blocker Switch", MAX98396_R2092_AMP_DSP_CFG, 1243 MAX98396_DSP_SPK_DCBLK_EN_SHIFT, 1, 0), 1244 SOC_SINGLE("IV DC Blocker Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG, 1245 MAX98396_IV_SENSE_DCBLK_EN_SHIFT, 3, 0), 1246 /* Speaker Safe Mode Enable */ 1247 SOC_SINGLE("Safe Mode Switch", MAX98396_R2092_AMP_DSP_CFG, 1248 MAX98396_DSP_SPK_SAFE_EN_SHIFT, 1, 0), 1249 /* Wideband Filter Enable */ 1250 SOC_SINGLE("WB Filter Switch", MAX98396_R2092_AMP_DSP_CFG, 1251 MAX98396_DSP_SPK_WB_FLT_EN_SHIFT, 1, 0), 1252 SOC_SINGLE("IV WB Filter Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG, 1253 MAX98396_IV_SENSE_WB_FLT_EN_SHIFT, 1, 0), 1254 /* Dynamic Headroom Tracking */ 1255 SOC_SINGLE("DHT Switch", MAX98396_R20DF_DHT_EN, 0, 1, 0), 1256 /* Brownout Protection Engine */ 1257 SOC_SINGLE("BPE Switch", MAX98396_R210D_BPE_EN, 0, 1, 0), 1258 SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0), 1259 /* Bypass Path Enable */ 1260 SOC_SINGLE("Bypass Path Switch", 1261 MAX98396_R205E_PCM_RX_EN, 1, 1, 0), 1262 /* Speaker Operation Mode */ 1263 SOC_ENUM("OP Mode", max98396_op_mod_enum), 1264 /* Auto Restart functions */ 1265 SOC_SINGLE("CMON Auto Restart Switch", MAX98396_R2038_CLK_MON_CTRL, 1266 MAX98396_CLK_MON_AUTO_RESTART_SHIFT, 1, 0), 1267 SOC_SINGLE("PVDD Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1268 MAX98396_PVDD_UVLO_RESTART_SHFT, 1, 0), 1269 SOC_SINGLE("VBAT Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1270 MAX98396_VBAT_UVLO_RESTART_SHFT, 1, 0), 1271 SOC_SINGLE("THERM Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1272 MAX98396_THEM_SHDN_RESTART_SHFT, 1, 0), 1273 SOC_SINGLE("OVC Auto Restart Switch", MAX98396_R210E_AUTO_RESTART, 1274 MAX98396_OVC_RESTART_SHFT, 1, 0), 1275 /* Thermal Threshold */ 1276 SOC_ENUM("THERM Thresh1", max98396_thermal_warn_thresh1_enum), 1277 SOC_ENUM("THERM Thresh2", max98396_thermal_warn_thresh2_enum), 1278 SOC_ENUM("THERM SHDN Thresh", max98396_thermal_shdn_thresh_enum), 1279 SOC_ENUM("THERM Hysteresis", max98396_thermal_hysteresis_enum), 1280 SOC_SINGLE("THERM Foldback Switch", 1281 MAX98396_R2027_THERM_FOLDBACK_EN, 0, 1, 0), 1282 SOC_ENUM("THERM Slope1", max98396_thermal_fb_slope1_enum), 1283 SOC_ENUM("THERM Slope2", max98396_thermal_fb_slope2_enum), 1284 SOC_ENUM("THERM Release", max98396_thermal_fb_reltime_enum), 1285 SOC_ENUM("THERM Hold", max98396_thermal_fb_holdtime_enum), 1286 /* ADC */ 1287 SOC_SINGLE_EXT("ADC PVDD", MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0, 0x1FF, 0, 1288 max98396_adc_value_get, NULL), 1289 SOC_SINGLE_EXT("ADC VBAT", MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0, 0x1FF, 0, 1290 max98396_adc_value_get, NULL), 1291 SOC_SINGLE_EXT("ADC TEMP", MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0, 0x1FF, 0, 1292 max98396_adc_value_get, NULL), 1293 }; 1294 1295 static const struct snd_soc_dapm_route max98396_audio_map[] = { 1296 /* Plabyack */ 1297 {"DAI Sel Mux", "Left", "Amp Enable"}, 1298 {"DAI Sel Mux", "Right", "Amp Enable"}, 1299 {"DAI Sel Mux", "LeftRight", "Amp Enable"}, 1300 {"BE_OUT", NULL, "DAI Sel Mux"}, 1301 /* Capture */ 1302 { "VI Sense", "Switch", "VMON" }, 1303 { "VI Sense", "Switch", "IMON" }, 1304 { "Voltage Sense", NULL, "VI Sense" }, 1305 { "Current Sense", NULL, "VI Sense" }, 1306 }; 1307 1308 static struct snd_soc_dai_driver max98396_dai[] = { 1309 { 1310 .name = "max98396-aif1", 1311 .playback = { 1312 .stream_name = "HiFi Playback", 1313 .channels_min = 1, 1314 .channels_max = 2, 1315 .rates = MAX98396_RATES, 1316 .formats = MAX98396_FORMATS, 1317 }, 1318 .capture = { 1319 .stream_name = "HiFi Capture", 1320 .channels_min = 1, 1321 .channels_max = 2, 1322 .rates = MAX98396_RATES, 1323 .formats = MAX98396_FORMATS, 1324 }, 1325 .ops = &max98396_dai_ops, 1326 } 1327 }; 1328 1329 static struct snd_soc_dai_driver max98397_dai[] = { 1330 { 1331 .name = "max98397-aif1", 1332 .playback = { 1333 .stream_name = "HiFi Playback", 1334 .channels_min = 1, 1335 .channels_max = 2, 1336 .rates = MAX98396_RATES, 1337 .formats = MAX98396_FORMATS, 1338 }, 1339 .capture = { 1340 .stream_name = "HiFi Capture", 1341 .channels_min = 1, 1342 .channels_max = 2, 1343 .rates = MAX98396_RATES, 1344 .formats = MAX98396_FORMATS, 1345 }, 1346 .ops = &max98396_dai_ops, 1347 } 1348 }; 1349 1350 static void max98396_reset(struct max98396_priv *max98396, struct device *dev) 1351 { 1352 int ret, reg, count; 1353 1354 /* Software Reset */ 1355 ret = regmap_write(max98396->regmap, 1356 MAX98396_R2000_SW_RESET, 1); 1357 if (ret) 1358 dev_err(dev, "Reset command failed. (ret:%d)\n", ret); 1359 1360 count = 0; 1361 while (count < 3) { 1362 usleep_range(5000, 6000); 1363 /* Software Reset Verification */ 1364 ret = regmap_read(max98396->regmap, 1365 GET_REG_ADDR_REV_ID(max98396->device_id), ®); 1366 if (!ret) { 1367 dev_info(dev, "Reset completed (retry:%d)\n", count); 1368 return; 1369 } 1370 count++; 1371 } 1372 dev_err(dev, "Reset failed. (ret:%d)\n", ret); 1373 } 1374 1375 static int max98396_probe(struct snd_soc_component *component) 1376 { 1377 struct max98396_priv *max98396 = 1378 snd_soc_component_get_drvdata(component); 1379 1380 /* Software Reset */ 1381 max98396_reset(max98396, component->dev); 1382 1383 /* L/R mix configuration */ 1384 if (max98396->device_id == CODEC_TYPE_MAX98396) { 1385 regmap_write(max98396->regmap, 1386 MAX98396_R2055_PCM_RX_SRC1, 0x02); 1387 regmap_write(max98396->regmap, 1388 MAX98396_R2056_PCM_RX_SRC2, 0x10); 1389 } else { 1390 regmap_write(max98396->regmap, 1391 MAX98397_R2056_PCM_RX_SRC1, 0x02); 1392 regmap_write(max98396->regmap, 1393 MAX98397_R2057_PCM_RX_SRC2, 0x10); 1394 } 1395 /* Supply control */ 1396 regmap_update_bits(max98396->regmap, 1397 MAX98396_R20A0_AMP_SUPPLY_CTL, 1398 MAX98396_AMP_SUPPLY_NOVBAT, 1399 (max98396->vbat == NULL) ? 1400 MAX98396_AMP_SUPPLY_NOVBAT : 0); 1401 /* Enable DC blocker */ 1402 regmap_update_bits(max98396->regmap, 1403 MAX98396_R2092_AMP_DSP_CFG, 1, 1); 1404 /* Enable IV Monitor DC blocker */ 1405 regmap_update_bits(max98396->regmap, 1406 MAX98396_R20E0_IV_SENSE_PATH_CFG, 1407 MAX98396_IV_SENSE_DCBLK_EN_MASK, 1408 MAX98396_IV_SENSE_DCBLK_EN_MASK); 1409 /* Configure default data output sources */ 1410 regmap_write(max98396->regmap, 1411 MAX98396_R205D_PCM_TX_SRC_EN, 3); 1412 /* Enable Wideband Filter */ 1413 regmap_update_bits(max98396->regmap, 1414 MAX98396_R2092_AMP_DSP_CFG, 0x40, 0x40); 1415 /* Enable IV Wideband Filter */ 1416 regmap_update_bits(max98396->regmap, 1417 MAX98396_R20E0_IV_SENSE_PATH_CFG, 8, 8); 1418 1419 /* Enable Bypass Source */ 1420 regmap_write(max98396->regmap, 1421 MAX98396_R2058_PCM_BYPASS_SRC, 1422 max98396->bypass_slot); 1423 /* Voltage, current slot configuration */ 1424 regmap_write(max98396->regmap, 1425 MAX98396_R2044_PCM_TX_CTRL_1, 1426 max98396->v_slot); 1427 regmap_write(max98396->regmap, 1428 MAX98396_R2045_PCM_TX_CTRL_2, 1429 max98396->i_slot); 1430 regmap_write(max98396->regmap, 1431 MAX98396_R204A_PCM_TX_CTRL_7, 1432 max98396->spkfb_slot); 1433 1434 if (max98396->v_slot < 8) 1435 if (max98396->device_id == CODEC_TYPE_MAX98396) 1436 regmap_update_bits(max98396->regmap, 1437 MAX98396_R2053_PCM_TX_HIZ_CTRL_8, 1438 1 << max98396->v_slot, 0); 1439 else 1440 regmap_update_bits(max98396->regmap, 1441 MAX98397_R2054_PCM_TX_HIZ_CTRL_8, 1442 1 << max98396->v_slot, 0); 1443 else 1444 if (max98396->device_id == CODEC_TYPE_MAX98396) 1445 regmap_update_bits(max98396->regmap, 1446 MAX98396_R2052_PCM_TX_HIZ_CTRL_7, 1447 1 << (max98396->v_slot - 8), 0); 1448 else 1449 regmap_update_bits(max98396->regmap, 1450 MAX98397_R2053_PCM_TX_HIZ_CTRL_7, 1451 1 << (max98396->v_slot - 8), 0); 1452 1453 if (max98396->i_slot < 8) 1454 if (max98396->device_id == CODEC_TYPE_MAX98396) 1455 regmap_update_bits(max98396->regmap, 1456 MAX98396_R2053_PCM_TX_HIZ_CTRL_8, 1457 1 << max98396->i_slot, 0); 1458 else 1459 regmap_update_bits(max98396->regmap, 1460 MAX98397_R2054_PCM_TX_HIZ_CTRL_8, 1461 1 << max98396->i_slot, 0); 1462 else 1463 if (max98396->device_id == CODEC_TYPE_MAX98396) 1464 regmap_update_bits(max98396->regmap, 1465 MAX98396_R2052_PCM_TX_HIZ_CTRL_7, 1466 1 << (max98396->i_slot - 8), 0); 1467 else 1468 regmap_update_bits(max98396->regmap, 1469 MAX98397_R2053_PCM_TX_HIZ_CTRL_7, 1470 1 << (max98396->i_slot - 8), 0); 1471 1472 /* Set interleave mode */ 1473 if (max98396->interleave_mode) 1474 regmap_update_bits(max98396->regmap, 1475 MAX98396_R2041_PCM_MODE_CFG, 1476 MAX98396_PCM_TX_CH_INTERLEAVE_MASK, 1477 MAX98396_PCM_TX_CH_INTERLEAVE_MASK); 1478 1479 regmap_update_bits(max98396->regmap, 1480 MAX98396_R2038_CLK_MON_CTRL, 1481 MAX98396_CLK_MON_AUTO_RESTART_MASK, 1482 MAX98396_CLK_MON_AUTO_RESTART_MASK); 1483 1484 regmap_update_bits(max98396->regmap, 1485 MAX98396_R203F_ENABLE_CTRLS, 1486 MAX98396_CTRL_DMON_STUCK_EN_MASK, 1487 max98396->dmon_stuck_enable ? 1488 MAX98396_CTRL_DMON_STUCK_EN_MASK : 0); 1489 1490 regmap_update_bits(max98396->regmap, 1491 MAX98396_R203F_ENABLE_CTRLS, 1492 MAX98396_CTRL_DMON_MAG_EN_MASK, 1493 max98396->dmon_mag_enable ? 1494 MAX98396_CTRL_DMON_MAG_EN_MASK : 0); 1495 1496 switch (max98396->dmon_duration) { 1497 case 64: 1498 regmap_update_bits(max98396->regmap, 1499 MAX98396_R2039_DATA_MON_CTRL, 1500 MAX98396_DMON_DURATION_MASK, 0); 1501 break; 1502 case 256: 1503 regmap_update_bits(max98396->regmap, 1504 MAX98396_R2039_DATA_MON_CTRL, 1505 MAX98396_DMON_DURATION_MASK, 1); 1506 break; 1507 case 1024: 1508 regmap_update_bits(max98396->regmap, 1509 MAX98396_R2039_DATA_MON_CTRL, 1510 MAX98396_DMON_DURATION_MASK, 2); 1511 break; 1512 case 4096: 1513 regmap_update_bits(max98396->regmap, 1514 MAX98396_R2039_DATA_MON_CTRL, 1515 MAX98396_DMON_DURATION_MASK, 3); 1516 break; 1517 default: 1518 dev_err(component->dev, "Invalid DMON duration %d\n", 1519 max98396->dmon_duration); 1520 } 1521 1522 switch (max98396->dmon_stuck_threshold) { 1523 case 15: 1524 regmap_update_bits(max98396->regmap, 1525 MAX98396_R2039_DATA_MON_CTRL, 1526 MAX98396_DMON_STUCK_THRESH_MASK, 1527 0 << MAX98396_DMON_STUCK_THRESH_SHIFT); 1528 break; 1529 case 13: 1530 regmap_update_bits(max98396->regmap, 1531 MAX98396_R2039_DATA_MON_CTRL, 1532 MAX98396_DMON_STUCK_THRESH_MASK, 1533 1 << MAX98396_DMON_STUCK_THRESH_SHIFT); 1534 break; 1535 case 22: 1536 regmap_update_bits(max98396->regmap, 1537 MAX98396_R2039_DATA_MON_CTRL, 1538 MAX98396_DMON_STUCK_THRESH_MASK, 1539 2 << MAX98396_DMON_STUCK_THRESH_SHIFT); 1540 break; 1541 case 9: 1542 regmap_update_bits(max98396->regmap, 1543 MAX98396_R2039_DATA_MON_CTRL, 1544 MAX98396_DMON_STUCK_THRESH_MASK, 1545 3 << MAX98396_DMON_STUCK_THRESH_SHIFT); 1546 break; 1547 default: 1548 dev_err(component->dev, "Invalid DMON stuck threshold %d\n", 1549 max98396->dmon_stuck_threshold); 1550 } 1551 1552 switch (max98396->dmon_mag_threshold) { 1553 case 2 ... 5: 1554 regmap_update_bits(max98396->regmap, 1555 MAX98396_R2039_DATA_MON_CTRL, 1556 MAX98396_DMON_STUCK_THRESH_MASK, 1557 (5 - max98396->dmon_mag_threshold) 1558 << MAX98396_DMON_MAG_THRESH_SHIFT); 1559 break; 1560 default: 1561 dev_err(component->dev, "Invalid DMON magnitude threshold %d\n", 1562 max98396->dmon_mag_threshold); 1563 } 1564 1565 /* Speaker Amplifier PCM RX Enable by default */ 1566 regmap_update_bits(max98396->regmap, 1567 MAX98396_R205E_PCM_RX_EN, 1568 MAX98396_PCM_RX_EN_MASK, 1); 1569 1570 return 0; 1571 } 1572 1573 static int max98396_suspend(struct device *dev) 1574 { 1575 struct max98396_priv *max98396 = dev_get_drvdata(dev); 1576 1577 regcache_cache_only(max98396->regmap, true); 1578 regcache_mark_dirty(max98396->regmap); 1579 regulator_bulk_disable(MAX98396_NUM_CORE_SUPPLIES, 1580 max98396->core_supplies); 1581 if (max98396->pvdd) 1582 regulator_disable(max98396->pvdd); 1583 1584 if (max98396->vbat) 1585 regulator_disable(max98396->vbat); 1586 1587 return 0; 1588 } 1589 1590 static int max98396_resume(struct device *dev) 1591 { 1592 struct max98396_priv *max98396 = dev_get_drvdata(dev); 1593 int ret; 1594 1595 ret = regulator_bulk_enable(MAX98396_NUM_CORE_SUPPLIES, 1596 max98396->core_supplies); 1597 if (ret < 0) 1598 return ret; 1599 1600 if (max98396->pvdd) { 1601 ret = regulator_enable(max98396->pvdd); 1602 if (ret < 0) 1603 return ret; 1604 } 1605 1606 if (max98396->vbat) { 1607 ret = regulator_enable(max98396->vbat); 1608 if (ret < 0) 1609 return ret; 1610 } 1611 1612 regcache_cache_only(max98396->regmap, false); 1613 max98396_reset(max98396, dev); 1614 regcache_sync(max98396->regmap); 1615 return 0; 1616 } 1617 1618 static const struct dev_pm_ops max98396_pm = { 1619 SYSTEM_SLEEP_PM_OPS(max98396_suspend, max98396_resume) 1620 }; 1621 1622 static const struct snd_soc_component_driver soc_codec_dev_max98396 = { 1623 .probe = max98396_probe, 1624 .controls = max98396_snd_controls, 1625 .num_controls = ARRAY_SIZE(max98396_snd_controls), 1626 .dapm_widgets = max98396_dapm_widgets, 1627 .num_dapm_widgets = ARRAY_SIZE(max98396_dapm_widgets), 1628 .dapm_routes = max98396_audio_map, 1629 .num_dapm_routes = ARRAY_SIZE(max98396_audio_map), 1630 .idle_bias_on = 1, 1631 .use_pmdown_time = 1, 1632 .endianness = 1, 1633 }; 1634 1635 static const struct snd_soc_component_driver soc_codec_dev_max98397 = { 1636 .probe = max98396_probe, 1637 .controls = max98397_snd_controls, 1638 .num_controls = ARRAY_SIZE(max98397_snd_controls), 1639 .dapm_widgets = max98396_dapm_widgets, 1640 .num_dapm_widgets = ARRAY_SIZE(max98396_dapm_widgets), 1641 .dapm_routes = max98396_audio_map, 1642 .num_dapm_routes = ARRAY_SIZE(max98396_audio_map), 1643 .idle_bias_on = 1, 1644 .use_pmdown_time = 1, 1645 .endianness = 1, 1646 }; 1647 1648 static const struct regmap_config max98396_regmap = { 1649 .reg_bits = 16, 1650 .val_bits = 8, 1651 .max_register = MAX98396_R21FF_REVISION_ID, 1652 .reg_defaults = max98396_reg, 1653 .num_reg_defaults = ARRAY_SIZE(max98396_reg), 1654 .readable_reg = max98396_readable_register, 1655 .volatile_reg = max98396_volatile_reg, 1656 .cache_type = REGCACHE_RBTREE, 1657 }; 1658 1659 static const struct regmap_config max98397_regmap = { 1660 .reg_bits = 16, 1661 .val_bits = 8, 1662 .max_register = MAX98397_R22FF_REVISION_ID, 1663 .reg_defaults = max98397_reg, 1664 .num_reg_defaults = ARRAY_SIZE(max98397_reg), 1665 .readable_reg = max98397_readable_register, 1666 .volatile_reg = max98397_volatile_reg, 1667 .cache_type = REGCACHE_RBTREE, 1668 }; 1669 1670 static void max98396_read_device_property(struct device *dev, 1671 struct max98396_priv *max98396) 1672 { 1673 int value; 1674 1675 if (!device_property_read_u32(dev, "adi,vmon-slot-no", &value)) 1676 max98396->v_slot = value & 0xF; 1677 else 1678 max98396->v_slot = 0; 1679 1680 if (!device_property_read_u32(dev, "adi,imon-slot-no", &value)) 1681 max98396->i_slot = value & 0xF; 1682 else 1683 max98396->i_slot = 1; 1684 1685 if (!device_property_read_u32(dev, "adi,spkfb-slot-no", &value)) 1686 max98396->spkfb_slot = value & 0xF; 1687 else 1688 max98396->spkfb_slot = 2; 1689 1690 if (!device_property_read_u32(dev, "adi,bypass-slot-no", &value)) 1691 max98396->bypass_slot = value & 0xF; 1692 else 1693 max98396->bypass_slot = 0; 1694 1695 max98396->dmon_stuck_enable = 1696 device_property_read_bool(dev, "adi,dmon-stuck-enable"); 1697 1698 if (!device_property_read_u32(dev, "adi,dmon-stuck-threshold-bits", &value)) 1699 max98396->dmon_stuck_threshold = value; 1700 else 1701 max98396->dmon_stuck_threshold = 15; 1702 1703 max98396->dmon_mag_enable = 1704 device_property_read_bool(dev, "adi,dmon-magnitude-enable"); 1705 1706 if (!device_property_read_u32(dev, "adi,dmon-magnitude-threshold-bits", &value)) 1707 max98396->dmon_mag_threshold = value; 1708 else 1709 max98396->dmon_mag_threshold = 5; 1710 1711 if (!device_property_read_u32(dev, "adi,dmon-duration-ms", &value)) 1712 max98396->dmon_duration = value; 1713 else 1714 max98396->dmon_duration = 64; 1715 } 1716 1717 static void max98396_core_supplies_disable(void *priv) 1718 { 1719 struct max98396_priv *max98396 = priv; 1720 1721 regulator_bulk_disable(MAX98396_NUM_CORE_SUPPLIES, 1722 max98396->core_supplies); 1723 } 1724 1725 static void max98396_supply_disable(void *r) 1726 { 1727 regulator_disable((struct regulator *) r); 1728 } 1729 1730 static int max98396_i2c_probe(struct i2c_client *i2c) 1731 { 1732 const struct i2c_device_id *id = i2c_client_get_device_id(i2c); 1733 struct max98396_priv *max98396 = NULL; 1734 int i, ret, reg; 1735 1736 max98396 = devm_kzalloc(&i2c->dev, sizeof(*max98396), GFP_KERNEL); 1737 1738 if (!max98396) { 1739 ret = -ENOMEM; 1740 return ret; 1741 } 1742 i2c_set_clientdata(i2c, max98396); 1743 1744 max98396->device_id = id->driver_data; 1745 1746 /* regmap initialization */ 1747 if (max98396->device_id == CODEC_TYPE_MAX98396) 1748 max98396->regmap = devm_regmap_init_i2c(i2c, &max98396_regmap); 1749 1750 else 1751 max98396->regmap = devm_regmap_init_i2c(i2c, &max98397_regmap); 1752 1753 if (IS_ERR(max98396->regmap)) { 1754 ret = PTR_ERR(max98396->regmap); 1755 dev_err(&i2c->dev, 1756 "Failed to allocate regmap: %d\n", ret); 1757 return ret; 1758 } 1759 1760 /* Obtain regulator supplies */ 1761 for (i = 0; i < MAX98396_NUM_CORE_SUPPLIES; i++) 1762 max98396->core_supplies[i].supply = max98396_core_supplies[i]; 1763 1764 ret = devm_regulator_bulk_get(&i2c->dev, MAX98396_NUM_CORE_SUPPLIES, 1765 max98396->core_supplies); 1766 if (ret < 0) { 1767 dev_err(&i2c->dev, "Failed to request core supplies: %d\n", ret); 1768 return ret; 1769 } 1770 1771 max98396->vbat = devm_regulator_get_optional(&i2c->dev, "vbat"); 1772 if (IS_ERR(max98396->vbat)) { 1773 if (PTR_ERR(max98396->vbat) == -EPROBE_DEFER) 1774 return -EPROBE_DEFER; 1775 1776 max98396->vbat = NULL; 1777 } 1778 1779 max98396->pvdd = devm_regulator_get_optional(&i2c->dev, "pvdd"); 1780 if (IS_ERR(max98396->pvdd)) { 1781 if (PTR_ERR(max98396->pvdd) == -EPROBE_DEFER) 1782 return -EPROBE_DEFER; 1783 1784 max98396->pvdd = NULL; 1785 } 1786 1787 ret = regulator_bulk_enable(MAX98396_NUM_CORE_SUPPLIES, 1788 max98396->core_supplies); 1789 if (ret < 0) { 1790 dev_err(&i2c->dev, "Unable to enable core supplies: %d", ret); 1791 return ret; 1792 } 1793 1794 ret = devm_add_action_or_reset(&i2c->dev, max98396_core_supplies_disable, 1795 max98396); 1796 if (ret < 0) 1797 return ret; 1798 1799 if (max98396->pvdd) { 1800 ret = regulator_enable(max98396->pvdd); 1801 if (ret < 0) 1802 return ret; 1803 1804 ret = devm_add_action_or_reset(&i2c->dev, 1805 max98396_supply_disable, 1806 max98396->pvdd); 1807 if (ret < 0) 1808 return ret; 1809 } 1810 1811 if (max98396->vbat) { 1812 ret = regulator_enable(max98396->vbat); 1813 if (ret < 0) 1814 return ret; 1815 1816 ret = devm_add_action_or_reset(&i2c->dev, 1817 max98396_supply_disable, 1818 max98396->vbat); 1819 if (ret < 0) 1820 return ret; 1821 } 1822 1823 /* update interleave mode info */ 1824 if (device_property_read_bool(&i2c->dev, "adi,interleave_mode")) 1825 max98396->interleave_mode = true; 1826 else 1827 max98396->interleave_mode = false; 1828 1829 /* voltage/current slot & gpio configuration */ 1830 max98396_read_device_property(&i2c->dev, max98396); 1831 1832 /* Reset the Device */ 1833 max98396->reset_gpio = devm_gpiod_get_optional(&i2c->dev, 1834 "reset", GPIOD_OUT_HIGH); 1835 if (IS_ERR(max98396->reset_gpio)) { 1836 ret = PTR_ERR(max98396->reset_gpio); 1837 dev_err(&i2c->dev, "Unable to request GPIO pin: %d.\n", ret); 1838 return ret; 1839 } 1840 1841 if (max98396->reset_gpio) { 1842 usleep_range(5000, 6000); 1843 gpiod_set_value_cansleep(max98396->reset_gpio, 0); 1844 /* Wait for the hw reset done */ 1845 usleep_range(5000, 6000); 1846 } 1847 1848 ret = regmap_read(max98396->regmap, 1849 GET_REG_ADDR_REV_ID(max98396->device_id), ®); 1850 if (ret < 0) { 1851 dev_err(&i2c->dev, "%s: failed to read revision of the device.\n", id->name); 1852 return ret; 1853 } 1854 dev_info(&i2c->dev, "%s revision ID: 0x%02X\n", id->name, reg); 1855 1856 /* codec registration */ 1857 if (max98396->device_id == CODEC_TYPE_MAX98396) 1858 ret = devm_snd_soc_register_component(&i2c->dev, 1859 &soc_codec_dev_max98396, 1860 max98396_dai, 1861 ARRAY_SIZE(max98396_dai)); 1862 else 1863 ret = devm_snd_soc_register_component(&i2c->dev, 1864 &soc_codec_dev_max98397, 1865 max98397_dai, 1866 ARRAY_SIZE(max98397_dai)); 1867 if (ret < 0) 1868 dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); 1869 1870 return ret; 1871 } 1872 1873 static const struct i2c_device_id max98396_i2c_id[] = { 1874 { "max98396", CODEC_TYPE_MAX98396}, 1875 { "max98397", CODEC_TYPE_MAX98397}, 1876 { }, 1877 }; 1878 1879 MODULE_DEVICE_TABLE(i2c, max98396_i2c_id); 1880 1881 #if defined(CONFIG_OF) 1882 static const struct of_device_id max98396_of_match[] = { 1883 { .compatible = "adi,max98396", }, 1884 { .compatible = "adi,max98397", }, 1885 { } 1886 }; 1887 MODULE_DEVICE_TABLE(of, max98396_of_match); 1888 #endif 1889 1890 #ifdef CONFIG_ACPI 1891 static const struct acpi_device_id max98396_acpi_match[] = { 1892 { "ADS8396", 0 }, 1893 { "ADS8397", 0 }, 1894 {}, 1895 }; 1896 MODULE_DEVICE_TABLE(acpi, max98396_acpi_match); 1897 #endif 1898 1899 static struct i2c_driver max98396_i2c_driver = { 1900 .driver = { 1901 .name = "max98396", 1902 .of_match_table = of_match_ptr(max98396_of_match), 1903 .acpi_match_table = ACPI_PTR(max98396_acpi_match), 1904 .pm = pm_ptr(&max98396_pm), 1905 }, 1906 .probe = max98396_i2c_probe, 1907 .id_table = max98396_i2c_id, 1908 }; 1909 1910 module_i2c_driver(max98396_i2c_driver) 1911 1912 MODULE_DESCRIPTION("ALSA SoC MAX98396 driver"); 1913 MODULE_AUTHOR("Ryan Lee <ryans.lee@analog.com>"); 1914 MODULE_LICENSE("GPL"); 1915