2 * max98927.c -- MAX98927 ALSA Soc Audio driver
4 * Copyright (C) 2016-2017 Maxim Integrated Products
5 * Author: Ryan Lee <ryans.lee@maximintegrated.com>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
13 #include <linux/acpi.h>
14 #include <linux/i2c.h>
15 #include <linux/module.h>
16 #include <linux/regmap.h>
17 #include <linux/slab.h>
18 #include <linux/cdev.h>
19 #include <sound/pcm.h>
20 #include <sound/pcm_params.h>
21 #include <sound/soc.h>
22 #include <linux/gpio.h>
23 #include <linux/of_gpio.h>
24 #include <sound/tlv.h>
27 static struct reg_default max98927_reg
[] = {
28 {MAX98927_R0001_INT_RAW1
, 0x00},
29 {MAX98927_R0002_INT_RAW2
, 0x00},
30 {MAX98927_R0003_INT_RAW3
, 0x00},
31 {MAX98927_R0004_INT_STATE1
, 0x00},
32 {MAX98927_R0005_INT_STATE2
, 0x00},
33 {MAX98927_R0006_INT_STATE3
, 0x00},
34 {MAX98927_R0007_INT_FLAG1
, 0x00},
35 {MAX98927_R0008_INT_FLAG2
, 0x00},
36 {MAX98927_R0009_INT_FLAG3
, 0x00},
37 {MAX98927_R000A_INT_EN1
, 0x00},
38 {MAX98927_R000B_INT_EN2
, 0x00},
39 {MAX98927_R000C_INT_EN3
, 0x00},
40 {MAX98927_R000D_INT_FLAG_CLR1
, 0x00},
41 {MAX98927_R000E_INT_FLAG_CLR2
, 0x00},
42 {MAX98927_R000F_INT_FLAG_CLR3
, 0x00},
43 {MAX98927_R0010_IRQ_CTRL
, 0x00},
44 {MAX98927_R0011_CLK_MON
, 0x00},
45 {MAX98927_R0012_WDOG_CTRL
, 0x00},
46 {MAX98927_R0013_WDOG_RST
, 0x00},
47 {MAX98927_R0014_MEAS_ADC_THERM_WARN_THRESH
, 0x75},
48 {MAX98927_R0015_MEAS_ADC_THERM_SHDN_THRESH
, 0x8c},
49 {MAX98927_R0016_MEAS_ADC_THERM_HYSTERESIS
, 0x08},
50 {MAX98927_R0017_PIN_CFG
, 0x55},
51 {MAX98927_R0018_PCM_RX_EN_A
, 0x00},
52 {MAX98927_R0019_PCM_RX_EN_B
, 0x00},
53 {MAX98927_R001A_PCM_TX_EN_A
, 0x00},
54 {MAX98927_R001B_PCM_TX_EN_B
, 0x00},
55 {MAX98927_R001C_PCM_TX_HIZ_CTRL_A
, 0x00},
56 {MAX98927_R001D_PCM_TX_HIZ_CTRL_B
, 0x00},
57 {MAX98927_R001E_PCM_TX_CH_SRC_A
, 0x00},
58 {MAX98927_R001F_PCM_TX_CH_SRC_B
, 0x00},
59 {MAX98927_R0020_PCM_MODE_CFG
, 0x40},
60 {MAX98927_R0021_PCM_MASTER_MODE
, 0x00},
61 {MAX98927_R0022_PCM_CLK_SETUP
, 0x22},
62 {MAX98927_R0023_PCM_SR_SETUP1
, 0x00},
63 {MAX98927_R0024_PCM_SR_SETUP2
, 0x00},
64 {MAX98927_R0025_PCM_TO_SPK_MONOMIX_A
, 0x00},
65 {MAX98927_R0026_PCM_TO_SPK_MONOMIX_B
, 0x00},
66 {MAX98927_R0027_ICC_RX_EN_A
, 0x00},
67 {MAX98927_R0028_ICC_RX_EN_B
, 0x00},
68 {MAX98927_R002B_ICC_TX_EN_A
, 0x00},
69 {MAX98927_R002C_ICC_TX_EN_B
, 0x00},
70 {MAX98927_R002E_ICC_HIZ_MANUAL_MODE
, 0x00},
71 {MAX98927_R002F_ICC_TX_HIZ_EN_A
, 0x00},
72 {MAX98927_R0030_ICC_TX_HIZ_EN_B
, 0x00},
73 {MAX98927_R0031_ICC_LNK_EN
, 0x00},
74 {MAX98927_R0032_PDM_TX_EN
, 0x00},
75 {MAX98927_R0033_PDM_TX_HIZ_CTRL
, 0x00},
76 {MAX98927_R0034_PDM_TX_CTRL
, 0x00},
77 {MAX98927_R0035_PDM_RX_CTRL
, 0x00},
78 {MAX98927_R0036_AMP_VOL_CTRL
, 0x00},
79 {MAX98927_R0037_AMP_DSP_CFG
, 0x02},
80 {MAX98927_R0038_TONE_GEN_DC_CFG
, 0x00},
81 {MAX98927_R0039_DRE_CTRL
, 0x01},
82 {MAX98927_R003A_AMP_EN
, 0x00},
83 {MAX98927_R003B_SPK_SRC_SEL
, 0x00},
84 {MAX98927_R003C_SPK_GAIN
, 0x00},
85 {MAX98927_R003D_SSM_CFG
, 0x04},
86 {MAX98927_R003E_MEAS_EN
, 0x00},
87 {MAX98927_R003F_MEAS_DSP_CFG
, 0x04},
88 {MAX98927_R0040_BOOST_CTRL0
, 0x00},
89 {MAX98927_R0041_BOOST_CTRL3
, 0x00},
90 {MAX98927_R0042_BOOST_CTRL1
, 0x00},
91 {MAX98927_R0043_MEAS_ADC_CFG
, 0x00},
92 {MAX98927_R0044_MEAS_ADC_BASE_MSB
, 0x01},
93 {MAX98927_R0045_MEAS_ADC_BASE_LSB
, 0x00},
94 {MAX98927_R0046_ADC_CH0_DIVIDE
, 0x00},
95 {MAX98927_R0047_ADC_CH1_DIVIDE
, 0x00},
96 {MAX98927_R0048_ADC_CH2_DIVIDE
, 0x00},
97 {MAX98927_R0049_ADC_CH0_FILT_CFG
, 0x00},
98 {MAX98927_R004A_ADC_CH1_FILT_CFG
, 0x00},
99 {MAX98927_R004B_ADC_CH2_FILT_CFG
, 0x00},
100 {MAX98927_R004C_MEAS_ADC_CH0_READ
, 0x00},
101 {MAX98927_R004D_MEAS_ADC_CH1_READ
, 0x00},
102 {MAX98927_R004E_MEAS_ADC_CH2_READ
, 0x00},
103 {MAX98927_R0051_BROWNOUT_STATUS
, 0x00},
104 {MAX98927_R0052_BROWNOUT_EN
, 0x00},
105 {MAX98927_R0053_BROWNOUT_INFINITE_HOLD
, 0x00},
106 {MAX98927_R0054_BROWNOUT_INFINITE_HOLD_CLR
, 0x00},
107 {MAX98927_R0055_BROWNOUT_LVL_HOLD
, 0x00},
108 {MAX98927_R005A_BROWNOUT_LVL1_THRESH
, 0x00},
109 {MAX98927_R005B_BROWNOUT_LVL2_THRESH
, 0x00},
110 {MAX98927_R005C_BROWNOUT_LVL3_THRESH
, 0x00},
111 {MAX98927_R005D_BROWNOUT_LVL4_THRESH
, 0x00},
112 {MAX98927_R005E_BROWNOUT_THRESH_HYSTERYSIS
, 0x00},
113 {MAX98927_R005F_BROWNOUT_AMP_LIMITER_ATK_REL
, 0x00},
114 {MAX98927_R0060_BROWNOUT_AMP_GAIN_ATK_REL
, 0x00},
115 {MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE
, 0x00},
116 {MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT
, 0x00},
117 {MAX98927_R0073_BROWNOUT_LVL1_AMP1_CTRL1
, 0x00},
118 {MAX98927_R0074_BROWNOUT_LVL1_AMP1_CTRL2
, 0x00},
119 {MAX98927_R0075_BROWNOUT_LVL1_AMP1_CTRL3
, 0x00},
120 {MAX98927_R0076_BROWNOUT_LVL2_CUR_LIMIT
, 0x00},
121 {MAX98927_R0077_BROWNOUT_LVL2_AMP1_CTRL1
, 0x00},
122 {MAX98927_R0078_BROWNOUT_LVL2_AMP1_CTRL2
, 0x00},
123 {MAX98927_R0079_BROWNOUT_LVL2_AMP1_CTRL3
, 0x00},
124 {MAX98927_R007A_BROWNOUT_LVL3_CUR_LIMIT
, 0x00},
125 {MAX98927_R007B_BROWNOUT_LVL3_AMP1_CTRL1
, 0x00},
126 {MAX98927_R007C_BROWNOUT_LVL3_AMP1_CTRL2
, 0x00},
127 {MAX98927_R007D_BROWNOUT_LVL3_AMP1_CTRL3
, 0x00},
128 {MAX98927_R007E_BROWNOUT_LVL4_CUR_LIMIT
, 0x00},
129 {MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1
, 0x00},
130 {MAX98927_R0080_BROWNOUT_LVL4_AMP1_CTRL2
, 0x00},
131 {MAX98927_R0081_BROWNOUT_LVL4_AMP1_CTRL3
, 0x00},
132 {MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM
, 0x00},
133 {MAX98927_R0083_ENV_TRACK_BOOST_VOUT_DELAY
, 0x00},
134 {MAX98927_R0084_ENV_TRACK_REL_RATE
, 0x00},
135 {MAX98927_R0085_ENV_TRACK_HOLD_RATE
, 0x00},
136 {MAX98927_R0086_ENV_TRACK_CTRL
, 0x00},
137 {MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
, 0x00},
138 {MAX98927_R00FF_GLOBAL_SHDN
, 0x00},
139 {MAX98927_R0100_SOFT_RESET
, 0x00},
140 {MAX98927_R01FF_REV_ID
, 0x40},
143 static int max98927_dai_set_fmt(struct snd_soc_dai
*codec_dai
, unsigned int fmt
)
145 struct snd_soc_component
*component
= codec_dai
->component
;
146 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
147 unsigned int mode
= 0;
148 unsigned int format
= 0;
149 bool use_pdm
= false;
150 unsigned int invert
= 0;
152 dev_dbg(component
->dev
, "%s: fmt 0x%08X\n", __func__
, fmt
);
154 switch (fmt
& SND_SOC_DAIFMT_MASTER_MASK
) {
155 case SND_SOC_DAIFMT_CBS_CFS
:
156 mode
= MAX98927_PCM_MASTER_MODE_SLAVE
;
158 case SND_SOC_DAIFMT_CBM_CFM
:
159 max98927
->master
= true;
160 mode
= MAX98927_PCM_MASTER_MODE_MASTER
;
163 dev_err(component
->dev
, "DAI clock mode unsupported\n");
167 regmap_update_bits(max98927
->regmap
,
168 MAX98927_R0021_PCM_MASTER_MODE
,
169 MAX98927_PCM_MASTER_MODE_MASK
,
172 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
173 case SND_SOC_DAIFMT_NB_NF
:
175 case SND_SOC_DAIFMT_IB_NF
:
176 invert
= MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE
;
179 dev_err(component
->dev
, "DAI invert mode unsupported\n");
183 regmap_update_bits(max98927
->regmap
,
184 MAX98927_R0020_PCM_MODE_CFG
,
185 MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE
,
188 /* interface format */
189 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
190 case SND_SOC_DAIFMT_I2S
:
191 format
= MAX98927_PCM_FORMAT_I2S
;
193 case SND_SOC_DAIFMT_LEFT_J
:
194 format
= MAX98927_PCM_FORMAT_LJ
;
196 case SND_SOC_DAIFMT_DSP_A
:
197 format
= MAX98927_PCM_FORMAT_TDM_MODE1
;
199 case SND_SOC_DAIFMT_DSP_B
:
200 format
= MAX98927_PCM_FORMAT_TDM_MODE0
;
202 case SND_SOC_DAIFMT_PDM
:
208 max98927
->iface
= fmt
& SND_SOC_DAIFMT_FORMAT_MASK
;
211 /* pcm channel configuration */
212 regmap_update_bits(max98927
->regmap
,
213 MAX98927_R0018_PCM_RX_EN_A
,
214 MAX98927_PCM_RX_CH0_EN
| MAX98927_PCM_RX_CH1_EN
,
215 MAX98927_PCM_RX_CH0_EN
| MAX98927_PCM_RX_CH1_EN
);
217 regmap_update_bits(max98927
->regmap
,
218 MAX98927_R0020_PCM_MODE_CFG
,
219 MAX98927_PCM_MODE_CFG_FORMAT_MASK
,
220 format
<< MAX98927_PCM_MODE_CFG_FORMAT_SHIFT
);
222 regmap_update_bits(max98927
->regmap
,
223 MAX98927_R003B_SPK_SRC_SEL
,
224 MAX98927_SPK_SRC_MASK
, 0);
226 regmap_update_bits(max98927
->regmap
,
227 MAX98927_R0035_PDM_RX_CTRL
,
228 MAX98927_PDM_RX_EN_MASK
, 0);
230 /* pdm channel configuration */
231 regmap_update_bits(max98927
->regmap
,
232 MAX98927_R0035_PDM_RX_CTRL
,
233 MAX98927_PDM_RX_EN_MASK
, 1);
235 regmap_update_bits(max98927
->regmap
,
236 MAX98927_R003B_SPK_SRC_SEL
,
237 MAX98927_SPK_SRC_MASK
, 3);
239 regmap_update_bits(max98927
->regmap
,
240 MAX98927_R0018_PCM_RX_EN_A
,
241 MAX98927_PCM_RX_CH0_EN
| MAX98927_PCM_RX_CH1_EN
, 0);
246 /* codec MCLK rate in master mode */
247 static const int rate_table
[] = {
248 5644800, 6000000, 6144000, 6500000,
249 9600000, 11289600, 12000000, 12288000,
253 /* BCLKs per LRCLK */
254 static const int bclk_sel_table
[] = {
255 32, 48, 64, 96, 128, 192, 256, 384, 512,
258 static int max98927_get_bclk_sel(int bclk
)
261 /* match BCLKs per LRCLK */
262 for (i
= 0; i
< ARRAY_SIZE(bclk_sel_table
); i
++) {
263 if (bclk_sel_table
[i
] == bclk
)
268 static int max98927_set_clock(struct max98927_priv
*max98927
,
269 struct snd_pcm_hw_params
*params
)
271 struct snd_soc_component
*component
= max98927
->component
;
272 /* BCLK/LRCLK ratio calculation */
273 int blr_clk_ratio
= params_channels(params
) * max98927
->ch_size
;
276 if (max98927
->master
) {
278 /* match rate to closest value */
279 for (i
= 0; i
< ARRAY_SIZE(rate_table
); i
++) {
280 if (rate_table
[i
] >= max98927
->sysclk
)
283 if (i
== ARRAY_SIZE(rate_table
)) {
284 dev_err(component
->dev
, "failed to find proper clock rate.\n");
287 regmap_update_bits(max98927
->regmap
,
288 MAX98927_R0021_PCM_MASTER_MODE
,
289 MAX98927_PCM_MASTER_MODE_MCLK_MASK
,
290 i
<< MAX98927_PCM_MASTER_MODE_MCLK_RATE_SHIFT
);
293 if (!max98927
->tdm_mode
) {
294 /* BCLK configuration */
295 value
= max98927_get_bclk_sel(blr_clk_ratio
);
297 dev_err(component
->dev
, "format unsupported %d\n",
298 params_format(params
));
302 regmap_update_bits(max98927
->regmap
,
303 MAX98927_R0022_PCM_CLK_SETUP
,
304 MAX98927_PCM_CLK_SETUP_BSEL_MASK
,
310 static int max98927_dai_hw_params(struct snd_pcm_substream
*substream
,
311 struct snd_pcm_hw_params
*params
,
312 struct snd_soc_dai
*dai
)
314 struct snd_soc_component
*component
= dai
->component
;
315 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
316 unsigned int sampling_rate
= 0;
317 unsigned int chan_sz
= 0;
319 /* pcm mode configuration */
320 switch (snd_pcm_format_width(params_format(params
))) {
322 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_16
;
325 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_24
;
328 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_32
;
331 dev_err(component
->dev
, "format unsupported %d\n",
332 params_format(params
));
336 max98927
->ch_size
= snd_pcm_format_width(params_format(params
));
338 regmap_update_bits(max98927
->regmap
,
339 MAX98927_R0020_PCM_MODE_CFG
,
340 MAX98927_PCM_MODE_CFG_CHANSZ_MASK
, chan_sz
);
342 dev_dbg(component
->dev
, "format supported %d",
343 params_format(params
));
345 /* sampling rate configuration */
346 switch (params_rate(params
)) {
348 sampling_rate
= MAX98927_PCM_SR_SET1_SR_8000
;
351 sampling_rate
= MAX98927_PCM_SR_SET1_SR_11025
;
354 sampling_rate
= MAX98927_PCM_SR_SET1_SR_12000
;
357 sampling_rate
= MAX98927_PCM_SR_SET1_SR_16000
;
360 sampling_rate
= MAX98927_PCM_SR_SET1_SR_22050
;
363 sampling_rate
= MAX98927_PCM_SR_SET1_SR_24000
;
366 sampling_rate
= MAX98927_PCM_SR_SET1_SR_32000
;
369 sampling_rate
= MAX98927_PCM_SR_SET1_SR_44100
;
372 sampling_rate
= MAX98927_PCM_SR_SET1_SR_48000
;
375 dev_err(component
->dev
, "rate %d not supported\n",
376 params_rate(params
));
379 /* set DAI_SR to correct LRCLK frequency */
380 regmap_update_bits(max98927
->regmap
,
381 MAX98927_R0023_PCM_SR_SETUP1
,
382 MAX98927_PCM_SR_SET1_SR_MASK
,
384 regmap_update_bits(max98927
->regmap
,
385 MAX98927_R0024_PCM_SR_SETUP2
,
386 MAX98927_PCM_SR_SET2_SR_MASK
,
387 sampling_rate
<< MAX98927_PCM_SR_SET2_SR_SHIFT
);
389 /* set sampling rate of IV */
390 if (max98927
->interleave_mode
&&
391 sampling_rate
> MAX98927_PCM_SR_SET1_SR_16000
)
392 regmap_update_bits(max98927
->regmap
,
393 MAX98927_R0024_PCM_SR_SETUP2
,
394 MAX98927_PCM_SR_SET2_IVADC_SR_MASK
,
397 regmap_update_bits(max98927
->regmap
,
398 MAX98927_R0024_PCM_SR_SETUP2
,
399 MAX98927_PCM_SR_SET2_IVADC_SR_MASK
,
401 return max98927_set_clock(max98927
, params
);
406 static int max98927_dai_tdm_slot(struct snd_soc_dai
*dai
,
407 unsigned int tx_mask
, unsigned int rx_mask
,
408 int slots
, int slot_width
)
410 struct snd_soc_component
*component
= dai
->component
;
411 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
413 unsigned int chan_sz
= 0;
415 max98927
->tdm_mode
= true;
417 /* BCLK configuration */
418 bsel
= max98927_get_bclk_sel(slots
* slot_width
);
420 dev_err(component
->dev
, "BCLK %d not supported\n",
425 regmap_update_bits(max98927
->regmap
,
426 MAX98927_R0022_PCM_CLK_SETUP
,
427 MAX98927_PCM_CLK_SETUP_BSEL_MASK
,
430 /* Channel size configuration */
431 switch (slot_width
) {
433 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_16
;
436 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_24
;
439 chan_sz
= MAX98927_PCM_MODE_CFG_CHANSZ_32
;
442 dev_err(component
->dev
, "format unsupported %d\n",
447 regmap_update_bits(max98927
->regmap
,
448 MAX98927_R0020_PCM_MODE_CFG
,
449 MAX98927_PCM_MODE_CFG_CHANSZ_MASK
, chan_sz
);
451 /* Rx slot configuration */
452 regmap_write(max98927
->regmap
,
453 MAX98927_R0018_PCM_RX_EN_A
,
455 regmap_write(max98927
->regmap
,
456 MAX98927_R0019_PCM_RX_EN_B
,
457 (rx_mask
& 0xFF00) >> 8);
459 /* Tx slot configuration */
460 regmap_write(max98927
->regmap
,
461 MAX98927_R001A_PCM_TX_EN_A
,
463 regmap_write(max98927
->regmap
,
464 MAX98927_R001B_PCM_TX_EN_B
,
465 (tx_mask
& 0xFF00) >> 8);
467 /* Tx slot Hi-Z configuration */
468 regmap_write(max98927
->regmap
,
469 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
471 regmap_write(max98927
->regmap
,
472 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
473 (~tx_mask
& 0xFF00) >> 8);
478 #define MAX98927_RATES SNDRV_PCM_RATE_8000_48000
480 #define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
481 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
483 static int max98927_dai_set_sysclk(struct snd_soc_dai
*dai
,
484 int clk_id
, unsigned int freq
, int dir
)
486 struct snd_soc_component
*component
= dai
->component
;
487 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
489 max98927
->sysclk
= freq
;
493 static const struct snd_soc_dai_ops max98927_dai_ops
= {
494 .set_sysclk
= max98927_dai_set_sysclk
,
495 .set_fmt
= max98927_dai_set_fmt
,
496 .hw_params
= max98927_dai_hw_params
,
497 .set_tdm_slot
= max98927_dai_tdm_slot
,
500 static int max98927_dac_event(struct snd_soc_dapm_widget
*w
,
501 struct snd_kcontrol
*kcontrol
, int event
)
503 struct snd_soc_component
*component
= snd_soc_dapm_to_component(w
->dapm
);
504 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
507 case SND_SOC_DAPM_PRE_PMU
:
508 max98927
->tdm_mode
= 0;
510 case SND_SOC_DAPM_POST_PMU
:
511 regmap_update_bits(max98927
->regmap
,
512 MAX98927_R003A_AMP_EN
,
513 MAX98927_AMP_EN_MASK
, 1);
514 regmap_update_bits(max98927
->regmap
,
515 MAX98927_R00FF_GLOBAL_SHDN
,
516 MAX98927_GLOBAL_EN_MASK
, 1);
518 case SND_SOC_DAPM_POST_PMD
:
519 regmap_update_bits(max98927
->regmap
,
520 MAX98927_R00FF_GLOBAL_SHDN
,
521 MAX98927_GLOBAL_EN_MASK
, 0);
522 regmap_update_bits(max98927
->regmap
,
523 MAX98927_R003A_AMP_EN
,
524 MAX98927_AMP_EN_MASK
, 0);
532 static const char * const max98927_switch_text
[] = {
533 "Left", "Right", "LeftRight"};
535 static const struct soc_enum dai_sel_enum
=
536 SOC_ENUM_SINGLE(MAX98927_R0025_PCM_TO_SPK_MONOMIX_A
,
537 MAX98927_PCM_TO_SPK_MONOMIX_CFG_SHIFT
,
538 3, max98927_switch_text
);
540 static const struct snd_kcontrol_new max98927_dai_controls
=
541 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum
);
543 static const struct snd_kcontrol_new max98927_vi_control
=
544 SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG
, 2, 1, 0);
546 static const struct snd_soc_dapm_widget max98927_dapm_widgets
[] = {
547 SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", MAX98927_R003A_AMP_EN
,
548 0, 0, max98927_dac_event
,
549 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_POST_PMD
),
550 SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM
, 0, 0,
551 &max98927_dai_controls
),
552 SND_SOC_DAPM_OUTPUT("BE_OUT"),
553 SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0,
554 MAX98927_R003E_MEAS_EN
, 0, 0),
555 SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
556 MAX98927_R003E_MEAS_EN
, 1, 0),
557 SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM
, 0, 0,
558 &max98927_vi_control
),
559 SND_SOC_DAPM_SIGGEN("VMON"),
560 SND_SOC_DAPM_SIGGEN("IMON"),
563 static DECLARE_TLV_DB_SCALE(max98927_spk_tlv
, 300, 300, 0);
564 static DECLARE_TLV_DB_SCALE(max98927_digital_tlv
, -1600, 25, 0);
566 static bool max98927_readable_register(struct device
*dev
, unsigned int reg
)
569 case MAX98927_R0001_INT_RAW1
... MAX98927_R0028_ICC_RX_EN_B
:
570 case MAX98927_R002B_ICC_TX_EN_A
... MAX98927_R002C_ICC_TX_EN_B
:
571 case MAX98927_R002E_ICC_HIZ_MANUAL_MODE
572 ... MAX98927_R004E_MEAS_ADC_CH2_READ
:
573 case MAX98927_R0051_BROWNOUT_STATUS
574 ... MAX98927_R0055_BROWNOUT_LVL_HOLD
:
575 case MAX98927_R005A_BROWNOUT_LVL1_THRESH
576 ... MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE
:
577 case MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT
578 ... MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
:
579 case MAX98927_R00FF_GLOBAL_SHDN
:
580 case MAX98927_R0100_SOFT_RESET
:
581 case MAX98927_R01FF_REV_ID
:
588 static bool max98927_volatile_reg(struct device
*dev
, unsigned int reg
)
591 case MAX98927_R0001_INT_RAW1
... MAX98927_R0009_INT_FLAG3
:
592 case MAX98927_R004C_MEAS_ADC_CH0_READ
:
593 case MAX98927_R004D_MEAS_ADC_CH1_READ
:
594 case MAX98927_R004E_MEAS_ADC_CH2_READ
:
595 case MAX98927_R0051_BROWNOUT_STATUS
:
596 case MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
:
597 case MAX98927_R01FF_REV_ID
:
598 case MAX98927_R0100_SOFT_RESET
:
605 static const char * const max98927_boost_voltage_text
[] = {
606 "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
607 "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
608 "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
609 "9.5V", "9.625V", "9.75V", "9.875V", "10V"
612 static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage
,
613 MAX98927_R0040_BOOST_CTRL0
, 0,
614 max98927_boost_voltage_text
);
616 static const char * const max98927_current_limit_text
[] = {
617 "1.00A", "1.10A", "1.20A", "1.30A", "1.40A", "1.50A", "1.60A", "1.70A",
618 "1.80A", "1.90A", "2.00A", "2.10A", "2.20A", "2.30A", "2.40A", "2.50A",
619 "2.60A", "2.70A", "2.80A", "2.90A", "3.00A", "3.10A", "3.20A", "3.30A",
620 "3.40A", "3.50A", "3.60A", "3.70A", "3.80A", "3.90A", "4.00A", "4.10A"
623 static SOC_ENUM_SINGLE_DECL(max98927_current_limit
,
624 MAX98927_R0042_BOOST_CTRL1
, 1,
625 max98927_current_limit_text
);
627 static const struct snd_kcontrol_new max98927_snd_controls
[] = {
628 SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN
,
631 SOC_SINGLE_TLV("Digital Volume", MAX98927_R0036_AMP_VOL_CTRL
,
632 0, (1<<MAX98927_AMP_VOL_WIDTH
)-1, 0,
633 max98927_digital_tlv
),
634 SOC_SINGLE("Amp DSP Switch", MAX98927_R0052_BROWNOUT_EN
,
635 MAX98927_BROWNOUT_DSP_SHIFT
, 1, 0),
636 SOC_SINGLE("Ramp Switch", MAX98927_R0037_AMP_DSP_CFG
,
637 MAX98927_AMP_DSP_CFG_RMP_SHIFT
, 1, 0),
638 SOC_SINGLE("DRE Switch", MAX98927_R0039_DRE_CTRL
,
639 MAX98927_DRE_EN_SHIFT
, 1, 0),
640 SOC_SINGLE("Volume Location Switch", MAX98927_R0036_AMP_VOL_CTRL
,
641 MAX98927_AMP_VOL_SEL_SHIFT
, 1, 0),
642 SOC_ENUM("Boost Output Voltage", max98927_boost_voltage
),
643 SOC_ENUM("Current Limit", max98927_current_limit
),
646 static const struct snd_soc_dapm_route max98927_audio_map
[] = {
648 {"DAI Sel Mux", "Left", "Amp Enable"},
649 {"DAI Sel Mux", "Right", "Amp Enable"},
650 {"DAI Sel Mux", "LeftRight", "Amp Enable"},
651 {"BE_OUT", NULL
, "DAI Sel Mux"},
653 { "VI Sense", "Switch", "VMON" },
654 { "VI Sense", "Switch", "IMON" },
655 { "Voltage Sense", NULL
, "VI Sense" },
656 { "Current Sense", NULL
, "VI Sense" },
659 static struct snd_soc_dai_driver max98927_dai
[] = {
661 .name
= "max98927-aif1",
663 .stream_name
= "HiFi Playback",
666 .rates
= MAX98927_RATES
,
667 .formats
= MAX98927_FORMATS
,
670 .stream_name
= "HiFi Capture",
673 .rates
= MAX98927_RATES
,
674 .formats
= MAX98927_FORMATS
,
676 .ops
= &max98927_dai_ops
,
680 static int max98927_probe(struct snd_soc_component
*component
)
682 struct max98927_priv
*max98927
= snd_soc_component_get_drvdata(component
);
684 max98927
->component
= component
;
687 regmap_write(max98927
->regmap
,
688 MAX98927_R0100_SOFT_RESET
, MAX98927_SOFT_RESET
);
690 /* IV default slot configuration */
691 regmap_write(max98927
->regmap
,
692 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
694 regmap_write(max98927
->regmap
,
695 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
697 regmap_write(max98927
->regmap
,
698 MAX98927_R0025_PCM_TO_SPK_MONOMIX_A
,
700 regmap_write(max98927
->regmap
,
701 MAX98927_R0026_PCM_TO_SPK_MONOMIX_B
,
703 /* Set inital volume (+13dB) */
704 regmap_write(max98927
->regmap
,
705 MAX98927_R0036_AMP_VOL_CTRL
,
707 regmap_write(max98927
->regmap
,
708 MAX98927_R003C_SPK_GAIN
,
710 /* Enable DC blocker */
711 regmap_write(max98927
->regmap
,
712 MAX98927_R0037_AMP_DSP_CFG
,
714 /* Enable IMON VMON DC blocker */
715 regmap_write(max98927
->regmap
,
716 MAX98927_R003F_MEAS_DSP_CFG
,
718 /* Boost Output Voltage & Current limit */
719 regmap_write(max98927
->regmap
,
720 MAX98927_R0040_BOOST_CTRL0
,
722 regmap_write(max98927
->regmap
,
723 MAX98927_R0042_BOOST_CTRL1
,
725 /* Measurement ADC config */
726 regmap_write(max98927
->regmap
,
727 MAX98927_R0043_MEAS_ADC_CFG
,
729 regmap_write(max98927
->regmap
,
730 MAX98927_R0044_MEAS_ADC_BASE_MSB
,
732 regmap_write(max98927
->regmap
,
733 MAX98927_R0045_MEAS_ADC_BASE_LSB
,
736 regmap_write(max98927
->regmap
,
737 MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1
,
739 /* Envelope Tracking configuration */
740 regmap_write(max98927
->regmap
,
741 MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM
,
743 regmap_write(max98927
->regmap
,
744 MAX98927_R0086_ENV_TRACK_CTRL
,
746 regmap_write(max98927
->regmap
,
747 MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ
,
750 /* voltage, current slot configuration */
751 regmap_write(max98927
->regmap
,
752 MAX98927_R001E_PCM_TX_CH_SRC_A
,
753 (max98927
->i_l_slot
<<MAX98927_PCM_TX_CH_SRC_A_I_SHIFT
|
754 max98927
->v_l_slot
)&0xFF);
756 if (max98927
->v_l_slot
< 8) {
757 regmap_update_bits(max98927
->regmap
,
758 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
759 1 << max98927
->v_l_slot
, 0);
760 regmap_update_bits(max98927
->regmap
,
761 MAX98927_R001A_PCM_TX_EN_A
,
762 1 << max98927
->v_l_slot
,
763 1 << max98927
->v_l_slot
);
765 regmap_update_bits(max98927
->regmap
,
766 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
767 1 << (max98927
->v_l_slot
- 8), 0);
768 regmap_update_bits(max98927
->regmap
,
769 MAX98927_R001B_PCM_TX_EN_B
,
770 1 << (max98927
->v_l_slot
- 8),
771 1 << (max98927
->v_l_slot
- 8));
774 if (max98927
->i_l_slot
< 8) {
775 regmap_update_bits(max98927
->regmap
,
776 MAX98927_R001C_PCM_TX_HIZ_CTRL_A
,
777 1 << max98927
->i_l_slot
, 0);
778 regmap_update_bits(max98927
->regmap
,
779 MAX98927_R001A_PCM_TX_EN_A
,
780 1 << max98927
->i_l_slot
,
781 1 << max98927
->i_l_slot
);
783 regmap_update_bits(max98927
->regmap
,
784 MAX98927_R001D_PCM_TX_HIZ_CTRL_B
,
785 1 << (max98927
->i_l_slot
- 8), 0);
786 regmap_update_bits(max98927
->regmap
,
787 MAX98927_R001B_PCM_TX_EN_B
,
788 1 << (max98927
->i_l_slot
- 8),
789 1 << (max98927
->i_l_slot
- 8));
792 /* Set interleave mode */
793 if (max98927
->interleave_mode
)
794 regmap_update_bits(max98927
->regmap
,
795 MAX98927_R001F_PCM_TX_CH_SRC_B
,
796 MAX98927_PCM_TX_CH_INTERLEAVE_MASK
,
797 MAX98927_PCM_TX_CH_INTERLEAVE_MASK
);
801 #ifdef CONFIG_PM_SLEEP
802 static int max98927_suspend(struct device
*dev
)
804 struct max98927_priv
*max98927
= dev_get_drvdata(dev
);
806 regcache_cache_only(max98927
->regmap
, true);
807 regcache_mark_dirty(max98927
->regmap
);
810 static int max98927_resume(struct device
*dev
)
812 struct max98927_priv
*max98927
= dev_get_drvdata(dev
);
814 regmap_write(max98927
->regmap
,
815 MAX98927_R0100_SOFT_RESET
, MAX98927_SOFT_RESET
);
816 regcache_cache_only(max98927
->regmap
, false);
817 regcache_sync(max98927
->regmap
);
822 static const struct dev_pm_ops max98927_pm
= {
823 SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend
, max98927_resume
)
826 static const struct snd_soc_component_driver soc_component_dev_max98927
= {
827 .probe
= max98927_probe
,
828 .controls
= max98927_snd_controls
,
829 .num_controls
= ARRAY_SIZE(max98927_snd_controls
),
830 .dapm_widgets
= max98927_dapm_widgets
,
831 .num_dapm_widgets
= ARRAY_SIZE(max98927_dapm_widgets
),
832 .dapm_routes
= max98927_audio_map
,
833 .num_dapm_routes
= ARRAY_SIZE(max98927_audio_map
),
835 .use_pmdown_time
= 1,
837 .non_legacy_dai_naming
= 1,
840 static const struct regmap_config max98927_regmap
= {
843 .max_register
= MAX98927_R01FF_REV_ID
,
844 .reg_defaults
= max98927_reg
,
845 .num_reg_defaults
= ARRAY_SIZE(max98927_reg
),
846 .readable_reg
= max98927_readable_register
,
847 .volatile_reg
= max98927_volatile_reg
,
848 .cache_type
= REGCACHE_RBTREE
,
851 static void max98927_slot_config(struct i2c_client
*i2c
,
852 struct max98927_priv
*max98927
)
855 struct device
*dev
= &i2c
->dev
;
857 if (!device_property_read_u32(dev
, "vmon-slot-no", &value
))
858 max98927
->v_l_slot
= value
& 0xF;
860 max98927
->v_l_slot
= 0;
862 if (!device_property_read_u32(dev
, "imon-slot-no", &value
))
863 max98927
->i_l_slot
= value
& 0xF;
865 max98927
->i_l_slot
= 1;
868 static int max98927_i2c_probe(struct i2c_client
*i2c
,
869 const struct i2c_device_id
*id
)
874 struct max98927_priv
*max98927
= NULL
;
876 max98927
= devm_kzalloc(&i2c
->dev
,
877 sizeof(*max98927
), GFP_KERNEL
);
883 i2c_set_clientdata(i2c
, max98927
);
885 /* update interleave mode info */
886 if (!of_property_read_u32(i2c
->dev
.of_node
,
887 "interleave_mode", &value
)) {
889 max98927
->interleave_mode
= 1;
891 max98927
->interleave_mode
= 0;
893 max98927
->interleave_mode
= 0;
895 /* regmap initialization */
897 = devm_regmap_init_i2c(i2c
, &max98927_regmap
);
898 if (IS_ERR(max98927
->regmap
)) {
899 ret
= PTR_ERR(max98927
->regmap
);
901 "Failed to allocate regmap: %d\n", ret
);
905 /* Check Revision ID */
906 ret
= regmap_read(max98927
->regmap
,
907 MAX98927_R01FF_REV_ID
, ®
);
910 "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID
);
913 dev_info(&i2c
->dev
, "MAX98927 revisionID: 0x%02X\n", reg
);
915 /* voltage/current slot configuration */
916 max98927_slot_config(i2c
, max98927
);
918 /* codec registeration */
919 ret
= devm_snd_soc_register_component(&i2c
->dev
,
920 &soc_component_dev_max98927
,
921 max98927_dai
, ARRAY_SIZE(max98927_dai
));
923 dev_err(&i2c
->dev
, "Failed to register component: %d\n", ret
);
928 static const struct i2c_device_id max98927_i2c_id
[] = {
933 MODULE_DEVICE_TABLE(i2c
, max98927_i2c_id
);
935 #if defined(CONFIG_OF)
936 static const struct of_device_id max98927_of_match
[] = {
937 { .compatible
= "maxim,max98927", },
940 MODULE_DEVICE_TABLE(of
, max98927_of_match
);
944 static const struct acpi_device_id max98927_acpi_match
[] = {
948 MODULE_DEVICE_TABLE(acpi
, max98927_acpi_match
);
951 static struct i2c_driver max98927_i2c_driver
= {
954 .of_match_table
= of_match_ptr(max98927_of_match
),
955 .acpi_match_table
= ACPI_PTR(max98927_acpi_match
),
958 .probe
= max98927_i2c_probe
,
959 .id_table
= max98927_i2c_id
,
962 module_i2c_driver(max98927_i2c_driver
)
964 MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
965 MODULE_AUTHOR("Ryan Lee <ryans.lee@maximintegrated.com>");
966 MODULE_LICENSE("GPL");