1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * max98927.c -- MAX98927 ALSA Soc Audio driver
5 * Copyright (C) 2016-2017 Maxim Integrated Products
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/consumer.h>
19 #include <sound/tlv.h>
22 static struct reg_default max98927_reg[] = {
23 {MAX98927_R0001_INT_RAW1, 0x00},
24 {MAX98927_R0002_INT_RAW2, 0x00},
25 {MAX98927_R0003_INT_RAW3, 0x00},
26 {MAX98927_R0004_INT_STATE1, 0x00},
27 {MAX98927_R0005_INT_STATE2, 0x00},
28 {MAX98927_R0006_INT_STATE3, 0x00},
29 {MAX98927_R0007_INT_FLAG1, 0x00},
30 {MAX98927_R0008_INT_FLAG2, 0x00},
31 {MAX98927_R0009_INT_FLAG3, 0x00},
32 {MAX98927_R000A_INT_EN1, 0x00},
33 {MAX98927_R000B_INT_EN2, 0x00},
34 {MAX98927_R000C_INT_EN3, 0x00},
35 {MAX98927_R000D_INT_FLAG_CLR1, 0x00},
36 {MAX98927_R000E_INT_FLAG_CLR2, 0x00},
37 {MAX98927_R000F_INT_FLAG_CLR3, 0x00},
38 {MAX98927_R0010_IRQ_CTRL, 0x00},
39 {MAX98927_R0011_CLK_MON, 0x00},
40 {MAX98927_R0012_WDOG_CTRL, 0x00},
41 {MAX98927_R0013_WDOG_RST, 0x00},
42 {MAX98927_R0014_MEAS_ADC_THERM_WARN_THRESH, 0x75},
43 {MAX98927_R0015_MEAS_ADC_THERM_SHDN_THRESH, 0x8c},
44 {MAX98927_R0016_MEAS_ADC_THERM_HYSTERESIS, 0x08},
45 {MAX98927_R0017_PIN_CFG, 0x55},
46 {MAX98927_R0018_PCM_RX_EN_A, 0x00},
47 {MAX98927_R0019_PCM_RX_EN_B, 0x00},
48 {MAX98927_R001A_PCM_TX_EN_A, 0x00},
49 {MAX98927_R001B_PCM_TX_EN_B, 0x00},
50 {MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 0x00},
51 {MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 0x00},
52 {MAX98927_R001E_PCM_TX_CH_SRC_A, 0x00},
53 {MAX98927_R001F_PCM_TX_CH_SRC_B, 0x00},
54 {MAX98927_R0020_PCM_MODE_CFG, 0x40},
55 {MAX98927_R0021_PCM_MASTER_MODE, 0x00},
56 {MAX98927_R0022_PCM_CLK_SETUP, 0x22},
57 {MAX98927_R0023_PCM_SR_SETUP1, 0x00},
58 {MAX98927_R0024_PCM_SR_SETUP2, 0x00},
59 {MAX98927_R0025_PCM_TO_SPK_MONOMIX_A, 0x00},
60 {MAX98927_R0026_PCM_TO_SPK_MONOMIX_B, 0x00},
61 {MAX98927_R0027_ICC_RX_EN_A, 0x00},
62 {MAX98927_R0028_ICC_RX_EN_B, 0x00},
63 {MAX98927_R002B_ICC_TX_EN_A, 0x00},
64 {MAX98927_R002C_ICC_TX_EN_B, 0x00},
65 {MAX98927_R002E_ICC_HIZ_MANUAL_MODE, 0x00},
66 {MAX98927_R002F_ICC_TX_HIZ_EN_A, 0x00},
67 {MAX98927_R0030_ICC_TX_HIZ_EN_B, 0x00},
68 {MAX98927_R0031_ICC_LNK_EN, 0x00},
69 {MAX98927_R0032_PDM_TX_EN, 0x00},
70 {MAX98927_R0033_PDM_TX_HIZ_CTRL, 0x00},
71 {MAX98927_R0034_PDM_TX_CTRL, 0x00},
72 {MAX98927_R0035_PDM_RX_CTRL, 0x00},
73 {MAX98927_R0036_AMP_VOL_CTRL, 0x00},
74 {MAX98927_R0037_AMP_DSP_CFG, 0x02},
75 {MAX98927_R0038_TONE_GEN_DC_CFG, 0x00},
76 {MAX98927_R0039_DRE_CTRL, 0x01},
77 {MAX98927_R003A_AMP_EN, 0x00},
78 {MAX98927_R003B_SPK_SRC_SEL, 0x00},
79 {MAX98927_R003C_SPK_GAIN, 0x00},
80 {MAX98927_R003D_SSM_CFG, 0x04},
81 {MAX98927_R003E_MEAS_EN, 0x00},
82 {MAX98927_R003F_MEAS_DSP_CFG, 0x04},
83 {MAX98927_R0040_BOOST_CTRL0, 0x00},
84 {MAX98927_R0041_BOOST_CTRL3, 0x00},
85 {MAX98927_R0042_BOOST_CTRL1, 0x00},
86 {MAX98927_R0043_MEAS_ADC_CFG, 0x00},
87 {MAX98927_R0044_MEAS_ADC_BASE_MSB, 0x01},
88 {MAX98927_R0045_MEAS_ADC_BASE_LSB, 0x00},
89 {MAX98927_R0046_ADC_CH0_DIVIDE, 0x00},
90 {MAX98927_R0047_ADC_CH1_DIVIDE, 0x00},
91 {MAX98927_R0048_ADC_CH2_DIVIDE, 0x00},
92 {MAX98927_R0049_ADC_CH0_FILT_CFG, 0x00},
93 {MAX98927_R004A_ADC_CH1_FILT_CFG, 0x00},
94 {MAX98927_R004B_ADC_CH2_FILT_CFG, 0x00},
95 {MAX98927_R004C_MEAS_ADC_CH0_READ, 0x00},
96 {MAX98927_R004D_MEAS_ADC_CH1_READ, 0x00},
97 {MAX98927_R004E_MEAS_ADC_CH2_READ, 0x00},
98 {MAX98927_R0051_BROWNOUT_STATUS, 0x00},
99 {MAX98927_R0052_BROWNOUT_EN, 0x00},
100 {MAX98927_R0053_BROWNOUT_INFINITE_HOLD, 0x00},
101 {MAX98927_R0054_BROWNOUT_INFINITE_HOLD_CLR, 0x00},
102 {MAX98927_R0055_BROWNOUT_LVL_HOLD, 0x00},
103 {MAX98927_R005A_BROWNOUT_LVL1_THRESH, 0x00},
104 {MAX98927_R005B_BROWNOUT_LVL2_THRESH, 0x00},
105 {MAX98927_R005C_BROWNOUT_LVL3_THRESH, 0x00},
106 {MAX98927_R005D_BROWNOUT_LVL4_THRESH, 0x00},
107 {MAX98927_R005E_BROWNOUT_THRESH_HYSTERYSIS, 0x00},
108 {MAX98927_R005F_BROWNOUT_AMP_LIMITER_ATK_REL, 0x00},
109 {MAX98927_R0060_BROWNOUT_AMP_GAIN_ATK_REL, 0x00},
110 {MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE, 0x00},
111 {MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT, 0x00},
112 {MAX98927_R0073_BROWNOUT_LVL1_AMP1_CTRL1, 0x00},
113 {MAX98927_R0074_BROWNOUT_LVL1_AMP1_CTRL2, 0x00},
114 {MAX98927_R0075_BROWNOUT_LVL1_AMP1_CTRL3, 0x00},
115 {MAX98927_R0076_BROWNOUT_LVL2_CUR_LIMIT, 0x00},
116 {MAX98927_R0077_BROWNOUT_LVL2_AMP1_CTRL1, 0x00},
117 {MAX98927_R0078_BROWNOUT_LVL2_AMP1_CTRL2, 0x00},
118 {MAX98927_R0079_BROWNOUT_LVL2_AMP1_CTRL3, 0x00},
119 {MAX98927_R007A_BROWNOUT_LVL3_CUR_LIMIT, 0x00},
120 {MAX98927_R007B_BROWNOUT_LVL3_AMP1_CTRL1, 0x00},
121 {MAX98927_R007C_BROWNOUT_LVL3_AMP1_CTRL2, 0x00},
122 {MAX98927_R007D_BROWNOUT_LVL3_AMP1_CTRL3, 0x00},
123 {MAX98927_R007E_BROWNOUT_LVL4_CUR_LIMIT, 0x00},
124 {MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1, 0x00},
125 {MAX98927_R0080_BROWNOUT_LVL4_AMP1_CTRL2, 0x00},
126 {MAX98927_R0081_BROWNOUT_LVL4_AMP1_CTRL3, 0x00},
127 {MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM, 0x00},
128 {MAX98927_R0083_ENV_TRACK_BOOST_VOUT_DELAY, 0x00},
129 {MAX98927_R0084_ENV_TRACK_REL_RATE, 0x00},
130 {MAX98927_R0085_ENV_TRACK_HOLD_RATE, 0x00},
131 {MAX98927_R0086_ENV_TRACK_CTRL, 0x00},
132 {MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ, 0x00},
133 {MAX98927_R00FF_GLOBAL_SHDN, 0x00},
134 {MAX98927_R0100_SOFT_RESET, 0x00},
135 {MAX98927_R01FF_REV_ID, 0x40},
138 static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
140 struct snd_soc_component *component = codec_dai->component;
141 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
142 unsigned int mode = 0;
143 unsigned int format = 0;
144 bool use_pdm = false;
145 unsigned int invert = 0;
147 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
149 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
150 case SND_SOC_DAIFMT_CBC_CFC:
151 max98927->provider = false;
152 mode = MAX98927_PCM_MASTER_MODE_SLAVE;
154 case SND_SOC_DAIFMT_CBP_CFP:
155 max98927->provider = true;
156 mode = MAX98927_PCM_MASTER_MODE_MASTER;
159 dev_err(component->dev, "DAI clock mode unsupported\n");
163 regmap_update_bits(max98927->regmap, MAX98927_R0021_PCM_MASTER_MODE,
164 MAX98927_PCM_MASTER_MODE_MASK, mode);
166 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
167 case SND_SOC_DAIFMT_NB_NF:
169 case SND_SOC_DAIFMT_IB_NF:
170 invert = MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE;
173 dev_err(component->dev, "DAI invert mode unsupported\n");
177 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG,
178 MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE, invert);
180 /* interface format */
181 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
182 case SND_SOC_DAIFMT_I2S:
183 format = MAX98927_PCM_FORMAT_I2S;
185 case SND_SOC_DAIFMT_LEFT_J:
186 format = MAX98927_PCM_FORMAT_LJ;
188 case SND_SOC_DAIFMT_DSP_A:
189 format = MAX98927_PCM_FORMAT_TDM_MODE1;
191 case SND_SOC_DAIFMT_DSP_B:
192 format = MAX98927_PCM_FORMAT_TDM_MODE0;
194 case SND_SOC_DAIFMT_PDM:
200 max98927->iface = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
203 /* pcm channel configuration */
204 regmap_update_bits(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A,
205 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN,
206 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN);
208 regmap_update_bits(max98927->regmap,
209 MAX98927_R0020_PCM_MODE_CFG,
210 MAX98927_PCM_MODE_CFG_FORMAT_MASK,
211 format << MAX98927_PCM_MODE_CFG_FORMAT_SHIFT);
213 regmap_update_bits(max98927->regmap, MAX98927_R003B_SPK_SRC_SEL,
214 MAX98927_SPK_SRC_MASK, 0);
216 regmap_update_bits(max98927->regmap, MAX98927_R0035_PDM_RX_CTRL,
217 MAX98927_PDM_RX_EN_MASK, 0);
219 /* pdm channel configuration */
220 regmap_update_bits(max98927->regmap, MAX98927_R0035_PDM_RX_CTRL,
221 MAX98927_PDM_RX_EN_MASK, 1);
223 regmap_update_bits(max98927->regmap, MAX98927_R003B_SPK_SRC_SEL,
224 MAX98927_SPK_SRC_MASK, 3);
226 regmap_update_bits(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A,
227 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN,
233 /* codec MCLK rate in master mode */
234 static const int rate_table[] = {
235 5644800, 6000000, 6144000, 6500000,
236 9600000, 11289600, 12000000, 12288000,
240 /* BCLKs per LRCLK */
241 static const int bclk_sel_table[] = {
242 32, 48, 64, 96, 128, 192, 256, 384, 512,
245 static int max98927_get_bclk_sel(int bclk)
248 /* match BCLKs per LRCLK */
249 for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) {
250 if (bclk_sel_table[i] == bclk)
255 static int max98927_set_clock(struct max98927_priv *max98927,
256 struct snd_pcm_hw_params *params)
258 struct snd_soc_component *component = max98927->component;
259 /* BCLK/LRCLK ratio calculation */
260 int blr_clk_ratio = params_channels(params) * max98927->ch_size;
263 if (max98927->provider) {
265 /* match rate to closest value */
266 for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
267 if (rate_table[i] >= max98927->sysclk)
270 if (i == ARRAY_SIZE(rate_table)) {
271 dev_err(component->dev, "failed to find proper clock rate.\n");
274 regmap_update_bits(max98927->regmap,
275 MAX98927_R0021_PCM_MASTER_MODE,
276 MAX98927_PCM_MASTER_MODE_MCLK_MASK,
277 i << MAX98927_PCM_MASTER_MODE_MCLK_RATE_SHIFT);
280 if (!max98927->tdm_mode) {
281 /* BCLK configuration */
282 value = max98927_get_bclk_sel(blr_clk_ratio);
284 dev_err(component->dev, "format unsupported %d\n",
285 params_format(params));
289 regmap_update_bits(max98927->regmap,
290 MAX98927_R0022_PCM_CLK_SETUP,
291 MAX98927_PCM_CLK_SETUP_BSEL_MASK, value);
296 static int max98927_dai_hw_params(struct snd_pcm_substream *substream,
297 struct snd_pcm_hw_params *params,
298 struct snd_soc_dai *dai)
300 struct snd_soc_component *component = dai->component;
301 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
302 unsigned int sampling_rate = 0;
303 unsigned int chan_sz = 0;
305 /* pcm mode configuration */
306 switch (snd_pcm_format_width(params_format(params))) {
308 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
311 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
314 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
317 dev_err(component->dev, "format unsupported %d\n",
318 params_format(params));
322 max98927->ch_size = snd_pcm_format_width(params_format(params));
324 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG,
325 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
327 dev_dbg(component->dev, "format supported %d",
328 params_format(params));
330 /* sampling rate configuration */
331 switch (params_rate(params)) {
333 sampling_rate = MAX98927_PCM_SR_SET1_SR_8000;
336 sampling_rate = MAX98927_PCM_SR_SET1_SR_11025;
339 sampling_rate = MAX98927_PCM_SR_SET1_SR_12000;
342 sampling_rate = MAX98927_PCM_SR_SET1_SR_16000;
345 sampling_rate = MAX98927_PCM_SR_SET1_SR_22050;
348 sampling_rate = MAX98927_PCM_SR_SET1_SR_24000;
351 sampling_rate = MAX98927_PCM_SR_SET1_SR_32000;
354 sampling_rate = MAX98927_PCM_SR_SET1_SR_44100;
357 sampling_rate = MAX98927_PCM_SR_SET1_SR_48000;
360 dev_err(component->dev, "rate %d not supported\n",
361 params_rate(params));
364 /* set DAI_SR to correct LRCLK frequency */
365 regmap_update_bits(max98927->regmap, MAX98927_R0023_PCM_SR_SETUP1,
366 MAX98927_PCM_SR_SET1_SR_MASK, sampling_rate);
367 regmap_update_bits(max98927->regmap, MAX98927_R0024_PCM_SR_SETUP2,
368 MAX98927_PCM_SR_SET2_SR_MASK,
369 sampling_rate << MAX98927_PCM_SR_SET2_SR_SHIFT);
371 /* set sampling rate of IV */
372 if (max98927->interleave_mode &&
373 sampling_rate > MAX98927_PCM_SR_SET1_SR_16000)
374 regmap_update_bits(max98927->regmap,
375 MAX98927_R0024_PCM_SR_SETUP2,
376 MAX98927_PCM_SR_SET2_IVADC_SR_MASK,
379 regmap_update_bits(max98927->regmap,
380 MAX98927_R0024_PCM_SR_SETUP2,
381 MAX98927_PCM_SR_SET2_IVADC_SR_MASK,
383 return max98927_set_clock(max98927, params);
388 static int max98927_dai_tdm_slot(struct snd_soc_dai *dai,
389 unsigned int tx_mask, unsigned int rx_mask,
390 int slots, int slot_width)
392 struct snd_soc_component *component = dai->component;
393 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
395 unsigned int chan_sz = 0;
397 max98927->tdm_mode = true;
399 /* BCLK configuration */
400 bsel = max98927_get_bclk_sel(slots * slot_width);
402 dev_err(component->dev, "BCLK %d not supported\n",
407 regmap_update_bits(max98927->regmap, MAX98927_R0022_PCM_CLK_SETUP,
408 MAX98927_PCM_CLK_SETUP_BSEL_MASK, bsel);
410 /* Channel size configuration */
411 switch (slot_width) {
413 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
416 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
419 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
422 dev_err(component->dev, "format unsupported %d\n",
427 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG,
428 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
430 /* Rx slot configuration */
431 regmap_write(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A,
433 regmap_write(max98927->regmap, MAX98927_R0019_PCM_RX_EN_B,
434 (rx_mask & 0xFF00) >> 8);
436 /* Tx slot configuration */
437 regmap_write(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A,
439 regmap_write(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B,
440 (tx_mask & 0xFF00) >> 8);
442 /* Tx slot Hi-Z configuration */
443 regmap_write(max98927->regmap, MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
445 regmap_write(max98927->regmap, MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
446 (~tx_mask & 0xFF00) >> 8);
451 #define MAX98927_RATES SNDRV_PCM_RATE_8000_48000
453 #define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
454 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
456 static int max98927_dai_set_sysclk(struct snd_soc_dai *dai,
457 int clk_id, unsigned int freq, int dir)
459 struct snd_soc_component *component = dai->component;
460 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
462 max98927->sysclk = freq;
466 static const struct snd_soc_dai_ops max98927_dai_ops = {
467 .set_sysclk = max98927_dai_set_sysclk,
468 .set_fmt = max98927_dai_set_fmt,
469 .hw_params = max98927_dai_hw_params,
470 .set_tdm_slot = max98927_dai_tdm_slot,
473 static int max98927_dac_event(struct snd_soc_dapm_widget *w,
474 struct snd_kcontrol *kcontrol, int event)
476 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
477 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
480 case SND_SOC_DAPM_PRE_PMU:
481 max98927->tdm_mode = false;
483 case SND_SOC_DAPM_POST_PMU:
484 regmap_update_bits(max98927->regmap, MAX98927_R003A_AMP_EN,
485 MAX98927_AMP_EN_MASK, 1);
486 regmap_update_bits(max98927->regmap, MAX98927_R00FF_GLOBAL_SHDN,
487 MAX98927_GLOBAL_EN_MASK, 1);
489 case SND_SOC_DAPM_POST_PMD:
490 regmap_update_bits(max98927->regmap, MAX98927_R00FF_GLOBAL_SHDN,
491 MAX98927_GLOBAL_EN_MASK, 0);
492 regmap_update_bits(max98927->regmap, MAX98927_R003A_AMP_EN,
493 MAX98927_AMP_EN_MASK, 0);
501 static const char * const max98927_switch_text[] = {
502 "Left", "Right", "LeftRight"};
504 static const struct soc_enum dai_sel_enum =
505 SOC_ENUM_SINGLE(MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,
506 MAX98927_PCM_TO_SPK_MONOMIX_CFG_SHIFT, 3,
507 max98927_switch_text);
509 static const struct snd_kcontrol_new max98927_dai_controls =
510 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
512 static const struct snd_kcontrol_new max98927_vi_control =
513 SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG, 2, 1, 0);
515 static const struct snd_soc_dapm_widget max98927_dapm_widgets[] = {
516 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", MAX98927_R003A_AMP_EN,
517 0, 0, max98927_dac_event,
518 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
519 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
520 &max98927_dai_controls),
521 SND_SOC_DAPM_OUTPUT("BE_OUT"),
522 SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0,
523 MAX98927_R003E_MEAS_EN, 0, 0),
524 SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
525 MAX98927_R003E_MEAS_EN, 1, 0),
526 SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0,
527 &max98927_vi_control),
528 SND_SOC_DAPM_SIGGEN("VMON"),
529 SND_SOC_DAPM_SIGGEN("IMON"),
532 static DECLARE_TLV_DB_SCALE(max98927_spk_tlv, 300, 300, 0);
533 static DECLARE_TLV_DB_SCALE(max98927_digital_tlv, -1600, 25, 0);
535 static bool max98927_readable_register(struct device *dev, unsigned int reg)
538 case MAX98927_R0001_INT_RAW1 ... MAX98927_R0028_ICC_RX_EN_B:
539 case MAX98927_R002B_ICC_TX_EN_A ... MAX98927_R002C_ICC_TX_EN_B:
540 case MAX98927_R002E_ICC_HIZ_MANUAL_MODE
541 ... MAX98927_R004E_MEAS_ADC_CH2_READ:
542 case MAX98927_R0051_BROWNOUT_STATUS
543 ... MAX98927_R0055_BROWNOUT_LVL_HOLD:
544 case MAX98927_R005A_BROWNOUT_LVL1_THRESH
545 ... MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE:
546 case MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT
547 ... MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ:
548 case MAX98927_R00FF_GLOBAL_SHDN:
549 case MAX98927_R0100_SOFT_RESET:
550 case MAX98927_R01FF_REV_ID:
557 static bool max98927_volatile_reg(struct device *dev, unsigned int reg)
560 case MAX98927_R0001_INT_RAW1 ... MAX98927_R0009_INT_FLAG3:
561 case MAX98927_R004C_MEAS_ADC_CH0_READ:
562 case MAX98927_R004D_MEAS_ADC_CH1_READ:
563 case MAX98927_R004E_MEAS_ADC_CH2_READ:
564 case MAX98927_R0051_BROWNOUT_STATUS:
565 case MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ:
566 case MAX98927_R01FF_REV_ID:
567 case MAX98927_R0100_SOFT_RESET:
574 static const char * const max98927_boost_voltage_text[] = {
575 "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
576 "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
577 "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
578 "9.5V", "9.625V", "9.75V", "9.875V", "10V"
581 static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage,
582 MAX98927_R0040_BOOST_CTRL0, 0,
583 max98927_boost_voltage_text);
585 static const char * const max98927_current_limit_text[] = {
586 "1.00A", "1.10A", "1.20A", "1.30A", "1.40A", "1.50A", "1.60A", "1.70A",
587 "1.80A", "1.90A", "2.00A", "2.10A", "2.20A", "2.30A", "2.40A", "2.50A",
588 "2.60A", "2.70A", "2.80A", "2.90A", "3.00A", "3.10A", "3.20A", "3.30A",
589 "3.40A", "3.50A", "3.60A", "3.70A", "3.80A", "3.90A", "4.00A", "4.10A"
592 static SOC_ENUM_SINGLE_DECL(max98927_current_limit,
593 MAX98927_R0042_BOOST_CTRL1, 1,
594 max98927_current_limit_text);
596 static const struct snd_kcontrol_new max98927_snd_controls[] = {
597 SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN, 0, 6, 0,
599 SOC_SINGLE_TLV("Digital Volume", MAX98927_R0036_AMP_VOL_CTRL,
600 0, (1 << MAX98927_AMP_VOL_WIDTH) - 1, 0,
601 max98927_digital_tlv),
602 SOC_SINGLE("Amp DSP Switch", MAX98927_R0052_BROWNOUT_EN,
603 MAX98927_BROWNOUT_DSP_SHIFT, 1, 0),
604 SOC_SINGLE("Ramp Switch", MAX98927_R0037_AMP_DSP_CFG,
605 MAX98927_AMP_DSP_CFG_RMP_SHIFT, 1, 0),
606 SOC_SINGLE("DRE Switch", MAX98927_R0039_DRE_CTRL, MAX98927_DRE_EN_SHIFT,
608 SOC_SINGLE("Volume Location Switch", MAX98927_R0036_AMP_VOL_CTRL,
609 MAX98927_AMP_VOL_SEL_SHIFT, 1, 0),
610 SOC_ENUM("Boost Output Voltage", max98927_boost_voltage),
611 SOC_ENUM("Current Limit", max98927_current_limit),
614 static const struct snd_soc_dapm_route max98927_audio_map[] = {
616 {"DAI Sel Mux", "Left", "Amp Enable"},
617 {"DAI Sel Mux", "Right", "Amp Enable"},
618 {"DAI Sel Mux", "LeftRight", "Amp Enable"},
619 {"BE_OUT", NULL, "DAI Sel Mux"},
621 { "VI Sense", "Switch", "VMON" },
622 { "VI Sense", "Switch", "IMON" },
623 { "Voltage Sense", NULL, "VI Sense" },
624 { "Current Sense", NULL, "VI Sense" },
627 static struct snd_soc_dai_driver max98927_dai[] = {
629 .name = "max98927-aif1",
631 .stream_name = "HiFi Playback",
634 .rates = MAX98927_RATES,
635 .formats = MAX98927_FORMATS,
638 .stream_name = "HiFi Capture",
641 .rates = MAX98927_RATES,
642 .formats = MAX98927_FORMATS,
644 .ops = &max98927_dai_ops,
648 static int max98927_probe(struct snd_soc_component *component)
650 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
652 max98927->component = component;
655 regmap_write(max98927->regmap, MAX98927_R0100_SOFT_RESET,
656 MAX98927_SOFT_RESET);
658 /* IV default slot configuration */
659 regmap_write(max98927->regmap, MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 0xFF);
660 regmap_write(max98927->regmap, MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 0xFF);
661 regmap_write(max98927->regmap, MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,
663 regmap_write(max98927->regmap, MAX98927_R0026_PCM_TO_SPK_MONOMIX_B,
665 /* Set inital volume (+13dB) */
666 regmap_write(max98927->regmap, MAX98927_R0036_AMP_VOL_CTRL, 0x38);
667 regmap_write(max98927->regmap, MAX98927_R003C_SPK_GAIN, 0x05);
668 /* Enable DC blocker */
669 regmap_write(max98927->regmap, MAX98927_R0037_AMP_DSP_CFG, 0x03);
670 /* Enable IMON VMON DC blocker */
671 regmap_write(max98927->regmap, MAX98927_R003F_MEAS_DSP_CFG, 0xF7);
672 /* Boost Output Voltage & Current limit */
673 regmap_write(max98927->regmap, MAX98927_R0040_BOOST_CTRL0, 0x1C);
674 regmap_write(max98927->regmap, MAX98927_R0042_BOOST_CTRL1, 0x3E);
675 /* Measurement ADC config */
676 regmap_write(max98927->regmap, MAX98927_R0043_MEAS_ADC_CFG, 0x04);
677 regmap_write(max98927->regmap, MAX98927_R0044_MEAS_ADC_BASE_MSB, 0x00);
678 regmap_write(max98927->regmap, MAX98927_R0045_MEAS_ADC_BASE_LSB, 0x24);
680 regmap_write(max98927->regmap, MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1,
682 /* Envelope Tracking configuration */
683 regmap_write(max98927->regmap, MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM,
685 regmap_write(max98927->regmap, MAX98927_R0086_ENV_TRACK_CTRL, 0x01);
686 regmap_write(max98927->regmap, MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ,
689 /* voltage, current slot configuration */
690 regmap_write(max98927->regmap, MAX98927_R001E_PCM_TX_CH_SRC_A,
691 (max98927->i_l_slot << MAX98927_PCM_TX_CH_SRC_A_I_SHIFT | max98927->v_l_slot) & 0xFF);
693 if (max98927->v_l_slot < 8) {
694 regmap_update_bits(max98927->regmap,
695 MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
696 1 << max98927->v_l_slot, 0);
697 regmap_update_bits(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A,
698 1 << max98927->v_l_slot,
699 1 << max98927->v_l_slot);
701 regmap_update_bits(max98927->regmap,
702 MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
703 1 << (max98927->v_l_slot - 8), 0);
704 regmap_update_bits(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B,
705 1 << (max98927->v_l_slot - 8),
706 1 << (max98927->v_l_slot - 8));
709 if (max98927->i_l_slot < 8) {
710 regmap_update_bits(max98927->regmap,
711 MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
712 1 << max98927->i_l_slot, 0);
713 regmap_update_bits(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A,
714 1 << max98927->i_l_slot,
715 1 << max98927->i_l_slot);
717 regmap_update_bits(max98927->regmap,
718 MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
719 1 << (max98927->i_l_slot - 8), 0);
720 regmap_update_bits(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B,
721 1 << (max98927->i_l_slot - 8),
722 1 << (max98927->i_l_slot - 8));
725 /* Set interleave mode */
726 if (max98927->interleave_mode)
727 regmap_update_bits(max98927->regmap,
728 MAX98927_R001F_PCM_TX_CH_SRC_B,
729 MAX98927_PCM_TX_CH_INTERLEAVE_MASK,
730 MAX98927_PCM_TX_CH_INTERLEAVE_MASK);
734 #ifdef CONFIG_PM_SLEEP
735 static int max98927_suspend(struct device *dev)
737 struct max98927_priv *max98927 = dev_get_drvdata(dev);
739 regcache_cache_only(max98927->regmap, true);
740 regcache_mark_dirty(max98927->regmap);
743 static int max98927_resume(struct device *dev)
745 struct max98927_priv *max98927 = dev_get_drvdata(dev);
747 regmap_write(max98927->regmap, MAX98927_R0100_SOFT_RESET,
748 MAX98927_SOFT_RESET);
749 regcache_cache_only(max98927->regmap, false);
750 regcache_sync(max98927->regmap);
755 static const struct dev_pm_ops max98927_pm = {
756 SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume)
759 static const struct snd_soc_component_driver soc_component_dev_max98927 = {
760 .probe = max98927_probe,
761 .controls = max98927_snd_controls,
762 .num_controls = ARRAY_SIZE(max98927_snd_controls),
763 .dapm_widgets = max98927_dapm_widgets,
764 .num_dapm_widgets = ARRAY_SIZE(max98927_dapm_widgets),
765 .dapm_routes = max98927_audio_map,
766 .num_dapm_routes = ARRAY_SIZE(max98927_audio_map),
768 .use_pmdown_time = 1,
772 static const struct regmap_config max98927_regmap = {
775 .max_register = MAX98927_R01FF_REV_ID,
776 .reg_defaults = max98927_reg,
777 .num_reg_defaults = ARRAY_SIZE(max98927_reg),
778 .readable_reg = max98927_readable_register,
779 .volatile_reg = max98927_volatile_reg,
780 .cache_type = REGCACHE_RBTREE,
783 static void max98927_slot_config(struct i2c_client *i2c,
784 struct max98927_priv *max98927)
787 struct device *dev = &i2c->dev;
789 if (!device_property_read_u32(dev, "vmon-slot-no", &value))
790 max98927->v_l_slot = value & 0xF;
792 max98927->v_l_slot = 0;
794 if (!device_property_read_u32(dev, "imon-slot-no", &value))
795 max98927->i_l_slot = value & 0xF;
797 max98927->i_l_slot = 1;
800 static int max98927_i2c_probe(struct i2c_client *i2c)
805 struct max98927_priv *max98927 = NULL;
807 max98927 = devm_kzalloc(&i2c->dev, sizeof(*max98927), GFP_KERNEL);
812 i2c_set_clientdata(i2c, max98927);
814 /* update interleave mode info */
815 if (of_property_read_bool(i2c->dev.of_node, "maxim,interleave-mode")) {
816 max98927->interleave_mode = true;
818 if (!of_property_read_u32(i2c->dev.of_node, "interleave_mode",
821 max98927->interleave_mode = true;
824 /* regmap initialization */
826 = devm_regmap_init_i2c(i2c, &max98927_regmap);
827 if (IS_ERR(max98927->regmap)) {
828 ret = PTR_ERR(max98927->regmap);
830 "Failed to allocate regmap: %d\n", ret);
834 max98927->reset_gpio = devm_gpiod_get_optional(&i2c->dev, "reset",
836 if (IS_ERR(max98927->reset_gpio)) {
837 ret = PTR_ERR(max98927->reset_gpio);
838 return dev_err_probe(&i2c->dev, ret, "failed to request GPIO reset pin");
841 if (max98927->reset_gpio) {
842 gpiod_set_value_cansleep(max98927->reset_gpio, 0);
843 /* Wait for i2c port to be ready */
844 usleep_range(5000, 6000);
847 /* Check Revision ID */
848 ret = regmap_read(max98927->regmap, MAX98927_R01FF_REV_ID, ®);
851 "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID);
854 dev_info(&i2c->dev, "MAX98927 revisionID: 0x%02X\n", reg);
856 /* voltage/current slot configuration */
857 max98927_slot_config(i2c, max98927);
859 /* codec registeration */
860 ret = devm_snd_soc_register_component(&i2c->dev,
861 &soc_component_dev_max98927,
862 max98927_dai, ARRAY_SIZE(max98927_dai));
864 dev_err(&i2c->dev, "Failed to register component: %d\n", ret);
869 static void max98927_i2c_remove(struct i2c_client *i2c)
871 struct max98927_priv *max98927 = i2c_get_clientdata(i2c);
873 if (max98927->reset_gpio)
874 gpiod_set_value_cansleep(max98927->reset_gpio, 1);
877 static const struct i2c_device_id max98927_i2c_id[] = {
882 MODULE_DEVICE_TABLE(i2c, max98927_i2c_id);
884 #if defined(CONFIG_OF)
885 static const struct of_device_id max98927_of_match[] = {
886 { .compatible = "maxim,max98927", },
889 MODULE_DEVICE_TABLE(of, max98927_of_match);
893 static const struct acpi_device_id max98927_acpi_match[] = {
897 MODULE_DEVICE_TABLE(acpi, max98927_acpi_match);
900 static struct i2c_driver max98927_i2c_driver = {
903 .of_match_table = of_match_ptr(max98927_of_match),
904 .acpi_match_table = ACPI_PTR(max98927_acpi_match),
907 .probe = max98927_i2c_probe,
908 .remove = max98927_i2c_remove,
909 .id_table = max98927_i2c_id,
912 module_i2c_driver(max98927_i2c_driver)
914 MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
916 MODULE_LICENSE("GPL");