1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * max98390.c -- MAX98390 ALSA Soc Audio driver 4 * 5 * Copyright (C) 2020 Maxim Integrated Products 6 * 7 */ 8 9 #include <linux/acpi.h> 10 #include <linux/cdev.h> 11 #include <linux/dmi.h> 12 #include <linux/firmware.h> 13 #include <linux/gpio/consumer.h> 14 #include <linux/i2c.h> 15 #include <linux/module.h> 16 #include <linux/regmap.h> 17 #include <linux/slab.h> 18 #include <linux/time.h> 19 #include <sound/pcm.h> 20 #include <sound/pcm_params.h> 21 #include <sound/soc.h> 22 #include <sound/tlv.h> 23 24 #include "max98390.h" 25 26 static const struct reg_default max98390_reg_defaults[] = { 27 {MAX98390_INT_EN1, 0xf0}, 28 {MAX98390_INT_EN2, 0x00}, 29 {MAX98390_INT_EN3, 0x00}, 30 {MAX98390_INT_FLAG_CLR1, 0x00}, 31 {MAX98390_INT_FLAG_CLR2, 0x00}, 32 {MAX98390_INT_FLAG_CLR3, 0x00}, 33 {MAX98390_IRQ_CTRL, 0x01}, 34 {MAX98390_CLK_MON, 0x6d}, 35 {MAX98390_DAT_MON, 0x03}, 36 {MAX98390_WDOG_CTRL, 0x00}, 37 {MAX98390_WDOG_RST, 0x00}, 38 {MAX98390_MEAS_ADC_THERM_WARN_THRESH, 0x75}, 39 {MAX98390_MEAS_ADC_THERM_SHDN_THRESH, 0x8c}, 40 {MAX98390_MEAS_ADC_THERM_HYSTERESIS, 0x08}, 41 {MAX98390_PIN_CFG, 0x55}, 42 {MAX98390_PCM_RX_EN_A, 0x00}, 43 {MAX98390_PCM_RX_EN_B, 0x00}, 44 {MAX98390_PCM_TX_EN_A, 0x00}, 45 {MAX98390_PCM_TX_EN_B, 0x00}, 46 {MAX98390_PCM_TX_HIZ_CTRL_A, 0xff}, 47 {MAX98390_PCM_TX_HIZ_CTRL_B, 0xff}, 48 {MAX98390_PCM_CH_SRC_1, 0x00}, 49 {MAX98390_PCM_CH_SRC_2, 0x00}, 50 {MAX98390_PCM_CH_SRC_3, 0x00}, 51 {MAX98390_PCM_MODE_CFG, 0xc0}, 52 {MAX98390_PCM_MASTER_MODE, 0x1c}, 53 {MAX98390_PCM_CLK_SETUP, 0x44}, 54 {MAX98390_PCM_SR_SETUP, 0x08}, 55 {MAX98390_ICC_RX_EN_A, 0x00}, 56 {MAX98390_ICC_RX_EN_B, 0x00}, 57 {MAX98390_ICC_TX_EN_A, 0x00}, 58 {MAX98390_ICC_TX_EN_B, 0x00}, 59 {MAX98390_ICC_HIZ_MANUAL_MODE, 0x00}, 60 {MAX98390_ICC_TX_HIZ_EN_A, 0x00}, 61 {MAX98390_ICC_TX_HIZ_EN_B, 0x00}, 62 {MAX98390_ICC_LNK_EN, 0x00}, 63 {MAX98390_R2039_AMP_DSP_CFG, 0x0f}, 64 {MAX98390_R203A_AMP_EN, 0x81}, 65 {MAX98390_TONE_GEN_DC_CFG, 0x00}, 66 {MAX98390_SPK_SRC_SEL, 0x00}, 67 {MAX98390_SSM_CFG, 0x85}, 68 {MAX98390_MEAS_EN, 0x03}, 69 {MAX98390_MEAS_DSP_CFG, 0x0f}, 70 {MAX98390_BOOST_CTRL0, 0x1c}, 71 {MAX98390_BOOST_CTRL3, 0x01}, 72 {MAX98390_BOOST_CTRL1, 0x40}, 73 {MAX98390_MEAS_ADC_CFG, 0x07}, 74 {MAX98390_MEAS_ADC_BASE_MSB, 0x00}, 75 {MAX98390_MEAS_ADC_BASE_LSB, 0x23}, 76 {MAX98390_ADC_CH0_DIVIDE, 0x00}, 77 {MAX98390_ADC_CH1_DIVIDE, 0x00}, 78 {MAX98390_ADC_CH2_DIVIDE, 0x00}, 79 {MAX98390_ADC_CH0_FILT_CFG, 0x00}, 80 {MAX98390_ADC_CH1_FILT_CFG, 0x00}, 81 {MAX98390_ADC_CH2_FILT_CFG, 0x00}, 82 {MAX98390_PWR_GATE_CTL, 0x2c}, 83 {MAX98390_BROWNOUT_EN, 0x00}, 84 {MAX98390_BROWNOUT_INFINITE_HOLD, 0x00}, 85 {MAX98390_BROWNOUT_INFINITE_HOLD_CLR, 0x00}, 86 {MAX98390_BROWNOUT_LVL_HOLD, 0x00}, 87 {MAX98390_BROWNOUT_LVL1_THRESH, 0x00}, 88 {MAX98390_BROWNOUT_LVL2_THRESH, 0x00}, 89 {MAX98390_BROWNOUT_LVL3_THRESH, 0x00}, 90 {MAX98390_BROWNOUT_LVL4_THRESH, 0x00}, 91 {MAX98390_BROWNOUT_THRESH_HYSTERYSIS, 0x00}, 92 {MAX98390_BROWNOUT_AMP_LIMITER_ATK_REL, 0x1f}, 93 {MAX98390_BROWNOUT_AMP_GAIN_ATK_REL, 0x00}, 94 {MAX98390_BROWNOUT_AMP1_CLIP_MODE, 0x00}, 95 {MAX98390_BROWNOUT_LVL1_CUR_LIMIT, 0x00}, 96 {MAX98390_BROWNOUT_LVL1_AMP1_CTRL1, 0x00}, 97 {MAX98390_BROWNOUT_LVL1_AMP1_CTRL2, 0x00}, 98 {MAX98390_BROWNOUT_LVL1_AMP1_CTRL3, 0x00}, 99 {MAX98390_BROWNOUT_LVL2_CUR_LIMIT, 0x00}, 100 {MAX98390_BROWNOUT_LVL2_AMP1_CTRL1, 0x00}, 101 {MAX98390_BROWNOUT_LVL2_AMP1_CTRL2, 0x00}, 102 {MAX98390_BROWNOUT_LVL2_AMP1_CTRL3, 0x00}, 103 {MAX98390_BROWNOUT_LVL3_CUR_LIMIT, 0x00}, 104 {MAX98390_BROWNOUT_LVL3_AMP1_CTRL1, 0x00}, 105 {MAX98390_BROWNOUT_LVL3_AMP1_CTRL2, 0x00}, 106 {MAX98390_BROWNOUT_LVL3_AMP1_CTRL3, 0x00}, 107 {MAX98390_BROWNOUT_LVL4_CUR_LIMIT, 0x00}, 108 {MAX98390_BROWNOUT_LVL4_AMP1_CTRL1, 0x00}, 109 {MAX98390_BROWNOUT_LVL4_AMP1_CTRL2, 0x00}, 110 {MAX98390_BROWNOUT_LVL4_AMP1_CTRL3, 0x00}, 111 {MAX98390_BROWNOUT_ILIM_HLD, 0x00}, 112 {MAX98390_BROWNOUT_LIM_HLD, 0x00}, 113 {MAX98390_BROWNOUT_CLIP_HLD, 0x00}, 114 {MAX98390_BROWNOUT_GAIN_HLD, 0x00}, 115 {MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0f}, 116 {MAX98390_ENV_TRACK_BOOST_VOUT_DELAY, 0x80}, 117 {MAX98390_ENV_TRACK_REL_RATE, 0x07}, 118 {MAX98390_ENV_TRACK_HOLD_RATE, 0x07}, 119 {MAX98390_ENV_TRACK_CTRL, 0x01}, 120 {MAX98390_BOOST_BYPASS1, 0x49}, 121 {MAX98390_BOOST_BYPASS2, 0x2b}, 122 {MAX98390_BOOST_BYPASS3, 0x08}, 123 {MAX98390_FET_SCALING1, 0x00}, 124 {MAX98390_FET_SCALING2, 0x03}, 125 {MAX98390_FET_SCALING3, 0x00}, 126 {MAX98390_FET_SCALING4, 0x07}, 127 {MAX98390_SPK_SPEEDUP, 0x00}, 128 {DSMIG_WB_DRC_RELEASE_TIME_1, 0x00}, 129 {DSMIG_WB_DRC_RELEASE_TIME_2, 0x00}, 130 {DSMIG_WB_DRC_ATTACK_TIME_1, 0x00}, 131 {DSMIG_WB_DRC_ATTACK_TIME_2, 0x00}, 132 {DSMIG_WB_DRC_COMPRESSION_RATIO, 0x00}, 133 {DSMIG_WB_DRC_COMPRESSION_THRESHOLD, 0x00}, 134 {DSMIG_WB_DRC_MAKEUPGAIN, 0x00}, 135 {DSMIG_WB_DRC_NOISE_GATE_THRESHOLD, 0x00}, 136 {DSMIG_WBDRC_HPF_ENABLE, 0x00}, 137 {DSMIG_WB_DRC_TEST_SMOOTHER_OUT_EN, 0x00}, 138 {DSMIG_PPR_THRESHOLD, 0x00}, 139 {DSM_STEREO_BASS_CHANNEL_SELECT, 0x00}, 140 {DSM_TPROT_THRESHOLD_BYTE0, 0x00}, 141 {DSM_TPROT_THRESHOLD_BYTE1, 0x00}, 142 {DSM_TPROT_ROOM_TEMPERATURE_BYTE0, 0x00}, 143 {DSM_TPROT_ROOM_TEMPERATURE_BYTE1, 0x00}, 144 {DSM_TPROT_RECIP_RDC_ROOM_BYTE0, 0x00}, 145 {DSM_TPROT_RECIP_RDC_ROOM_BYTE1, 0x00}, 146 {DSM_TPROT_RECIP_RDC_ROOM_BYTE2, 0x00}, 147 {DSM_TPROT_RECIP_TCONST_BYTE0, 0x00}, 148 {DSM_TPROT_RECIP_TCONST_BYTE1, 0x00}, 149 {DSM_TPROT_RECIP_TCONST_BYTE2, 0x00}, 150 {DSM_THERMAL_ATTENUATION_SETTINGS, 0x00}, 151 {DSM_THERMAL_PILOT_TONE_ATTENUATION, 0x00}, 152 {DSM_TPROT_PG_TEMP_THRESH_BYTE0, 0x00}, 153 {DSM_TPROT_PG_TEMP_THRESH_BYTE1, 0x00}, 154 {DSMIG_DEBUZZER_THRESHOLD, 0x00}, 155 {DSMIG_DEBUZZER_ALPHA_COEF_TEST_ONLY, 0x08}, 156 {DSM_VOL_ENA, 0x20}, 157 {DSM_VOL_CTRL, 0xa0}, 158 {DSMIG_EN, 0x00}, 159 {MAX98390_R23E1_DSP_GLOBAL_EN, 0x00}, 160 {MAX98390_R23FF_GLOBAL_EN, 0x00}, 161 }; 162 163 static int max98390_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 164 { 165 struct snd_soc_component *component = codec_dai->component; 166 struct max98390_priv *max98390 = 167 snd_soc_component_get_drvdata(component); 168 unsigned int mode; 169 unsigned int format; 170 unsigned int invert = 0; 171 172 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); 173 174 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 175 case SND_SOC_DAIFMT_CBC_CFC: 176 mode = MAX98390_PCM_MASTER_MODE_SLAVE; 177 break; 178 case SND_SOC_DAIFMT_CBP_CFP: 179 max98390->provider = true; 180 mode = MAX98390_PCM_MASTER_MODE_MASTER; 181 break; 182 default: 183 dev_err(component->dev, "DAI clock mode unsupported\n"); 184 return -EINVAL; 185 } 186 187 regmap_update_bits(max98390->regmap, 188 MAX98390_PCM_MASTER_MODE, 189 MAX98390_PCM_MASTER_MODE_MASK, 190 mode); 191 192 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 193 case SND_SOC_DAIFMT_NB_NF: 194 break; 195 case SND_SOC_DAIFMT_IB_NF: 196 invert = MAX98390_PCM_MODE_CFG_PCM_BCLKEDGE; 197 break; 198 default: 199 dev_err(component->dev, "DAI invert mode unsupported\n"); 200 return -EINVAL; 201 } 202 203 regmap_update_bits(max98390->regmap, 204 MAX98390_PCM_MODE_CFG, 205 MAX98390_PCM_MODE_CFG_PCM_BCLKEDGE, 206 invert); 207 208 /* interface format */ 209 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 210 case SND_SOC_DAIFMT_I2S: 211 format = MAX98390_PCM_FORMAT_I2S; 212 break; 213 case SND_SOC_DAIFMT_LEFT_J: 214 format = MAX98390_PCM_FORMAT_LJ; 215 break; 216 case SND_SOC_DAIFMT_DSP_A: 217 format = MAX98390_PCM_FORMAT_TDM_MODE1; 218 break; 219 case SND_SOC_DAIFMT_DSP_B: 220 format = MAX98390_PCM_FORMAT_TDM_MODE0; 221 break; 222 default: 223 return -EINVAL; 224 } 225 226 regmap_update_bits(max98390->regmap, 227 MAX98390_PCM_MODE_CFG, 228 MAX98390_PCM_MODE_CFG_FORMAT_MASK, 229 format << MAX98390_PCM_MODE_CFG_FORMAT_SHIFT); 230 231 return 0; 232 } 233 234 static int max98390_get_bclk_sel(int bclk) 235 { 236 int i; 237 /* BCLKs per LRCLK */ 238 static int bclk_sel_table[] = { 239 32, 48, 64, 96, 128, 192, 256, 320, 384, 512, 240 }; 241 /* match BCLKs per LRCLK */ 242 for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) { 243 if (bclk_sel_table[i] == bclk) 244 return i + 2; 245 } 246 return 0; 247 } 248 249 static int max98390_set_clock(struct snd_soc_component *component, 250 struct snd_pcm_hw_params *params) 251 { 252 struct max98390_priv *max98390 = 253 snd_soc_component_get_drvdata(component); 254 /* codec MCLK rate in master mode */ 255 static int rate_table[] = { 256 5644800, 6000000, 6144000, 6500000, 257 9600000, 11289600, 12000000, 12288000, 258 13000000, 19200000, 259 }; 260 /* BCLK/LRCLK ratio calculation */ 261 int blr_clk_ratio = params_channels(params) 262 * snd_pcm_format_width(params_format(params)); 263 int value; 264 265 if (max98390->provider) { 266 int i; 267 /* match rate to closest value */ 268 for (i = 0; i < ARRAY_SIZE(rate_table); i++) { 269 if (rate_table[i] >= max98390->sysclk) 270 break; 271 } 272 if (i == ARRAY_SIZE(rate_table)) { 273 dev_err(component->dev, "failed to find proper clock rate.\n"); 274 return -EINVAL; 275 } 276 277 regmap_update_bits(max98390->regmap, 278 MAX98390_PCM_MASTER_MODE, 279 MAX98390_PCM_MASTER_MODE_MCLK_MASK, 280 i << MAX98390_PCM_MASTER_MODE_MCLK_RATE_SHIFT); 281 } 282 283 if (!max98390->tdm_mode) { 284 /* BCLK configuration */ 285 value = max98390_get_bclk_sel(blr_clk_ratio); 286 if (!value) { 287 dev_err(component->dev, "format unsupported %d\n", 288 params_format(params)); 289 return -EINVAL; 290 } 291 292 regmap_update_bits(max98390->regmap, 293 MAX98390_PCM_CLK_SETUP, 294 MAX98390_PCM_CLK_SETUP_BSEL_MASK, 295 value); 296 } 297 return 0; 298 } 299 300 static int max98390_dai_hw_params(struct snd_pcm_substream *substream, 301 struct snd_pcm_hw_params *params, 302 struct snd_soc_dai *dai) 303 { 304 struct snd_soc_component *component = 305 dai->component; 306 struct max98390_priv *max98390 = 307 snd_soc_component_get_drvdata(component); 308 309 unsigned int sampling_rate; 310 unsigned int chan_sz; 311 312 /* pcm mode configuration */ 313 switch (snd_pcm_format_width(params_format(params))) { 314 case 16: 315 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16; 316 break; 317 case 24: 318 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24; 319 break; 320 case 32: 321 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32; 322 break; 323 default: 324 dev_err(component->dev, "format unsupported %d\n", 325 params_format(params)); 326 goto err; 327 } 328 329 regmap_update_bits(max98390->regmap, 330 MAX98390_PCM_MODE_CFG, 331 MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); 332 333 dev_dbg(component->dev, "format supported %d", 334 params_format(params)); 335 336 /* sampling rate configuration */ 337 switch (params_rate(params)) { 338 case 8000: 339 sampling_rate = MAX98390_PCM_SR_SET1_SR_8000; 340 break; 341 case 11025: 342 sampling_rate = MAX98390_PCM_SR_SET1_SR_11025; 343 break; 344 case 12000: 345 sampling_rate = MAX98390_PCM_SR_SET1_SR_12000; 346 break; 347 case 16000: 348 sampling_rate = MAX98390_PCM_SR_SET1_SR_16000; 349 break; 350 case 22050: 351 sampling_rate = MAX98390_PCM_SR_SET1_SR_22050; 352 break; 353 case 24000: 354 sampling_rate = MAX98390_PCM_SR_SET1_SR_24000; 355 break; 356 case 32000: 357 sampling_rate = MAX98390_PCM_SR_SET1_SR_32000; 358 break; 359 case 44100: 360 sampling_rate = MAX98390_PCM_SR_SET1_SR_44100; 361 break; 362 case 48000: 363 sampling_rate = MAX98390_PCM_SR_SET1_SR_48000; 364 break; 365 default: 366 dev_err(component->dev, "rate %d not supported\n", 367 params_rate(params)); 368 goto err; 369 } 370 371 /* set DAI_SR to correct LRCLK frequency */ 372 regmap_update_bits(max98390->regmap, 373 MAX98390_PCM_SR_SETUP, 374 MAX98390_PCM_SR_SET1_SR_MASK, 375 sampling_rate); 376 377 return max98390_set_clock(component, params); 378 err: 379 return -EINVAL; 380 } 381 382 static int max98390_dai_tdm_slot(struct snd_soc_dai *dai, 383 unsigned int tx_mask, unsigned int rx_mask, 384 int slots, int slot_width) 385 { 386 struct snd_soc_component *component = dai->component; 387 struct max98390_priv *max98390 = 388 snd_soc_component_get_drvdata(component); 389 390 int bsel; 391 unsigned int chan_sz; 392 393 if (!tx_mask && !rx_mask && !slots && !slot_width) 394 max98390->tdm_mode = false; 395 else 396 max98390->tdm_mode = true; 397 398 dev_dbg(component->dev, 399 "Tdm mode : %d\n", max98390->tdm_mode); 400 401 /* BCLK configuration */ 402 bsel = max98390_get_bclk_sel(slots * slot_width); 403 if (!bsel) { 404 dev_err(component->dev, "BCLK %d not supported\n", 405 slots * slot_width); 406 return -EINVAL; 407 } 408 409 regmap_update_bits(max98390->regmap, 410 MAX98390_PCM_CLK_SETUP, 411 MAX98390_PCM_CLK_SETUP_BSEL_MASK, 412 bsel); 413 414 /* Channel size configuration */ 415 switch (slot_width) { 416 case 16: 417 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16; 418 break; 419 case 24: 420 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24; 421 break; 422 case 32: 423 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32; 424 break; 425 default: 426 dev_err(component->dev, "format unsupported %d\n", 427 slot_width); 428 return -EINVAL; 429 } 430 431 regmap_update_bits(max98390->regmap, 432 MAX98390_PCM_MODE_CFG, 433 MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); 434 435 /* Rx slot configuration */ 436 regmap_write(max98390->regmap, 437 MAX98390_PCM_RX_EN_A, 438 rx_mask & 0xFF); 439 regmap_write(max98390->regmap, 440 MAX98390_PCM_RX_EN_B, 441 (rx_mask & 0xFF00) >> 8); 442 443 /* Tx slot Hi-Z configuration */ 444 regmap_write(max98390->regmap, 445 MAX98390_PCM_TX_HIZ_CTRL_A, 446 ~tx_mask & 0xFF); 447 regmap_write(max98390->regmap, 448 MAX98390_PCM_TX_HIZ_CTRL_B, 449 (~tx_mask & 0xFF00) >> 8); 450 451 return 0; 452 } 453 454 static int max98390_dai_set_sysclk(struct snd_soc_dai *dai, 455 int clk_id, unsigned int freq, int dir) 456 { 457 struct snd_soc_component *component = dai->component; 458 struct max98390_priv *max98390 = 459 snd_soc_component_get_drvdata(component); 460 461 max98390->sysclk = freq; 462 return 0; 463 } 464 465 static const struct snd_soc_dai_ops max98390_dai_ops = { 466 .set_sysclk = max98390_dai_set_sysclk, 467 .set_fmt = max98390_dai_set_fmt, 468 .hw_params = max98390_dai_hw_params, 469 .set_tdm_slot = max98390_dai_tdm_slot, 470 }; 471 472 static int max98390_dac_event(struct snd_soc_dapm_widget *w, 473 struct snd_kcontrol *kcontrol, int event) 474 { 475 struct snd_soc_component *component = 476 snd_soc_dapm_to_component(w->dapm); 477 struct max98390_priv *max98390 = 478 snd_soc_component_get_drvdata(component); 479 480 switch (event) { 481 case SND_SOC_DAPM_POST_PMU: 482 regmap_update_bits(max98390->regmap, 483 MAX98390_R203A_AMP_EN, 484 MAX98390_AMP_EN_MASK, 1); 485 regmap_update_bits(max98390->regmap, 486 MAX98390_R23FF_GLOBAL_EN, 487 MAX98390_GLOBAL_EN_MASK, 1); 488 break; 489 case SND_SOC_DAPM_POST_PMD: 490 regmap_update_bits(max98390->regmap, 491 MAX98390_R23FF_GLOBAL_EN, 492 MAX98390_GLOBAL_EN_MASK, 0); 493 regmap_update_bits(max98390->regmap, 494 MAX98390_R203A_AMP_EN, 495 MAX98390_AMP_EN_MASK, 0); 496 break; 497 } 498 return 0; 499 } 500 501 static const char * const max98390_switch_text[] = { 502 "Left", "Right", "LeftRight"}; 503 504 static const char * const max98390_boost_voltage_text[] = { 505 "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V", 506 "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V", 507 "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V", 508 "9.5V", "9.625V", "9.75V", "9.875V", "10V" 509 }; 510 511 static SOC_ENUM_SINGLE_DECL(max98390_boost_voltage, 512 MAX98390_BOOST_CTRL0, 0, 513 max98390_boost_voltage_text); 514 515 static DECLARE_TLV_DB_SCALE(max98390_spk_tlv, 300, 300, 0); 516 static DECLARE_TLV_DB_SCALE(max98390_digital_tlv, -8000, 50, 0); 517 518 static const char * const max98390_current_limit_text[] = { 519 "0.00A", "0.50A", "1.00A", "1.05A", "1.10A", "1.15A", "1.20A", "1.25A", 520 "1.30A", "1.35A", "1.40A", "1.45A", "1.50A", "1.55A", "1.60A", "1.65A", 521 "1.70A", "1.75A", "1.80A", "1.85A", "1.90A", "1.95A", "2.00A", "2.05A", 522 "2.10A", "2.15A", "2.20A", "2.25A", "2.30A", "2.35A", "2.40A", "2.45A", 523 "2.50A", "2.55A", "2.60A", "2.65A", "2.70A", "2.75A", "2.80A", "2.85A", 524 "2.90A", "2.95A", "3.00A", "3.05A", "3.10A", "3.15A", "3.20A", "3.25A", 525 "3.30A", "3.35A", "3.40A", "3.45A", "3.50A", "3.55A", "3.60A", "3.65A", 526 "3.70A", "3.75A", "3.80A", "3.85A", "3.90A", "3.95A", "4.00A", "4.05A", 527 "4.10A" 528 }; 529 530 static SOC_ENUM_SINGLE_DECL(max98390_current_limit, 531 MAX98390_BOOST_CTRL1, 0, 532 max98390_current_limit_text); 533 534 static int max98390_ref_rdc_put(struct snd_kcontrol *kcontrol, 535 struct snd_ctl_elem_value *ucontrol) 536 { 537 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 538 struct max98390_priv *max98390 = 539 snd_soc_component_get_drvdata(component); 540 541 max98390->ref_rdc_value = ucontrol->value.integer.value[0]; 542 543 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0, 544 max98390->ref_rdc_value & 0x000000ff); 545 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1, 546 (max98390->ref_rdc_value >> 8) & 0x000000ff); 547 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2, 548 (max98390->ref_rdc_value >> 16) & 0x000000ff); 549 550 return 0; 551 } 552 553 static int max98390_ref_rdc_get(struct snd_kcontrol *kcontrol, 554 struct snd_ctl_elem_value *ucontrol) 555 { 556 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 557 struct max98390_priv *max98390 = 558 snd_soc_component_get_drvdata(component); 559 560 ucontrol->value.integer.value[0] = max98390->ref_rdc_value; 561 562 return 0; 563 } 564 565 static int max98390_ambient_temp_put(struct snd_kcontrol *kcontrol, 566 struct snd_ctl_elem_value *ucontrol) 567 { 568 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 569 struct max98390_priv *max98390 = 570 snd_soc_component_get_drvdata(component); 571 572 max98390->ambient_temp_value = ucontrol->value.integer.value[0]; 573 574 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1, 575 (max98390->ambient_temp_value >> 8) & 0x000000ff); 576 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0, 577 (max98390->ambient_temp_value) & 0x000000ff); 578 579 return 0; 580 } 581 582 static int max98390_ambient_temp_get(struct snd_kcontrol *kcontrol, 583 struct snd_ctl_elem_value *ucontrol) 584 { 585 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 586 struct max98390_priv *max98390 = 587 snd_soc_component_get_drvdata(component); 588 589 ucontrol->value.integer.value[0] = max98390->ambient_temp_value; 590 591 return 0; 592 } 593 594 static int max98390_adaptive_rdc_put(struct snd_kcontrol *kcontrol, 595 struct snd_ctl_elem_value *ucontrol) 596 { 597 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 598 599 dev_warn(component->dev, "Put adaptive rdc not supported\n"); 600 601 return 0; 602 } 603 604 static int max98390_adaptive_rdc_get(struct snd_kcontrol *kcontrol, 605 struct snd_ctl_elem_value *ucontrol) 606 { 607 int rdc, rdc0; 608 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 609 struct max98390_priv *max98390 = 610 snd_soc_component_get_drvdata(component); 611 612 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc); 613 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc0); 614 ucontrol->value.integer.value[0] = rdc0 | rdc << 8; 615 616 return 0; 617 } 618 619 static int max98390_dsm_calib_get(struct snd_kcontrol *kcontrol, 620 struct snd_ctl_elem_value *ucontrol) 621 { 622 /* Do nothing */ 623 return 0; 624 } 625 626 static int max98390_dsm_calib_put(struct snd_kcontrol *kcontrol, 627 struct snd_ctl_elem_value *ucontrol) 628 { 629 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 630 struct max98390_priv *max98390 = snd_soc_component_get_drvdata(component); 631 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component); 632 unsigned int rdc, rdc_cal_result, rdc_integer, rdc_factor, temp, val; 633 634 snd_soc_dapm_mutex_lock(dapm); 635 636 regmap_read(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, &val); 637 if (!val) { 638 /* Enable the codec for the duration of calibration readout */ 639 regmap_update_bits(max98390->regmap, MAX98390_R203A_AMP_EN, 640 MAX98390_AMP_EN_MASK, 1); 641 regmap_update_bits(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, 642 MAX98390_GLOBAL_EN_MASK, 1); 643 } 644 645 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc); 646 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc_cal_result); 647 regmap_read(max98390->regmap, MAX98390_MEAS_ADC_CH2_READ, &temp); 648 649 if (!val) { 650 /* Disable the codec if it was disabled */ 651 regmap_update_bits(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, 652 MAX98390_GLOBAL_EN_MASK, 0); 653 regmap_update_bits(max98390->regmap, MAX98390_R203A_AMP_EN, 654 MAX98390_AMP_EN_MASK, 0); 655 } 656 657 snd_soc_dapm_mutex_unlock(dapm); 658 659 rdc_cal_result |= (rdc << 8) & 0x0000FFFF; 660 if (rdc_cal_result) 661 max98390->ref_rdc_value = 268435456U / rdc_cal_result; 662 663 max98390->ambient_temp_value = temp * 52 - 1188; 664 665 rdc_integer = rdc_cal_result * 937 / 65536; 666 rdc_factor = ((rdc_cal_result * 937 * 100) / 65536) - (rdc_integer * 100); 667 668 dev_info(component->dev, 669 "rdc resistance about %d.%02d ohm, reg=0x%X temp reg=0x%X\n", 670 rdc_integer, rdc_factor, rdc_cal_result, temp); 671 672 return 0; 673 } 674 675 static const struct snd_kcontrol_new max98390_snd_controls[] = { 676 SOC_SINGLE_TLV("Digital Volume", DSM_VOL_CTRL, 677 0, 184, 0, 678 max98390_digital_tlv), 679 SOC_SINGLE_TLV("Speaker Volume", MAX98390_R203D_SPK_GAIN, 680 0, 6, 0, 681 max98390_spk_tlv), 682 SOC_SINGLE("Ramp Up Bypass Switch", MAX98390_R2039_AMP_DSP_CFG, 683 MAX98390_AMP_DSP_CFG_RMP_UP_SHIFT, 1, 0), 684 SOC_SINGLE("Ramp Down Bypass Switch", MAX98390_R2039_AMP_DSP_CFG, 685 MAX98390_AMP_DSP_CFG_RMP_DN_SHIFT, 1, 0), 686 SOC_SINGLE("Boost Clock Phase", MAX98390_BOOST_CTRL3, 687 MAX98390_BOOST_CLK_PHASE_CFG_SHIFT, 3, 0), 688 SOC_ENUM("Boost Output Voltage", max98390_boost_voltage), 689 SOC_ENUM("Current Limit", max98390_current_limit), 690 SOC_SINGLE_EXT("DSM Rdc", SND_SOC_NOPM, 0, 0xffffff, 0, 691 max98390_ref_rdc_get, max98390_ref_rdc_put), 692 SOC_SINGLE_EXT("DSM Ambient Temp", SND_SOC_NOPM, 0, 0xffff, 0, 693 max98390_ambient_temp_get, max98390_ambient_temp_put), 694 SOC_SINGLE_EXT("DSM Adaptive Rdc", SND_SOC_NOPM, 0, 0xffff, 0, 695 max98390_adaptive_rdc_get, max98390_adaptive_rdc_put), 696 SOC_SINGLE_EXT("DSM Calibration", SND_SOC_NOPM, 0, 1, 0, 697 max98390_dsm_calib_get, max98390_dsm_calib_put), 698 }; 699 700 static const struct soc_enum dai_sel_enum = 701 SOC_ENUM_SINGLE(MAX98390_PCM_CH_SRC_1, 702 MAX98390_PCM_RX_CH_SRC_SHIFT, 703 3, max98390_switch_text); 704 705 static const struct snd_kcontrol_new max98390_dai_controls = 706 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum); 707 708 static const struct snd_soc_dapm_widget max98390_dapm_widgets[] = { 709 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", 710 SND_SOC_NOPM, 0, 0, max98390_dac_event, 711 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 712 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0, 713 &max98390_dai_controls), 714 SND_SOC_DAPM_OUTPUT("BE_OUT"), 715 }; 716 717 static const struct snd_soc_dapm_route max98390_audio_map[] = { 718 /* Plabyack */ 719 {"DAI Sel Mux", "Left", "Amp Enable"}, 720 {"DAI Sel Mux", "Right", "Amp Enable"}, 721 {"DAI Sel Mux", "LeftRight", "Amp Enable"}, 722 {"BE_OUT", NULL, "DAI Sel Mux"}, 723 }; 724 725 static bool max98390_readable_register(struct device *dev, unsigned int reg) 726 { 727 switch (reg) { 728 case MAX98390_SOFTWARE_RESET ... MAX98390_INT_EN3: 729 case MAX98390_IRQ_CTRL ... MAX98390_WDOG_CTRL: 730 case MAX98390_MEAS_ADC_THERM_WARN_THRESH 731 ... MAX98390_BROWNOUT_INFINITE_HOLD: 732 case MAX98390_BROWNOUT_LVL_HOLD ... DSMIG_DEBUZZER_THRESHOLD: 733 case DSM_VOL_ENA ... MAX98390_R24FF_REV_ID: 734 return true; 735 default: 736 return false; 737 } 738 }; 739 740 static bool max98390_volatile_reg(struct device *dev, unsigned int reg) 741 { 742 switch (reg) { 743 case MAX98390_SOFTWARE_RESET ... MAX98390_INT_EN3: 744 case MAX98390_MEAS_ADC_CH0_READ ... MAX98390_MEAS_ADC_CH2_READ: 745 case MAX98390_PWR_GATE_STATUS ... MAX98390_BROWNOUT_STATUS: 746 case MAX98390_BROWNOUT_LOWEST_STATUS: 747 case MAX98390_ENV_TRACK_BOOST_VOUT_READ: 748 case DSM_STBASS_HPF_B0_BYTE0 ... DSM_DEBUZZER_ATTACK_TIME_BYTE2: 749 case THERMAL_RDC_RD_BACK_BYTE1 ... DSMIG_DEBUZZER_THRESHOLD: 750 case DSM_THERMAL_GAIN ... DSM_WBDRC_GAIN: 751 return true; 752 default: 753 return false; 754 } 755 } 756 757 #define MAX98390_RATES SNDRV_PCM_RATE_8000_48000 758 759 #define MAX98390_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 760 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 761 762 static struct snd_soc_dai_driver max98390_dai[] = { 763 { 764 .name = "max98390-aif1", 765 .playback = { 766 .stream_name = "HiFi Playback", 767 .channels_min = 1, 768 .channels_max = 2, 769 .rates = MAX98390_RATES, 770 .formats = MAX98390_FORMATS, 771 }, 772 .capture = { 773 .stream_name = "HiFi Capture", 774 .channels_min = 1, 775 .channels_max = 2, 776 .rates = MAX98390_RATES, 777 .formats = MAX98390_FORMATS, 778 }, 779 .ops = &max98390_dai_ops, 780 } 781 }; 782 783 static int max98390_dsm_init(struct snd_soc_component *component) 784 { 785 int ret; 786 int param_size, param_start_addr; 787 char filename[128]; 788 const char *vendor, *product; 789 struct max98390_priv *max98390 = 790 snd_soc_component_get_drvdata(component); 791 const struct firmware *fw; 792 char *dsm_param; 793 794 vendor = dmi_get_system_info(DMI_SYS_VENDOR); 795 product = dmi_get_system_info(DMI_PRODUCT_NAME); 796 797 if (!strcmp(max98390->dsm_param_name, "default")) { 798 if (vendor && product) { 799 snprintf(filename, sizeof(filename), 800 "dsm_param_%s_%s.bin", vendor, product); 801 } else { 802 sprintf(filename, "dsm_param.bin"); 803 } 804 } else { 805 snprintf(filename, sizeof(filename), "%s", 806 max98390->dsm_param_name); 807 } 808 ret = request_firmware(&fw, filename, component->dev); 809 if (ret) { 810 ret = request_firmware(&fw, "dsm_param.bin", component->dev); 811 if (ret) { 812 ret = request_firmware(&fw, "dsmparam.bin", 813 component->dev); 814 if (ret) 815 goto err; 816 } 817 } 818 819 dev_dbg(component->dev, 820 "max98390: param fw size %zd\n", 821 fw->size); 822 if (fw->size < MAX98390_DSM_PARAM_MIN_SIZE) { 823 dev_err(component->dev, 824 "param fw is invalid.\n"); 825 ret = -EINVAL; 826 goto err_alloc; 827 } 828 dsm_param = (char *)fw->data; 829 param_start_addr = (dsm_param[0] & 0xff) | (dsm_param[1] & 0xff) << 8; 830 param_size = (dsm_param[2] & 0xff) | (dsm_param[3] & 0xff) << 8; 831 if (param_size > MAX98390_DSM_PARAM_MAX_SIZE || 832 param_start_addr < MAX98390_IRQ_CTRL || 833 fw->size < param_size + MAX98390_DSM_PAYLOAD_OFFSET) { 834 dev_err(component->dev, 835 "param fw is invalid.\n"); 836 ret = -EINVAL; 837 goto err_alloc; 838 } 839 regmap_write(max98390->regmap, MAX98390_R203A_AMP_EN, 0x80); 840 dsm_param += MAX98390_DSM_PAYLOAD_OFFSET; 841 regmap_bulk_write(max98390->regmap, param_start_addr, 842 dsm_param, param_size); 843 regmap_write(max98390->regmap, MAX98390_R23E1_DSP_GLOBAL_EN, 0x01); 844 845 err_alloc: 846 release_firmware(fw); 847 err: 848 return ret; 849 } 850 851 static void max98390_init_regs(struct snd_soc_component *component) 852 { 853 struct max98390_priv *max98390 = 854 snd_soc_component_get_drvdata(component); 855 856 regmap_write(max98390->regmap, MAX98390_CLK_MON, 0x6f); 857 regmap_write(max98390->regmap, MAX98390_DAT_MON, 0x00); 858 regmap_write(max98390->regmap, MAX98390_PWR_GATE_CTL, 0x00); 859 regmap_write(max98390->regmap, MAX98390_PCM_RX_EN_A, 0x03); 860 regmap_write(max98390->regmap, MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0e); 861 regmap_write(max98390->regmap, MAX98390_BOOST_BYPASS1, 0x46); 862 regmap_write(max98390->regmap, MAX98390_FET_SCALING3, 0x03); 863 864 /* voltage, current slot configuration */ 865 regmap_write(max98390->regmap, 866 MAX98390_PCM_CH_SRC_2, 867 (max98390->i_l_slot << 4 | 868 max98390->v_l_slot)&0xFF); 869 870 if (max98390->v_l_slot < 8) { 871 regmap_update_bits(max98390->regmap, 872 MAX98390_PCM_TX_HIZ_CTRL_A, 873 1 << max98390->v_l_slot, 0); 874 regmap_update_bits(max98390->regmap, 875 MAX98390_PCM_TX_EN_A, 876 1 << max98390->v_l_slot, 877 1 << max98390->v_l_slot); 878 } else { 879 regmap_update_bits(max98390->regmap, 880 MAX98390_PCM_TX_HIZ_CTRL_B, 881 1 << (max98390->v_l_slot - 8), 0); 882 regmap_update_bits(max98390->regmap, 883 MAX98390_PCM_TX_EN_B, 884 1 << (max98390->v_l_slot - 8), 885 1 << (max98390->v_l_slot - 8)); 886 } 887 888 if (max98390->i_l_slot < 8) { 889 regmap_update_bits(max98390->regmap, 890 MAX98390_PCM_TX_HIZ_CTRL_A, 891 1 << max98390->i_l_slot, 0); 892 regmap_update_bits(max98390->regmap, 893 MAX98390_PCM_TX_EN_A, 894 1 << max98390->i_l_slot, 895 1 << max98390->i_l_slot); 896 } else { 897 regmap_update_bits(max98390->regmap, 898 MAX98390_PCM_TX_HIZ_CTRL_B, 899 1 << (max98390->i_l_slot - 8), 0); 900 regmap_update_bits(max98390->regmap, 901 MAX98390_PCM_TX_EN_B, 902 1 << (max98390->i_l_slot - 8), 903 1 << (max98390->i_l_slot - 8)); 904 } 905 } 906 907 static int max98390_probe(struct snd_soc_component *component) 908 { 909 struct max98390_priv *max98390 = 910 snd_soc_component_get_drvdata(component); 911 912 regmap_write(max98390->regmap, MAX98390_SOFTWARE_RESET, 0x01); 913 /* Sleep reset settle time */ 914 msleep(20); 915 916 /* Amp init setting */ 917 max98390_init_regs(component); 918 /* Update dsm bin param */ 919 max98390_dsm_init(component); 920 921 /* Dsm Setting */ 922 if (max98390->ref_rdc_value) { 923 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0, 924 max98390->ref_rdc_value & 0x000000ff); 925 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1, 926 (max98390->ref_rdc_value >> 8) & 0x000000ff); 927 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2, 928 (max98390->ref_rdc_value >> 16) & 0x000000ff); 929 } 930 if (max98390->ambient_temp_value) { 931 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1, 932 (max98390->ambient_temp_value >> 8) & 0x000000ff); 933 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0, 934 (max98390->ambient_temp_value) & 0x000000ff); 935 } 936 937 return 0; 938 } 939 940 static int max98390_suspend(struct device *dev) 941 { 942 struct max98390_priv *max98390 = dev_get_drvdata(dev); 943 944 dev_dbg(dev, "%s:Enter\n", __func__); 945 946 regcache_cache_only(max98390->regmap, true); 947 regcache_mark_dirty(max98390->regmap); 948 949 return 0; 950 } 951 952 static int max98390_resume(struct device *dev) 953 { 954 struct max98390_priv *max98390 = dev_get_drvdata(dev); 955 956 dev_dbg(dev, "%s:Enter\n", __func__); 957 958 regcache_cache_only(max98390->regmap, false); 959 regcache_sync(max98390->regmap); 960 961 return 0; 962 } 963 964 static const struct dev_pm_ops max98390_pm = { 965 SYSTEM_SLEEP_PM_OPS(max98390_suspend, max98390_resume) 966 }; 967 968 static const struct snd_soc_component_driver soc_codec_dev_max98390 = { 969 .probe = max98390_probe, 970 .controls = max98390_snd_controls, 971 .num_controls = ARRAY_SIZE(max98390_snd_controls), 972 .dapm_widgets = max98390_dapm_widgets, 973 .num_dapm_widgets = ARRAY_SIZE(max98390_dapm_widgets), 974 .dapm_routes = max98390_audio_map, 975 .num_dapm_routes = ARRAY_SIZE(max98390_audio_map), 976 .idle_bias_on = 1, 977 .use_pmdown_time = 1, 978 .endianness = 1, 979 }; 980 981 static const struct regmap_config max98390_regmap = { 982 .reg_bits = 16, 983 .val_bits = 8, 984 .max_register = MAX98390_R24FF_REV_ID, 985 .reg_defaults = max98390_reg_defaults, 986 .num_reg_defaults = ARRAY_SIZE(max98390_reg_defaults), 987 .readable_reg = max98390_readable_register, 988 .volatile_reg = max98390_volatile_reg, 989 .cache_type = REGCACHE_RBTREE, 990 }; 991 992 static void max98390_slot_config(struct i2c_client *i2c, 993 struct max98390_priv *max98390) 994 { 995 int value; 996 struct device *dev = &i2c->dev; 997 998 if (!device_property_read_u32(dev, "maxim,vmon-slot-no", &value)) 999 max98390->v_l_slot = value & 0xF; 1000 else 1001 max98390->v_l_slot = 0; 1002 1003 if (!device_property_read_u32(dev, "maxim,imon-slot-no", &value)) 1004 max98390->i_l_slot = value & 0xF; 1005 else 1006 max98390->i_l_slot = 1; 1007 } 1008 1009 static int max98390_i2c_probe(struct i2c_client *i2c) 1010 { 1011 int ret = 0; 1012 int reg = 0; 1013 1014 struct max98390_priv *max98390 = NULL; 1015 struct i2c_adapter *adapter = i2c->adapter; 1016 struct gpio_desc *reset_gpio; 1017 1018 ret = i2c_check_functionality(adapter, 1019 I2C_FUNC_SMBUS_BYTE 1020 | I2C_FUNC_SMBUS_BYTE_DATA); 1021 if (!ret) { 1022 dev_err(&i2c->dev, "I2C check functionality failed\n"); 1023 return -ENXIO; 1024 } 1025 1026 max98390 = devm_kzalloc(&i2c->dev, sizeof(*max98390), GFP_KERNEL); 1027 if (!max98390) { 1028 ret = -ENOMEM; 1029 return ret; 1030 } 1031 i2c_set_clientdata(i2c, max98390); 1032 1033 ret = device_property_read_u32(&i2c->dev, "maxim,temperature_calib", 1034 &max98390->ambient_temp_value); 1035 if (ret) { 1036 dev_info(&i2c->dev, 1037 "no optional property 'temperature_calib' found, default:\n"); 1038 } 1039 ret = device_property_read_u32(&i2c->dev, "maxim,r0_calib", 1040 &max98390->ref_rdc_value); 1041 if (ret) { 1042 dev_info(&i2c->dev, 1043 "no optional property 'r0_calib' found, default:\n"); 1044 } 1045 1046 dev_info(&i2c->dev, 1047 "%s: r0_calib: 0x%x,temperature_calib: 0x%x", 1048 __func__, max98390->ref_rdc_value, 1049 max98390->ambient_temp_value); 1050 1051 ret = device_property_read_string(&i2c->dev, "maxim,dsm_param_name", 1052 &max98390->dsm_param_name); 1053 if (ret) 1054 max98390->dsm_param_name = "default"; 1055 1056 /* voltage/current slot configuration */ 1057 max98390_slot_config(i2c, max98390); 1058 1059 /* regmap initialization */ 1060 max98390->regmap = devm_regmap_init_i2c(i2c, &max98390_regmap); 1061 if (IS_ERR(max98390->regmap)) { 1062 ret = PTR_ERR(max98390->regmap); 1063 dev_err(&i2c->dev, 1064 "Failed to allocate regmap: %d\n", ret); 1065 return ret; 1066 } 1067 1068 reset_gpio = devm_gpiod_get_optional(&i2c->dev, 1069 "reset", GPIOD_OUT_HIGH); 1070 1071 /* Power on device */ 1072 if (reset_gpio) { 1073 usleep_range(1000, 2000); 1074 /* bring out of reset */ 1075 gpiod_set_value_cansleep(reset_gpio, 0); 1076 usleep_range(1000, 2000); 1077 } 1078 1079 /* Check Revision ID */ 1080 ret = regmap_read(max98390->regmap, 1081 MAX98390_R24FF_REV_ID, ®); 1082 if (ret) { 1083 dev_err(&i2c->dev, 1084 "ret=%d, Failed to read: 0x%02X\n", 1085 ret, MAX98390_R24FF_REV_ID); 1086 return ret; 1087 } 1088 dev_info(&i2c->dev, "MAX98390 revisionID: 0x%02X\n", reg); 1089 1090 ret = devm_snd_soc_register_component(&i2c->dev, 1091 &soc_codec_dev_max98390, 1092 max98390_dai, ARRAY_SIZE(max98390_dai)); 1093 1094 return ret; 1095 } 1096 1097 static const struct i2c_device_id max98390_i2c_id[] = { 1098 { "max98390"}, 1099 {}, 1100 }; 1101 1102 MODULE_DEVICE_TABLE(i2c, max98390_i2c_id); 1103 1104 #if defined(CONFIG_OF) 1105 static const struct of_device_id max98390_of_match[] = { 1106 { .compatible = "maxim,max98390", }, 1107 {} 1108 }; 1109 MODULE_DEVICE_TABLE(of, max98390_of_match); 1110 #endif 1111 1112 #ifdef CONFIG_ACPI 1113 static const struct acpi_device_id max98390_acpi_match[] = { 1114 { "MX98390", 0 }, 1115 {}, 1116 }; 1117 MODULE_DEVICE_TABLE(acpi, max98390_acpi_match); 1118 #endif 1119 1120 static struct i2c_driver max98390_i2c_driver = { 1121 .driver = { 1122 .name = "max98390", 1123 .of_match_table = of_match_ptr(max98390_of_match), 1124 .acpi_match_table = ACPI_PTR(max98390_acpi_match), 1125 .pm = pm_ptr(&max98390_pm), 1126 }, 1127 .probe = max98390_i2c_probe, 1128 .id_table = max98390_i2c_id, 1129 }; 1130 1131 module_i2c_driver(max98390_i2c_driver) 1132 1133 MODULE_DESCRIPTION("ALSA SoC MAX98390 driver"); 1134 MODULE_AUTHOR("Steve Lee <steves.lee@maximintegrated.com>"); 1135 MODULE_LICENSE("GPL"); 1136