1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * max98927.c -- MAX98927 ALSA Soc Audio driver 4 * 5 * Copyright (C) 2016-2017 Maxim Integrated Products 6 * Author: Ryan Lee <ryans.lee@maximintegrated.com> 7 */ 8 9 #include <linux/acpi.h> 10 #include <linux/i2c.h> 11 #include <linux/module.h> 12 #include <linux/regmap.h> 13 #include <linux/slab.h> 14 #include <linux/cdev.h> 15 #include <sound/pcm.h> 16 #include <sound/pcm_params.h> 17 #include <sound/soc.h> 18 #include <linux/gpio.h> 19 #include <linux/gpio/consumer.h> 20 #include <linux/of_gpio.h> 21 #include <sound/tlv.h> 22 #include "max98927.h" 23 24 static struct reg_default max98927_reg[] = { 25 {MAX98927_R0001_INT_RAW1, 0x00}, 26 {MAX98927_R0002_INT_RAW2, 0x00}, 27 {MAX98927_R0003_INT_RAW3, 0x00}, 28 {MAX98927_R0004_INT_STATE1, 0x00}, 29 {MAX98927_R0005_INT_STATE2, 0x00}, 30 {MAX98927_R0006_INT_STATE3, 0x00}, 31 {MAX98927_R0007_INT_FLAG1, 0x00}, 32 {MAX98927_R0008_INT_FLAG2, 0x00}, 33 {MAX98927_R0009_INT_FLAG3, 0x00}, 34 {MAX98927_R000A_INT_EN1, 0x00}, 35 {MAX98927_R000B_INT_EN2, 0x00}, 36 {MAX98927_R000C_INT_EN3, 0x00}, 37 {MAX98927_R000D_INT_FLAG_CLR1, 0x00}, 38 {MAX98927_R000E_INT_FLAG_CLR2, 0x00}, 39 {MAX98927_R000F_INT_FLAG_CLR3, 0x00}, 40 {MAX98927_R0010_IRQ_CTRL, 0x00}, 41 {MAX98927_R0011_CLK_MON, 0x00}, 42 {MAX98927_R0012_WDOG_CTRL, 0x00}, 43 {MAX98927_R0013_WDOG_RST, 0x00}, 44 {MAX98927_R0014_MEAS_ADC_THERM_WARN_THRESH, 0x75}, 45 {MAX98927_R0015_MEAS_ADC_THERM_SHDN_THRESH, 0x8c}, 46 {MAX98927_R0016_MEAS_ADC_THERM_HYSTERESIS, 0x08}, 47 {MAX98927_R0017_PIN_CFG, 0x55}, 48 {MAX98927_R0018_PCM_RX_EN_A, 0x00}, 49 {MAX98927_R0019_PCM_RX_EN_B, 0x00}, 50 {MAX98927_R001A_PCM_TX_EN_A, 0x00}, 51 {MAX98927_R001B_PCM_TX_EN_B, 0x00}, 52 {MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 0x00}, 53 {MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 0x00}, 54 {MAX98927_R001E_PCM_TX_CH_SRC_A, 0x00}, 55 {MAX98927_R001F_PCM_TX_CH_SRC_B, 0x00}, 56 {MAX98927_R0020_PCM_MODE_CFG, 0x40}, 57 {MAX98927_R0021_PCM_MASTER_MODE, 0x00}, 58 {MAX98927_R0022_PCM_CLK_SETUP, 0x22}, 59 {MAX98927_R0023_PCM_SR_SETUP1, 0x00}, 60 {MAX98927_R0024_PCM_SR_SETUP2, 0x00}, 61 {MAX98927_R0025_PCM_TO_SPK_MONOMIX_A, 0x00}, 62 {MAX98927_R0026_PCM_TO_SPK_MONOMIX_B, 0x00}, 63 {MAX98927_R0027_ICC_RX_EN_A, 0x00}, 64 {MAX98927_R0028_ICC_RX_EN_B, 0x00}, 65 {MAX98927_R002B_ICC_TX_EN_A, 0x00}, 66 {MAX98927_R002C_ICC_TX_EN_B, 0x00}, 67 {MAX98927_R002E_ICC_HIZ_MANUAL_MODE, 0x00}, 68 {MAX98927_R002F_ICC_TX_HIZ_EN_A, 0x00}, 69 {MAX98927_R0030_ICC_TX_HIZ_EN_B, 0x00}, 70 {MAX98927_R0031_ICC_LNK_EN, 0x00}, 71 {MAX98927_R0032_PDM_TX_EN, 0x00}, 72 {MAX98927_R0033_PDM_TX_HIZ_CTRL, 0x00}, 73 {MAX98927_R0034_PDM_TX_CTRL, 0x00}, 74 {MAX98927_R0035_PDM_RX_CTRL, 0x00}, 75 {MAX98927_R0036_AMP_VOL_CTRL, 0x00}, 76 {MAX98927_R0037_AMP_DSP_CFG, 0x02}, 77 {MAX98927_R0038_TONE_GEN_DC_CFG, 0x00}, 78 {MAX98927_R0039_DRE_CTRL, 0x01}, 79 {MAX98927_R003A_AMP_EN, 0x00}, 80 {MAX98927_R003B_SPK_SRC_SEL, 0x00}, 81 {MAX98927_R003C_SPK_GAIN, 0x00}, 82 {MAX98927_R003D_SSM_CFG, 0x04}, 83 {MAX98927_R003E_MEAS_EN, 0x00}, 84 {MAX98927_R003F_MEAS_DSP_CFG, 0x04}, 85 {MAX98927_R0040_BOOST_CTRL0, 0x00}, 86 {MAX98927_R0041_BOOST_CTRL3, 0x00}, 87 {MAX98927_R0042_BOOST_CTRL1, 0x00}, 88 {MAX98927_R0043_MEAS_ADC_CFG, 0x00}, 89 {MAX98927_R0044_MEAS_ADC_BASE_MSB, 0x01}, 90 {MAX98927_R0045_MEAS_ADC_BASE_LSB, 0x00}, 91 {MAX98927_R0046_ADC_CH0_DIVIDE, 0x00}, 92 {MAX98927_R0047_ADC_CH1_DIVIDE, 0x00}, 93 {MAX98927_R0048_ADC_CH2_DIVIDE, 0x00}, 94 {MAX98927_R0049_ADC_CH0_FILT_CFG, 0x00}, 95 {MAX98927_R004A_ADC_CH1_FILT_CFG, 0x00}, 96 {MAX98927_R004B_ADC_CH2_FILT_CFG, 0x00}, 97 {MAX98927_R004C_MEAS_ADC_CH0_READ, 0x00}, 98 {MAX98927_R004D_MEAS_ADC_CH1_READ, 0x00}, 99 {MAX98927_R004E_MEAS_ADC_CH2_READ, 0x00}, 100 {MAX98927_R0051_BROWNOUT_STATUS, 0x00}, 101 {MAX98927_R0052_BROWNOUT_EN, 0x00}, 102 {MAX98927_R0053_BROWNOUT_INFINITE_HOLD, 0x00}, 103 {MAX98927_R0054_BROWNOUT_INFINITE_HOLD_CLR, 0x00}, 104 {MAX98927_R0055_BROWNOUT_LVL_HOLD, 0x00}, 105 {MAX98927_R005A_BROWNOUT_LVL1_THRESH, 0x00}, 106 {MAX98927_R005B_BROWNOUT_LVL2_THRESH, 0x00}, 107 {MAX98927_R005C_BROWNOUT_LVL3_THRESH, 0x00}, 108 {MAX98927_R005D_BROWNOUT_LVL4_THRESH, 0x00}, 109 {MAX98927_R005E_BROWNOUT_THRESH_HYSTERYSIS, 0x00}, 110 {MAX98927_R005F_BROWNOUT_AMP_LIMITER_ATK_REL, 0x00}, 111 {MAX98927_R0060_BROWNOUT_AMP_GAIN_ATK_REL, 0x00}, 112 {MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE, 0x00}, 113 {MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT, 0x00}, 114 {MAX98927_R0073_BROWNOUT_LVL1_AMP1_CTRL1, 0x00}, 115 {MAX98927_R0074_BROWNOUT_LVL1_AMP1_CTRL2, 0x00}, 116 {MAX98927_R0075_BROWNOUT_LVL1_AMP1_CTRL3, 0x00}, 117 {MAX98927_R0076_BROWNOUT_LVL2_CUR_LIMIT, 0x00}, 118 {MAX98927_R0077_BROWNOUT_LVL2_AMP1_CTRL1, 0x00}, 119 {MAX98927_R0078_BROWNOUT_LVL2_AMP1_CTRL2, 0x00}, 120 {MAX98927_R0079_BROWNOUT_LVL2_AMP1_CTRL3, 0x00}, 121 {MAX98927_R007A_BROWNOUT_LVL3_CUR_LIMIT, 0x00}, 122 {MAX98927_R007B_BROWNOUT_LVL3_AMP1_CTRL1, 0x00}, 123 {MAX98927_R007C_BROWNOUT_LVL3_AMP1_CTRL2, 0x00}, 124 {MAX98927_R007D_BROWNOUT_LVL3_AMP1_CTRL3, 0x00}, 125 {MAX98927_R007E_BROWNOUT_LVL4_CUR_LIMIT, 0x00}, 126 {MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1, 0x00}, 127 {MAX98927_R0080_BROWNOUT_LVL4_AMP1_CTRL2, 0x00}, 128 {MAX98927_R0081_BROWNOUT_LVL4_AMP1_CTRL3, 0x00}, 129 {MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM, 0x00}, 130 {MAX98927_R0083_ENV_TRACK_BOOST_VOUT_DELAY, 0x00}, 131 {MAX98927_R0084_ENV_TRACK_REL_RATE, 0x00}, 132 {MAX98927_R0085_ENV_TRACK_HOLD_RATE, 0x00}, 133 {MAX98927_R0086_ENV_TRACK_CTRL, 0x00}, 134 {MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ, 0x00}, 135 {MAX98927_R00FF_GLOBAL_SHDN, 0x00}, 136 {MAX98927_R0100_SOFT_RESET, 0x00}, 137 {MAX98927_R01FF_REV_ID, 0x40}, 138 }; 139 140 static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 141 { 142 struct snd_soc_component *component = codec_dai->component; 143 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); 144 unsigned int mode = 0; 145 unsigned int format = 0; 146 bool use_pdm = false; 147 unsigned int invert = 0; 148 149 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); 150 151 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 152 case SND_SOC_DAIFMT_CBC_CFC: 153 max98927->provider = false; 154 mode = MAX98927_PCM_MASTER_MODE_SLAVE; 155 break; 156 case SND_SOC_DAIFMT_CBP_CFP: 157 max98927->provider = true; 158 mode = MAX98927_PCM_MASTER_MODE_MASTER; 159 break; 160 default: 161 dev_err(component->dev, "DAI clock mode unsupported\n"); 162 return -EINVAL; 163 } 164 165 regmap_update_bits(max98927->regmap, MAX98927_R0021_PCM_MASTER_MODE, 166 MAX98927_PCM_MASTER_MODE_MASK, mode); 167 168 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 169 case SND_SOC_DAIFMT_NB_NF: 170 break; 171 case SND_SOC_DAIFMT_IB_NF: 172 invert = MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE; 173 break; 174 default: 175 dev_err(component->dev, "DAI invert mode unsupported\n"); 176 return -EINVAL; 177 } 178 179 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG, 180 MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE, invert); 181 182 /* interface format */ 183 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 184 case SND_SOC_DAIFMT_I2S: 185 format = MAX98927_PCM_FORMAT_I2S; 186 break; 187 case SND_SOC_DAIFMT_LEFT_J: 188 format = MAX98927_PCM_FORMAT_LJ; 189 break; 190 case SND_SOC_DAIFMT_DSP_A: 191 format = MAX98927_PCM_FORMAT_TDM_MODE1; 192 break; 193 case SND_SOC_DAIFMT_DSP_B: 194 format = MAX98927_PCM_FORMAT_TDM_MODE0; 195 break; 196 case SND_SOC_DAIFMT_PDM: 197 use_pdm = true; 198 break; 199 default: 200 return -EINVAL; 201 } 202 max98927->iface = fmt & SND_SOC_DAIFMT_FORMAT_MASK; 203 204 if (!use_pdm) { 205 /* pcm channel configuration */ 206 regmap_update_bits(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A, 207 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, 208 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN); 209 210 regmap_update_bits(max98927->regmap, 211 MAX98927_R0020_PCM_MODE_CFG, 212 MAX98927_PCM_MODE_CFG_FORMAT_MASK, 213 format << MAX98927_PCM_MODE_CFG_FORMAT_SHIFT); 214 215 regmap_update_bits(max98927->regmap, MAX98927_R003B_SPK_SRC_SEL, 216 MAX98927_SPK_SRC_MASK, 0); 217 218 regmap_update_bits(max98927->regmap, MAX98927_R0035_PDM_RX_CTRL, 219 MAX98927_PDM_RX_EN_MASK, 0); 220 } else { 221 /* pdm channel configuration */ 222 regmap_update_bits(max98927->regmap, MAX98927_R0035_PDM_RX_CTRL, 223 MAX98927_PDM_RX_EN_MASK, 1); 224 225 regmap_update_bits(max98927->regmap, MAX98927_R003B_SPK_SRC_SEL, 226 MAX98927_SPK_SRC_MASK, 3); 227 228 regmap_update_bits(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A, 229 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, 230 0); 231 } 232 return 0; 233 } 234 235 /* codec MCLK rate in master mode */ 236 static const int rate_table[] = { 237 5644800, 6000000, 6144000, 6500000, 238 9600000, 11289600, 12000000, 12288000, 239 13000000, 19200000, 240 }; 241 242 /* BCLKs per LRCLK */ 243 static const int bclk_sel_table[] = { 244 32, 48, 64, 96, 128, 192, 256, 384, 512, 245 }; 246 247 static int max98927_get_bclk_sel(int bclk) 248 { 249 int i; 250 /* match BCLKs per LRCLK */ 251 for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) { 252 if (bclk_sel_table[i] == bclk) 253 return i + 2; 254 } 255 return 0; 256 } 257 static int max98927_set_clock(struct max98927_priv *max98927, 258 struct snd_pcm_hw_params *params) 259 { 260 struct snd_soc_component *component = max98927->component; 261 /* BCLK/LRCLK ratio calculation */ 262 int blr_clk_ratio = params_channels(params) * max98927->ch_size; 263 int value; 264 265 if (max98927->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] >= max98927->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 regmap_update_bits(max98927->regmap, 277 MAX98927_R0021_PCM_MASTER_MODE, 278 MAX98927_PCM_MASTER_MODE_MCLK_MASK, 279 i << MAX98927_PCM_MASTER_MODE_MCLK_RATE_SHIFT); 280 } 281 282 if (!max98927->tdm_mode) { 283 /* BCLK configuration */ 284 value = max98927_get_bclk_sel(blr_clk_ratio); 285 if (!value) { 286 dev_err(component->dev, "format unsupported %d\n", 287 params_format(params)); 288 return -EINVAL; 289 } 290 291 regmap_update_bits(max98927->regmap, 292 MAX98927_R0022_PCM_CLK_SETUP, 293 MAX98927_PCM_CLK_SETUP_BSEL_MASK, value); 294 } 295 return 0; 296 } 297 298 static int max98927_dai_hw_params(struct snd_pcm_substream *substream, 299 struct snd_pcm_hw_params *params, 300 struct snd_soc_dai *dai) 301 { 302 struct snd_soc_component *component = dai->component; 303 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); 304 unsigned int sampling_rate = 0; 305 unsigned int chan_sz = 0; 306 307 /* pcm mode configuration */ 308 switch (snd_pcm_format_width(params_format(params))) { 309 case 16: 310 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16; 311 break; 312 case 24: 313 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24; 314 break; 315 case 32: 316 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32; 317 break; 318 default: 319 dev_err(component->dev, "format unsupported %d\n", 320 params_format(params)); 321 goto err; 322 } 323 324 max98927->ch_size = snd_pcm_format_width(params_format(params)); 325 326 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG, 327 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); 328 329 dev_dbg(component->dev, "format supported %d", 330 params_format(params)); 331 332 /* sampling rate configuration */ 333 switch (params_rate(params)) { 334 case 8000: 335 sampling_rate = MAX98927_PCM_SR_SET1_SR_8000; 336 break; 337 case 11025: 338 sampling_rate = MAX98927_PCM_SR_SET1_SR_11025; 339 break; 340 case 12000: 341 sampling_rate = MAX98927_PCM_SR_SET1_SR_12000; 342 break; 343 case 16000: 344 sampling_rate = MAX98927_PCM_SR_SET1_SR_16000; 345 break; 346 case 22050: 347 sampling_rate = MAX98927_PCM_SR_SET1_SR_22050; 348 break; 349 case 24000: 350 sampling_rate = MAX98927_PCM_SR_SET1_SR_24000; 351 break; 352 case 32000: 353 sampling_rate = MAX98927_PCM_SR_SET1_SR_32000; 354 break; 355 case 44100: 356 sampling_rate = MAX98927_PCM_SR_SET1_SR_44100; 357 break; 358 case 48000: 359 sampling_rate = MAX98927_PCM_SR_SET1_SR_48000; 360 break; 361 default: 362 dev_err(component->dev, "rate %d not supported\n", 363 params_rate(params)); 364 goto err; 365 } 366 /* set DAI_SR to correct LRCLK frequency */ 367 regmap_update_bits(max98927->regmap, MAX98927_R0023_PCM_SR_SETUP1, 368 MAX98927_PCM_SR_SET1_SR_MASK, sampling_rate); 369 regmap_update_bits(max98927->regmap, MAX98927_R0024_PCM_SR_SETUP2, 370 MAX98927_PCM_SR_SET2_SR_MASK, 371 sampling_rate << MAX98927_PCM_SR_SET2_SR_SHIFT); 372 373 /* set sampling rate of IV */ 374 if (max98927->interleave_mode && 375 sampling_rate > MAX98927_PCM_SR_SET1_SR_16000) 376 regmap_update_bits(max98927->regmap, 377 MAX98927_R0024_PCM_SR_SETUP2, 378 MAX98927_PCM_SR_SET2_IVADC_SR_MASK, 379 sampling_rate - 3); 380 else 381 regmap_update_bits(max98927->regmap, 382 MAX98927_R0024_PCM_SR_SETUP2, 383 MAX98927_PCM_SR_SET2_IVADC_SR_MASK, 384 sampling_rate); 385 return max98927_set_clock(max98927, params); 386 err: 387 return -EINVAL; 388 } 389 390 static int max98927_dai_tdm_slot(struct snd_soc_dai *dai, 391 unsigned int tx_mask, unsigned int rx_mask, 392 int slots, int slot_width) 393 { 394 struct snd_soc_component *component = dai->component; 395 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); 396 int bsel = 0; 397 unsigned int chan_sz = 0; 398 399 max98927->tdm_mode = true; 400 401 /* BCLK configuration */ 402 bsel = max98927_get_bclk_sel(slots * slot_width); 403 if (bsel == 0) { 404 dev_err(component->dev, "BCLK %d not supported\n", 405 slots * slot_width); 406 return -EINVAL; 407 } 408 409 regmap_update_bits(max98927->regmap, MAX98927_R0022_PCM_CLK_SETUP, 410 MAX98927_PCM_CLK_SETUP_BSEL_MASK, bsel); 411 412 /* Channel size configuration */ 413 switch (slot_width) { 414 case 16: 415 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16; 416 break; 417 case 24: 418 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24; 419 break; 420 case 32: 421 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32; 422 break; 423 default: 424 dev_err(component->dev, "format unsupported %d\n", 425 slot_width); 426 return -EINVAL; 427 } 428 429 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG, 430 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); 431 432 /* Rx slot configuration */ 433 regmap_write(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A, 434 rx_mask & 0xFF); 435 regmap_write(max98927->regmap, MAX98927_R0019_PCM_RX_EN_B, 436 (rx_mask & 0xFF00) >> 8); 437 438 /* Tx slot configuration */ 439 regmap_write(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A, 440 tx_mask & 0xFF); 441 regmap_write(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B, 442 (tx_mask & 0xFF00) >> 8); 443 444 /* Tx slot Hi-Z configuration */ 445 regmap_write(max98927->regmap, MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 446 ~tx_mask & 0xFF); 447 regmap_write(max98927->regmap, MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 448 (~tx_mask & 0xFF00) >> 8); 449 450 return 0; 451 } 452 453 #define MAX98927_RATES SNDRV_PCM_RATE_8000_48000 454 455 #define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 456 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 457 458 static int max98927_dai_set_sysclk(struct snd_soc_dai *dai, 459 int clk_id, unsigned int freq, int dir) 460 { 461 struct snd_soc_component *component = dai->component; 462 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); 463 464 max98927->sysclk = freq; 465 return 0; 466 } 467 468 static const struct snd_soc_dai_ops max98927_dai_ops = { 469 .set_sysclk = max98927_dai_set_sysclk, 470 .set_fmt = max98927_dai_set_fmt, 471 .hw_params = max98927_dai_hw_params, 472 .set_tdm_slot = max98927_dai_tdm_slot, 473 }; 474 475 static int max98927_dac_event(struct snd_soc_dapm_widget *w, 476 struct snd_kcontrol *kcontrol, int event) 477 { 478 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 479 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); 480 481 switch (event) { 482 case SND_SOC_DAPM_PRE_PMU: 483 max98927->tdm_mode = false; 484 break; 485 case SND_SOC_DAPM_POST_PMU: 486 regmap_update_bits(max98927->regmap, MAX98927_R003A_AMP_EN, 487 MAX98927_AMP_EN_MASK, 1); 488 regmap_update_bits(max98927->regmap, MAX98927_R00FF_GLOBAL_SHDN, 489 MAX98927_GLOBAL_EN_MASK, 1); 490 break; 491 case SND_SOC_DAPM_POST_PMD: 492 regmap_update_bits(max98927->regmap, MAX98927_R00FF_GLOBAL_SHDN, 493 MAX98927_GLOBAL_EN_MASK, 0); 494 regmap_update_bits(max98927->regmap, MAX98927_R003A_AMP_EN, 495 MAX98927_AMP_EN_MASK, 0); 496 break; 497 default: 498 return 0; 499 } 500 return 0; 501 } 502 503 static const char * const max98927_switch_text[] = { 504 "Left", "Right", "LeftRight"}; 505 506 static const struct soc_enum dai_sel_enum = 507 SOC_ENUM_SINGLE(MAX98927_R0025_PCM_TO_SPK_MONOMIX_A, 508 MAX98927_PCM_TO_SPK_MONOMIX_CFG_SHIFT, 3, 509 max98927_switch_text); 510 511 static const struct snd_kcontrol_new max98927_dai_controls = 512 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum); 513 514 static const struct snd_kcontrol_new max98927_vi_control = 515 SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG, 2, 1, 0); 516 517 static const struct snd_soc_dapm_widget max98927_dapm_widgets[] = { 518 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", MAX98927_R003A_AMP_EN, 519 0, 0, max98927_dac_event, 520 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 521 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0, 522 &max98927_dai_controls), 523 SND_SOC_DAPM_OUTPUT("BE_OUT"), 524 SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0, 525 MAX98927_R003E_MEAS_EN, 0, 0), 526 SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0, 527 MAX98927_R003E_MEAS_EN, 1, 0), 528 SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0, 529 &max98927_vi_control), 530 SND_SOC_DAPM_SIGGEN("VMON"), 531 SND_SOC_DAPM_SIGGEN("IMON"), 532 }; 533 534 static DECLARE_TLV_DB_SCALE(max98927_spk_tlv, 300, 300, 0); 535 static DECLARE_TLV_DB_SCALE(max98927_digital_tlv, -1600, 25, 0); 536 537 static bool max98927_readable_register(struct device *dev, unsigned int reg) 538 { 539 switch (reg) { 540 case MAX98927_R0001_INT_RAW1 ... MAX98927_R0028_ICC_RX_EN_B: 541 case MAX98927_R002B_ICC_TX_EN_A ... MAX98927_R002C_ICC_TX_EN_B: 542 case MAX98927_R002E_ICC_HIZ_MANUAL_MODE 543 ... MAX98927_R004E_MEAS_ADC_CH2_READ: 544 case MAX98927_R0051_BROWNOUT_STATUS 545 ... MAX98927_R0055_BROWNOUT_LVL_HOLD: 546 case MAX98927_R005A_BROWNOUT_LVL1_THRESH 547 ... MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE: 548 case MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT 549 ... MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ: 550 case MAX98927_R00FF_GLOBAL_SHDN: 551 case MAX98927_R0100_SOFT_RESET: 552 case MAX98927_R01FF_REV_ID: 553 return true; 554 default: 555 return false; 556 } 557 }; 558 559 static bool max98927_volatile_reg(struct device *dev, unsigned int reg) 560 { 561 switch (reg) { 562 case MAX98927_R0001_INT_RAW1 ... MAX98927_R0009_INT_FLAG3: 563 case MAX98927_R004C_MEAS_ADC_CH0_READ: 564 case MAX98927_R004D_MEAS_ADC_CH1_READ: 565 case MAX98927_R004E_MEAS_ADC_CH2_READ: 566 case MAX98927_R0051_BROWNOUT_STATUS: 567 case MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ: 568 case MAX98927_R01FF_REV_ID: 569 case MAX98927_R0100_SOFT_RESET: 570 return true; 571 default: 572 return false; 573 } 574 } 575 576 static const char * const max98927_boost_voltage_text[] = { 577 "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V", 578 "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V", 579 "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V", 580 "9.5V", "9.625V", "9.75V", "9.875V", "10V" 581 }; 582 583 static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage, 584 MAX98927_R0040_BOOST_CTRL0, 0, 585 max98927_boost_voltage_text); 586 587 static const char * const max98927_current_limit_text[] = { 588 "1.00A", "1.10A", "1.20A", "1.30A", "1.40A", "1.50A", "1.60A", "1.70A", 589 "1.80A", "1.90A", "2.00A", "2.10A", "2.20A", "2.30A", "2.40A", "2.50A", 590 "2.60A", "2.70A", "2.80A", "2.90A", "3.00A", "3.10A", "3.20A", "3.30A", 591 "3.40A", "3.50A", "3.60A", "3.70A", "3.80A", "3.90A", "4.00A", "4.10A" 592 }; 593 594 static SOC_ENUM_SINGLE_DECL(max98927_current_limit, 595 MAX98927_R0042_BOOST_CTRL1, 1, 596 max98927_current_limit_text); 597 598 static const struct snd_kcontrol_new max98927_snd_controls[] = { 599 SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN, 0, 6, 0, 600 max98927_spk_tlv), 601 SOC_SINGLE_TLV("Digital Volume", MAX98927_R0036_AMP_VOL_CTRL, 602 0, (1 << MAX98927_AMP_VOL_WIDTH) - 1, 0, 603 max98927_digital_tlv), 604 SOC_SINGLE("Amp DSP Switch", MAX98927_R0052_BROWNOUT_EN, 605 MAX98927_BROWNOUT_DSP_SHIFT, 1, 0), 606 SOC_SINGLE("Ramp Switch", MAX98927_R0037_AMP_DSP_CFG, 607 MAX98927_AMP_DSP_CFG_RMP_SHIFT, 1, 0), 608 SOC_SINGLE("DRE Switch", MAX98927_R0039_DRE_CTRL, MAX98927_DRE_EN_SHIFT, 609 1, 0), 610 SOC_SINGLE("Volume Location Switch", MAX98927_R0036_AMP_VOL_CTRL, 611 MAX98927_AMP_VOL_SEL_SHIFT, 1, 0), 612 SOC_ENUM("Boost Output Voltage", max98927_boost_voltage), 613 SOC_ENUM("Current Limit", max98927_current_limit), 614 }; 615 616 static const struct snd_soc_dapm_route max98927_audio_map[] = { 617 /* Plabyack */ 618 {"DAI Sel Mux", "Left", "Amp Enable"}, 619 {"DAI Sel Mux", "Right", "Amp Enable"}, 620 {"DAI Sel Mux", "LeftRight", "Amp Enable"}, 621 {"BE_OUT", NULL, "DAI Sel Mux"}, 622 /* Capture */ 623 { "VI Sense", "Switch", "VMON" }, 624 { "VI Sense", "Switch", "IMON" }, 625 { "Voltage Sense", NULL, "VI Sense" }, 626 { "Current Sense", NULL, "VI Sense" }, 627 }; 628 629 static struct snd_soc_dai_driver max98927_dai[] = { 630 { 631 .name = "max98927-aif1", 632 .playback = { 633 .stream_name = "HiFi Playback", 634 .channels_min = 1, 635 .channels_max = 2, 636 .rates = MAX98927_RATES, 637 .formats = MAX98927_FORMATS, 638 }, 639 .capture = { 640 .stream_name = "HiFi Capture", 641 .channels_min = 1, 642 .channels_max = 2, 643 .rates = MAX98927_RATES, 644 .formats = MAX98927_FORMATS, 645 }, 646 .ops = &max98927_dai_ops, 647 } 648 }; 649 650 static int max98927_probe(struct snd_soc_component *component) 651 { 652 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); 653 654 max98927->component = component; 655 656 /* Software Reset */ 657 regmap_write(max98927->regmap, MAX98927_R0100_SOFT_RESET, 658 MAX98927_SOFT_RESET); 659 660 /* IV default slot configuration */ 661 regmap_write(max98927->regmap, MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 0xFF); 662 regmap_write(max98927->regmap, MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 0xFF); 663 regmap_write(max98927->regmap, MAX98927_R0025_PCM_TO_SPK_MONOMIX_A, 664 0x80); 665 regmap_write(max98927->regmap, MAX98927_R0026_PCM_TO_SPK_MONOMIX_B, 666 0x1); 667 /* Set inital volume (+13dB) */ 668 regmap_write(max98927->regmap, MAX98927_R0036_AMP_VOL_CTRL, 0x38); 669 regmap_write(max98927->regmap, MAX98927_R003C_SPK_GAIN, 0x05); 670 /* Enable DC blocker */ 671 regmap_write(max98927->regmap, MAX98927_R0037_AMP_DSP_CFG, 0x03); 672 /* Enable IMON VMON DC blocker */ 673 regmap_write(max98927->regmap, MAX98927_R003F_MEAS_DSP_CFG, 0xF7); 674 /* Boost Output Voltage & Current limit */ 675 regmap_write(max98927->regmap, MAX98927_R0040_BOOST_CTRL0, 0x1C); 676 regmap_write(max98927->regmap, MAX98927_R0042_BOOST_CTRL1, 0x3E); 677 /* Measurement ADC config */ 678 regmap_write(max98927->regmap, MAX98927_R0043_MEAS_ADC_CFG, 0x04); 679 regmap_write(max98927->regmap, MAX98927_R0044_MEAS_ADC_BASE_MSB, 0x00); 680 regmap_write(max98927->regmap, MAX98927_R0045_MEAS_ADC_BASE_LSB, 0x24); 681 /* Brownout Level */ 682 regmap_write(max98927->regmap, MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1, 683 0x06); 684 /* Envelope Tracking configuration */ 685 regmap_write(max98927->regmap, MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM, 686 0x08); 687 regmap_write(max98927->regmap, MAX98927_R0086_ENV_TRACK_CTRL, 0x01); 688 regmap_write(max98927->regmap, MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ, 689 0x10); 690 691 /* voltage, current slot configuration */ 692 regmap_write(max98927->regmap, MAX98927_R001E_PCM_TX_CH_SRC_A, 693 (max98927->i_l_slot << MAX98927_PCM_TX_CH_SRC_A_I_SHIFT | max98927->v_l_slot) & 0xFF); 694 695 if (max98927->v_l_slot < 8) { 696 regmap_update_bits(max98927->regmap, 697 MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 698 1 << max98927->v_l_slot, 0); 699 regmap_update_bits(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A, 700 1 << max98927->v_l_slot, 701 1 << max98927->v_l_slot); 702 } else { 703 regmap_update_bits(max98927->regmap, 704 MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 705 1 << (max98927->v_l_slot - 8), 0); 706 regmap_update_bits(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B, 707 1 << (max98927->v_l_slot - 8), 708 1 << (max98927->v_l_slot - 8)); 709 } 710 711 if (max98927->i_l_slot < 8) { 712 regmap_update_bits(max98927->regmap, 713 MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 714 1 << max98927->i_l_slot, 0); 715 regmap_update_bits(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A, 716 1 << max98927->i_l_slot, 717 1 << max98927->i_l_slot); 718 } else { 719 regmap_update_bits(max98927->regmap, 720 MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 721 1 << (max98927->i_l_slot - 8), 0); 722 regmap_update_bits(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B, 723 1 << (max98927->i_l_slot - 8), 724 1 << (max98927->i_l_slot - 8)); 725 } 726 727 /* Set interleave mode */ 728 if (max98927->interleave_mode) 729 regmap_update_bits(max98927->regmap, 730 MAX98927_R001F_PCM_TX_CH_SRC_B, 731 MAX98927_PCM_TX_CH_INTERLEAVE_MASK, 732 MAX98927_PCM_TX_CH_INTERLEAVE_MASK); 733 return 0; 734 } 735 736 #ifdef CONFIG_PM_SLEEP 737 static int max98927_suspend(struct device *dev) 738 { 739 struct max98927_priv *max98927 = dev_get_drvdata(dev); 740 741 regcache_cache_only(max98927->regmap, true); 742 regcache_mark_dirty(max98927->regmap); 743 return 0; 744 } 745 static int max98927_resume(struct device *dev) 746 { 747 struct max98927_priv *max98927 = dev_get_drvdata(dev); 748 749 regmap_write(max98927->regmap, MAX98927_R0100_SOFT_RESET, 750 MAX98927_SOFT_RESET); 751 regcache_cache_only(max98927->regmap, false); 752 regcache_sync(max98927->regmap); 753 return 0; 754 } 755 #endif 756 757 static const struct dev_pm_ops max98927_pm = { 758 SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume) 759 }; 760 761 static const struct snd_soc_component_driver soc_component_dev_max98927 = { 762 .probe = max98927_probe, 763 .controls = max98927_snd_controls, 764 .num_controls = ARRAY_SIZE(max98927_snd_controls), 765 .dapm_widgets = max98927_dapm_widgets, 766 .num_dapm_widgets = ARRAY_SIZE(max98927_dapm_widgets), 767 .dapm_routes = max98927_audio_map, 768 .num_dapm_routes = ARRAY_SIZE(max98927_audio_map), 769 .idle_bias_on = 1, 770 .use_pmdown_time = 1, 771 .endianness = 1, 772 }; 773 774 static const struct regmap_config max98927_regmap = { 775 .reg_bits = 16, 776 .val_bits = 8, 777 .max_register = MAX98927_R01FF_REV_ID, 778 .reg_defaults = max98927_reg, 779 .num_reg_defaults = ARRAY_SIZE(max98927_reg), 780 .readable_reg = max98927_readable_register, 781 .volatile_reg = max98927_volatile_reg, 782 .cache_type = REGCACHE_RBTREE, 783 }; 784 785 static void max98927_slot_config(struct i2c_client *i2c, 786 struct max98927_priv *max98927) 787 { 788 int value; 789 struct device *dev = &i2c->dev; 790 791 if (!device_property_read_u32(dev, "vmon-slot-no", &value)) 792 max98927->v_l_slot = value & 0xF; 793 else 794 max98927->v_l_slot = 0; 795 796 if (!device_property_read_u32(dev, "imon-slot-no", &value)) 797 max98927->i_l_slot = value & 0xF; 798 else 799 max98927->i_l_slot = 1; 800 } 801 802 static int max98927_i2c_probe(struct i2c_client *i2c) 803 { 804 805 int ret = 0, value; 806 int reg = 0; 807 struct max98927_priv *max98927 = NULL; 808 809 max98927 = devm_kzalloc(&i2c->dev, sizeof(*max98927), GFP_KERNEL); 810 if (!max98927) { 811 ret = -ENOMEM; 812 return ret; 813 } 814 i2c_set_clientdata(i2c, max98927); 815 816 /* update interleave mode info */ 817 if (of_property_read_bool(i2c->dev.of_node, "maxim,interleave-mode")) { 818 max98927->interleave_mode = true; 819 } else { 820 if (!of_property_read_u32(i2c->dev.of_node, "interleave_mode", 821 &value)) 822 if (value > 0) 823 max98927->interleave_mode = true; 824 } 825 826 /* regmap initialization */ 827 max98927->regmap 828 = devm_regmap_init_i2c(i2c, &max98927_regmap); 829 if (IS_ERR(max98927->regmap)) { 830 ret = PTR_ERR(max98927->regmap); 831 dev_err(&i2c->dev, 832 "Failed to allocate regmap: %d\n", ret); 833 return ret; 834 } 835 836 max98927->reset_gpio = devm_gpiod_get_optional(&i2c->dev, "reset", 837 GPIOD_OUT_HIGH); 838 if (IS_ERR(max98927->reset_gpio)) { 839 ret = PTR_ERR(max98927->reset_gpio); 840 return dev_err_probe(&i2c->dev, ret, "failed to request GPIO reset pin"); 841 } 842 843 if (max98927->reset_gpio) { 844 gpiod_set_value_cansleep(max98927->reset_gpio, 0); 845 /* Wait for i2c port to be ready */ 846 usleep_range(5000, 6000); 847 } 848 849 /* Check Revision ID */ 850 ret = regmap_read(max98927->regmap, MAX98927_R01FF_REV_ID, ®); 851 if (ret < 0) { 852 dev_err(&i2c->dev, 853 "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID); 854 return ret; 855 } 856 dev_info(&i2c->dev, "MAX98927 revisionID: 0x%02X\n", reg); 857 858 /* voltage/current slot configuration */ 859 max98927_slot_config(i2c, max98927); 860 861 /* codec registeration */ 862 ret = devm_snd_soc_register_component(&i2c->dev, 863 &soc_component_dev_max98927, 864 max98927_dai, ARRAY_SIZE(max98927_dai)); 865 if (ret < 0) 866 dev_err(&i2c->dev, "Failed to register component: %d\n", ret); 867 868 return ret; 869 } 870 871 static void max98927_i2c_remove(struct i2c_client *i2c) 872 { 873 struct max98927_priv *max98927 = i2c_get_clientdata(i2c); 874 875 if (max98927->reset_gpio) 876 gpiod_set_value_cansleep(max98927->reset_gpio, 1); 877 } 878 879 static const struct i2c_device_id max98927_i2c_id[] = { 880 { "max98927", 0}, 881 { }, 882 }; 883 884 MODULE_DEVICE_TABLE(i2c, max98927_i2c_id); 885 886 #if defined(CONFIG_OF) 887 static const struct of_device_id max98927_of_match[] = { 888 { .compatible = "maxim,max98927", }, 889 { } 890 }; 891 MODULE_DEVICE_TABLE(of, max98927_of_match); 892 #endif 893 894 #ifdef CONFIG_ACPI 895 static const struct acpi_device_id max98927_acpi_match[] = { 896 { "MX98927", 0 }, 897 {}, 898 }; 899 MODULE_DEVICE_TABLE(acpi, max98927_acpi_match); 900 #endif 901 902 static struct i2c_driver max98927_i2c_driver = { 903 .driver = { 904 .name = "max98927", 905 .of_match_table = of_match_ptr(max98927_of_match), 906 .acpi_match_table = ACPI_PTR(max98927_acpi_match), 907 .pm = &max98927_pm, 908 }, 909 .probe = max98927_i2c_probe, 910 .remove = max98927_i2c_remove, 911 .id_table = max98927_i2c_id, 912 }; 913 914 module_i2c_driver(max98927_i2c_driver) 915 916 MODULE_DESCRIPTION("ALSA SoC MAX98927 driver"); 917 MODULE_AUTHOR("Ryan Lee <ryans.lee@maximintegrated.com>"); 918 MODULE_LICENSE("GPL"); 919