xref: /linux/sound/soc/codecs/max98927.c (revision d642ef71)
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 
22 static struct reg_default max98927_reg[] = {
23 	{MAX98927_R0001_INT_RAW1,  0x00},
24 	{MAX98927_R0002_INT_RAW2,  0x00},
25 	{MAX98927_R0003_INT_RAW3,  0x00},
26 	{MAX98927_R0004_INT_STATE1,  0x00},
27 	{MAX98927_R0005_INT_STATE2,  0x00},
28 	{MAX98927_R0006_INT_STATE3,  0x00},
29 	{MAX98927_R0007_INT_FLAG1,  0x00},
30 	{MAX98927_R0008_INT_FLAG2,  0x00},
31 	{MAX98927_R0009_INT_FLAG3,  0x00},
32 	{MAX98927_R000A_INT_EN1,  0x00},
33 	{MAX98927_R000B_INT_EN2,  0x00},
34 	{MAX98927_R000C_INT_EN3,  0x00},
35 	{MAX98927_R000D_INT_FLAG_CLR1,  0x00},
36 	{MAX98927_R000E_INT_FLAG_CLR2,  0x00},
37 	{MAX98927_R000F_INT_FLAG_CLR3,  0x00},
38 	{MAX98927_R0010_IRQ_CTRL,  0x00},
39 	{MAX98927_R0011_CLK_MON,  0x00},
40 	{MAX98927_R0012_WDOG_CTRL,  0x00},
41 	{MAX98927_R0013_WDOG_RST,  0x00},
42 	{MAX98927_R0014_MEAS_ADC_THERM_WARN_THRESH,  0x75},
43 	{MAX98927_R0015_MEAS_ADC_THERM_SHDN_THRESH,  0x8c},
44 	{MAX98927_R0016_MEAS_ADC_THERM_HYSTERESIS,  0x08},
45 	{MAX98927_R0017_PIN_CFG,  0x55},
46 	{MAX98927_R0018_PCM_RX_EN_A,  0x00},
47 	{MAX98927_R0019_PCM_RX_EN_B,  0x00},
48 	{MAX98927_R001A_PCM_TX_EN_A,  0x00},
49 	{MAX98927_R001B_PCM_TX_EN_B,  0x00},
50 	{MAX98927_R001C_PCM_TX_HIZ_CTRL_A,  0x00},
51 	{MAX98927_R001D_PCM_TX_HIZ_CTRL_B,  0x00},
52 	{MAX98927_R001E_PCM_TX_CH_SRC_A,  0x00},
53 	{MAX98927_R001F_PCM_TX_CH_SRC_B,  0x00},
54 	{MAX98927_R0020_PCM_MODE_CFG,  0x40},
55 	{MAX98927_R0021_PCM_MASTER_MODE,  0x00},
56 	{MAX98927_R0022_PCM_CLK_SETUP,  0x22},
57 	{MAX98927_R0023_PCM_SR_SETUP1,  0x00},
58 	{MAX98927_R0024_PCM_SR_SETUP2,  0x00},
59 	{MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,  0x00},
60 	{MAX98927_R0026_PCM_TO_SPK_MONOMIX_B,  0x00},
61 	{MAX98927_R0027_ICC_RX_EN_A,  0x00},
62 	{MAX98927_R0028_ICC_RX_EN_B,  0x00},
63 	{MAX98927_R002B_ICC_TX_EN_A,  0x00},
64 	{MAX98927_R002C_ICC_TX_EN_B,  0x00},
65 	{MAX98927_R002E_ICC_HIZ_MANUAL_MODE,  0x00},
66 	{MAX98927_R002F_ICC_TX_HIZ_EN_A,  0x00},
67 	{MAX98927_R0030_ICC_TX_HIZ_EN_B,  0x00},
68 	{MAX98927_R0031_ICC_LNK_EN,  0x00},
69 	{MAX98927_R0032_PDM_TX_EN,  0x00},
70 	{MAX98927_R0033_PDM_TX_HIZ_CTRL,  0x00},
71 	{MAX98927_R0034_PDM_TX_CTRL,  0x00},
72 	{MAX98927_R0035_PDM_RX_CTRL,  0x00},
73 	{MAX98927_R0036_AMP_VOL_CTRL,  0x00},
74 	{MAX98927_R0037_AMP_DSP_CFG,  0x02},
75 	{MAX98927_R0038_TONE_GEN_DC_CFG,  0x00},
76 	{MAX98927_R0039_DRE_CTRL,  0x01},
77 	{MAX98927_R003A_AMP_EN,  0x00},
78 	{MAX98927_R003B_SPK_SRC_SEL,  0x00},
79 	{MAX98927_R003C_SPK_GAIN,  0x00},
80 	{MAX98927_R003D_SSM_CFG,  0x04},
81 	{MAX98927_R003E_MEAS_EN,  0x00},
82 	{MAX98927_R003F_MEAS_DSP_CFG,  0x04},
83 	{MAX98927_R0040_BOOST_CTRL0,  0x00},
84 	{MAX98927_R0041_BOOST_CTRL3,  0x00},
85 	{MAX98927_R0042_BOOST_CTRL1,  0x00},
86 	{MAX98927_R0043_MEAS_ADC_CFG,  0x00},
87 	{MAX98927_R0044_MEAS_ADC_BASE_MSB,  0x01},
88 	{MAX98927_R0045_MEAS_ADC_BASE_LSB,  0x00},
89 	{MAX98927_R0046_ADC_CH0_DIVIDE,  0x00},
90 	{MAX98927_R0047_ADC_CH1_DIVIDE,  0x00},
91 	{MAX98927_R0048_ADC_CH2_DIVIDE,  0x00},
92 	{MAX98927_R0049_ADC_CH0_FILT_CFG,  0x00},
93 	{MAX98927_R004A_ADC_CH1_FILT_CFG,  0x00},
94 	{MAX98927_R004B_ADC_CH2_FILT_CFG,  0x00},
95 	{MAX98927_R004C_MEAS_ADC_CH0_READ,  0x00},
96 	{MAX98927_R004D_MEAS_ADC_CH1_READ,  0x00},
97 	{MAX98927_R004E_MEAS_ADC_CH2_READ,  0x00},
98 	{MAX98927_R0051_BROWNOUT_STATUS,  0x00},
99 	{MAX98927_R0052_BROWNOUT_EN,  0x00},
100 	{MAX98927_R0053_BROWNOUT_INFINITE_HOLD,  0x00},
101 	{MAX98927_R0054_BROWNOUT_INFINITE_HOLD_CLR,  0x00},
102 	{MAX98927_R0055_BROWNOUT_LVL_HOLD,  0x00},
103 	{MAX98927_R005A_BROWNOUT_LVL1_THRESH,  0x00},
104 	{MAX98927_R005B_BROWNOUT_LVL2_THRESH,  0x00},
105 	{MAX98927_R005C_BROWNOUT_LVL3_THRESH,  0x00},
106 	{MAX98927_R005D_BROWNOUT_LVL4_THRESH,  0x00},
107 	{MAX98927_R005E_BROWNOUT_THRESH_HYSTERYSIS,  0x00},
108 	{MAX98927_R005F_BROWNOUT_AMP_LIMITER_ATK_REL,  0x00},
109 	{MAX98927_R0060_BROWNOUT_AMP_GAIN_ATK_REL,  0x00},
110 	{MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE,  0x00},
111 	{MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT,  0x00},
112 	{MAX98927_R0073_BROWNOUT_LVL1_AMP1_CTRL1,  0x00},
113 	{MAX98927_R0074_BROWNOUT_LVL1_AMP1_CTRL2,  0x00},
114 	{MAX98927_R0075_BROWNOUT_LVL1_AMP1_CTRL3,  0x00},
115 	{MAX98927_R0076_BROWNOUT_LVL2_CUR_LIMIT,  0x00},
116 	{MAX98927_R0077_BROWNOUT_LVL2_AMP1_CTRL1,  0x00},
117 	{MAX98927_R0078_BROWNOUT_LVL2_AMP1_CTRL2,  0x00},
118 	{MAX98927_R0079_BROWNOUT_LVL2_AMP1_CTRL3,  0x00},
119 	{MAX98927_R007A_BROWNOUT_LVL3_CUR_LIMIT,  0x00},
120 	{MAX98927_R007B_BROWNOUT_LVL3_AMP1_CTRL1,  0x00},
121 	{MAX98927_R007C_BROWNOUT_LVL3_AMP1_CTRL2,  0x00},
122 	{MAX98927_R007D_BROWNOUT_LVL3_AMP1_CTRL3,  0x00},
123 	{MAX98927_R007E_BROWNOUT_LVL4_CUR_LIMIT,  0x00},
124 	{MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1,  0x00},
125 	{MAX98927_R0080_BROWNOUT_LVL4_AMP1_CTRL2,  0x00},
126 	{MAX98927_R0081_BROWNOUT_LVL4_AMP1_CTRL3,  0x00},
127 	{MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM,  0x00},
128 	{MAX98927_R0083_ENV_TRACK_BOOST_VOUT_DELAY,  0x00},
129 	{MAX98927_R0084_ENV_TRACK_REL_RATE,  0x00},
130 	{MAX98927_R0085_ENV_TRACK_HOLD_RATE,  0x00},
131 	{MAX98927_R0086_ENV_TRACK_CTRL,  0x00},
132 	{MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ,  0x00},
133 	{MAX98927_R00FF_GLOBAL_SHDN,  0x00},
134 	{MAX98927_R0100_SOFT_RESET,  0x00},
135 	{MAX98927_R01FF_REV_ID,  0x40},
136 };
137 
138 static 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 */
234 static const int rate_table[] = {
235 	5644800, 6000000, 6144000, 6500000,
236 	9600000, 11289600, 12000000, 12288000,
237 	13000000, 19200000,
238 };
239 
240 /* BCLKs per LRCLK */
241 static const int bclk_sel_table[] = {
242 	32, 48, 64, 96, 128, 192, 256, 384, 512,
243 };
244 
245 static 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 }
255 static 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 
296 static int max98927_dai_hw_params(struct snd_pcm_substream *substream,
297 	struct snd_pcm_hw_params *params,
298 	struct snd_soc_dai *dai)
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);
384 err:
385 	return -EINVAL;
386 }
387 
388 static int max98927_dai_tdm_slot(struct snd_soc_dai *dai,
389 	unsigned int tx_mask, unsigned int rx_mask,
390 	int slots, int slot_width)
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 
456 static 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 
466 static const struct snd_soc_dai_ops max98927_dai_ops = {
467 	.set_sysclk = max98927_dai_set_sysclk,
468 	.set_fmt = max98927_dai_set_fmt,
469 	.hw_params = max98927_dai_hw_params,
470 	.set_tdm_slot = max98927_dai_tdm_slot,
471 };
472 
473 static 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 
501 static const char * const max98927_switch_text[] = {
502 	"Left", "Right", "LeftRight"};
503 
504 static const struct soc_enum dai_sel_enum =
505 	SOC_ENUM_SINGLE(MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,
506 			MAX98927_PCM_TO_SPK_MONOMIX_CFG_SHIFT, 3,
507 			max98927_switch_text);
508 
509 static const struct snd_kcontrol_new max98927_dai_controls =
510 	SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
511 
512 static const struct snd_kcontrol_new max98927_vi_control =
513 	SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG, 2, 1, 0);
514 
515 static const struct snd_soc_dapm_widget max98927_dapm_widgets[] = {
516 	SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", MAX98927_R003A_AMP_EN,
517 			   0, 0, max98927_dac_event,
518 			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
519 	SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
520 			 &max98927_dai_controls),
521 	SND_SOC_DAPM_OUTPUT("BE_OUT"),
522 	SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture",  0,
523 			     MAX98927_R003E_MEAS_EN, 0, 0),
524 	SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture",  0,
525 			     MAX98927_R003E_MEAS_EN, 1, 0),
526 	SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0,
527 			    &max98927_vi_control),
528 	SND_SOC_DAPM_SIGGEN("VMON"),
529 	SND_SOC_DAPM_SIGGEN("IMON"),
530 };
531 
532 static DECLARE_TLV_DB_SCALE(max98927_spk_tlv, 300, 300, 0);
533 static DECLARE_TLV_DB_SCALE(max98927_digital_tlv, -1600, 25, 0);
534 
535 static 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 
557 static 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 
574 static const char * const max98927_boost_voltage_text[] = {
575 	"6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
576 	"7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
577 	"8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
578 	"9.5V", "9.625V", "9.75V", "9.875V", "10V"
579 };
580 
581 static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage,
582 		MAX98927_R0040_BOOST_CTRL0, 0,
583 		max98927_boost_voltage_text);
584 
585 static const char * const max98927_current_limit_text[] = {
586 	"1.00A", "1.10A", "1.20A", "1.30A", "1.40A", "1.50A", "1.60A", "1.70A",
587 	"1.80A", "1.90A", "2.00A", "2.10A", "2.20A", "2.30A", "2.40A", "2.50A",
588 	"2.60A", "2.70A", "2.80A", "2.90A", "3.00A", "3.10A", "3.20A", "3.30A",
589 	"3.40A", "3.50A", "3.60A", "3.70A", "3.80A", "3.90A", "4.00A", "4.10A"
590 };
591 
592 static SOC_ENUM_SINGLE_DECL(max98927_current_limit,
593 		MAX98927_R0042_BOOST_CTRL1, 1,
594 		max98927_current_limit_text);
595 
596 static 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 
614 static 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 
627 static 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 
648 static 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
735 static 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 }
743 static 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 
755 static const struct dev_pm_ops max98927_pm = {
756 	SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume)
757 };
758 
759 static const struct snd_soc_component_driver soc_component_dev_max98927 = {
760 	.probe			= max98927_probe,
761 	.controls		= max98927_snd_controls,
762 	.num_controls		= ARRAY_SIZE(max98927_snd_controls),
763 	.dapm_widgets		= max98927_dapm_widgets,
764 	.num_dapm_widgets	= ARRAY_SIZE(max98927_dapm_widgets),
765 	.dapm_routes		= max98927_audio_map,
766 	.num_dapm_routes	= ARRAY_SIZE(max98927_audio_map),
767 	.idle_bias_on		= 1,
768 	.use_pmdown_time	= 1,
769 	.endianness		= 1,
770 };
771 
772 static 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 
783 static 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 
800 static 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, &reg);
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 
869 static 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 
877 static const struct i2c_device_id max98927_i2c_id[] = {
878 	{ "max98927", 0},
879 	{ },
880 };
881 
882 MODULE_DEVICE_TABLE(i2c, max98927_i2c_id);
883 
884 #if defined(CONFIG_OF)
885 static const struct of_device_id max98927_of_match[] = {
886 	{ .compatible = "maxim,max98927", },
887 	{ }
888 };
889 MODULE_DEVICE_TABLE(of, max98927_of_match);
890 #endif
891 
892 #ifdef CONFIG_ACPI
893 static const struct acpi_device_id max98927_acpi_match[] = {
894 	{ "MX98927", 0 },
895 	{},
896 };
897 MODULE_DEVICE_TABLE(acpi, max98927_acpi_match);
898 #endif
899 
900 static 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 
912 module_i2c_driver(max98927_i2c_driver)
913 
914 MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
915 MODULE_AUTHOR("Ryan Lee <ryans.lee@maximintegrated.com>");
916 MODULE_LICENSE("GPL");
917