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
6 * Author: Ryan Lee <ryans.lee@maximintegrated.com>
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/of_gpio.h>
20 #include <sound/tlv.h>
23 static struct reg_default max98927_reg
[] = {
24 {MAX98927_R0001_INT_RAW1
, 0x00},
25 {MAX98927_R0002_INT_RAW2
, 0x00},
26 {MAX98927_R0003_INT_RAW3
, 0x00},
27 {MAX98927_R0004_INT_STATE1
, 0x00},
28 {MAX98927_R0005_INT_STATE2
, 0x00},
29 {MAX98927_R0006_INT_STATE3
, 0x00},
30 {MAX98927_R0007_INT_FLAG1
, 0x00},
31 {MAX98927_R0008_INT_FLAG2
, 0x00},
32 {MAX98927_R0009_INT_FLAG3
, 0x00},
33 {MAX98927_R000A_INT_EN1
, 0x00},
34 {MAX98927_R000B_INT_EN2
, 0x00},
35 {MAX98927_R000C_INT_EN3
, 0x00},
36 {MAX98927_R000D_INT_FLAG_CLR1
, 0x00},
37 {MAX98927_R000E_INT_FLAG_CLR2
, 0x00},
38 {MAX98927_R000F_INT_FLAG_CLR3
, 0x00},
39 {MAX98927_R0010_IRQ_CTRL
, 0x00},
40 {MAX98927_R0011_CLK_MON
, 0x00},
41 {MAX98927_R0012_WDOG_CTRL
, 0x00},
42 {MAX98927_R0013_WDOG_RST
, 0x00},
43 {MAX98927_R0014_MEAS_ADC_THERM_WARN_THRESH
, 0x75},
44 {MAX98927_R0015_MEAS_ADC_THERM_SHDN_THRESH
, 0x8c},
45 {MAX98927_R0016_MEAS_ADC_THERM_HYSTERESIS
, 0x08},
46 {MAX98927_R0017_PIN_CFG
, 0x55},
47 {MAX98927_R0018_PCM_RX_EN_A
, 0x00},
48 {MAX98927_R0019_PCM_RX_EN_B
, 0x00},
49 {MAX98927_R001A_PCM_TX_EN_A
, 0x00},
50 {MAX98927_R001B_PCM_TX_EN_B
, 0x00},
51 {MAX98927_R001C_PCM_TX_HIZ_CTRL_A
, 0x00},
52 {MAX98927_R001D_PCM_TX_HIZ_CTRL_B
, 0x00},
53 {MAX98927_R001E_PCM_TX_CH_SRC_A
, 0x00},
54 {MAX98927_R001F_PCM_TX_CH_SRC_B
, 0x00},
55 {MAX98927_R0020_PCM_MODE_CFG
, 0x40},
56 {MAX98927_R0021_PCM_MASTER_MODE
, 0x00},
57 {MAX98927_R0022_PCM_CLK_SETUP
, 0x22},
58 {MAX98927_R0023_PCM_SR_SETUP1
, 0x00},
59 {MAX98927_R0024_PCM_SR_SETUP2
, 0x00},
60 {MAX98927_R0025_PCM_TO_SPK_MONOMIX_A
, 0x00},
61 {MAX98927_R0026_PCM_TO_SPK_MONOMIX_B
, 0x00},
62 {MAX98927_R0027_ICC_RX_EN_A
, 0x00},
63 {MAX98927_R0028_ICC_RX_EN_B
, 0x00},
64 {MAX98927_R002B_ICC_TX_EN_A
, 0x00},
65 {MAX98927_R002C_ICC_TX_EN_B
, 0x00},
66 {MAX98927_R002E_ICC_HIZ_MANUAL_MODE
, 0x00},
67 {MAX98927_R002F_ICC_TX_HIZ_EN_A
, 0x00},
68 {MAX98927_R0030_ICC_TX_HIZ_EN_B
, 0x00},
69 {MAX98927_R0031_ICC_LNK_EN
, 0x00},
70 {MAX98927_R0032_PDM_TX_EN
, 0x00},
71 {MAX98927_R0033_PDM_TX_HIZ_CTRL
, 0x00},
72 {MAX98927_R0034_PDM_TX_CTRL
, 0x00},
73 {MAX98927_R0035_PDM_RX_CTRL
, 0x00},
74 {MAX98927_R0036_AMP_VOL_CTRL
, 0x00},
75 {MAX98927_R0037_AMP_DSP_CFG
, 0x02},
76 {MAX98927_R0038_TONE_GEN_DC_CFG
, 0x00},
77 {MAX98927_R0039_DRE_CTRL
, 0x01},
78 {MAX98927_R003A_AMP_EN
, 0x00},
79 {MAX98927_R003B_SPK_SRC_SEL
, 0x00},
80 {MAX98927_R003C_SPK_GAIN
, 0x00},
81 {MAX98927_R003D_SSM_CFG
, 0x04},
82 {MAX98927_R003E_MEAS_EN
, 0x00},
83 {MAX98927_R003F_MEAS_DSP_CFG
, 0x04},
84 {MAX98927_R0040_BOOST_CTRL0
, 0x00},
85 {MAX98927_R0041_BOOST_CTRL3
, 0x00},
86 {MAX98927_R0042_BOOST_CTRL1
, 0x00},
87 {MAX98927_R0043_MEAS_ADC_CFG
, 0x00},
88 {MAX98927_R0044_MEAS_ADC_BASE_MSB
, 0x01},
89 {MAX98927_R0045_MEAS_ADC_BASE_LSB
, 0x00},
90 {MAX98927_R0046_ADC_CH0_DIVIDE
, 0x00},
91 {MAX98927_R0047_ADC_CH1_DIVIDE
, 0x00},
92 {MAX98927_R0048_ADC_CH2_DIVIDE
, 0x00},
93 {MAX98927_R0049_ADC_CH0_FILT_CFG
, 0x00},
94 {MAX98927_R004A_ADC_CH1_FILT_CFG
, 0x00},
95 {MAX98927_R004B_ADC_CH2_FILT_CFG
, 0x00},
96 {MAX98927_R004C_MEAS_ADC_CH0_READ
, 0x00},
97 {MAX98927_R004D_MEAS_ADC_CH1_READ
, 0x00},
98 {MAX98927_R004E_MEAS_ADC_CH2_READ
, 0x00},
99 {MAX98927_R0051_BROWNOUT_STATUS
, 0x00},
100 {MAX98927_R0052_BROWNOUT_EN
, 0x00},
101 {MAX98927_R0053_BROWNOUT_INFINITE_HOLD
, 0x00},
102 {MAX98927_R0054_BROWNOUT_INFINITE_HOLD_CLR
, 0x00},
103 {MAX98927_R0055_BROWNOUT_LVL_HOLD
, 0x00},
104 {MAX98927_R005A_BROWNOUT_LVL1_THRESH
, 0x00},
105 {MAX98927_R005B_BROWNOUT_LVL2_THRESH
, 0x00},
106 {MAX98927_R005C_BROWNOUT_LVL3_THRESH
, 0x00},
107 {MAX98927_R005D_BROWNOUT_LVL4_THRESH
, 0x00},
108 {MAX98927_R005E_BROWNOUT_THRESH_HYSTERYSIS
, 0x00},
109 {MAX98927_R005F_BROWNOUT_AMP_LIMITER_ATK_REL
, 0x00},
110 {MAX98927_R0060_BROWNOUT_AMP_GAIN_ATK_REL
, 0x00},
111 {MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE
, 0x00},
112 {MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT
, 0x00},
113 {MAX98927_R0073_BROWNOUT_LVL1_AMP1_CTRL1
, 0x00},
114 {MAX98927_R0074_BROWNOUT_LVL1_AMP1_CTRL2
, 0x00},
115 {MAX98927_R0075_BROWNOUT_LVL1_AMP1_CTRL3
, 0x00},
116 {MAX98927_R0076_BROWNOUT_LVL2_CUR_LIMIT
, 0x00},
117 {MAX98927_R0077_BROWNOUT_LVL2_AMP1_CTRL1
, 0x00},
118 {MAX98927_R0078_BROWNOUT_LVL2_AMP1_CTRL2
, 0x00},
119 {MAX98927_R0079_BROWNOUT_LVL2_AMP1_CTRL3
, 0x00},
120 {MAX98927_R007A_BROWNOUT_LVL3_CUR_LIMIT
, 0x00},
121 {MAX98927_R007B_BROWNOUT_LVL3_AMP1_CTRL1
, 0x00},
122 {MAX98927_R007C_BROWNOUT_LVL3_AMP1_CTRL2
, 0x00},
123 {MAX98927_R007D_BROWNOUT_LVL3_AMP1_CTRL3
, 0x00},
124 {MAX98927_R007E_BROWNOUT_LVL4_CUR_LIMIT
, 0x00},
125 {MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1
, 0x00},
126 {MAX98927_R0080_BROWNOUT_LVL4_AMP1_CTRL2
, 0x00},
127 {MAX98927_R0081_BROWNOUT_LVL4_AMP1_CTRL3
, 0x00},
128 {MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM
, 0x00},
129 {MAX98927_R0083_ENV_TRACK_BOOST_VOUT_DELAY
, 0x00},
130 {MAX98927_R0084_ENV_TRACK_REL_RATE
, 0x00},
131 {MAX98927_R0085_ENV_TRACK_HOLD_RATE
, 0x00},
132 {MAX98927_R0086_ENV_TRACK_CTRL
, 0x00},
133 {MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
, 0x00},
134 {MAX98927_R00FF_GLOBAL_SHDN
, 0x00},
135 {MAX98927_R0100_SOFT_RESET
, 0x00},
136 {MAX98927_R01FF_REV_ID
, 0x40},
139 static int max98927_dai_set_fmt(struct snd_soc_dai
*codec_dai
, unsigned int fmt
)
141 struct snd_soc_component
*component
= codec_dai
->component
;
142 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
143 unsigned int mode
= 0;
144 unsigned int format
= 0;
145 bool use_pdm
= false;
146 unsigned int invert
= 0;
148 dev_dbg(component
->dev
, "%s: fmt 0x%08X\n", __func__
, fmt
);
150 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
151 case SND_SOC_DAIFMT_CBS_CFS
:
152 mode
= MAX98927_PCM_MASTER_MODE_SLAVE
;
154 case SND_SOC_DAIFMT_CBM_CFM
:
155 max98927
->master
= true;
156 mode
= MAX98927_PCM_MASTER_MODE_MASTER
;
159 dev_err(component
->dev
, "DAI clock mode unsupported\n");
163 regmap_update_bits(max98927
->regmap
,
164 MAX98927_R0021_PCM_MASTER_MODE
,
165 MAX98927_PCM_MASTER_MODE_MASK
,
168 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
169 case SND_SOC_DAIFMT_NB_NF
:
171 case SND_SOC_DAIFMT_IB_NF
:
172 invert
= MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE
;
175 dev_err(component
->dev
, "DAI invert mode unsupported\n");
179 regmap_update_bits(max98927
->regmap
,
180 MAX98927_R0020_PCM_MODE_CFG
,
181 MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE
,
184 /* interface format */
185 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
186 case SND_SOC_DAIFMT_I2S
:
187 format
= MAX98927_PCM_FORMAT_I2S
;
189 case SND_SOC_DAIFMT_LEFT_J
:
190 format
= MAX98927_PCM_FORMAT_LJ
;
192 case SND_SOC_DAIFMT_DSP_A
:
193 format
= MAX98927_PCM_FORMAT_TDM_MODE1
;
195 case SND_SOC_DAIFMT_DSP_B
:
196 format
= MAX98927_PCM_FORMAT_TDM_MODE0
;
198 case SND_SOC_DAIFMT_PDM
:
204 max98927
->iface
= fmt
& SND_SOC_DAIFMT_FORMAT_MASK
;
207 /* pcm channel configuration */
208 regmap_update_bits(max98927
->regmap
,
209 MAX98927_R0018_PCM_RX_EN_A
,
210 MAX98927_PCM_RX_CH0_EN
| MAX98927_PCM_RX_CH1_EN
,
211 MAX98927_PCM_RX_CH0_EN
| MAX98927_PCM_RX_CH1_EN
);
213 regmap_update_bits(max98927
->regmap
,
214 MAX98927_R0020_PCM_MODE_CFG
,
215 MAX98927_PCM_MODE_CFG_FORMAT_MASK
,
216 format
<< MAX98927_PCM_MODE_CFG_FORMAT_SHIFT
);
218 regmap_update_bits(max98927
->regmap
,
219 MAX98927_R003B_SPK_SRC_SEL
,
220 MAX98927_SPK_SRC_MASK
, 0);
222 regmap_update_bits(max98927
->regmap
,
223 MAX98927_R0035_PDM_RX_CTRL
,
224 MAX98927_PDM_RX_EN_MASK
, 0);
226 /* pdm channel configuration */
227 regmap_update_bits(max98927
->regmap
,
228 MAX98927_R0035_PDM_RX_CTRL
,
229 MAX98927_PDM_RX_EN_MASK
, 1);
231 regmap_update_bits(max98927
->regmap
,
232 MAX98927_R003B_SPK_SRC_SEL
,
233 MAX98927_SPK_SRC_MASK
, 3);
235 regmap_update_bits(max98927
->regmap
,
236 MAX98927_R0018_PCM_RX_EN_A
,
237 MAX98927_PCM_RX_CH0_EN
| MAX98927_PCM_RX_CH1_EN
, 0);
242 /* codec MCLK rate in master mode */
243 static const int rate_table
[] = {
244 5644800, 6000000, 6144000, 6500000,
245 9600000, 11289600, 12000000, 12288000,
249 /* BCLKs per LRCLK */
250 static const int bclk_sel_table
[] = {
251 32, 48, 64, 96, 128, 192, 256, 384, 512,
254 static int max98927_get_bclk_sel(int bclk
)
257 /* match BCLKs per LRCLK */
258 for (i
= 0; i
< ARRAY_SIZE(bclk_sel_table
); i
++) {
259 if (bclk_sel_table
[i
] == bclk
)
264 static int max98927_set_clock(struct max98927_priv
*max98927
,
265 struct snd_pcm_hw_params
*params
)
267 struct snd_soc_component
*component
= max98927
->component
;
268 /* BCLK/LRCLK ratio calculation */
269 int blr_clk_ratio
= params_channels(params
) * max98927
->ch_size
;
272 if (max98927
->master
) {
274 /* match rate to closest value */
275 for (i
= 0; i
< ARRAY_SIZE(rate_table
); i
++) {
276 if (rate_table
[i
] >= max98927
->sysclk
)
279 if (i
== ARRAY_SIZE(rate_table
)) {
280 dev_err(component
->dev
, "failed to find proper clock rate.\n");
283 regmap_update_bits(max98927
->regmap
,
284 MAX98927_R0021_PCM_MASTER_MODE
,
285 MAX98927_PCM_MASTER_MODE_MCLK_MASK
,
286 i
<< MAX98927_PCM_MASTER_MODE_MCLK_RATE_SHIFT
);
289 if (!max98927
->tdm_mode
) {
290 /* BCLK configuration */
291 value
= max98927_get_bclk_sel(blr_clk_ratio
);
293 dev_err(component
->dev
, "format unsupported %d\n",
294 params_format(params
));
298 regmap_update_bits(max98927
->regmap
,
299 MAX98927_R0022_PCM_CLK_SETUP
,
300 MAX98927_PCM_CLK_SETUP_BSEL_MASK
,
306 static int max98927_dai_hw_params(struct snd_pcm_substream
*substream
,
307 struct snd_pcm_hw_params
*params
,
308 struct snd_soc_dai
*dai
)
310 struct snd_soc_component
*component
= dai
->component
;
311 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
312 unsigned int sampling_rate
= 0;
313 unsigned int chan_sz
= 0;
315 /* pcm mode configuration */
316 switch (snd_pcm_format_width(params_format(params
))) {
318 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_16
;
321 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_24
;
324 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_32
;
327 dev_err(component
->dev
, "format unsupported %d\n",
328 params_format(params
));
332 max98927
->ch_size
= snd_pcm_format_width(params_format(params
));
334 regmap_update_bits(max98927
->regmap
,
335 MAX98927_R0020_PCM_MODE_CFG
,
336 MAX98927_PCM_MODE_CFG_CHANSZ_MASK
, chan_sz
);
338 dev_dbg(component
->dev
, "format supported %d",
339 params_format(params
));
341 /* sampling rate configuration */
342 switch (params_rate(params
)) {
344 sampling_rate
= MAX98927_PCM_SR_SET1_SR_8000
;
347 sampling_rate
= MAX98927_PCM_SR_SET1_SR_11025
;
350 sampling_rate
= MAX98927_PCM_SR_SET1_SR_12000
;
353 sampling_rate
= MAX98927_PCM_SR_SET1_SR_16000
;
356 sampling_rate
= MAX98927_PCM_SR_SET1_SR_22050
;
359 sampling_rate
= MAX98927_PCM_SR_SET1_SR_24000
;
362 sampling_rate
= MAX98927_PCM_SR_SET1_SR_32000
;
365 sampling_rate
= MAX98927_PCM_SR_SET1_SR_44100
;
368 sampling_rate
= MAX98927_PCM_SR_SET1_SR_48000
;
371 dev_err(component
->dev
, "rate %d not supported\n",
372 params_rate(params
));
375 /* set DAI_SR to correct LRCLK frequency */
376 regmap_update_bits(max98927
->regmap
,
377 MAX98927_R0023_PCM_SR_SETUP1
,
378 MAX98927_PCM_SR_SET1_SR_MASK
,
380 regmap_update_bits(max98927
->regmap
,
381 MAX98927_R0024_PCM_SR_SETUP2
,
382 MAX98927_PCM_SR_SET2_SR_MASK
,
383 sampling_rate
<< MAX98927_PCM_SR_SET2_SR_SHIFT
);
385 /* set sampling rate of IV */
386 if (max98927
->interleave_mode
&&
387 sampling_rate
> MAX98927_PCM_SR_SET1_SR_16000
)
388 regmap_update_bits(max98927
->regmap
,
389 MAX98927_R0024_PCM_SR_SETUP2
,
390 MAX98927_PCM_SR_SET2_IVADC_SR_MASK
,
393 regmap_update_bits(max98927
->regmap
,
394 MAX98927_R0024_PCM_SR_SETUP2
,
395 MAX98927_PCM_SR_SET2_IVADC_SR_MASK
,
397 return max98927_set_clock(max98927
, params
);
402 static int max98927_dai_tdm_slot(struct snd_soc_dai
*dai
,
403 unsigned int tx_mask
, unsigned int rx_mask
,
404 int slots
, int slot_width
)
406 struct snd_soc_component
*component
= dai
->component
;
407 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
409 unsigned int chan_sz
= 0;
411 max98927
->tdm_mode
= true;
413 /* BCLK configuration */
414 bsel
= max98927_get_bclk_sel(slots
* slot_width
);
416 dev_err(component
->dev
, "BCLK %d not supported\n",
421 regmap_update_bits(max98927
->regmap
,
422 MAX98927_R0022_PCM_CLK_SETUP
,
423 MAX98927_PCM_CLK_SETUP_BSEL_MASK
,
426 /* Channel size configuration */
427 switch (slot_width
) {
429 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_16
;
432 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_24
;
435 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_32
;
438 dev_err(component
->dev
, "format unsupported %d\n",
443 regmap_update_bits(max98927
->regmap
,
444 MAX98927_R0020_PCM_MODE_CFG
,
445 MAX98927_PCM_MODE_CFG_CHANSZ_MASK
, chan_sz
);
447 /* Rx slot configuration */
448 regmap_write(max98927
->regmap
,
449 MAX98927_R0018_PCM_RX_EN_A
,
451 regmap_write(max98927
->regmap
,
452 MAX98927_R0019_PCM_RX_EN_B
,
453 (rx_mask
& 0xFF00) >> 8);
455 /* Tx slot configuration */
456 regmap_write(max98927
->regmap
,
457 MAX98927_R001A_PCM_TX_EN_A
,
459 regmap_write(max98927
->regmap
,
460 MAX98927_R001B_PCM_TX_EN_B
,
461 (tx_mask
& 0xFF00) >> 8);
463 /* Tx slot Hi-Z configuration */
464 regmap_write(max98927
->regmap
,
465 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
467 regmap_write(max98927
->regmap
,
468 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
469 (~tx_mask
& 0xFF00) >> 8);
474 #define MAX98927_RATES SNDRV_PCM_RATE_8000_48000
476 #define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
477 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
479 static int max98927_dai_set_sysclk(struct snd_soc_dai
*dai
,
480 int clk_id
, unsigned int freq
, int dir
)
482 struct snd_soc_component
*component
= dai
->component
;
483 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
485 max98927
->sysclk
= freq
;
489 static const struct snd_soc_dai_ops max98927_dai_ops
= {
490 .set_sysclk
= max98927_dai_set_sysclk
,
491 .set_fmt
= max98927_dai_set_fmt
,
492 .hw_params
= max98927_dai_hw_params
,
493 .set_tdm_slot
= max98927_dai_tdm_slot
,
496 static int max98927_dac_event(struct snd_soc_dapm_widget
*w
,
497 struct snd_kcontrol
*kcontrol
, int event
)
499 struct snd_soc_component
*component
= snd_soc_dapm_to_component(w
->dapm
);
500 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
503 case SND_SOC_DAPM_PRE_PMU
:
504 max98927
->tdm_mode
= false;
506 case SND_SOC_DAPM_POST_PMU
:
507 regmap_update_bits(max98927
->regmap
,
508 MAX98927_R003A_AMP_EN
,
509 MAX98927_AMP_EN_MASK
, 1);
510 regmap_update_bits(max98927
->regmap
,
511 MAX98927_R00FF_GLOBAL_SHDN
,
512 MAX98927_GLOBAL_EN_MASK
, 1);
514 case SND_SOC_DAPM_POST_PMD
:
515 regmap_update_bits(max98927
->regmap
,
516 MAX98927_R00FF_GLOBAL_SHDN
,
517 MAX98927_GLOBAL_EN_MASK
, 0);
518 regmap_update_bits(max98927
->regmap
,
519 MAX98927_R003A_AMP_EN
,
520 MAX98927_AMP_EN_MASK
, 0);
528 static const char * const max98927_switch_text
[] = {
529 "Left", "Right", "LeftRight"};
531 static const struct soc_enum dai_sel_enum
=
532 SOC_ENUM_SINGLE(MAX98927_R0025_PCM_TO_SPK_MONOMIX_A
,
533 MAX98927_PCM_TO_SPK_MONOMIX_CFG_SHIFT
,
534 3, max98927_switch_text
);
536 static const struct snd_kcontrol_new max98927_dai_controls
=
537 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum
);
539 static const struct snd_kcontrol_new max98927_vi_control
=
540 SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG
, 2, 1, 0);
542 static const struct snd_soc_dapm_widget max98927_dapm_widgets
[] = {
543 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", MAX98927_R003A_AMP_EN
,
544 0, 0, max98927_dac_event
,
545 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_POST_PMD
),
546 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM
, 0, 0,
547 &max98927_dai_controls
),
548 SND_SOC_DAPM_OUTPUT("BE_OUT"),
549 SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0,
550 MAX98927_R003E_MEAS_EN
, 0, 0),
551 SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
552 MAX98927_R003E_MEAS_EN
, 1, 0),
553 SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM
, 0, 0,
554 &max98927_vi_control
),
555 SND_SOC_DAPM_SIGGEN("VMON"),
556 SND_SOC_DAPM_SIGGEN("IMON"),
559 static DECLARE_TLV_DB_SCALE(max98927_spk_tlv
, 300, 300, 0);
560 static DECLARE_TLV_DB_SCALE(max98927_digital_tlv
, -1600, 25, 0);
562 static bool max98927_readable_register(struct device
*dev
, unsigned int reg
)
565 case MAX98927_R0001_INT_RAW1
... MAX98927_R0028_ICC_RX_EN_B
:
566 case MAX98927_R002B_ICC_TX_EN_A
... MAX98927_R002C_ICC_TX_EN_B
:
567 case MAX98927_R002E_ICC_HIZ_MANUAL_MODE
568 ... MAX98927_R004E_MEAS_ADC_CH2_READ
:
569 case MAX98927_R0051_BROWNOUT_STATUS
570 ... MAX98927_R0055_BROWNOUT_LVL_HOLD
:
571 case MAX98927_R005A_BROWNOUT_LVL1_THRESH
572 ... MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE
:
573 case MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT
574 ... MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
:
575 case MAX98927_R00FF_GLOBAL_SHDN
:
576 case MAX98927_R0100_SOFT_RESET
:
577 case MAX98927_R01FF_REV_ID
:
584 static bool max98927_volatile_reg(struct device
*dev
, unsigned int reg
)
587 case MAX98927_R0001_INT_RAW1
... MAX98927_R0009_INT_FLAG3
:
588 case MAX98927_R004C_MEAS_ADC_CH0_READ
:
589 case MAX98927_R004D_MEAS_ADC_CH1_READ
:
590 case MAX98927_R004E_MEAS_ADC_CH2_READ
:
591 case MAX98927_R0051_BROWNOUT_STATUS
:
592 case MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
:
593 case MAX98927_R01FF_REV_ID
:
594 case MAX98927_R0100_SOFT_RESET
:
601 static const char * const max98927_boost_voltage_text
[] = {
602 "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
603 "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
604 "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
605 "9.5V", "9.625V", "9.75V", "9.875V", "10V"
608 static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage
,
609 MAX98927_R0040_BOOST_CTRL0
, 0,
610 max98927_boost_voltage_text
);
612 static const char * const max98927_current_limit_text
[] = {
613 "1.00A", "1.10A", "1.20A", "1.30A", "1.40A", "1.50A", "1.60A", "1.70A",
614 "1.80A", "1.90A", "2.00A", "2.10A", "2.20A", "2.30A", "2.40A", "2.50A",
615 "2.60A", "2.70A", "2.80A", "2.90A", "3.00A", "3.10A", "3.20A", "3.30A",
616 "3.40A", "3.50A", "3.60A", "3.70A", "3.80A", "3.90A", "4.00A", "4.10A"
619 static SOC_ENUM_SINGLE_DECL(max98927_current_limit
,
620 MAX98927_R0042_BOOST_CTRL1
, 1,
621 max98927_current_limit_text
);
623 static const struct snd_kcontrol_new max98927_snd_controls
[] = {
624 SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN
,
627 SOC_SINGLE_TLV("Digital Volume", MAX98927_R0036_AMP_VOL_CTRL
,
628 0, (1<<MAX98927_AMP_VOL_WIDTH
)-1, 0,
629 max98927_digital_tlv
),
630 SOC_SINGLE("Amp DSP Switch", MAX98927_R0052_BROWNOUT_EN
,
631 MAX98927_BROWNOUT_DSP_SHIFT
, 1, 0),
632 SOC_SINGLE("Ramp Switch", MAX98927_R0037_AMP_DSP_CFG
,
633 MAX98927_AMP_DSP_CFG_RMP_SHIFT
, 1, 0),
634 SOC_SINGLE("DRE Switch", MAX98927_R0039_DRE_CTRL
,
635 MAX98927_DRE_EN_SHIFT
, 1, 0),
636 SOC_SINGLE("Volume Location Switch", MAX98927_R0036_AMP_VOL_CTRL
,
637 MAX98927_AMP_VOL_SEL_SHIFT
, 1, 0),
638 SOC_ENUM("Boost Output Voltage", max98927_boost_voltage
),
639 SOC_ENUM("Current Limit", max98927_current_limit
),
642 static const struct snd_soc_dapm_route max98927_audio_map
[] = {
644 {"DAI Sel Mux", "Left", "Amp Enable"},
645 {"DAI Sel Mux", "Right", "Amp Enable"},
646 {"DAI Sel Mux", "LeftRight", "Amp Enable"},
647 {"BE_OUT", NULL
, "DAI Sel Mux"},
649 { "VI Sense", "Switch", "VMON" },
650 { "VI Sense", "Switch", "IMON" },
651 { "Voltage Sense", NULL
, "VI Sense" },
652 { "Current Sense", NULL
, "VI Sense" },
655 static struct snd_soc_dai_driver max98927_dai
[] = {
657 .name
= "max98927-aif1",
659 .stream_name
= "HiFi Playback",
662 .rates
= MAX98927_RATES
,
663 .formats
= MAX98927_FORMATS
,
666 .stream_name
= "HiFi Capture",
669 .rates
= MAX98927_RATES
,
670 .formats
= MAX98927_FORMATS
,
672 .ops
= &max98927_dai_ops
,
676 static int max98927_probe(struct snd_soc_component
*component
)
678 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
680 max98927
->component
= component
;
683 regmap_write(max98927
->regmap
,
684 MAX98927_R0100_SOFT_RESET
, MAX98927_SOFT_RESET
);
686 /* IV default slot configuration */
687 regmap_write(max98927
->regmap
,
688 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
690 regmap_write(max98927
->regmap
,
691 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
693 regmap_write(max98927
->regmap
,
694 MAX98927_R0025_PCM_TO_SPK_MONOMIX_A
,
696 regmap_write(max98927
->regmap
,
697 MAX98927_R0026_PCM_TO_SPK_MONOMIX_B
,
699 /* Set inital volume (+13dB) */
700 regmap_write(max98927
->regmap
,
701 MAX98927_R0036_AMP_VOL_CTRL
,
703 regmap_write(max98927
->regmap
,
704 MAX98927_R003C_SPK_GAIN
,
706 /* Enable DC blocker */
707 regmap_write(max98927
->regmap
,
708 MAX98927_R0037_AMP_DSP_CFG
,
710 /* Enable IMON VMON DC blocker */
711 regmap_write(max98927
->regmap
,
712 MAX98927_R003F_MEAS_DSP_CFG
,
714 /* Boost Output Voltage & Current limit */
715 regmap_write(max98927
->regmap
,
716 MAX98927_R0040_BOOST_CTRL0
,
718 regmap_write(max98927
->regmap
,
719 MAX98927_R0042_BOOST_CTRL1
,
721 /* Measurement ADC config */
722 regmap_write(max98927
->regmap
,
723 MAX98927_R0043_MEAS_ADC_CFG
,
725 regmap_write(max98927
->regmap
,
726 MAX98927_R0044_MEAS_ADC_BASE_MSB
,
728 regmap_write(max98927
->regmap
,
729 MAX98927_R0045_MEAS_ADC_BASE_LSB
,
732 regmap_write(max98927
->regmap
,
733 MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1
,
735 /* Envelope Tracking configuration */
736 regmap_write(max98927
->regmap
,
737 MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM
,
739 regmap_write(max98927
->regmap
,
740 MAX98927_R0086_ENV_TRACK_CTRL
,
742 regmap_write(max98927
->regmap
,
743 MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
,
746 /* voltage, current slot configuration */
747 regmap_write(max98927
->regmap
,
748 MAX98927_R001E_PCM_TX_CH_SRC_A
,
749 (max98927
->i_l_slot
<<MAX98927_PCM_TX_CH_SRC_A_I_SHIFT
|
750 max98927
->v_l_slot
)&0xFF);
752 if (max98927
->v_l_slot
< 8) {
753 regmap_update_bits(max98927
->regmap
,
754 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
755 1 << max98927
->v_l_slot
, 0);
756 regmap_update_bits(max98927
->regmap
,
757 MAX98927_R001A_PCM_TX_EN_A
,
758 1 << max98927
->v_l_slot
,
759 1 << max98927
->v_l_slot
);
761 regmap_update_bits(max98927
->regmap
,
762 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
763 1 << (max98927
->v_l_slot
- 8), 0);
764 regmap_update_bits(max98927
->regmap
,
765 MAX98927_R001B_PCM_TX_EN_B
,
766 1 << (max98927
->v_l_slot
- 8),
767 1 << (max98927
->v_l_slot
- 8));
770 if (max98927
->i_l_slot
< 8) {
771 regmap_update_bits(max98927
->regmap
,
772 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
773 1 << max98927
->i_l_slot
, 0);
774 regmap_update_bits(max98927
->regmap
,
775 MAX98927_R001A_PCM_TX_EN_A
,
776 1 << max98927
->i_l_slot
,
777 1 << max98927
->i_l_slot
);
779 regmap_update_bits(max98927
->regmap
,
780 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
781 1 << (max98927
->i_l_slot
- 8), 0);
782 regmap_update_bits(max98927
->regmap
,
783 MAX98927_R001B_PCM_TX_EN_B
,
784 1 << (max98927
->i_l_slot
- 8),
785 1 << (max98927
->i_l_slot
- 8));
788 /* Set interleave mode */
789 if (max98927
->interleave_mode
)
790 regmap_update_bits(max98927
->regmap
,
791 MAX98927_R001F_PCM_TX_CH_SRC_B
,
792 MAX98927_PCM_TX_CH_INTERLEAVE_MASK
,
793 MAX98927_PCM_TX_CH_INTERLEAVE_MASK
);
797 #ifdef CONFIG_PM_SLEEP
798 static int max98927_suspend(struct device
*dev
)
800 struct max98927_priv
*max98927
= dev_get_drvdata(dev
);
802 regcache_cache_only(max98927
->regmap
, true);
803 regcache_mark_dirty(max98927
->regmap
);
806 static int max98927_resume(struct device
*dev
)
808 struct max98927_priv
*max98927
= dev_get_drvdata(dev
);
810 regmap_write(max98927
->regmap
,
811 MAX98927_R0100_SOFT_RESET
, MAX98927_SOFT_RESET
);
812 regcache_cache_only(max98927
->regmap
, false);
813 regcache_sync(max98927
->regmap
);
818 static const struct dev_pm_ops max98927_pm
= {
819 SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend
, max98927_resume
)
822 static const struct snd_soc_component_driver soc_component_dev_max98927
= {
823 .probe
= max98927_probe
,
824 .controls
= max98927_snd_controls
,
825 .num_controls
= ARRAY_SIZE(max98927_snd_controls
),
826 .dapm_widgets
= max98927_dapm_widgets
,
827 .num_dapm_widgets
= ARRAY_SIZE(max98927_dapm_widgets
),
828 .dapm_routes
= max98927_audio_map
,
829 .num_dapm_routes
= ARRAY_SIZE(max98927_audio_map
),
831 .use_pmdown_time
= 1,
833 .non_legacy_dai_naming
= 1,
836 static const struct regmap_config max98927_regmap
= {
839 .max_register
= MAX98927_R01FF_REV_ID
,
840 .reg_defaults
= max98927_reg
,
841 .num_reg_defaults
= ARRAY_SIZE(max98927_reg
),
842 .readable_reg
= max98927_readable_register
,
843 .volatile_reg
= max98927_volatile_reg
,
844 .cache_type
= REGCACHE_RBTREE
,
847 static void max98927_slot_config(struct i2c_client
*i2c
,
848 struct max98927_priv
*max98927
)
851 struct device
*dev
= &i2c
->dev
;
853 if (!device_property_read_u32(dev
, "vmon-slot-no", &value
))
854 max98927
->v_l_slot
= value
& 0xF;
856 max98927
->v_l_slot
= 0;
858 if (!device_property_read_u32(dev
, "imon-slot-no", &value
))
859 max98927
->i_l_slot
= value
& 0xF;
861 max98927
->i_l_slot
= 1;
864 static int max98927_i2c_probe(struct i2c_client
*i2c
,
865 const struct i2c_device_id
*id
)
870 struct max98927_priv
*max98927
= NULL
;
872 max98927
= devm_kzalloc(&i2c
->dev
,
873 sizeof(*max98927
), GFP_KERNEL
);
879 i2c_set_clientdata(i2c
, max98927
);
881 /* update interleave mode info */
882 if (!of_property_read_u32(i2c
->dev
.of_node
,
883 "interleave_mode", &value
)) {
885 max98927
->interleave_mode
= true;
887 max98927
->interleave_mode
= false;
889 max98927
->interleave_mode
= false;
891 /* regmap initialization */
893 = devm_regmap_init_i2c(i2c
, &max98927_regmap
);
894 if (IS_ERR(max98927
->regmap
)) {
895 ret
= PTR_ERR(max98927
->regmap
);
897 "Failed to allocate regmap: %d\n", ret
);
901 /* Check Revision ID */
902 ret
= regmap_read(max98927
->regmap
,
903 MAX98927_R01FF_REV_ID
, ®
);
906 "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID
);
909 dev_info(&i2c
->dev
, "MAX98927 revisionID: 0x%02X\n", reg
);
911 /* voltage/current slot configuration */
912 max98927_slot_config(i2c
, max98927
);
914 /* codec registeration */
915 ret
= devm_snd_soc_register_component(&i2c
->dev
,
916 &soc_component_dev_max98927
,
917 max98927_dai
, ARRAY_SIZE(max98927_dai
));
919 dev_err(&i2c
->dev
, "Failed to register component: %d\n", ret
);
924 static const struct i2c_device_id max98927_i2c_id
[] = {
929 MODULE_DEVICE_TABLE(i2c
, max98927_i2c_id
);
931 #if defined(CONFIG_OF)
932 static const struct of_device_id max98927_of_match
[] = {
933 { .compatible
= "maxim,max98927", },
936 MODULE_DEVICE_TABLE(of
, max98927_of_match
);
940 static const struct acpi_device_id max98927_acpi_match
[] = {
944 MODULE_DEVICE_TABLE(acpi
, max98927_acpi_match
);
947 static struct i2c_driver max98927_i2c_driver
= {
950 .of_match_table
= of_match_ptr(max98927_of_match
),
951 .acpi_match_table
= ACPI_PTR(max98927_acpi_match
),
954 .probe
= max98927_i2c_probe
,
955 .id_table
= max98927_i2c_id
,
958 module_i2c_driver(max98927_i2c_driver
)
960 MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
961 MODULE_AUTHOR("Ryan Lee <ryans.lee@maximintegrated.com>");
962 MODULE_LICENSE("GPL");