1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * max98390.c -- MAX98390 ALSA Soc Audio driver
5 * Copyright (C) 2020 Maxim Integrated Products
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/of_gpio.h>
17 #include <linux/regmap.h>
18 #include <linux/slab.h>
19 #include <linux/time.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/soc.h>
23 #include <sound/tlv.h>
27 static struct reg_default max98390_reg_defaults[] = {
28 {MAX98390_INT_EN1, 0xf0},
29 {MAX98390_INT_EN2, 0x00},
30 {MAX98390_INT_EN3, 0x00},
31 {MAX98390_INT_FLAG_CLR1, 0x00},
32 {MAX98390_INT_FLAG_CLR2, 0x00},
33 {MAX98390_INT_FLAG_CLR3, 0x00},
34 {MAX98390_IRQ_CTRL, 0x01},
35 {MAX98390_CLK_MON, 0x6d},
36 {MAX98390_DAT_MON, 0x03},
37 {MAX98390_WDOG_CTRL, 0x00},
38 {MAX98390_WDOG_RST, 0x00},
39 {MAX98390_MEAS_ADC_THERM_WARN_THRESH, 0x75},
40 {MAX98390_MEAS_ADC_THERM_SHDN_THRESH, 0x8c},
41 {MAX98390_MEAS_ADC_THERM_HYSTERESIS, 0x08},
42 {MAX98390_PIN_CFG, 0x55},
43 {MAX98390_PCM_RX_EN_A, 0x00},
44 {MAX98390_PCM_RX_EN_B, 0x00},
45 {MAX98390_PCM_TX_EN_A, 0x00},
46 {MAX98390_PCM_TX_EN_B, 0x00},
47 {MAX98390_PCM_TX_HIZ_CTRL_A, 0xff},
48 {MAX98390_PCM_TX_HIZ_CTRL_B, 0xff},
49 {MAX98390_PCM_CH_SRC_1, 0x00},
50 {MAX98390_PCM_CH_SRC_2, 0x00},
51 {MAX98390_PCM_CH_SRC_3, 0x00},
52 {MAX98390_PCM_MODE_CFG, 0xc0},
53 {MAX98390_PCM_MASTER_MODE, 0x1c},
54 {MAX98390_PCM_CLK_SETUP, 0x44},
55 {MAX98390_PCM_SR_SETUP, 0x08},
56 {MAX98390_ICC_RX_EN_A, 0x00},
57 {MAX98390_ICC_RX_EN_B, 0x00},
58 {MAX98390_ICC_TX_EN_A, 0x00},
59 {MAX98390_ICC_TX_EN_B, 0x00},
60 {MAX98390_ICC_HIZ_MANUAL_MODE, 0x00},
61 {MAX98390_ICC_TX_HIZ_EN_A, 0x00},
62 {MAX98390_ICC_TX_HIZ_EN_B, 0x00},
63 {MAX98390_ICC_LNK_EN, 0x00},
64 {MAX98390_R2039_AMP_DSP_CFG, 0x0f},
65 {MAX98390_R203A_AMP_EN, 0x81},
66 {MAX98390_TONE_GEN_DC_CFG, 0x00},
67 {MAX98390_SPK_SRC_SEL, 0x00},
68 {MAX98390_SSM_CFG, 0x85},
69 {MAX98390_MEAS_EN, 0x03},
70 {MAX98390_MEAS_DSP_CFG, 0x0f},
71 {MAX98390_BOOST_CTRL0, 0x1c},
72 {MAX98390_BOOST_CTRL3, 0x01},
73 {MAX98390_BOOST_CTRL1, 0x40},
74 {MAX98390_MEAS_ADC_CFG, 0x07},
75 {MAX98390_MEAS_ADC_BASE_MSB, 0x00},
76 {MAX98390_MEAS_ADC_BASE_LSB, 0x23},
77 {MAX98390_ADC_CH0_DIVIDE, 0x00},
78 {MAX98390_ADC_CH1_DIVIDE, 0x00},
79 {MAX98390_ADC_CH2_DIVIDE, 0x00},
80 {MAX98390_ADC_CH0_FILT_CFG, 0x00},
81 {MAX98390_ADC_CH1_FILT_CFG, 0x00},
82 {MAX98390_ADC_CH2_FILT_CFG, 0x00},
83 {MAX98390_PWR_GATE_CTL, 0x2c},
84 {MAX98390_BROWNOUT_EN, 0x00},
85 {MAX98390_BROWNOUT_INFINITE_HOLD, 0x00},
86 {MAX98390_BROWNOUT_INFINITE_HOLD_CLR, 0x00},
87 {MAX98390_BROWNOUT_LVL_HOLD, 0x00},
88 {MAX98390_BROWNOUT_LVL1_THRESH, 0x00},
89 {MAX98390_BROWNOUT_LVL2_THRESH, 0x00},
90 {MAX98390_BROWNOUT_LVL3_THRESH, 0x00},
91 {MAX98390_BROWNOUT_LVL4_THRESH, 0x00},
92 {MAX98390_BROWNOUT_THRESH_HYSTERYSIS, 0x00},
93 {MAX98390_BROWNOUT_AMP_LIMITER_ATK_REL, 0x1f},
94 {MAX98390_BROWNOUT_AMP_GAIN_ATK_REL, 0x00},
95 {MAX98390_BROWNOUT_AMP1_CLIP_MODE, 0x00},
96 {MAX98390_BROWNOUT_LVL1_CUR_LIMIT, 0x00},
97 {MAX98390_BROWNOUT_LVL1_AMP1_CTRL1, 0x00},
98 {MAX98390_BROWNOUT_LVL1_AMP1_CTRL2, 0x00},
99 {MAX98390_BROWNOUT_LVL1_AMP1_CTRL3, 0x00},
100 {MAX98390_BROWNOUT_LVL2_CUR_LIMIT, 0x00},
101 {MAX98390_BROWNOUT_LVL2_AMP1_CTRL1, 0x00},
102 {MAX98390_BROWNOUT_LVL2_AMP1_CTRL2, 0x00},
103 {MAX98390_BROWNOUT_LVL2_AMP1_CTRL3, 0x00},
104 {MAX98390_BROWNOUT_LVL3_CUR_LIMIT, 0x00},
105 {MAX98390_BROWNOUT_LVL3_AMP1_CTRL1, 0x00},
106 {MAX98390_BROWNOUT_LVL3_AMP1_CTRL2, 0x00},
107 {MAX98390_BROWNOUT_LVL3_AMP1_CTRL3, 0x00},
108 {MAX98390_BROWNOUT_LVL4_CUR_LIMIT, 0x00},
109 {MAX98390_BROWNOUT_LVL4_AMP1_CTRL1, 0x00},
110 {MAX98390_BROWNOUT_LVL4_AMP1_CTRL2, 0x00},
111 {MAX98390_BROWNOUT_LVL4_AMP1_CTRL3, 0x00},
112 {MAX98390_BROWNOUT_ILIM_HLD, 0x00},
113 {MAX98390_BROWNOUT_LIM_HLD, 0x00},
114 {MAX98390_BROWNOUT_CLIP_HLD, 0x00},
115 {MAX98390_BROWNOUT_GAIN_HLD, 0x00},
116 {MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0f},
117 {MAX98390_ENV_TRACK_BOOST_VOUT_DELAY, 0x80},
118 {MAX98390_ENV_TRACK_REL_RATE, 0x07},
119 {MAX98390_ENV_TRACK_HOLD_RATE, 0x07},
120 {MAX98390_ENV_TRACK_CTRL, 0x01},
121 {MAX98390_BOOST_BYPASS1, 0x49},
122 {MAX98390_BOOST_BYPASS2, 0x2b},
123 {MAX98390_BOOST_BYPASS3, 0x08},
124 {MAX98390_FET_SCALING1, 0x00},
125 {MAX98390_FET_SCALING2, 0x03},
126 {MAX98390_FET_SCALING3, 0x00},
127 {MAX98390_FET_SCALING4, 0x07},
128 {MAX98390_SPK_SPEEDUP, 0x00},
129 {DSMIG_WB_DRC_RELEASE_TIME_1, 0x00},
130 {DSMIG_WB_DRC_RELEASE_TIME_2, 0x00},
131 {DSMIG_WB_DRC_ATTACK_TIME_1, 0x00},
132 {DSMIG_WB_DRC_ATTACK_TIME_2, 0x00},
133 {DSMIG_WB_DRC_COMPRESSION_RATIO, 0x00},
134 {DSMIG_WB_DRC_COMPRESSION_THRESHOLD, 0x00},
135 {DSMIG_WB_DRC_MAKEUPGAIN, 0x00},
136 {DSMIG_WB_DRC_NOISE_GATE_THRESHOLD, 0x00},
137 {DSMIG_WBDRC_HPF_ENABLE, 0x00},
138 {DSMIG_WB_DRC_TEST_SMOOTHER_OUT_EN, 0x00},
139 {DSMIG_PPR_THRESHOLD, 0x00},
140 {DSM_STEREO_BASS_CHANNEL_SELECT, 0x00},
141 {DSM_TPROT_THRESHOLD_BYTE0, 0x00},
142 {DSM_TPROT_THRESHOLD_BYTE1, 0x00},
143 {DSM_TPROT_ROOM_TEMPERATURE_BYTE0, 0x00},
144 {DSM_TPROT_ROOM_TEMPERATURE_BYTE1, 0x00},
145 {DSM_TPROT_RECIP_RDC_ROOM_BYTE0, 0x00},
146 {DSM_TPROT_RECIP_RDC_ROOM_BYTE1, 0x00},
147 {DSM_TPROT_RECIP_RDC_ROOM_BYTE2, 0x00},
148 {DSM_TPROT_RECIP_TCONST_BYTE0, 0x00},
149 {DSM_TPROT_RECIP_TCONST_BYTE1, 0x00},
150 {DSM_TPROT_RECIP_TCONST_BYTE2, 0x00},
151 {DSM_THERMAL_ATTENUATION_SETTINGS, 0x00},
152 {DSM_THERMAL_PILOT_TONE_ATTENUATION, 0x00},
153 {DSM_TPROT_PG_TEMP_THRESH_BYTE0, 0x00},
154 {DSM_TPROT_PG_TEMP_THRESH_BYTE1, 0x00},
155 {DSMIG_DEBUZZER_THRESHOLD, 0x00},
156 {DSMIG_DEBUZZER_ALPHA_COEF_TEST_ONLY, 0x08},
158 {DSM_VOL_CTRL, 0xa0},
160 {MAX98390_R23E1_DSP_GLOBAL_EN, 0x00},
161 {MAX98390_R23FF_GLOBAL_EN, 0x00},
164 static int max98390_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
166 struct snd_soc_component *component = codec_dai->component;
167 struct max98390_priv *max98390 =
168 snd_soc_component_get_drvdata(component);
171 unsigned int invert = 0;
173 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
175 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
176 case SND_SOC_DAIFMT_CBC_CFC:
177 mode = MAX98390_PCM_MASTER_MODE_SLAVE;
179 case SND_SOC_DAIFMT_CBP_CFP:
180 max98390->provider = true;
181 mode = MAX98390_PCM_MASTER_MODE_MASTER;
184 dev_err(component->dev, "DAI clock mode unsupported\n");
188 regmap_update_bits(max98390->regmap,
189 MAX98390_PCM_MASTER_MODE,
190 MAX98390_PCM_MASTER_MODE_MASK,
193 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
194 case SND_SOC_DAIFMT_NB_NF:
196 case SND_SOC_DAIFMT_IB_NF:
197 invert = MAX98390_PCM_MODE_CFG_PCM_BCLKEDGE;
200 dev_err(component->dev, "DAI invert mode unsupported\n");
204 regmap_update_bits(max98390->regmap,
205 MAX98390_PCM_MODE_CFG,
206 MAX98390_PCM_MODE_CFG_PCM_BCLKEDGE,
209 /* interface format */
210 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
211 case SND_SOC_DAIFMT_I2S:
212 format = MAX98390_PCM_FORMAT_I2S;
214 case SND_SOC_DAIFMT_LEFT_J:
215 format = MAX98390_PCM_FORMAT_LJ;
217 case SND_SOC_DAIFMT_DSP_A:
218 format = MAX98390_PCM_FORMAT_TDM_MODE1;
220 case SND_SOC_DAIFMT_DSP_B:
221 format = MAX98390_PCM_FORMAT_TDM_MODE0;
227 regmap_update_bits(max98390->regmap,
228 MAX98390_PCM_MODE_CFG,
229 MAX98390_PCM_MODE_CFG_FORMAT_MASK,
230 format << MAX98390_PCM_MODE_CFG_FORMAT_SHIFT);
235 static int max98390_get_bclk_sel(int bclk)
238 /* BCLKs per LRCLK */
239 static int bclk_sel_table[] = {
240 32, 48, 64, 96, 128, 192, 256, 320, 384, 512,
242 /* match BCLKs per LRCLK */
243 for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) {
244 if (bclk_sel_table[i] == bclk)
250 static int max98390_set_clock(struct snd_soc_component *component,
251 struct snd_pcm_hw_params *params)
253 struct max98390_priv *max98390 =
254 snd_soc_component_get_drvdata(component);
255 /* codec MCLK rate in master mode */
256 static int rate_table[] = {
257 5644800, 6000000, 6144000, 6500000,
258 9600000, 11289600, 12000000, 12288000,
261 /* BCLK/LRCLK ratio calculation */
262 int blr_clk_ratio = params_channels(params)
263 * snd_pcm_format_width(params_format(params));
266 if (max98390->provider) {
268 /* match rate to closest value */
269 for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
270 if (rate_table[i] >= max98390->sysclk)
273 if (i == ARRAY_SIZE(rate_table)) {
274 dev_err(component->dev, "failed to find proper clock rate.\n");
278 regmap_update_bits(max98390->regmap,
279 MAX98390_PCM_MASTER_MODE,
280 MAX98390_PCM_MASTER_MODE_MCLK_MASK,
281 i << MAX98390_PCM_MASTER_MODE_MCLK_RATE_SHIFT);
284 if (!max98390->tdm_mode) {
285 /* BCLK configuration */
286 value = max98390_get_bclk_sel(blr_clk_ratio);
288 dev_err(component->dev, "format unsupported %d\n",
289 params_format(params));
293 regmap_update_bits(max98390->regmap,
294 MAX98390_PCM_CLK_SETUP,
295 MAX98390_PCM_CLK_SETUP_BSEL_MASK,
301 static int max98390_dai_hw_params(struct snd_pcm_substream *substream,
302 struct snd_pcm_hw_params *params,
303 struct snd_soc_dai *dai)
305 struct snd_soc_component *component =
307 struct max98390_priv *max98390 =
308 snd_soc_component_get_drvdata(component);
310 unsigned int sampling_rate;
311 unsigned int chan_sz;
313 /* pcm mode configuration */
314 switch (snd_pcm_format_width(params_format(params))) {
316 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16;
319 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24;
322 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32;
325 dev_err(component->dev, "format unsupported %d\n",
326 params_format(params));
330 regmap_update_bits(max98390->regmap,
331 MAX98390_PCM_MODE_CFG,
332 MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
334 dev_dbg(component->dev, "format supported %d",
335 params_format(params));
337 /* sampling rate configuration */
338 switch (params_rate(params)) {
340 sampling_rate = MAX98390_PCM_SR_SET1_SR_8000;
343 sampling_rate = MAX98390_PCM_SR_SET1_SR_11025;
346 sampling_rate = MAX98390_PCM_SR_SET1_SR_12000;
349 sampling_rate = MAX98390_PCM_SR_SET1_SR_16000;
352 sampling_rate = MAX98390_PCM_SR_SET1_SR_22050;
355 sampling_rate = MAX98390_PCM_SR_SET1_SR_24000;
358 sampling_rate = MAX98390_PCM_SR_SET1_SR_32000;
361 sampling_rate = MAX98390_PCM_SR_SET1_SR_44100;
364 sampling_rate = MAX98390_PCM_SR_SET1_SR_48000;
367 dev_err(component->dev, "rate %d not supported\n",
368 params_rate(params));
372 /* set DAI_SR to correct LRCLK frequency */
373 regmap_update_bits(max98390->regmap,
374 MAX98390_PCM_SR_SETUP,
375 MAX98390_PCM_SR_SET1_SR_MASK,
378 return max98390_set_clock(component, params);
383 static int max98390_dai_tdm_slot(struct snd_soc_dai *dai,
384 unsigned int tx_mask, unsigned int rx_mask,
385 int slots, int slot_width)
387 struct snd_soc_component *component = dai->component;
388 struct max98390_priv *max98390 =
389 snd_soc_component_get_drvdata(component);
392 unsigned int chan_sz;
394 if (!tx_mask && !rx_mask && !slots && !slot_width)
395 max98390->tdm_mode = false;
397 max98390->tdm_mode = true;
399 dev_dbg(component->dev,
400 "Tdm mode : %d\n", max98390->tdm_mode);
402 /* BCLK configuration */
403 bsel = max98390_get_bclk_sel(slots * slot_width);
405 dev_err(component->dev, "BCLK %d not supported\n",
410 regmap_update_bits(max98390->regmap,
411 MAX98390_PCM_CLK_SETUP,
412 MAX98390_PCM_CLK_SETUP_BSEL_MASK,
415 /* Channel size configuration */
416 switch (slot_width) {
418 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16;
421 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24;
424 chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32;
427 dev_err(component->dev, "format unsupported %d\n",
432 regmap_update_bits(max98390->regmap,
433 MAX98390_PCM_MODE_CFG,
434 MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
436 /* Rx slot configuration */
437 regmap_write(max98390->regmap,
438 MAX98390_PCM_RX_EN_A,
440 regmap_write(max98390->regmap,
441 MAX98390_PCM_RX_EN_B,
442 (rx_mask & 0xFF00) >> 8);
444 /* Tx slot Hi-Z configuration */
445 regmap_write(max98390->regmap,
446 MAX98390_PCM_TX_HIZ_CTRL_A,
448 regmap_write(max98390->regmap,
449 MAX98390_PCM_TX_HIZ_CTRL_B,
450 (~tx_mask & 0xFF00) >> 8);
455 static int max98390_dai_set_sysclk(struct snd_soc_dai *dai,
456 int clk_id, unsigned int freq, int dir)
458 struct snd_soc_component *component = dai->component;
459 struct max98390_priv *max98390 =
460 snd_soc_component_get_drvdata(component);
462 max98390->sysclk = freq;
466 static const struct snd_soc_dai_ops max98390_dai_ops = {
467 .set_sysclk = max98390_dai_set_sysclk,
468 .set_fmt = max98390_dai_set_fmt,
469 .hw_params = max98390_dai_hw_params,
470 .set_tdm_slot = max98390_dai_tdm_slot,
473 static int max98390_dac_event(struct snd_soc_dapm_widget *w,
474 struct snd_kcontrol *kcontrol, int event)
476 struct snd_soc_component *component =
477 snd_soc_dapm_to_component(w->dapm);
478 struct max98390_priv *max98390 =
479 snd_soc_component_get_drvdata(component);
482 case SND_SOC_DAPM_POST_PMU:
483 regmap_update_bits(max98390->regmap,
484 MAX98390_R203A_AMP_EN,
485 MAX98390_AMP_EN_MASK, 1);
486 regmap_update_bits(max98390->regmap,
487 MAX98390_R23FF_GLOBAL_EN,
488 MAX98390_GLOBAL_EN_MASK, 1);
490 case SND_SOC_DAPM_POST_PMD:
491 regmap_update_bits(max98390->regmap,
492 MAX98390_R23FF_GLOBAL_EN,
493 MAX98390_GLOBAL_EN_MASK, 0);
494 regmap_update_bits(max98390->regmap,
495 MAX98390_R203A_AMP_EN,
496 MAX98390_AMP_EN_MASK, 0);
502 static const char * const max98390_switch_text[] = {
503 "Left", "Right", "LeftRight"};
505 static const char * const max98390_boost_voltage_text[] = {
506 "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
507 "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
508 "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
509 "9.5V", "9.625V", "9.75V", "9.875V", "10V"
512 static SOC_ENUM_SINGLE_DECL(max98390_boost_voltage,
513 MAX98390_BOOST_CTRL0, 0,
514 max98390_boost_voltage_text);
516 static DECLARE_TLV_DB_SCALE(max98390_spk_tlv, 300, 300, 0);
517 static DECLARE_TLV_DB_SCALE(max98390_digital_tlv, -8000, 50, 0);
519 static const char * const max98390_current_limit_text[] = {
520 "0.00A", "0.50A", "1.00A", "1.05A", "1.10A", "1.15A", "1.20A", "1.25A",
521 "1.30A", "1.35A", "1.40A", "1.45A", "1.50A", "1.55A", "1.60A", "1.65A",
522 "1.70A", "1.75A", "1.80A", "1.85A", "1.90A", "1.95A", "2.00A", "2.05A",
523 "2.10A", "2.15A", "2.20A", "2.25A", "2.30A", "2.35A", "2.40A", "2.45A",
524 "2.50A", "2.55A", "2.60A", "2.65A", "2.70A", "2.75A", "2.80A", "2.85A",
525 "2.90A", "2.95A", "3.00A", "3.05A", "3.10A", "3.15A", "3.20A", "3.25A",
526 "3.30A", "3.35A", "3.40A", "3.45A", "3.50A", "3.55A", "3.60A", "3.65A",
527 "3.70A", "3.75A", "3.80A", "3.85A", "3.90A", "3.95A", "4.00A", "4.05A",
531 static SOC_ENUM_SINGLE_DECL(max98390_current_limit,
532 MAX98390_BOOST_CTRL1, 0,
533 max98390_current_limit_text);
535 static int max98390_ref_rdc_put(struct snd_kcontrol *kcontrol,
536 struct snd_ctl_elem_value *ucontrol)
538 struct snd_soc_component *component =
539 snd_soc_kcontrol_component(kcontrol);
540 struct max98390_priv *max98390 =
541 snd_soc_component_get_drvdata(component);
543 max98390->ref_rdc_value = ucontrol->value.integer.value[0];
545 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0,
546 max98390->ref_rdc_value & 0x000000ff);
547 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1,
548 (max98390->ref_rdc_value >> 8) & 0x000000ff);
549 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2,
550 (max98390->ref_rdc_value >> 16) & 0x000000ff);
555 static int max98390_ref_rdc_get(struct snd_kcontrol *kcontrol,
556 struct snd_ctl_elem_value *ucontrol)
558 struct snd_soc_component *component =
559 snd_soc_kcontrol_component(kcontrol);
560 struct max98390_priv *max98390 =
561 snd_soc_component_get_drvdata(component);
563 ucontrol->value.integer.value[0] = max98390->ref_rdc_value;
568 static int max98390_ambient_temp_put(struct snd_kcontrol *kcontrol,
569 struct snd_ctl_elem_value *ucontrol)
571 struct snd_soc_component *component =
572 snd_soc_kcontrol_component(kcontrol);
573 struct max98390_priv *max98390 =
574 snd_soc_component_get_drvdata(component);
576 max98390->ambient_temp_value = ucontrol->value.integer.value[0];
578 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1,
579 (max98390->ambient_temp_value >> 8) & 0x000000ff);
580 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0,
581 (max98390->ambient_temp_value) & 0x000000ff);
586 static int max98390_ambient_temp_get(struct snd_kcontrol *kcontrol,
587 struct snd_ctl_elem_value *ucontrol)
589 struct snd_soc_component *component =
590 snd_soc_kcontrol_component(kcontrol);
591 struct max98390_priv *max98390 =
592 snd_soc_component_get_drvdata(component);
594 ucontrol->value.integer.value[0] = max98390->ambient_temp_value;
599 static int max98390_adaptive_rdc_put(struct snd_kcontrol *kcontrol,
600 struct snd_ctl_elem_value *ucontrol)
602 struct snd_soc_component *component =
603 snd_soc_kcontrol_component(kcontrol);
605 dev_warn(component->dev, "Put adaptive rdc not supported\n");
610 static int max98390_adaptive_rdc_get(struct snd_kcontrol *kcontrol,
611 struct snd_ctl_elem_value *ucontrol)
614 struct snd_soc_component *component =
615 snd_soc_kcontrol_component(kcontrol);
616 struct max98390_priv *max98390 =
617 snd_soc_component_get_drvdata(component);
619 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc);
620 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc0);
621 ucontrol->value.integer.value[0] = rdc0 | rdc << 8;
626 static int max98390_dsm_calib_get(struct snd_kcontrol *kcontrol,
627 struct snd_ctl_elem_value *ucontrol)
633 static int max98390_dsm_calib_put(struct snd_kcontrol *kcontrol,
634 struct snd_ctl_elem_value *ucontrol)
636 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
637 struct max98390_priv *max98390 = snd_soc_component_get_drvdata(component);
638 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
639 unsigned int rdc, rdc_cal_result, rdc_integer, rdc_factor, temp, val;
641 snd_soc_dapm_mutex_lock(dapm);
643 regmap_read(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, &val);
645 /* Enable the codec for the duration of calibration readout */
646 regmap_update_bits(max98390->regmap, MAX98390_R203A_AMP_EN,
647 MAX98390_AMP_EN_MASK, 1);
648 regmap_update_bits(max98390->regmap, MAX98390_R23FF_GLOBAL_EN,
649 MAX98390_GLOBAL_EN_MASK, 1);
652 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc);
653 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc_cal_result);
654 regmap_read(max98390->regmap, MAX98390_MEAS_ADC_CH2_READ, &temp);
657 /* Disable the codec if it was disabled */
658 regmap_update_bits(max98390->regmap, MAX98390_R23FF_GLOBAL_EN,
659 MAX98390_GLOBAL_EN_MASK, 0);
660 regmap_update_bits(max98390->regmap, MAX98390_R203A_AMP_EN,
661 MAX98390_AMP_EN_MASK, 0);
664 snd_soc_dapm_mutex_unlock(dapm);
666 rdc_cal_result |= (rdc << 8) & 0x0000FFFF;
668 max98390->ref_rdc_value = 268435456U / rdc_cal_result;
670 max98390->ambient_temp_value = temp * 52 - 1188;
672 rdc_integer = rdc_cal_result * 937 / 65536;
673 rdc_factor = ((rdc_cal_result * 937 * 100) / 65536) - (rdc_integer * 100);
675 dev_info(component->dev,
676 "rdc resistance about %d.%02d ohm, reg=0x%X temp reg=0x%X\n",
677 rdc_integer, rdc_factor, rdc_cal_result, temp);
682 static const struct snd_kcontrol_new max98390_snd_controls[] = {
683 SOC_SINGLE_TLV("Digital Volume", DSM_VOL_CTRL,
685 max98390_digital_tlv),
686 SOC_SINGLE_TLV("Speaker Volume", MAX98390_R203D_SPK_GAIN,
689 SOC_SINGLE("Ramp Up Bypass Switch", MAX98390_R2039_AMP_DSP_CFG,
690 MAX98390_AMP_DSP_CFG_RMP_UP_SHIFT, 1, 0),
691 SOC_SINGLE("Ramp Down Bypass Switch", MAX98390_R2039_AMP_DSP_CFG,
692 MAX98390_AMP_DSP_CFG_RMP_DN_SHIFT, 1, 0),
693 SOC_SINGLE("Boost Clock Phase", MAX98390_BOOST_CTRL3,
694 MAX98390_BOOST_CLK_PHASE_CFG_SHIFT, 3, 0),
695 SOC_ENUM("Boost Output Voltage", max98390_boost_voltage),
696 SOC_ENUM("Current Limit", max98390_current_limit),
697 SOC_SINGLE_EXT("DSM Rdc", SND_SOC_NOPM, 0, 0xffffff, 0,
698 max98390_ref_rdc_get, max98390_ref_rdc_put),
699 SOC_SINGLE_EXT("DSM Ambient Temp", SND_SOC_NOPM, 0, 0xffff, 0,
700 max98390_ambient_temp_get, max98390_ambient_temp_put),
701 SOC_SINGLE_EXT("DSM Adaptive Rdc", SND_SOC_NOPM, 0, 0xffff, 0,
702 max98390_adaptive_rdc_get, max98390_adaptive_rdc_put),
703 SOC_SINGLE_EXT("DSM Calibration", SND_SOC_NOPM, 0, 1, 0,
704 max98390_dsm_calib_get, max98390_dsm_calib_put),
707 static const struct soc_enum dai_sel_enum =
708 SOC_ENUM_SINGLE(MAX98390_PCM_CH_SRC_1,
709 MAX98390_PCM_RX_CH_SRC_SHIFT,
710 3, max98390_switch_text);
712 static const struct snd_kcontrol_new max98390_dai_controls =
713 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
715 static const struct snd_soc_dapm_widget max98390_dapm_widgets[] = {
716 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback",
717 SND_SOC_NOPM, 0, 0, max98390_dac_event,
718 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
719 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
720 &max98390_dai_controls),
721 SND_SOC_DAPM_OUTPUT("BE_OUT"),
724 static const struct snd_soc_dapm_route max98390_audio_map[] = {
726 {"DAI Sel Mux", "Left", "Amp Enable"},
727 {"DAI Sel Mux", "Right", "Amp Enable"},
728 {"DAI Sel Mux", "LeftRight", "Amp Enable"},
729 {"BE_OUT", NULL, "DAI Sel Mux"},
732 static bool max98390_readable_register(struct device *dev, unsigned int reg)
735 case MAX98390_SOFTWARE_RESET ... MAX98390_INT_EN3:
736 case MAX98390_IRQ_CTRL ... MAX98390_WDOG_CTRL:
737 case MAX98390_MEAS_ADC_THERM_WARN_THRESH
738 ... MAX98390_BROWNOUT_INFINITE_HOLD:
739 case MAX98390_BROWNOUT_LVL_HOLD ... DSMIG_DEBUZZER_THRESHOLD:
740 case DSM_VOL_ENA ... MAX98390_R24FF_REV_ID:
747 static bool max98390_volatile_reg(struct device *dev, unsigned int reg)
750 case MAX98390_SOFTWARE_RESET ... MAX98390_INT_EN3:
751 case MAX98390_MEAS_ADC_CH0_READ ... MAX98390_MEAS_ADC_CH2_READ:
752 case MAX98390_PWR_GATE_STATUS ... MAX98390_BROWNOUT_STATUS:
753 case MAX98390_BROWNOUT_LOWEST_STATUS:
754 case MAX98390_ENV_TRACK_BOOST_VOUT_READ:
755 case DSM_STBASS_HPF_B0_BYTE0 ... DSM_DEBUZZER_ATTACK_TIME_BYTE2:
756 case THERMAL_RDC_RD_BACK_BYTE1 ... DSMIG_DEBUZZER_THRESHOLD:
757 case DSM_THERMAL_GAIN ... DSM_WBDRC_GAIN:
764 #define MAX98390_RATES SNDRV_PCM_RATE_8000_48000
766 #define MAX98390_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
767 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
769 static struct snd_soc_dai_driver max98390_dai[] = {
771 .name = "max98390-aif1",
773 .stream_name = "HiFi Playback",
776 .rates = MAX98390_RATES,
777 .formats = MAX98390_FORMATS,
780 .stream_name = "HiFi Capture",
783 .rates = MAX98390_RATES,
784 .formats = MAX98390_FORMATS,
786 .ops = &max98390_dai_ops,
790 static int max98390_dsm_init(struct snd_soc_component *component)
793 int param_size, param_start_addr;
795 const char *vendor, *product;
796 struct max98390_priv *max98390 =
797 snd_soc_component_get_drvdata(component);
798 const struct firmware *fw;
801 vendor = dmi_get_system_info(DMI_SYS_VENDOR);
802 product = dmi_get_system_info(DMI_PRODUCT_NAME);
804 if (!strcmp(max98390->dsm_param_name, "default")) {
805 if (vendor && product) {
806 snprintf(filename, sizeof(filename),
807 "/*(DEBLOBBED)*/", vendor, product);
809 sprintf(filename, "/*(DEBLOBBED)*/");
812 snprintf(filename, sizeof(filename), "%s",
813 max98390->dsm_param_name);
815 ret = reject_firmware(&fw, filename, component->dev);
817 ret = reject_firmware(&fw, "/*(DEBLOBBED)*/", component->dev);
819 ret = reject_firmware(&fw, "dsmpa/*(DEBLOBBED)*/",
826 dev_dbg(component->dev,
827 "max98390: param fw size %zd\n",
829 if (fw->size < MAX98390_DSM_PARAM_MIN_SIZE) {
830 dev_err(component->dev,
831 "param fw is invalid.\n");
835 dsm_param = (char *)fw->data;
836 param_start_addr = (dsm_param[0] & 0xff) | (dsm_param[1] & 0xff) << 8;
837 param_size = (dsm_param[2] & 0xff) | (dsm_param[3] & 0xff) << 8;
838 if (param_size > MAX98390_DSM_PARAM_MAX_SIZE ||
839 param_start_addr < MAX98390_IRQ_CTRL ||
840 fw->size < param_size + MAX98390_DSM_PAYLOAD_OFFSET) {
841 dev_err(component->dev,
842 "param fw is invalid.\n");
846 regmap_write(max98390->regmap, MAX98390_R203A_AMP_EN, 0x80);
847 dsm_param += MAX98390_DSM_PAYLOAD_OFFSET;
848 regmap_bulk_write(max98390->regmap, param_start_addr,
849 dsm_param, param_size);
850 regmap_write(max98390->regmap, MAX98390_R23E1_DSP_GLOBAL_EN, 0x01);
853 release_firmware(fw);
858 static void max98390_init_regs(struct snd_soc_component *component)
860 struct max98390_priv *max98390 =
861 snd_soc_component_get_drvdata(component);
863 regmap_write(max98390->regmap, MAX98390_CLK_MON, 0x6f);
864 regmap_write(max98390->regmap, MAX98390_DAT_MON, 0x00);
865 regmap_write(max98390->regmap, MAX98390_PWR_GATE_CTL, 0x00);
866 regmap_write(max98390->regmap, MAX98390_PCM_RX_EN_A, 0x03);
867 regmap_write(max98390->regmap, MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0e);
868 regmap_write(max98390->regmap, MAX98390_BOOST_BYPASS1, 0x46);
869 regmap_write(max98390->regmap, MAX98390_FET_SCALING3, 0x03);
871 /* voltage, current slot configuration */
872 regmap_write(max98390->regmap,
873 MAX98390_PCM_CH_SRC_2,
874 (max98390->i_l_slot << 4 |
875 max98390->v_l_slot)&0xFF);
877 if (max98390->v_l_slot < 8) {
878 regmap_update_bits(max98390->regmap,
879 MAX98390_PCM_TX_HIZ_CTRL_A,
880 1 << max98390->v_l_slot, 0);
881 regmap_update_bits(max98390->regmap,
882 MAX98390_PCM_TX_EN_A,
883 1 << max98390->v_l_slot,
884 1 << max98390->v_l_slot);
886 regmap_update_bits(max98390->regmap,
887 MAX98390_PCM_TX_HIZ_CTRL_B,
888 1 << (max98390->v_l_slot - 8), 0);
889 regmap_update_bits(max98390->regmap,
890 MAX98390_PCM_TX_EN_B,
891 1 << (max98390->v_l_slot - 8),
892 1 << (max98390->v_l_slot - 8));
895 if (max98390->i_l_slot < 8) {
896 regmap_update_bits(max98390->regmap,
897 MAX98390_PCM_TX_HIZ_CTRL_A,
898 1 << max98390->i_l_slot, 0);
899 regmap_update_bits(max98390->regmap,
900 MAX98390_PCM_TX_EN_A,
901 1 << max98390->i_l_slot,
902 1 << max98390->i_l_slot);
904 regmap_update_bits(max98390->regmap,
905 MAX98390_PCM_TX_HIZ_CTRL_B,
906 1 << (max98390->i_l_slot - 8), 0);
907 regmap_update_bits(max98390->regmap,
908 MAX98390_PCM_TX_EN_B,
909 1 << (max98390->i_l_slot - 8),
910 1 << (max98390->i_l_slot - 8));
914 static int max98390_probe(struct snd_soc_component *component)
916 struct max98390_priv *max98390 =
917 snd_soc_component_get_drvdata(component);
919 regmap_write(max98390->regmap, MAX98390_SOFTWARE_RESET, 0x01);
920 /* Sleep reset settle time */
923 /* Amp init setting */
924 max98390_init_regs(component);
925 /* Update dsm bin param */
926 max98390_dsm_init(component);
929 if (max98390->ref_rdc_value) {
930 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0,
931 max98390->ref_rdc_value & 0x000000ff);
932 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1,
933 (max98390->ref_rdc_value >> 8) & 0x000000ff);
934 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2,
935 (max98390->ref_rdc_value >> 16) & 0x000000ff);
937 if (max98390->ambient_temp_value) {
938 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1,
939 (max98390->ambient_temp_value >> 8) & 0x000000ff);
940 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0,
941 (max98390->ambient_temp_value) & 0x000000ff);
947 #ifdef CONFIG_PM_SLEEP
948 static int max98390_suspend(struct device *dev)
950 struct max98390_priv *max98390 = dev_get_drvdata(dev);
952 dev_dbg(dev, "%s:Enter\n", __func__);
954 regcache_cache_only(max98390->regmap, true);
955 regcache_mark_dirty(max98390->regmap);
960 static int max98390_resume(struct device *dev)
962 struct max98390_priv *max98390 = dev_get_drvdata(dev);
964 dev_dbg(dev, "%s:Enter\n", __func__);
966 regcache_cache_only(max98390->regmap, false);
967 regcache_sync(max98390->regmap);
973 static const struct dev_pm_ops max98390_pm = {
974 SET_SYSTEM_SLEEP_PM_OPS(max98390_suspend, max98390_resume)
977 static const struct snd_soc_component_driver soc_codec_dev_max98390 = {
978 .probe = max98390_probe,
979 .controls = max98390_snd_controls,
980 .num_controls = ARRAY_SIZE(max98390_snd_controls),
981 .dapm_widgets = max98390_dapm_widgets,
982 .num_dapm_widgets = ARRAY_SIZE(max98390_dapm_widgets),
983 .dapm_routes = max98390_audio_map,
984 .num_dapm_routes = ARRAY_SIZE(max98390_audio_map),
986 .use_pmdown_time = 1,
990 static const struct regmap_config max98390_regmap = {
993 .max_register = MAX98390_R24FF_REV_ID,
994 .reg_defaults = max98390_reg_defaults,
995 .num_reg_defaults = ARRAY_SIZE(max98390_reg_defaults),
996 .readable_reg = max98390_readable_register,
997 .volatile_reg = max98390_volatile_reg,
998 .cache_type = REGCACHE_RBTREE,
1001 static void max98390_slot_config(struct i2c_client *i2c,
1002 struct max98390_priv *max98390)
1005 struct device *dev = &i2c->dev;
1007 if (!device_property_read_u32(dev, "maxim,vmon-slot-no", &value))
1008 max98390->v_l_slot = value & 0xF;
1010 max98390->v_l_slot = 0;
1012 if (!device_property_read_u32(dev, "maxim,imon-slot-no", &value))
1013 max98390->i_l_slot = value & 0xF;
1015 max98390->i_l_slot = 1;
1018 static int max98390_i2c_probe(struct i2c_client *i2c)
1023 struct max98390_priv *max98390 = NULL;
1024 struct i2c_adapter *adapter = i2c->adapter;
1025 struct gpio_desc *reset_gpio;
1027 ret = i2c_check_functionality(adapter,
1029 | I2C_FUNC_SMBUS_BYTE_DATA);
1031 dev_err(&i2c->dev, "I2C check functionality failed\n");
1035 max98390 = devm_kzalloc(&i2c->dev, sizeof(*max98390), GFP_KERNEL);
1040 i2c_set_clientdata(i2c, max98390);
1042 ret = device_property_read_u32(&i2c->dev, "maxim,temperature_calib",
1043 &max98390->ambient_temp_value);
1046 "no optional property 'temperature_calib' found, default:\n");
1048 ret = device_property_read_u32(&i2c->dev, "maxim,r0_calib",
1049 &max98390->ref_rdc_value);
1052 "no optional property 'r0_calib' found, default:\n");
1056 "%s: r0_calib: 0x%x,temperature_calib: 0x%x",
1057 __func__, max98390->ref_rdc_value,
1058 max98390->ambient_temp_value);
1060 ret = device_property_read_string(&i2c->dev, "maxim,dsm_param_name",
1061 &max98390->dsm_param_name);
1063 max98390->dsm_param_name = "default";
1065 /* voltage/current slot configuration */
1066 max98390_slot_config(i2c, max98390);
1068 /* regmap initialization */
1069 max98390->regmap = devm_regmap_init_i2c(i2c, &max98390_regmap);
1070 if (IS_ERR(max98390->regmap)) {
1071 ret = PTR_ERR(max98390->regmap);
1073 "Failed to allocate regmap: %d\n", ret);
1077 reset_gpio = devm_gpiod_get_optional(&i2c->dev,
1078 "reset", GPIOD_OUT_HIGH);
1080 /* Power on device */
1082 usleep_range(1000, 2000);
1083 /* bring out of reset */
1084 gpiod_set_value_cansleep(reset_gpio, 0);
1085 usleep_range(1000, 2000);
1088 /* Check Revision ID */
1089 ret = regmap_read(max98390->regmap,
1090 MAX98390_R24FF_REV_ID, ®);
1093 "ret=%d, Failed to read: 0x%02X\n",
1094 ret, MAX98390_R24FF_REV_ID);
1097 dev_info(&i2c->dev, "MAX98390 revisionID: 0x%02X\n", reg);
1099 ret = devm_snd_soc_register_component(&i2c->dev,
1100 &soc_codec_dev_max98390,
1101 max98390_dai, ARRAY_SIZE(max98390_dai));
1106 static const struct i2c_device_id max98390_i2c_id[] = {
1111 MODULE_DEVICE_TABLE(i2c, max98390_i2c_id);
1113 #if defined(CONFIG_OF)
1114 static const struct of_device_id max98390_of_match[] = {
1115 { .compatible = "maxim,max98390", },
1118 MODULE_DEVICE_TABLE(of, max98390_of_match);
1122 static const struct acpi_device_id max98390_acpi_match[] = {
1126 MODULE_DEVICE_TABLE(acpi, max98390_acpi_match);
1129 static struct i2c_driver max98390_i2c_driver = {
1132 .of_match_table = of_match_ptr(max98390_of_match),
1133 .acpi_match_table = ACPI_PTR(max98390_acpi_match),
1136 .probe = max98390_i2c_probe,
1137 .id_table = max98390_i2c_id,
1140 module_i2c_driver(max98390_i2c_driver)
1142 MODULE_DESCRIPTION("ALSA SoC MAX98390 driver");
1143 MODULE_AUTHOR("Steve Lee <steves.lee@maximintegrated.com>");
1144 MODULE_LICENSE("GPL");