Loading...
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * max98927.c -- MAX98927 ALSA Soc Audio driver
4 *
5 * Copyright (C) 2016-2017 Maxim Integrated Products
6 * Author: Ryan Lee <ryans.lee@maximintegrated.com>
7 */
8
9#include <linux/acpi.h>
10#include <linux/i2c.h>
11#include <linux/module.h>
12#include <linux/regmap.h>
13#include <linux/slab.h>
14#include <linux/cdev.h>
15#include <sound/pcm.h>
16#include <sound/pcm_params.h>
17#include <sound/soc.h>
18#include <linux/gpio/consumer.h>
19#include <sound/tlv.h>
20#include "max98927.h"
21
22static 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},
136};
137
138static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
139{
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;
146
147 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
148
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;
153 break;
154 case SND_SOC_DAIFMT_CBP_CFP:
155 max98927->provider = true;
156 mode = MAX98927_PCM_MASTER_MODE_MASTER;
157 break;
158 default:
159 dev_err(component->dev, "DAI clock mode unsupported\n");
160 return -EINVAL;
161 }
162
163 regmap_update_bits(max98927->regmap, MAX98927_R0021_PCM_MASTER_MODE,
164 MAX98927_PCM_MASTER_MODE_MASK, mode);
165
166 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
167 case SND_SOC_DAIFMT_NB_NF:
168 break;
169 case SND_SOC_DAIFMT_IB_NF:
170 invert = MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE;
171 break;
172 default:
173 dev_err(component->dev, "DAI invert mode unsupported\n");
174 return -EINVAL;
175 }
176
177 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG,
178 MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE, invert);
179
180 /* interface format */
181 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
182 case SND_SOC_DAIFMT_I2S:
183 format = MAX98927_PCM_FORMAT_I2S;
184 break;
185 case SND_SOC_DAIFMT_LEFT_J:
186 format = MAX98927_PCM_FORMAT_LJ;
187 break;
188 case SND_SOC_DAIFMT_DSP_A:
189 format = MAX98927_PCM_FORMAT_TDM_MODE1;
190 break;
191 case SND_SOC_DAIFMT_DSP_B:
192 format = MAX98927_PCM_FORMAT_TDM_MODE0;
193 break;
194 case SND_SOC_DAIFMT_PDM:
195 use_pdm = true;
196 break;
197 default:
198 return -EINVAL;
199 }
200 max98927->iface = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
201
202 if (!use_pdm) {
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);
207
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);
212
213 regmap_update_bits(max98927->regmap, MAX98927_R003B_SPK_SRC_SEL,
214 MAX98927_SPK_SRC_MASK, 0);
215
216 regmap_update_bits(max98927->regmap, MAX98927_R0035_PDM_RX_CTRL,
217 MAX98927_PDM_RX_EN_MASK, 0);
218 } else {
219 /* pdm channel configuration */
220 regmap_update_bits(max98927->regmap, MAX98927_R0035_PDM_RX_CTRL,
221 MAX98927_PDM_RX_EN_MASK, 1);
222
223 regmap_update_bits(max98927->regmap, MAX98927_R003B_SPK_SRC_SEL,
224 MAX98927_SPK_SRC_MASK, 3);
225
226 regmap_update_bits(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A,
227 MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN,
228 0);
229 }
230 return 0;
231}
232
233/* codec MCLK rate in master mode */
234static const int rate_table[] = {
235 5644800, 6000000, 6144000, 6500000,
236 9600000, 11289600, 12000000, 12288000,
237 13000000, 19200000,
238};
239
240/* BCLKs per LRCLK */
241static const int bclk_sel_table[] = {
242 32, 48, 64, 96, 128, 192, 256, 384, 512,
243};
244
245static int max98927_get_bclk_sel(int bclk)
246{
247 int i;
248 /* match BCLKs per LRCLK */
249 for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) {
250 if (bclk_sel_table[i] == bclk)
251 return i + 2;
252 }
253 return 0;
254}
255static int max98927_set_clock(struct max98927_priv *max98927,
256 struct snd_pcm_hw_params *params)
257{
258 struct snd_soc_component *component = max98927->component;
259 /* BCLK/LRCLK ratio calculation */
260 int blr_clk_ratio = params_channels(params) * max98927->ch_size;
261 int value;
262
263 if (max98927->provider) {
264 int i;
265 /* match rate to closest value */
266 for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
267 if (rate_table[i] >= max98927->sysclk)
268 break;
269 }
270 if (i == ARRAY_SIZE(rate_table)) {
271 dev_err(component->dev, "failed to find proper clock rate.\n");
272 return -EINVAL;
273 }
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);
278 }
279
280 if (!max98927->tdm_mode) {
281 /* BCLK configuration */
282 value = max98927_get_bclk_sel(blr_clk_ratio);
283 if (!value) {
284 dev_err(component->dev, "format unsupported %d\n",
285 params_format(params));
286 return -EINVAL;
287 }
288
289 regmap_update_bits(max98927->regmap,
290 MAX98927_R0022_PCM_CLK_SETUP,
291 MAX98927_PCM_CLK_SETUP_BSEL_MASK, value);
292 }
293 return 0;
294}
295
296static int max98927_dai_hw_params(struct snd_pcm_substream *substream,
297 struct snd_pcm_hw_params *params,
298 struct snd_soc_dai *dai)
299{
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;
304
305 /* pcm mode configuration */
306 switch (snd_pcm_format_width(params_format(params))) {
307 case 16:
308 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
309 break;
310 case 24:
311 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
312 break;
313 case 32:
314 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
315 break;
316 default:
317 dev_err(component->dev, "format unsupported %d\n",
318 params_format(params));
319 goto err;
320 }
321
322 max98927->ch_size = snd_pcm_format_width(params_format(params));
323
324 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG,
325 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
326
327 dev_dbg(component->dev, "format supported %d",
328 params_format(params));
329
330 /* sampling rate configuration */
331 switch (params_rate(params)) {
332 case 8000:
333 sampling_rate = MAX98927_PCM_SR_SET1_SR_8000;
334 break;
335 case 11025:
336 sampling_rate = MAX98927_PCM_SR_SET1_SR_11025;
337 break;
338 case 12000:
339 sampling_rate = MAX98927_PCM_SR_SET1_SR_12000;
340 break;
341 case 16000:
342 sampling_rate = MAX98927_PCM_SR_SET1_SR_16000;
343 break;
344 case 22050:
345 sampling_rate = MAX98927_PCM_SR_SET1_SR_22050;
346 break;
347 case 24000:
348 sampling_rate = MAX98927_PCM_SR_SET1_SR_24000;
349 break;
350 case 32000:
351 sampling_rate = MAX98927_PCM_SR_SET1_SR_32000;
352 break;
353 case 44100:
354 sampling_rate = MAX98927_PCM_SR_SET1_SR_44100;
355 break;
356 case 48000:
357 sampling_rate = MAX98927_PCM_SR_SET1_SR_48000;
358 break;
359 default:
360 dev_err(component->dev, "rate %d not supported\n",
361 params_rate(params));
362 goto err;
363 }
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);
370
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,
377 sampling_rate - 3);
378 else
379 regmap_update_bits(max98927->regmap,
380 MAX98927_R0024_PCM_SR_SETUP2,
381 MAX98927_PCM_SR_SET2_IVADC_SR_MASK,
382 sampling_rate);
383 return max98927_set_clock(max98927, params);
384err:
385 return -EINVAL;
386}
387
388static 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)
391{
392 struct snd_soc_component *component = dai->component;
393 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
394 int bsel = 0;
395 unsigned int chan_sz = 0;
396
397 max98927->tdm_mode = true;
398
399 /* BCLK configuration */
400 bsel = max98927_get_bclk_sel(slots * slot_width);
401 if (bsel == 0) {
402 dev_err(component->dev, "BCLK %d not supported\n",
403 slots * slot_width);
404 return -EINVAL;
405 }
406
407 regmap_update_bits(max98927->regmap, MAX98927_R0022_PCM_CLK_SETUP,
408 MAX98927_PCM_CLK_SETUP_BSEL_MASK, bsel);
409
410 /* Channel size configuration */
411 switch (slot_width) {
412 case 16:
413 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
414 break;
415 case 24:
416 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
417 break;
418 case 32:
419 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
420 break;
421 default:
422 dev_err(component->dev, "format unsupported %d\n",
423 slot_width);
424 return -EINVAL;
425 }
426
427 regmap_update_bits(max98927->regmap, MAX98927_R0020_PCM_MODE_CFG,
428 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
429
430 /* Rx slot configuration */
431 regmap_write(max98927->regmap, MAX98927_R0018_PCM_RX_EN_A,
432 rx_mask & 0xFF);
433 regmap_write(max98927->regmap, MAX98927_R0019_PCM_RX_EN_B,
434 (rx_mask & 0xFF00) >> 8);
435
436 /* Tx slot configuration */
437 regmap_write(max98927->regmap, MAX98927_R001A_PCM_TX_EN_A,
438 tx_mask & 0xFF);
439 regmap_write(max98927->regmap, MAX98927_R001B_PCM_TX_EN_B,
440 (tx_mask & 0xFF00) >> 8);
441
442 /* Tx slot Hi-Z configuration */
443 regmap_write(max98927->regmap, MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
444 ~tx_mask & 0xFF);
445 regmap_write(max98927->regmap, MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
446 (~tx_mask & 0xFF00) >> 8);
447
448 return 0;
449}
450
451#define MAX98927_RATES SNDRV_PCM_RATE_8000_48000
452
453#define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
454 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
455
456static int max98927_dai_set_sysclk(struct snd_soc_dai *dai,
457 int clk_id, unsigned int freq, int dir)
458{
459 struct snd_soc_component *component = dai->component;
460 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
461
462 max98927->sysclk = freq;
463 return 0;
464}
465
466static 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,
471};
472
473static int max98927_dac_event(struct snd_soc_dapm_widget *w,
474 struct snd_kcontrol *kcontrol, int event)
475{
476 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
477 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
478
479 switch (event) {
480 case SND_SOC_DAPM_PRE_PMU:
481 max98927->tdm_mode = false;
482 break;
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);
488 break;
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);
494 break;
495 default:
496 return 0;
497 }
498 return 0;
499}
500
501static const char * const max98927_switch_text[] = {
502 "Left", "Right", "LeftRight"};
503
504static 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);
508
509static const struct snd_kcontrol_new max98927_dai_controls =
510 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
511
512static const struct snd_kcontrol_new max98927_vi_control =
513 SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG, 2, 1, 0);
514
515static 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"),
530};
531
532static DECLARE_TLV_DB_SCALE(max98927_spk_tlv, 300, 300, 0);
533static DECLARE_TLV_DB_SCALE(max98927_digital_tlv, -1600, 25, 0);
534
535static bool max98927_readable_register(struct device *dev, unsigned int reg)
536{
537 switch (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:
551 return true;
552 default:
553 return false;
554 }
555};
556
557static bool max98927_volatile_reg(struct device *dev, unsigned int reg)
558{
559 switch (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:
568 return true;
569 default:
570 return false;
571 }
572}
573
574static 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"
579};
580
581static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage,
582 MAX98927_R0040_BOOST_CTRL0, 0,
583 max98927_boost_voltage_text);
584
585static 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"
590};
591
592static SOC_ENUM_SINGLE_DECL(max98927_current_limit,
593 MAX98927_R0042_BOOST_CTRL1, 1,
594 max98927_current_limit_text);
595
596static const struct snd_kcontrol_new max98927_snd_controls[] = {
597 SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN, 0, 6, 0,
598 max98927_spk_tlv),
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,
607 1, 0),
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),
612};
613
614static const struct snd_soc_dapm_route max98927_audio_map[] = {
615 /* Plabyack */
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"},
620 /* Capture */
621 { "VI Sense", "Switch", "VMON" },
622 { "VI Sense", "Switch", "IMON" },
623 { "Voltage Sense", NULL, "VI Sense" },
624 { "Current Sense", NULL, "VI Sense" },
625};
626
627static struct snd_soc_dai_driver max98927_dai[] = {
628 {
629 .name = "max98927-aif1",
630 .playback = {
631 .stream_name = "HiFi Playback",
632 .channels_min = 1,
633 .channels_max = 2,
634 .rates = MAX98927_RATES,
635 .formats = MAX98927_FORMATS,
636 },
637 .capture = {
638 .stream_name = "HiFi Capture",
639 .channels_min = 1,
640 .channels_max = 2,
641 .rates = MAX98927_RATES,
642 .formats = MAX98927_FORMATS,
643 },
644 .ops = &max98927_dai_ops,
645 }
646};
647
648static int max98927_probe(struct snd_soc_component *component)
649{
650 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
651
652 max98927->component = component;
653
654 /* Software Reset */
655 regmap_write(max98927->regmap, MAX98927_R0100_SOFT_RESET,
656 MAX98927_SOFT_RESET);
657
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,
662 0x80);
663 regmap_write(max98927->regmap, MAX98927_R0026_PCM_TO_SPK_MONOMIX_B,
664 0x1);
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);
679 /* Brownout Level */
680 regmap_write(max98927->regmap, MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1,
681 0x06);
682 /* Envelope Tracking configuration */
683 regmap_write(max98927->regmap, MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM,
684 0x08);
685 regmap_write(max98927->regmap, MAX98927_R0086_ENV_TRACK_CTRL, 0x01);
686 regmap_write(max98927->regmap, MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ,
687 0x10);
688
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);
692
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);
700 } else {
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));
707 }
708
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);
716 } else {
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));
723 }
724
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);
731 return 0;
732}
733
734#ifdef CONFIG_PM_SLEEP
735static int max98927_suspend(struct device *dev)
736{
737 struct max98927_priv *max98927 = dev_get_drvdata(dev);
738
739 regcache_cache_only(max98927->regmap, true);
740 regcache_mark_dirty(max98927->regmap);
741 return 0;
742}
743static int max98927_resume(struct device *dev)
744{
745 struct max98927_priv *max98927 = dev_get_drvdata(dev);
746
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);
751 return 0;
752}
753#endif
754
755static const struct dev_pm_ops max98927_pm = {
756 SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume)
757};
758
759static 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),
767 .idle_bias_on = 1,
768 .use_pmdown_time = 1,
769 .endianness = 1,
770};
771
772static const struct regmap_config max98927_regmap = {
773 .reg_bits = 16,
774 .val_bits = 8,
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,
781};
782
783static void max98927_slot_config(struct i2c_client *i2c,
784 struct max98927_priv *max98927)
785{
786 int value;
787 struct device *dev = &i2c->dev;
788
789 if (!device_property_read_u32(dev, "vmon-slot-no", &value))
790 max98927->v_l_slot = value & 0xF;
791 else
792 max98927->v_l_slot = 0;
793
794 if (!device_property_read_u32(dev, "imon-slot-no", &value))
795 max98927->i_l_slot = value & 0xF;
796 else
797 max98927->i_l_slot = 1;
798}
799
800static int max98927_i2c_probe(struct i2c_client *i2c)
801{
802
803 int ret = 0, value;
804 int reg = 0;
805 struct max98927_priv *max98927 = NULL;
806
807 max98927 = devm_kzalloc(&i2c->dev, sizeof(*max98927), GFP_KERNEL);
808 if (!max98927) {
809 ret = -ENOMEM;
810 return ret;
811 }
812 i2c_set_clientdata(i2c, max98927);
813
814 /* update interleave mode info */
815 if (of_property_read_bool(i2c->dev.of_node, "maxim,interleave-mode")) {
816 max98927->interleave_mode = true;
817 } else {
818 if (!of_property_read_u32(i2c->dev.of_node, "interleave_mode",
819 &value))
820 if (value > 0)
821 max98927->interleave_mode = true;
822 }
823
824 /* regmap initialization */
825 max98927->regmap
826 = devm_regmap_init_i2c(i2c, &max98927_regmap);
827 if (IS_ERR(max98927->regmap)) {
828 ret = PTR_ERR(max98927->regmap);
829 dev_err(&i2c->dev,
830 "Failed to allocate regmap: %d\n", ret);
831 return ret;
832 }
833
834 max98927->reset_gpio = devm_gpiod_get_optional(&i2c->dev, "reset",
835 GPIOD_OUT_HIGH);
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");
839 }
840
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);
845 }
846
847 /* Check Revision ID */
848 ret = regmap_read(max98927->regmap, MAX98927_R01FF_REV_ID, ®);
849 if (ret < 0) {
850 dev_err(&i2c->dev,
851 "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID);
852 return ret;
853 }
854 dev_info(&i2c->dev, "MAX98927 revisionID: 0x%02X\n", reg);
855
856 /* voltage/current slot configuration */
857 max98927_slot_config(i2c, max98927);
858
859 /* codec registeration */
860 ret = devm_snd_soc_register_component(&i2c->dev,
861 &soc_component_dev_max98927,
862 max98927_dai, ARRAY_SIZE(max98927_dai));
863 if (ret < 0)
864 dev_err(&i2c->dev, "Failed to register component: %d\n", ret);
865
866 return ret;
867}
868
869static void max98927_i2c_remove(struct i2c_client *i2c)
870{
871 struct max98927_priv *max98927 = i2c_get_clientdata(i2c);
872
873 if (max98927->reset_gpio)
874 gpiod_set_value_cansleep(max98927->reset_gpio, 1);
875}
876
877static const struct i2c_device_id max98927_i2c_id[] = {
878 { "max98927"},
879 { },
880};
881
882MODULE_DEVICE_TABLE(i2c, max98927_i2c_id);
883
884#if defined(CONFIG_OF)
885static const struct of_device_id max98927_of_match[] = {
886 { .compatible = "maxim,max98927", },
887 { }
888};
889MODULE_DEVICE_TABLE(of, max98927_of_match);
890#endif
891
892#ifdef CONFIG_ACPI
893static const struct acpi_device_id max98927_acpi_match[] = {
894 { "MX98927", 0 },
895 {},
896};
897MODULE_DEVICE_TABLE(acpi, max98927_acpi_match);
898#endif
899
900static struct i2c_driver max98927_i2c_driver = {
901 .driver = {
902 .name = "max98927",
903 .of_match_table = of_match_ptr(max98927_of_match),
904 .acpi_match_table = ACPI_PTR(max98927_acpi_match),
905 .pm = &max98927_pm,
906 },
907 .probe = max98927_i2c_probe,
908 .remove = max98927_i2c_remove,
909 .id_table = max98927_i2c_id,
910};
911
912module_i2c_driver(max98927_i2c_driver)
913
914MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
915MODULE_AUTHOR("Ryan Lee <ryans.lee@maximintegrated.com>");
916MODULE_LICENSE("GPL");
1/*
2 * max98927.c -- MAX98927 ALSA Soc Audio driver
3 *
4 * Copyright (C) 2016-2017 Maxim Integrated Products
5 * Author: Ryan Lee <ryans.lee@maximintegrated.com>
6 *
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.
11 */
12
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>
25#include "max98927.h"
26
27static 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},
141};
142
143static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
144{
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;
151
152 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
153
154 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
155 case SND_SOC_DAIFMT_CBS_CFS:
156 mode = MAX98927_PCM_MASTER_MODE_SLAVE;
157 break;
158 case SND_SOC_DAIFMT_CBM_CFM:
159 max98927->master = true;
160 mode = MAX98927_PCM_MASTER_MODE_MASTER;
161 break;
162 default:
163 dev_err(component->dev, "DAI clock mode unsupported\n");
164 return -EINVAL;
165 }
166
167 regmap_update_bits(max98927->regmap,
168 MAX98927_R0021_PCM_MASTER_MODE,
169 MAX98927_PCM_MASTER_MODE_MASK,
170 mode);
171
172 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
173 case SND_SOC_DAIFMT_NB_NF:
174 break;
175 case SND_SOC_DAIFMT_IB_NF:
176 invert = MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE;
177 break;
178 default:
179 dev_err(component->dev, "DAI invert mode unsupported\n");
180 return -EINVAL;
181 }
182
183 regmap_update_bits(max98927->regmap,
184 MAX98927_R0020_PCM_MODE_CFG,
185 MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE,
186 invert);
187
188 /* interface format */
189 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
190 case SND_SOC_DAIFMT_I2S:
191 format = MAX98927_PCM_FORMAT_I2S;
192 break;
193 case SND_SOC_DAIFMT_LEFT_J:
194 format = MAX98927_PCM_FORMAT_LJ;
195 break;
196 case SND_SOC_DAIFMT_DSP_A:
197 format = MAX98927_PCM_FORMAT_TDM_MODE1;
198 break;
199 case SND_SOC_DAIFMT_DSP_B:
200 format = MAX98927_PCM_FORMAT_TDM_MODE0;
201 break;
202 case SND_SOC_DAIFMT_PDM:
203 use_pdm = true;
204 break;
205 default:
206 return -EINVAL;
207 }
208 max98927->iface = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
209
210 if (!use_pdm) {
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);
216
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);
221
222 regmap_update_bits(max98927->regmap,
223 MAX98927_R003B_SPK_SRC_SEL,
224 MAX98927_SPK_SRC_MASK, 0);
225
226 regmap_update_bits(max98927->regmap,
227 MAX98927_R0035_PDM_RX_CTRL,
228 MAX98927_PDM_RX_EN_MASK, 0);
229 } else {
230 /* pdm channel configuration */
231 regmap_update_bits(max98927->regmap,
232 MAX98927_R0035_PDM_RX_CTRL,
233 MAX98927_PDM_RX_EN_MASK, 1);
234
235 regmap_update_bits(max98927->regmap,
236 MAX98927_R003B_SPK_SRC_SEL,
237 MAX98927_SPK_SRC_MASK, 3);
238
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);
242 }
243 return 0;
244}
245
246/* codec MCLK rate in master mode */
247static const int rate_table[] = {
248 5644800, 6000000, 6144000, 6500000,
249 9600000, 11289600, 12000000, 12288000,
250 13000000, 19200000,
251};
252
253/* BCLKs per LRCLK */
254static const int bclk_sel_table[] = {
255 32, 48, 64, 96, 128, 192, 256, 384, 512,
256};
257
258static int max98927_get_bclk_sel(int bclk)
259{
260 int i;
261 /* match BCLKs per LRCLK */
262 for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) {
263 if (bclk_sel_table[i] == bclk)
264 return i + 2;
265 }
266 return 0;
267}
268static int max98927_set_clock(struct max98927_priv *max98927,
269 struct snd_pcm_hw_params *params)
270{
271 struct snd_soc_component *component = max98927->component;
272 /* BCLK/LRCLK ratio calculation */
273 int blr_clk_ratio = params_channels(params) * max98927->ch_size;
274 int value;
275
276 if (max98927->master) {
277 int i;
278 /* match rate to closest value */
279 for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
280 if (rate_table[i] >= max98927->sysclk)
281 break;
282 }
283 if (i == ARRAY_SIZE(rate_table)) {
284 dev_err(component->dev, "failed to find proper clock rate.\n");
285 return -EINVAL;
286 }
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);
291 }
292
293 if (!max98927->tdm_mode) {
294 /* BCLK configuration */
295 value = max98927_get_bclk_sel(blr_clk_ratio);
296 if (!value) {
297 dev_err(component->dev, "format unsupported %d\n",
298 params_format(params));
299 return -EINVAL;
300 }
301
302 regmap_update_bits(max98927->regmap,
303 MAX98927_R0022_PCM_CLK_SETUP,
304 MAX98927_PCM_CLK_SETUP_BSEL_MASK,
305 value);
306 }
307 return 0;
308}
309
310static int max98927_dai_hw_params(struct snd_pcm_substream *substream,
311 struct snd_pcm_hw_params *params,
312 struct snd_soc_dai *dai)
313{
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;
318
319 /* pcm mode configuration */
320 switch (snd_pcm_format_width(params_format(params))) {
321 case 16:
322 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
323 break;
324 case 24:
325 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
326 break;
327 case 32:
328 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
329 break;
330 default:
331 dev_err(component->dev, "format unsupported %d\n",
332 params_format(params));
333 goto err;
334 }
335
336 max98927->ch_size = snd_pcm_format_width(params_format(params));
337
338 regmap_update_bits(max98927->regmap,
339 MAX98927_R0020_PCM_MODE_CFG,
340 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
341
342 dev_dbg(component->dev, "format supported %d",
343 params_format(params));
344
345 /* sampling rate configuration */
346 switch (params_rate(params)) {
347 case 8000:
348 sampling_rate = MAX98927_PCM_SR_SET1_SR_8000;
349 break;
350 case 11025:
351 sampling_rate = MAX98927_PCM_SR_SET1_SR_11025;
352 break;
353 case 12000:
354 sampling_rate = MAX98927_PCM_SR_SET1_SR_12000;
355 break;
356 case 16000:
357 sampling_rate = MAX98927_PCM_SR_SET1_SR_16000;
358 break;
359 case 22050:
360 sampling_rate = MAX98927_PCM_SR_SET1_SR_22050;
361 break;
362 case 24000:
363 sampling_rate = MAX98927_PCM_SR_SET1_SR_24000;
364 break;
365 case 32000:
366 sampling_rate = MAX98927_PCM_SR_SET1_SR_32000;
367 break;
368 case 44100:
369 sampling_rate = MAX98927_PCM_SR_SET1_SR_44100;
370 break;
371 case 48000:
372 sampling_rate = MAX98927_PCM_SR_SET1_SR_48000;
373 break;
374 default:
375 dev_err(component->dev, "rate %d not supported\n",
376 params_rate(params));
377 goto err;
378 }
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,
383 sampling_rate);
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);
388
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,
395 sampling_rate - 3);
396 else
397 regmap_update_bits(max98927->regmap,
398 MAX98927_R0024_PCM_SR_SETUP2,
399 MAX98927_PCM_SR_SET2_IVADC_SR_MASK,
400 sampling_rate);
401 return max98927_set_clock(max98927, params);
402err:
403 return -EINVAL;
404}
405
406static 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)
409{
410 struct snd_soc_component *component = dai->component;
411 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
412 int bsel = 0;
413 unsigned int chan_sz = 0;
414
415 max98927->tdm_mode = true;
416
417 /* BCLK configuration */
418 bsel = max98927_get_bclk_sel(slots * slot_width);
419 if (bsel == 0) {
420 dev_err(component->dev, "BCLK %d not supported\n",
421 slots * slot_width);
422 return -EINVAL;
423 }
424
425 regmap_update_bits(max98927->regmap,
426 MAX98927_R0022_PCM_CLK_SETUP,
427 MAX98927_PCM_CLK_SETUP_BSEL_MASK,
428 bsel);
429
430 /* Channel size configuration */
431 switch (slot_width) {
432 case 16:
433 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
434 break;
435 case 24:
436 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
437 break;
438 case 32:
439 chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
440 break;
441 default:
442 dev_err(component->dev, "format unsupported %d\n",
443 slot_width);
444 return -EINVAL;
445 }
446
447 regmap_update_bits(max98927->regmap,
448 MAX98927_R0020_PCM_MODE_CFG,
449 MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
450
451 /* Rx slot configuration */
452 regmap_write(max98927->regmap,
453 MAX98927_R0018_PCM_RX_EN_A,
454 rx_mask & 0xFF);
455 regmap_write(max98927->regmap,
456 MAX98927_R0019_PCM_RX_EN_B,
457 (rx_mask & 0xFF00) >> 8);
458
459 /* Tx slot configuration */
460 regmap_write(max98927->regmap,
461 MAX98927_R001A_PCM_TX_EN_A,
462 tx_mask & 0xFF);
463 regmap_write(max98927->regmap,
464 MAX98927_R001B_PCM_TX_EN_B,
465 (tx_mask & 0xFF00) >> 8);
466
467 /* Tx slot Hi-Z configuration */
468 regmap_write(max98927->regmap,
469 MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
470 ~tx_mask & 0xFF);
471 regmap_write(max98927->regmap,
472 MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
473 (~tx_mask & 0xFF00) >> 8);
474
475 return 0;
476}
477
478#define MAX98927_RATES SNDRV_PCM_RATE_8000_48000
479
480#define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
481 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
482
483static int max98927_dai_set_sysclk(struct snd_soc_dai *dai,
484 int clk_id, unsigned int freq, int dir)
485{
486 struct snd_soc_component *component = dai->component;
487 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
488
489 max98927->sysclk = freq;
490 return 0;
491}
492
493static 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,
498};
499
500static int max98927_dac_event(struct snd_soc_dapm_widget *w,
501 struct snd_kcontrol *kcontrol, int event)
502{
503 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
504 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
505
506 switch (event) {
507 case SND_SOC_DAPM_PRE_PMU:
508 max98927->tdm_mode = 0;
509 break;
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);
517 break;
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);
525 break;
526 default:
527 return 0;
528 }
529 return 0;
530}
531
532static const char * const max98927_switch_text[] = {
533 "Left", "Right", "LeftRight"};
534
535static 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);
539
540static const struct snd_kcontrol_new max98927_dai_controls =
541 SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
542
543static const struct snd_kcontrol_new max98927_vi_control =
544 SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG, 2, 1, 0);
545
546static 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"),
561};
562
563static DECLARE_TLV_DB_SCALE(max98927_spk_tlv, 300, 300, 0);
564static DECLARE_TLV_DB_SCALE(max98927_digital_tlv, -1600, 25, 0);
565
566static bool max98927_readable_register(struct device *dev, unsigned int reg)
567{
568 switch (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:
582 return true;
583 default:
584 return false;
585 }
586};
587
588static bool max98927_volatile_reg(struct device *dev, unsigned int reg)
589{
590 switch (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:
599 return true;
600 default:
601 return false;
602 }
603}
604
605static 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"
610};
611
612static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage,
613 MAX98927_R0040_BOOST_CTRL0, 0,
614 max98927_boost_voltage_text);
615
616static 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"
621};
622
623static SOC_ENUM_SINGLE_DECL(max98927_current_limit,
624 MAX98927_R0042_BOOST_CTRL1, 1,
625 max98927_current_limit_text);
626
627static const struct snd_kcontrol_new max98927_snd_controls[] = {
628 SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN,
629 0, 6, 0,
630 max98927_spk_tlv),
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),
644};
645
646static const struct snd_soc_dapm_route max98927_audio_map[] = {
647 /* Plabyack */
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"},
652 /* Capture */
653 { "VI Sense", "Switch", "VMON" },
654 { "VI Sense", "Switch", "IMON" },
655 { "Voltage Sense", NULL, "VI Sense" },
656 { "Current Sense", NULL, "VI Sense" },
657};
658
659static struct snd_soc_dai_driver max98927_dai[] = {
660 {
661 .name = "max98927-aif1",
662 .playback = {
663 .stream_name = "HiFi Playback",
664 .channels_min = 1,
665 .channels_max = 2,
666 .rates = MAX98927_RATES,
667 .formats = MAX98927_FORMATS,
668 },
669 .capture = {
670 .stream_name = "HiFi Capture",
671 .channels_min = 1,
672 .channels_max = 2,
673 .rates = MAX98927_RATES,
674 .formats = MAX98927_FORMATS,
675 },
676 .ops = &max98927_dai_ops,
677 }
678};
679
680static int max98927_probe(struct snd_soc_component *component)
681{
682 struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
683
684 max98927->component = component;
685
686 /* Software Reset */
687 regmap_write(max98927->regmap,
688 MAX98927_R0100_SOFT_RESET, MAX98927_SOFT_RESET);
689
690 /* IV default slot configuration */
691 regmap_write(max98927->regmap,
692 MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
693 0xFF);
694 regmap_write(max98927->regmap,
695 MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
696 0xFF);
697 regmap_write(max98927->regmap,
698 MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,
699 0x80);
700 regmap_write(max98927->regmap,
701 MAX98927_R0026_PCM_TO_SPK_MONOMIX_B,
702 0x1);
703 /* Set inital volume (+13dB) */
704 regmap_write(max98927->regmap,
705 MAX98927_R0036_AMP_VOL_CTRL,
706 0x38);
707 regmap_write(max98927->regmap,
708 MAX98927_R003C_SPK_GAIN,
709 0x05);
710 /* Enable DC blocker */
711 regmap_write(max98927->regmap,
712 MAX98927_R0037_AMP_DSP_CFG,
713 0x03);
714 /* Enable IMON VMON DC blocker */
715 regmap_write(max98927->regmap,
716 MAX98927_R003F_MEAS_DSP_CFG,
717 0xF7);
718 /* Boost Output Voltage & Current limit */
719 regmap_write(max98927->regmap,
720 MAX98927_R0040_BOOST_CTRL0,
721 0x1C);
722 regmap_write(max98927->regmap,
723 MAX98927_R0042_BOOST_CTRL1,
724 0x3E);
725 /* Measurement ADC config */
726 regmap_write(max98927->regmap,
727 MAX98927_R0043_MEAS_ADC_CFG,
728 0x04);
729 regmap_write(max98927->regmap,
730 MAX98927_R0044_MEAS_ADC_BASE_MSB,
731 0x00);
732 regmap_write(max98927->regmap,
733 MAX98927_R0045_MEAS_ADC_BASE_LSB,
734 0x24);
735 /* Brownout Level */
736 regmap_write(max98927->regmap,
737 MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1,
738 0x06);
739 /* Envelope Tracking configuration */
740 regmap_write(max98927->regmap,
741 MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM,
742 0x08);
743 regmap_write(max98927->regmap,
744 MAX98927_R0086_ENV_TRACK_CTRL,
745 0x01);
746 regmap_write(max98927->regmap,
747 MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ,
748 0x10);
749
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);
755
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);
764 } else {
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));
772 }
773
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);
782 } else {
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));
790 }
791
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);
798 return 0;
799}
800
801#ifdef CONFIG_PM_SLEEP
802static int max98927_suspend(struct device *dev)
803{
804 struct max98927_priv *max98927 = dev_get_drvdata(dev);
805
806 regcache_cache_only(max98927->regmap, true);
807 regcache_mark_dirty(max98927->regmap);
808 return 0;
809}
810static int max98927_resume(struct device *dev)
811{
812 struct max98927_priv *max98927 = dev_get_drvdata(dev);
813
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);
818 return 0;
819}
820#endif
821
822static const struct dev_pm_ops max98927_pm = {
823 SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume)
824};
825
826static 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),
834 .idle_bias_on = 1,
835 .use_pmdown_time = 1,
836 .endianness = 1,
837 .non_legacy_dai_naming = 1,
838};
839
840static const struct regmap_config max98927_regmap = {
841 .reg_bits = 16,
842 .val_bits = 8,
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,
849};
850
851static void max98927_slot_config(struct i2c_client *i2c,
852 struct max98927_priv *max98927)
853{
854 int value;
855 struct device *dev = &i2c->dev;
856
857 if (!device_property_read_u32(dev, "vmon-slot-no", &value))
858 max98927->v_l_slot = value & 0xF;
859 else
860 max98927->v_l_slot = 0;
861
862 if (!device_property_read_u32(dev, "imon-slot-no", &value))
863 max98927->i_l_slot = value & 0xF;
864 else
865 max98927->i_l_slot = 1;
866}
867
868static int max98927_i2c_probe(struct i2c_client *i2c,
869 const struct i2c_device_id *id)
870{
871
872 int ret = 0, value;
873 int reg = 0;
874 struct max98927_priv *max98927 = NULL;
875
876 max98927 = devm_kzalloc(&i2c->dev,
877 sizeof(*max98927), GFP_KERNEL);
878
879 if (!max98927) {
880 ret = -ENOMEM;
881 return ret;
882 }
883 i2c_set_clientdata(i2c, max98927);
884
885 /* update interleave mode info */
886 if (!of_property_read_u32(i2c->dev.of_node,
887 "interleave_mode", &value)) {
888 if (value > 0)
889 max98927->interleave_mode = 1;
890 else
891 max98927->interleave_mode = 0;
892 } else
893 max98927->interleave_mode = 0;
894
895 /* regmap initialization */
896 max98927->regmap
897 = devm_regmap_init_i2c(i2c, &max98927_regmap);
898 if (IS_ERR(max98927->regmap)) {
899 ret = PTR_ERR(max98927->regmap);
900 dev_err(&i2c->dev,
901 "Failed to allocate regmap: %d\n", ret);
902 return ret;
903 }
904
905 /* Check Revision ID */
906 ret = regmap_read(max98927->regmap,
907 MAX98927_R01FF_REV_ID, ®);
908 if (ret < 0) {
909 dev_err(&i2c->dev,
910 "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID);
911 return ret;
912 }
913 dev_info(&i2c->dev, "MAX98927 revisionID: 0x%02X\n", reg);
914
915 /* voltage/current slot configuration */
916 max98927_slot_config(i2c, max98927);
917
918 /* codec registeration */
919 ret = devm_snd_soc_register_component(&i2c->dev,
920 &soc_component_dev_max98927,
921 max98927_dai, ARRAY_SIZE(max98927_dai));
922 if (ret < 0)
923 dev_err(&i2c->dev, "Failed to register component: %d\n", ret);
924
925 return ret;
926}
927
928static const struct i2c_device_id max98927_i2c_id[] = {
929 { "max98927", 0},
930 { },
931};
932
933MODULE_DEVICE_TABLE(i2c, max98927_i2c_id);
934
935#if defined(CONFIG_OF)
936static const struct of_device_id max98927_of_match[] = {
937 { .compatible = "maxim,max98927", },
938 { }
939};
940MODULE_DEVICE_TABLE(of, max98927_of_match);
941#endif
942
943#ifdef CONFIG_ACPI
944static const struct acpi_device_id max98927_acpi_match[] = {
945 { "MX98927", 0 },
946 {},
947};
948MODULE_DEVICE_TABLE(acpi, max98927_acpi_match);
949#endif
950
951static struct i2c_driver max98927_i2c_driver = {
952 .driver = {
953 .name = "max98927",
954 .of_match_table = of_match_ptr(max98927_of_match),
955 .acpi_match_table = ACPI_PTR(max98927_acpi_match),
956 .pm = &max98927_pm,
957 },
958 .probe = max98927_i2c_probe,
959 .id_table = max98927_i2c_id,
960};
961
962module_i2c_driver(max98927_i2c_driver)
963
964MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
965MODULE_AUTHOR("Ryan Lee <ryans.lee@maximintegrated.com>");
966MODULE_LICENSE("GPL");