xref: /openbmc/linux/sound/soc/codecs/max98390.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   * max98390.c  --  MAX98390 ALSA Soc Audio driver
4   *
5   * Copyright (C) 2020 Maxim Integrated Products
6   *
7   */
8  
9  #include <linux/acpi.h>
10  #include <linux/cdev.h>
11  #include <linux/dmi.h>
12  #include <linux/firmware.h>
13  #include <linux/gpio/consumer.h>
14  #include <linux/i2c.h>
15  #include <linux/module.h>
16  #include <linux/of_gpio.h>
17  #include <linux/regmap.h>
18  #include <linux/slab.h>
19  #include <linux/time.h>
20  #include <sound/pcm.h>
21  #include <sound/pcm_params.h>
22  #include <sound/soc.h>
23  #include <sound/tlv.h>
24  
25  #include "max98390.h"
26  
27  static struct reg_default max98390_reg_defaults[] = {
28  	{MAX98390_INT_EN1, 0xf0},
29  	{MAX98390_INT_EN2, 0x00},
30  	{MAX98390_INT_EN3, 0x00},
31  	{MAX98390_INT_FLAG_CLR1, 0x00},
32  	{MAX98390_INT_FLAG_CLR2, 0x00},
33  	{MAX98390_INT_FLAG_CLR3, 0x00},
34  	{MAX98390_IRQ_CTRL, 0x01},
35  	{MAX98390_CLK_MON, 0x6d},
36  	{MAX98390_DAT_MON, 0x03},
37  	{MAX98390_WDOG_CTRL, 0x00},
38  	{MAX98390_WDOG_RST, 0x00},
39  	{MAX98390_MEAS_ADC_THERM_WARN_THRESH, 0x75},
40  	{MAX98390_MEAS_ADC_THERM_SHDN_THRESH, 0x8c},
41  	{MAX98390_MEAS_ADC_THERM_HYSTERESIS, 0x08},
42  	{MAX98390_PIN_CFG, 0x55},
43  	{MAX98390_PCM_RX_EN_A, 0x00},
44  	{MAX98390_PCM_RX_EN_B, 0x00},
45  	{MAX98390_PCM_TX_EN_A, 0x00},
46  	{MAX98390_PCM_TX_EN_B, 0x00},
47  	{MAX98390_PCM_TX_HIZ_CTRL_A, 0xff},
48  	{MAX98390_PCM_TX_HIZ_CTRL_B, 0xff},
49  	{MAX98390_PCM_CH_SRC_1, 0x00},
50  	{MAX98390_PCM_CH_SRC_2, 0x00},
51  	{MAX98390_PCM_CH_SRC_3, 0x00},
52  	{MAX98390_PCM_MODE_CFG, 0xc0},
53  	{MAX98390_PCM_MASTER_MODE, 0x1c},
54  	{MAX98390_PCM_CLK_SETUP, 0x44},
55  	{MAX98390_PCM_SR_SETUP, 0x08},
56  	{MAX98390_ICC_RX_EN_A, 0x00},
57  	{MAX98390_ICC_RX_EN_B, 0x00},
58  	{MAX98390_ICC_TX_EN_A, 0x00},
59  	{MAX98390_ICC_TX_EN_B, 0x00},
60  	{MAX98390_ICC_HIZ_MANUAL_MODE, 0x00},
61  	{MAX98390_ICC_TX_HIZ_EN_A, 0x00},
62  	{MAX98390_ICC_TX_HIZ_EN_B, 0x00},
63  	{MAX98390_ICC_LNK_EN, 0x00},
64  	{MAX98390_R2039_AMP_DSP_CFG, 0x0f},
65  	{MAX98390_R203A_AMP_EN, 0x81},
66  	{MAX98390_TONE_GEN_DC_CFG, 0x00},
67  	{MAX98390_SPK_SRC_SEL, 0x00},
68  	{MAX98390_SSM_CFG, 0x85},
69  	{MAX98390_MEAS_EN, 0x03},
70  	{MAX98390_MEAS_DSP_CFG, 0x0f},
71  	{MAX98390_BOOST_CTRL0, 0x1c},
72  	{MAX98390_BOOST_CTRL3, 0x01},
73  	{MAX98390_BOOST_CTRL1, 0x40},
74  	{MAX98390_MEAS_ADC_CFG, 0x07},
75  	{MAX98390_MEAS_ADC_BASE_MSB, 0x00},
76  	{MAX98390_MEAS_ADC_BASE_LSB, 0x23},
77  	{MAX98390_ADC_CH0_DIVIDE, 0x00},
78  	{MAX98390_ADC_CH1_DIVIDE, 0x00},
79  	{MAX98390_ADC_CH2_DIVIDE, 0x00},
80  	{MAX98390_ADC_CH0_FILT_CFG, 0x00},
81  	{MAX98390_ADC_CH1_FILT_CFG, 0x00},
82  	{MAX98390_ADC_CH2_FILT_CFG, 0x00},
83  	{MAX98390_PWR_GATE_CTL, 0x2c},
84  	{MAX98390_BROWNOUT_EN, 0x00},
85  	{MAX98390_BROWNOUT_INFINITE_HOLD, 0x00},
86  	{MAX98390_BROWNOUT_INFINITE_HOLD_CLR, 0x00},
87  	{MAX98390_BROWNOUT_LVL_HOLD, 0x00},
88  	{MAX98390_BROWNOUT_LVL1_THRESH, 0x00},
89  	{MAX98390_BROWNOUT_LVL2_THRESH, 0x00},
90  	{MAX98390_BROWNOUT_LVL3_THRESH, 0x00},
91  	{MAX98390_BROWNOUT_LVL4_THRESH, 0x00},
92  	{MAX98390_BROWNOUT_THRESH_HYSTERYSIS, 0x00},
93  	{MAX98390_BROWNOUT_AMP_LIMITER_ATK_REL, 0x1f},
94  	{MAX98390_BROWNOUT_AMP_GAIN_ATK_REL, 0x00},
95  	{MAX98390_BROWNOUT_AMP1_CLIP_MODE, 0x00},
96  	{MAX98390_BROWNOUT_LVL1_CUR_LIMIT, 0x00},
97  	{MAX98390_BROWNOUT_LVL1_AMP1_CTRL1, 0x00},
98  	{MAX98390_BROWNOUT_LVL1_AMP1_CTRL2, 0x00},
99  	{MAX98390_BROWNOUT_LVL1_AMP1_CTRL3, 0x00},
100  	{MAX98390_BROWNOUT_LVL2_CUR_LIMIT, 0x00},
101  	{MAX98390_BROWNOUT_LVL2_AMP1_CTRL1, 0x00},
102  	{MAX98390_BROWNOUT_LVL2_AMP1_CTRL2, 0x00},
103  	{MAX98390_BROWNOUT_LVL2_AMP1_CTRL3, 0x00},
104  	{MAX98390_BROWNOUT_LVL3_CUR_LIMIT, 0x00},
105  	{MAX98390_BROWNOUT_LVL3_AMP1_CTRL1, 0x00},
106  	{MAX98390_BROWNOUT_LVL3_AMP1_CTRL2, 0x00},
107  	{MAX98390_BROWNOUT_LVL3_AMP1_CTRL3, 0x00},
108  	{MAX98390_BROWNOUT_LVL4_CUR_LIMIT, 0x00},
109  	{MAX98390_BROWNOUT_LVL4_AMP1_CTRL1, 0x00},
110  	{MAX98390_BROWNOUT_LVL4_AMP1_CTRL2, 0x00},
111  	{MAX98390_BROWNOUT_LVL4_AMP1_CTRL3, 0x00},
112  	{MAX98390_BROWNOUT_ILIM_HLD, 0x00},
113  	{MAX98390_BROWNOUT_LIM_HLD, 0x00},
114  	{MAX98390_BROWNOUT_CLIP_HLD, 0x00},
115  	{MAX98390_BROWNOUT_GAIN_HLD, 0x00},
116  	{MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0f},
117  	{MAX98390_ENV_TRACK_BOOST_VOUT_DELAY, 0x80},
118  	{MAX98390_ENV_TRACK_REL_RATE, 0x07},
119  	{MAX98390_ENV_TRACK_HOLD_RATE, 0x07},
120  	{MAX98390_ENV_TRACK_CTRL, 0x01},
121  	{MAX98390_BOOST_BYPASS1, 0x49},
122  	{MAX98390_BOOST_BYPASS2, 0x2b},
123  	{MAX98390_BOOST_BYPASS3, 0x08},
124  	{MAX98390_FET_SCALING1, 0x00},
125  	{MAX98390_FET_SCALING2, 0x03},
126  	{MAX98390_FET_SCALING3, 0x00},
127  	{MAX98390_FET_SCALING4, 0x07},
128  	{MAX98390_SPK_SPEEDUP, 0x00},
129  	{DSMIG_WB_DRC_RELEASE_TIME_1, 0x00},
130  	{DSMIG_WB_DRC_RELEASE_TIME_2, 0x00},
131  	{DSMIG_WB_DRC_ATTACK_TIME_1, 0x00},
132  	{DSMIG_WB_DRC_ATTACK_TIME_2, 0x00},
133  	{DSMIG_WB_DRC_COMPRESSION_RATIO, 0x00},
134  	{DSMIG_WB_DRC_COMPRESSION_THRESHOLD, 0x00},
135  	{DSMIG_WB_DRC_MAKEUPGAIN, 0x00},
136  	{DSMIG_WB_DRC_NOISE_GATE_THRESHOLD, 0x00},
137  	{DSMIG_WBDRC_HPF_ENABLE, 0x00},
138  	{DSMIG_WB_DRC_TEST_SMOOTHER_OUT_EN, 0x00},
139  	{DSMIG_PPR_THRESHOLD, 0x00},
140  	{DSM_STEREO_BASS_CHANNEL_SELECT, 0x00},
141  	{DSM_TPROT_THRESHOLD_BYTE0, 0x00},
142  	{DSM_TPROT_THRESHOLD_BYTE1, 0x00},
143  	{DSM_TPROT_ROOM_TEMPERATURE_BYTE0, 0x00},
144  	{DSM_TPROT_ROOM_TEMPERATURE_BYTE1, 0x00},
145  	{DSM_TPROT_RECIP_RDC_ROOM_BYTE0, 0x00},
146  	{DSM_TPROT_RECIP_RDC_ROOM_BYTE1, 0x00},
147  	{DSM_TPROT_RECIP_RDC_ROOM_BYTE2, 0x00},
148  	{DSM_TPROT_RECIP_TCONST_BYTE0, 0x00},
149  	{DSM_TPROT_RECIP_TCONST_BYTE1, 0x00},
150  	{DSM_TPROT_RECIP_TCONST_BYTE2, 0x00},
151  	{DSM_THERMAL_ATTENUATION_SETTINGS, 0x00},
152  	{DSM_THERMAL_PILOT_TONE_ATTENUATION, 0x00},
153  	{DSM_TPROT_PG_TEMP_THRESH_BYTE0, 0x00},
154  	{DSM_TPROT_PG_TEMP_THRESH_BYTE1, 0x00},
155  	{DSMIG_DEBUZZER_THRESHOLD, 0x00},
156  	{DSMIG_DEBUZZER_ALPHA_COEF_TEST_ONLY, 0x08},
157  	{DSM_VOL_ENA, 0x20},
158  	{DSM_VOL_CTRL, 0xa0},
159  	{DSMIG_EN, 0x00},
160  	{MAX98390_R23E1_DSP_GLOBAL_EN, 0x00},
161  	{MAX98390_R23FF_GLOBAL_EN, 0x00},
162  };
163  
max98390_dai_set_fmt(struct snd_soc_dai * codec_dai,unsigned int fmt)164  static int max98390_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
165  {
166  	struct snd_soc_component *component = codec_dai->component;
167  	struct max98390_priv *max98390 =
168  		snd_soc_component_get_drvdata(component);
169  	unsigned int mode;
170  	unsigned int format;
171  	unsigned int invert = 0;
172  
173  	dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
174  
175  	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
176  	case SND_SOC_DAIFMT_CBC_CFC:
177  		mode = MAX98390_PCM_MASTER_MODE_SLAVE;
178  		break;
179  	case SND_SOC_DAIFMT_CBP_CFP:
180  		max98390->provider = true;
181  		mode = MAX98390_PCM_MASTER_MODE_MASTER;
182  		break;
183  	default:
184  		dev_err(component->dev, "DAI clock mode unsupported\n");
185  		return -EINVAL;
186  	}
187  
188  	regmap_update_bits(max98390->regmap,
189  		MAX98390_PCM_MASTER_MODE,
190  		MAX98390_PCM_MASTER_MODE_MASK,
191  		mode);
192  
193  	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
194  	case SND_SOC_DAIFMT_NB_NF:
195  		break;
196  	case SND_SOC_DAIFMT_IB_NF:
197  		invert = MAX98390_PCM_MODE_CFG_PCM_BCLKEDGE;
198  		break;
199  	default:
200  		dev_err(component->dev, "DAI invert mode unsupported\n");
201  		return -EINVAL;
202  	}
203  
204  	regmap_update_bits(max98390->regmap,
205  		MAX98390_PCM_MODE_CFG,
206  		MAX98390_PCM_MODE_CFG_PCM_BCLKEDGE,
207  		invert);
208  
209  	/* interface format */
210  	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
211  	case SND_SOC_DAIFMT_I2S:
212  		format = MAX98390_PCM_FORMAT_I2S;
213  		break;
214  	case SND_SOC_DAIFMT_LEFT_J:
215  		format = MAX98390_PCM_FORMAT_LJ;
216  		break;
217  	case SND_SOC_DAIFMT_DSP_A:
218  		format = MAX98390_PCM_FORMAT_TDM_MODE1;
219  		break;
220  	case SND_SOC_DAIFMT_DSP_B:
221  		format = MAX98390_PCM_FORMAT_TDM_MODE0;
222  		break;
223  	default:
224  		return -EINVAL;
225  	}
226  
227  	regmap_update_bits(max98390->regmap,
228  		MAX98390_PCM_MODE_CFG,
229  		MAX98390_PCM_MODE_CFG_FORMAT_MASK,
230  		format << MAX98390_PCM_MODE_CFG_FORMAT_SHIFT);
231  
232  	return 0;
233  }
234  
max98390_get_bclk_sel(int bclk)235  static int max98390_get_bclk_sel(int bclk)
236  {
237  	int i;
238  	/* BCLKs per LRCLK */
239  	static int bclk_sel_table[] = {
240  		32, 48, 64, 96, 128, 192, 256, 320, 384, 512,
241  	};
242  	/* match BCLKs per LRCLK */
243  	for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) {
244  		if (bclk_sel_table[i] == bclk)
245  			return i + 2;
246  	}
247  	return 0;
248  }
249  
max98390_set_clock(struct snd_soc_component * component,struct snd_pcm_hw_params * params)250  static int max98390_set_clock(struct snd_soc_component *component,
251  		struct snd_pcm_hw_params *params)
252  {
253  	struct max98390_priv *max98390 =
254  		snd_soc_component_get_drvdata(component);
255  	/* codec MCLK rate in master mode */
256  	static int rate_table[] = {
257  		5644800, 6000000, 6144000, 6500000,
258  		9600000, 11289600, 12000000, 12288000,
259  		13000000, 19200000,
260  	};
261  	/* BCLK/LRCLK ratio calculation */
262  	int blr_clk_ratio = params_channels(params)
263  		* snd_pcm_format_width(params_format(params));
264  	int value;
265  
266  	if (max98390->provider) {
267  		int i;
268  		/* match rate to closest value */
269  		for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
270  			if (rate_table[i] >= max98390->sysclk)
271  				break;
272  		}
273  		if (i == ARRAY_SIZE(rate_table)) {
274  			dev_err(component->dev, "failed to find proper clock rate.\n");
275  			return -EINVAL;
276  		}
277  
278  		regmap_update_bits(max98390->regmap,
279  			MAX98390_PCM_MASTER_MODE,
280  			MAX98390_PCM_MASTER_MODE_MCLK_MASK,
281  			i << MAX98390_PCM_MASTER_MODE_MCLK_RATE_SHIFT);
282  	}
283  
284  	if (!max98390->tdm_mode) {
285  		/* BCLK configuration */
286  		value = max98390_get_bclk_sel(blr_clk_ratio);
287  		if (!value) {
288  			dev_err(component->dev, "format unsupported %d\n",
289  				params_format(params));
290  			return -EINVAL;
291  		}
292  
293  		regmap_update_bits(max98390->regmap,
294  			MAX98390_PCM_CLK_SETUP,
295  			MAX98390_PCM_CLK_SETUP_BSEL_MASK,
296  			value);
297  	}
298  	return 0;
299  }
300  
max98390_dai_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)301  static int max98390_dai_hw_params(struct snd_pcm_substream *substream,
302  		struct snd_pcm_hw_params *params,
303  		struct snd_soc_dai *dai)
304  {
305  	struct snd_soc_component *component =
306  		dai->component;
307  	struct max98390_priv *max98390 =
308  		snd_soc_component_get_drvdata(component);
309  
310  	unsigned int sampling_rate;
311  	unsigned int chan_sz;
312  
313  	/* pcm mode configuration */
314  	switch (snd_pcm_format_width(params_format(params))) {
315  	case 16:
316  		chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16;
317  		break;
318  	case 24:
319  		chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24;
320  		break;
321  	case 32:
322  		chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32;
323  		break;
324  	default:
325  		dev_err(component->dev, "format unsupported %d\n",
326  			params_format(params));
327  		goto err;
328  	}
329  
330  	regmap_update_bits(max98390->regmap,
331  		MAX98390_PCM_MODE_CFG,
332  		MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
333  
334  	dev_dbg(component->dev, "format supported %d",
335  		params_format(params));
336  
337  	/* sampling rate configuration */
338  	switch (params_rate(params)) {
339  	case 8000:
340  		sampling_rate = MAX98390_PCM_SR_SET1_SR_8000;
341  		break;
342  	case 11025:
343  		sampling_rate = MAX98390_PCM_SR_SET1_SR_11025;
344  		break;
345  	case 12000:
346  		sampling_rate = MAX98390_PCM_SR_SET1_SR_12000;
347  		break;
348  	case 16000:
349  		sampling_rate = MAX98390_PCM_SR_SET1_SR_16000;
350  		break;
351  	case 22050:
352  		sampling_rate = MAX98390_PCM_SR_SET1_SR_22050;
353  		break;
354  	case 24000:
355  		sampling_rate = MAX98390_PCM_SR_SET1_SR_24000;
356  		break;
357  	case 32000:
358  		sampling_rate = MAX98390_PCM_SR_SET1_SR_32000;
359  		break;
360  	case 44100:
361  		sampling_rate = MAX98390_PCM_SR_SET1_SR_44100;
362  		break;
363  	case 48000:
364  		sampling_rate = MAX98390_PCM_SR_SET1_SR_48000;
365  		break;
366  	default:
367  		dev_err(component->dev, "rate %d not supported\n",
368  			params_rate(params));
369  		goto err;
370  	}
371  
372  	/* set DAI_SR to correct LRCLK frequency */
373  	regmap_update_bits(max98390->regmap,
374  		MAX98390_PCM_SR_SETUP,
375  		MAX98390_PCM_SR_SET1_SR_MASK,
376  		sampling_rate);
377  
378  	return max98390_set_clock(component, params);
379  err:
380  	return -EINVAL;
381  }
382  
max98390_dai_tdm_slot(struct snd_soc_dai * dai,unsigned int tx_mask,unsigned int rx_mask,int slots,int slot_width)383  static int max98390_dai_tdm_slot(struct snd_soc_dai *dai,
384  		unsigned int tx_mask, unsigned int rx_mask,
385  		int slots, int slot_width)
386  {
387  	struct snd_soc_component *component = dai->component;
388  	struct max98390_priv *max98390 =
389  		snd_soc_component_get_drvdata(component);
390  
391  	int bsel;
392  	unsigned int chan_sz;
393  
394  	if (!tx_mask && !rx_mask && !slots && !slot_width)
395  		max98390->tdm_mode = false;
396  	else
397  		max98390->tdm_mode = true;
398  
399  	dev_dbg(component->dev,
400  		"Tdm mode : %d\n", max98390->tdm_mode);
401  
402  	/* BCLK configuration */
403  	bsel = max98390_get_bclk_sel(slots * slot_width);
404  	if (!bsel) {
405  		dev_err(component->dev, "BCLK %d not supported\n",
406  			slots * slot_width);
407  		return -EINVAL;
408  	}
409  
410  	regmap_update_bits(max98390->regmap,
411  		MAX98390_PCM_CLK_SETUP,
412  		MAX98390_PCM_CLK_SETUP_BSEL_MASK,
413  		bsel);
414  
415  	/* Channel size configuration */
416  	switch (slot_width) {
417  	case 16:
418  		chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16;
419  		break;
420  	case 24:
421  		chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24;
422  		break;
423  	case 32:
424  		chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32;
425  		break;
426  	default:
427  		dev_err(component->dev, "format unsupported %d\n",
428  			slot_width);
429  		return -EINVAL;
430  	}
431  
432  	regmap_update_bits(max98390->regmap,
433  		MAX98390_PCM_MODE_CFG,
434  		MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
435  
436  	/* Rx slot configuration */
437  	regmap_write(max98390->regmap,
438  		MAX98390_PCM_RX_EN_A,
439  		rx_mask & 0xFF);
440  	regmap_write(max98390->regmap,
441  		MAX98390_PCM_RX_EN_B,
442  		(rx_mask & 0xFF00) >> 8);
443  
444  	/* Tx slot Hi-Z configuration */
445  	regmap_write(max98390->regmap,
446  		MAX98390_PCM_TX_HIZ_CTRL_A,
447  		~tx_mask & 0xFF);
448  	regmap_write(max98390->regmap,
449  		MAX98390_PCM_TX_HIZ_CTRL_B,
450  		(~tx_mask & 0xFF00) >> 8);
451  
452  	return 0;
453  }
454  
max98390_dai_set_sysclk(struct snd_soc_dai * dai,int clk_id,unsigned int freq,int dir)455  static int max98390_dai_set_sysclk(struct snd_soc_dai *dai,
456  		int clk_id, unsigned int freq, int dir)
457  {
458  	struct snd_soc_component *component = dai->component;
459  	struct max98390_priv *max98390 =
460  		snd_soc_component_get_drvdata(component);
461  
462  	max98390->sysclk = freq;
463  	return 0;
464  }
465  
466  static const struct snd_soc_dai_ops max98390_dai_ops = {
467  	.set_sysclk = max98390_dai_set_sysclk,
468  	.set_fmt = max98390_dai_set_fmt,
469  	.hw_params = max98390_dai_hw_params,
470  	.set_tdm_slot = max98390_dai_tdm_slot,
471  };
472  
max98390_dac_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)473  static int max98390_dac_event(struct snd_soc_dapm_widget *w,
474  		struct snd_kcontrol *kcontrol, int event)
475  {
476  	struct snd_soc_component *component =
477  		snd_soc_dapm_to_component(w->dapm);
478  	struct max98390_priv *max98390 =
479  		snd_soc_component_get_drvdata(component);
480  
481  	switch (event) {
482  	case SND_SOC_DAPM_POST_PMU:
483  		regmap_update_bits(max98390->regmap,
484  			MAX98390_R203A_AMP_EN,
485  			MAX98390_AMP_EN_MASK, 1);
486  		regmap_update_bits(max98390->regmap,
487  			MAX98390_R23FF_GLOBAL_EN,
488  			MAX98390_GLOBAL_EN_MASK, 1);
489  		break;
490  	case SND_SOC_DAPM_POST_PMD:
491  		regmap_update_bits(max98390->regmap,
492  			MAX98390_R23FF_GLOBAL_EN,
493  			MAX98390_GLOBAL_EN_MASK, 0);
494  		regmap_update_bits(max98390->regmap,
495  			MAX98390_R203A_AMP_EN,
496  			MAX98390_AMP_EN_MASK, 0);
497  		break;
498  	}
499  	return 0;
500  }
501  
502  static const char * const max98390_switch_text[] = {
503  	"Left", "Right", "LeftRight"};
504  
505  static const char * const max98390_boost_voltage_text[] = {
506  	"6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
507  	"7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
508  	"8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
509  	"9.5V", "9.625V", "9.75V", "9.875V", "10V"
510  };
511  
512  static SOC_ENUM_SINGLE_DECL(max98390_boost_voltage,
513  		MAX98390_BOOST_CTRL0, 0,
514  		max98390_boost_voltage_text);
515  
516  static DECLARE_TLV_DB_SCALE(max98390_spk_tlv, 300, 300, 0);
517  static DECLARE_TLV_DB_SCALE(max98390_digital_tlv, -8000, 50, 0);
518  
519  static const char * const max98390_current_limit_text[] = {
520  	"0.00A", "0.50A", "1.00A", "1.05A", "1.10A", "1.15A", "1.20A", "1.25A",
521  	"1.30A", "1.35A", "1.40A", "1.45A", "1.50A", "1.55A", "1.60A", "1.65A",
522  	"1.70A", "1.75A", "1.80A", "1.85A", "1.90A", "1.95A", "2.00A", "2.05A",
523  	"2.10A", "2.15A", "2.20A", "2.25A", "2.30A", "2.35A", "2.40A", "2.45A",
524  	"2.50A", "2.55A", "2.60A", "2.65A", "2.70A", "2.75A", "2.80A", "2.85A",
525  	"2.90A", "2.95A", "3.00A", "3.05A", "3.10A", "3.15A", "3.20A", "3.25A",
526  	"3.30A", "3.35A", "3.40A", "3.45A", "3.50A", "3.55A", "3.60A", "3.65A",
527  	"3.70A", "3.75A", "3.80A", "3.85A", "3.90A", "3.95A", "4.00A", "4.05A",
528  	"4.10A"
529  };
530  
531  static SOC_ENUM_SINGLE_DECL(max98390_current_limit,
532  		MAX98390_BOOST_CTRL1, 0,
533  		max98390_current_limit_text);
534  
max98390_ref_rdc_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)535  static int max98390_ref_rdc_put(struct snd_kcontrol *kcontrol,
536  		struct snd_ctl_elem_value *ucontrol)
537  {
538  	struct snd_soc_component *component =
539  		snd_soc_kcontrol_component(kcontrol);
540  	struct max98390_priv *max98390 =
541  		snd_soc_component_get_drvdata(component);
542  
543  	max98390->ref_rdc_value = ucontrol->value.integer.value[0];
544  
545  	regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0,
546  		max98390->ref_rdc_value & 0x000000ff);
547  	regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1,
548  		(max98390->ref_rdc_value >> 8) & 0x000000ff);
549  	regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2,
550  		(max98390->ref_rdc_value >> 16) & 0x000000ff);
551  
552  	return 0;
553  }
554  
max98390_ref_rdc_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)555  static int max98390_ref_rdc_get(struct snd_kcontrol *kcontrol,
556  		struct snd_ctl_elem_value *ucontrol)
557  {
558  	struct snd_soc_component *component =
559  		snd_soc_kcontrol_component(kcontrol);
560  	struct max98390_priv *max98390 =
561  		snd_soc_component_get_drvdata(component);
562  
563  	ucontrol->value.integer.value[0] = max98390->ref_rdc_value;
564  
565  	return 0;
566  }
567  
max98390_ambient_temp_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)568  static int max98390_ambient_temp_put(struct snd_kcontrol *kcontrol,
569  		struct snd_ctl_elem_value *ucontrol)
570  {
571  	struct snd_soc_component *component =
572  		snd_soc_kcontrol_component(kcontrol);
573  	struct max98390_priv *max98390 =
574  		snd_soc_component_get_drvdata(component);
575  
576  	max98390->ambient_temp_value = ucontrol->value.integer.value[0];
577  
578  	regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1,
579  		(max98390->ambient_temp_value >> 8) & 0x000000ff);
580  	regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0,
581  		(max98390->ambient_temp_value) & 0x000000ff);
582  
583  	return 0;
584  }
585  
max98390_ambient_temp_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)586  static int max98390_ambient_temp_get(struct snd_kcontrol *kcontrol,
587  		struct snd_ctl_elem_value *ucontrol)
588  {
589  	struct snd_soc_component *component =
590  		snd_soc_kcontrol_component(kcontrol);
591  	struct max98390_priv *max98390 =
592  		snd_soc_component_get_drvdata(component);
593  
594  	ucontrol->value.integer.value[0] = max98390->ambient_temp_value;
595  
596  	return 0;
597  }
598  
max98390_adaptive_rdc_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)599  static int max98390_adaptive_rdc_put(struct snd_kcontrol *kcontrol,
600  		struct snd_ctl_elem_value *ucontrol)
601  {
602  	struct snd_soc_component *component =
603  		snd_soc_kcontrol_component(kcontrol);
604  
605  	dev_warn(component->dev, "Put adaptive rdc not supported\n");
606  
607  	return 0;
608  }
609  
max98390_adaptive_rdc_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)610  static int max98390_adaptive_rdc_get(struct snd_kcontrol *kcontrol,
611  		struct snd_ctl_elem_value *ucontrol)
612  {
613  	int rdc, rdc0;
614  	struct snd_soc_component *component =
615  		snd_soc_kcontrol_component(kcontrol);
616  	struct max98390_priv *max98390 =
617  		snd_soc_component_get_drvdata(component);
618  
619  	regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc);
620  	regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc0);
621  	ucontrol->value.integer.value[0] = rdc0 | rdc << 8;
622  
623  	return 0;
624  }
625  
max98390_dsm_calib_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)626  static int max98390_dsm_calib_get(struct snd_kcontrol *kcontrol,
627  		struct snd_ctl_elem_value *ucontrol)
628  {
629  	/* Do nothing */
630  	return 0;
631  }
632  
max98390_dsm_calib_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)633  static int max98390_dsm_calib_put(struct snd_kcontrol *kcontrol,
634  		struct snd_ctl_elem_value *ucontrol)
635  {
636  	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
637  	struct max98390_priv *max98390 = snd_soc_component_get_drvdata(component);
638  	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
639  	unsigned int rdc, rdc_cal_result, rdc_integer, rdc_factor, temp, val;
640  
641  	snd_soc_dapm_mutex_lock(dapm);
642  
643  	regmap_read(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, &val);
644  	if (!val) {
645  		/* Enable the codec for the duration of calibration readout */
646  		regmap_update_bits(max98390->regmap, MAX98390_R203A_AMP_EN,
647  				   MAX98390_AMP_EN_MASK, 1);
648  		regmap_update_bits(max98390->regmap, MAX98390_R23FF_GLOBAL_EN,
649  				   MAX98390_GLOBAL_EN_MASK, 1);
650  	}
651  
652  	regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc);
653  	regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc_cal_result);
654  	regmap_read(max98390->regmap, MAX98390_MEAS_ADC_CH2_READ, &temp);
655  
656  	if (!val) {
657  		/* Disable the codec if it was disabled */
658  		regmap_update_bits(max98390->regmap, MAX98390_R23FF_GLOBAL_EN,
659  				   MAX98390_GLOBAL_EN_MASK, 0);
660  		regmap_update_bits(max98390->regmap, MAX98390_R203A_AMP_EN,
661  				   MAX98390_AMP_EN_MASK, 0);
662  	}
663  
664  	snd_soc_dapm_mutex_unlock(dapm);
665  
666  	rdc_cal_result |= (rdc << 8) & 0x0000FFFF;
667  	if (rdc_cal_result)
668  		max98390->ref_rdc_value = 268435456U / rdc_cal_result;
669  
670  	max98390->ambient_temp_value = temp * 52 - 1188;
671  
672  	rdc_integer =  rdc_cal_result * 937  / 65536;
673  	rdc_factor = ((rdc_cal_result * 937 * 100) / 65536) - (rdc_integer * 100);
674  
675  	dev_info(component->dev,
676  		 "rdc resistance about %d.%02d ohm, reg=0x%X temp reg=0x%X\n",
677  		 rdc_integer, rdc_factor, rdc_cal_result, temp);
678  
679  	return 0;
680  }
681  
682  static const struct snd_kcontrol_new max98390_snd_controls[] = {
683  	SOC_SINGLE_TLV("Digital Volume", DSM_VOL_CTRL,
684  		0, 184, 0,
685  		max98390_digital_tlv),
686  	SOC_SINGLE_TLV("Speaker Volume", MAX98390_R203D_SPK_GAIN,
687  		0, 6, 0,
688  		max98390_spk_tlv),
689  	SOC_SINGLE("Ramp Up Bypass Switch", MAX98390_R2039_AMP_DSP_CFG,
690  		MAX98390_AMP_DSP_CFG_RMP_UP_SHIFT, 1, 0),
691  	SOC_SINGLE("Ramp Down Bypass Switch", MAX98390_R2039_AMP_DSP_CFG,
692  		MAX98390_AMP_DSP_CFG_RMP_DN_SHIFT, 1, 0),
693  	SOC_SINGLE("Boost Clock Phase", MAX98390_BOOST_CTRL3,
694  		MAX98390_BOOST_CLK_PHASE_CFG_SHIFT, 3, 0),
695  	SOC_ENUM("Boost Output Voltage", max98390_boost_voltage),
696  	SOC_ENUM("Current Limit", max98390_current_limit),
697  	SOC_SINGLE_EXT("DSM Rdc", SND_SOC_NOPM, 0, 0xffffff, 0,
698  		max98390_ref_rdc_get, max98390_ref_rdc_put),
699  	SOC_SINGLE_EXT("DSM Ambient Temp", SND_SOC_NOPM, 0, 0xffff, 0,
700  		max98390_ambient_temp_get, max98390_ambient_temp_put),
701  	SOC_SINGLE_EXT("DSM Adaptive Rdc", SND_SOC_NOPM, 0, 0xffff, 0,
702  		max98390_adaptive_rdc_get, max98390_adaptive_rdc_put),
703  	SOC_SINGLE_EXT("DSM Calibration", SND_SOC_NOPM, 0, 1, 0,
704  		max98390_dsm_calib_get, max98390_dsm_calib_put),
705  };
706  
707  static const struct soc_enum dai_sel_enum =
708  	SOC_ENUM_SINGLE(MAX98390_PCM_CH_SRC_1,
709  		MAX98390_PCM_RX_CH_SRC_SHIFT,
710  		3, max98390_switch_text);
711  
712  static const struct snd_kcontrol_new max98390_dai_controls =
713  	SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
714  
715  static const struct snd_soc_dapm_widget max98390_dapm_widgets[] = {
716  	SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback",
717  		SND_SOC_NOPM, 0, 0, max98390_dac_event,
718  		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
719  	SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
720  		&max98390_dai_controls),
721  	SND_SOC_DAPM_OUTPUT("BE_OUT"),
722  };
723  
724  static const struct snd_soc_dapm_route max98390_audio_map[] = {
725  	/* Plabyack */
726  	{"DAI Sel Mux", "Left", "Amp Enable"},
727  	{"DAI Sel Mux", "Right", "Amp Enable"},
728  	{"DAI Sel Mux", "LeftRight", "Amp Enable"},
729  	{"BE_OUT", NULL, "DAI Sel Mux"},
730  };
731  
max98390_readable_register(struct device * dev,unsigned int reg)732  static bool max98390_readable_register(struct device *dev, unsigned int reg)
733  {
734  	switch (reg) {
735  	case MAX98390_SOFTWARE_RESET ... MAX98390_INT_EN3:
736  	case MAX98390_IRQ_CTRL ... MAX98390_WDOG_CTRL:
737  	case MAX98390_MEAS_ADC_THERM_WARN_THRESH
738  		... MAX98390_BROWNOUT_INFINITE_HOLD:
739  	case MAX98390_BROWNOUT_LVL_HOLD ... DSMIG_DEBUZZER_THRESHOLD:
740  	case DSM_VOL_ENA ... MAX98390_R24FF_REV_ID:
741  		return true;
742  	default:
743  		return false;
744  	}
745  };
746  
max98390_volatile_reg(struct device * dev,unsigned int reg)747  static bool max98390_volatile_reg(struct device *dev, unsigned int reg)
748  {
749  	switch (reg) {
750  	case MAX98390_SOFTWARE_RESET ... MAX98390_INT_EN3:
751  	case MAX98390_MEAS_ADC_CH0_READ ... MAX98390_MEAS_ADC_CH2_READ:
752  	case MAX98390_PWR_GATE_STATUS ... MAX98390_BROWNOUT_STATUS:
753  	case MAX98390_BROWNOUT_LOWEST_STATUS:
754  	case MAX98390_ENV_TRACK_BOOST_VOUT_READ:
755  	case DSM_STBASS_HPF_B0_BYTE0 ... DSM_DEBUZZER_ATTACK_TIME_BYTE2:
756  	case THERMAL_RDC_RD_BACK_BYTE1 ... DSMIG_DEBUZZER_THRESHOLD:
757  	case DSM_THERMAL_GAIN ... DSM_WBDRC_GAIN:
758  		return true;
759  	default:
760  		return false;
761  	}
762  }
763  
764  #define MAX98390_RATES SNDRV_PCM_RATE_8000_48000
765  
766  #define MAX98390_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
767  	SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
768  
769  static struct snd_soc_dai_driver max98390_dai[] = {
770  	{
771  		.name = "max98390-aif1",
772  		.playback = {
773  			.stream_name = "HiFi Playback",
774  			.channels_min = 1,
775  			.channels_max = 2,
776  			.rates = MAX98390_RATES,
777  			.formats = MAX98390_FORMATS,
778  		},
779  		.capture = {
780  			.stream_name = "HiFi Capture",
781  			.channels_min = 1,
782  			.channels_max = 2,
783  			.rates = MAX98390_RATES,
784  			.formats = MAX98390_FORMATS,
785  		},
786  		.ops = &max98390_dai_ops,
787  	}
788  };
789  
max98390_dsm_init(struct snd_soc_component * component)790  static int max98390_dsm_init(struct snd_soc_component *component)
791  {
792  	int ret;
793  	int param_size, param_start_addr;
794  	char filename[128];
795  	const char *vendor, *product;
796  	struct max98390_priv *max98390 =
797  		snd_soc_component_get_drvdata(component);
798  	const struct firmware *fw;
799  	char *dsm_param;
800  
801  	vendor = dmi_get_system_info(DMI_SYS_VENDOR);
802  	product = dmi_get_system_info(DMI_PRODUCT_NAME);
803  
804  	if (!strcmp(max98390->dsm_param_name, "default")) {
805  		if (vendor && product) {
806  			snprintf(filename, sizeof(filename),
807  				"dsm_param_%s_%s.bin", vendor, product);
808  		} else {
809  			sprintf(filename, "dsm_param.bin");
810  		}
811  	} else {
812  		snprintf(filename, sizeof(filename), "%s",
813  			max98390->dsm_param_name);
814  	}
815  	ret = request_firmware(&fw, filename, component->dev);
816  	if (ret) {
817  		ret = request_firmware(&fw, "dsm_param.bin", component->dev);
818  		if (ret) {
819  			ret = request_firmware(&fw, "dsmparam.bin",
820  				component->dev);
821  			if (ret)
822  				goto err;
823  		}
824  	}
825  
826  	dev_dbg(component->dev,
827  		"max98390: param fw size %zd\n",
828  		fw->size);
829  	if (fw->size < MAX98390_DSM_PARAM_MIN_SIZE) {
830  		dev_err(component->dev,
831  			"param fw is invalid.\n");
832  		ret = -EINVAL;
833  		goto err_alloc;
834  	}
835  	dsm_param = (char *)fw->data;
836  	param_start_addr = (dsm_param[0] & 0xff) | (dsm_param[1] & 0xff) << 8;
837  	param_size = (dsm_param[2] & 0xff) | (dsm_param[3] & 0xff) << 8;
838  	if (param_size > MAX98390_DSM_PARAM_MAX_SIZE ||
839  		param_start_addr < MAX98390_IRQ_CTRL ||
840  		fw->size < param_size + MAX98390_DSM_PAYLOAD_OFFSET) {
841  		dev_err(component->dev,
842  			"param fw is invalid.\n");
843  		ret = -EINVAL;
844  		goto err_alloc;
845  	}
846  	regmap_write(max98390->regmap, MAX98390_R203A_AMP_EN, 0x80);
847  	dsm_param += MAX98390_DSM_PAYLOAD_OFFSET;
848  	regmap_bulk_write(max98390->regmap, param_start_addr,
849  		dsm_param, param_size);
850  	regmap_write(max98390->regmap, MAX98390_R23E1_DSP_GLOBAL_EN, 0x01);
851  
852  err_alloc:
853  	release_firmware(fw);
854  err:
855  	return ret;
856  }
857  
max98390_init_regs(struct snd_soc_component * component)858  static void max98390_init_regs(struct snd_soc_component *component)
859  {
860  	struct max98390_priv *max98390 =
861  		snd_soc_component_get_drvdata(component);
862  
863  	regmap_write(max98390->regmap, MAX98390_CLK_MON, 0x6f);
864  	regmap_write(max98390->regmap, MAX98390_DAT_MON, 0x00);
865  	regmap_write(max98390->regmap, MAX98390_PWR_GATE_CTL, 0x00);
866  	regmap_write(max98390->regmap, MAX98390_PCM_RX_EN_A, 0x03);
867  	regmap_write(max98390->regmap, MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0e);
868  	regmap_write(max98390->regmap, MAX98390_BOOST_BYPASS1, 0x46);
869  	regmap_write(max98390->regmap, MAX98390_FET_SCALING3, 0x03);
870  
871  	/* voltage, current slot configuration */
872  	regmap_write(max98390->regmap,
873  		MAX98390_PCM_CH_SRC_2,
874  		(max98390->i_l_slot << 4 |
875  		max98390->v_l_slot)&0xFF);
876  
877  	if (max98390->v_l_slot < 8) {
878  		regmap_update_bits(max98390->regmap,
879  			MAX98390_PCM_TX_HIZ_CTRL_A,
880  			1 << max98390->v_l_slot, 0);
881  		regmap_update_bits(max98390->regmap,
882  			MAX98390_PCM_TX_EN_A,
883  			1 << max98390->v_l_slot,
884  			1 << max98390->v_l_slot);
885  	} else {
886  		regmap_update_bits(max98390->regmap,
887  			MAX98390_PCM_TX_HIZ_CTRL_B,
888  			1 << (max98390->v_l_slot - 8), 0);
889  		regmap_update_bits(max98390->regmap,
890  			MAX98390_PCM_TX_EN_B,
891  			1 << (max98390->v_l_slot - 8),
892  			1 << (max98390->v_l_slot - 8));
893  	}
894  
895  	if (max98390->i_l_slot < 8) {
896  		regmap_update_bits(max98390->regmap,
897  			MAX98390_PCM_TX_HIZ_CTRL_A,
898  			1 << max98390->i_l_slot, 0);
899  		regmap_update_bits(max98390->regmap,
900  			MAX98390_PCM_TX_EN_A,
901  			1 << max98390->i_l_slot,
902  			1 << max98390->i_l_slot);
903  	} else {
904  		regmap_update_bits(max98390->regmap,
905  			MAX98390_PCM_TX_HIZ_CTRL_B,
906  			1 << (max98390->i_l_slot - 8), 0);
907  		regmap_update_bits(max98390->regmap,
908  			MAX98390_PCM_TX_EN_B,
909  			1 << (max98390->i_l_slot - 8),
910  			1 << (max98390->i_l_slot - 8));
911  	}
912  }
913  
max98390_probe(struct snd_soc_component * component)914  static int max98390_probe(struct snd_soc_component *component)
915  {
916  	struct max98390_priv *max98390 =
917  		snd_soc_component_get_drvdata(component);
918  
919  	regmap_write(max98390->regmap, MAX98390_SOFTWARE_RESET, 0x01);
920  	/* Sleep reset settle time */
921  	msleep(20);
922  
923  	/* Amp init setting */
924  	max98390_init_regs(component);
925  	/* Update dsm bin param */
926  	max98390_dsm_init(component);
927  
928  	/* Dsm Setting */
929  	if (max98390->ref_rdc_value) {
930  		regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0,
931  			max98390->ref_rdc_value & 0x000000ff);
932  		regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1,
933  			(max98390->ref_rdc_value >> 8) & 0x000000ff);
934  		regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2,
935  			(max98390->ref_rdc_value >> 16) & 0x000000ff);
936  	}
937  	if (max98390->ambient_temp_value) {
938  		regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1,
939  			(max98390->ambient_temp_value >> 8) & 0x000000ff);
940  		regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0,
941  			(max98390->ambient_temp_value) & 0x000000ff);
942  	}
943  
944  	return 0;
945  }
946  
947  #ifdef CONFIG_PM_SLEEP
max98390_suspend(struct device * dev)948  static int max98390_suspend(struct device *dev)
949  {
950  	struct max98390_priv *max98390 = dev_get_drvdata(dev);
951  
952  	dev_dbg(dev, "%s:Enter\n", __func__);
953  
954  	regcache_cache_only(max98390->regmap, true);
955  	regcache_mark_dirty(max98390->regmap);
956  
957  	return 0;
958  }
959  
max98390_resume(struct device * dev)960  static int max98390_resume(struct device *dev)
961  {
962  	struct max98390_priv *max98390 = dev_get_drvdata(dev);
963  
964  	dev_dbg(dev, "%s:Enter\n", __func__);
965  
966  	regcache_cache_only(max98390->regmap, false);
967  	regcache_sync(max98390->regmap);
968  
969  	return 0;
970  }
971  #endif
972  
973  static const struct dev_pm_ops max98390_pm = {
974  	SET_SYSTEM_SLEEP_PM_OPS(max98390_suspend, max98390_resume)
975  };
976  
977  static const struct snd_soc_component_driver soc_codec_dev_max98390 = {
978  	.probe			= max98390_probe,
979  	.controls		= max98390_snd_controls,
980  	.num_controls		= ARRAY_SIZE(max98390_snd_controls),
981  	.dapm_widgets		= max98390_dapm_widgets,
982  	.num_dapm_widgets	= ARRAY_SIZE(max98390_dapm_widgets),
983  	.dapm_routes		= max98390_audio_map,
984  	.num_dapm_routes	= ARRAY_SIZE(max98390_audio_map),
985  	.idle_bias_on		= 1,
986  	.use_pmdown_time	= 1,
987  	.endianness		= 1,
988  };
989  
990  static const struct regmap_config max98390_regmap = {
991  	.reg_bits         = 16,
992  	.val_bits         = 8,
993  	.max_register     = MAX98390_R24FF_REV_ID,
994  	.reg_defaults     = max98390_reg_defaults,
995  	.num_reg_defaults = ARRAY_SIZE(max98390_reg_defaults),
996  	.readable_reg	  = max98390_readable_register,
997  	.volatile_reg	  = max98390_volatile_reg,
998  	.cache_type       = REGCACHE_RBTREE,
999  };
1000  
max98390_slot_config(struct i2c_client * i2c,struct max98390_priv * max98390)1001  static void max98390_slot_config(struct i2c_client *i2c,
1002  	struct max98390_priv *max98390)
1003  {
1004  	int value;
1005  	struct device *dev = &i2c->dev;
1006  
1007  	if (!device_property_read_u32(dev, "maxim,vmon-slot-no", &value))
1008  		max98390->v_l_slot = value & 0xF;
1009  	else
1010  		max98390->v_l_slot = 0;
1011  
1012  	if (!device_property_read_u32(dev, "maxim,imon-slot-no", &value))
1013  		max98390->i_l_slot = value & 0xF;
1014  	else
1015  		max98390->i_l_slot = 1;
1016  }
1017  
max98390_i2c_probe(struct i2c_client * i2c)1018  static int max98390_i2c_probe(struct i2c_client *i2c)
1019  {
1020  	int ret = 0;
1021  	int reg = 0;
1022  
1023  	struct max98390_priv *max98390 = NULL;
1024  	struct i2c_adapter *adapter = i2c->adapter;
1025  	struct gpio_desc *reset_gpio;
1026  
1027  	ret = i2c_check_functionality(adapter,
1028  		I2C_FUNC_SMBUS_BYTE
1029  		| I2C_FUNC_SMBUS_BYTE_DATA);
1030  	if (!ret) {
1031  		dev_err(&i2c->dev, "I2C check functionality failed\n");
1032  		return -ENXIO;
1033  	}
1034  
1035  	max98390 = devm_kzalloc(&i2c->dev, sizeof(*max98390), GFP_KERNEL);
1036  	if (!max98390) {
1037  		ret = -ENOMEM;
1038  		return ret;
1039  	}
1040  	i2c_set_clientdata(i2c, max98390);
1041  
1042  	ret = device_property_read_u32(&i2c->dev, "maxim,temperature_calib",
1043  				       &max98390->ambient_temp_value);
1044  	if (ret) {
1045  		dev_info(&i2c->dev,
1046  			 "no optional property 'temperature_calib' found, default:\n");
1047  	}
1048  	ret = device_property_read_u32(&i2c->dev, "maxim,r0_calib",
1049  				       &max98390->ref_rdc_value);
1050  	if (ret) {
1051  		dev_info(&i2c->dev,
1052  			 "no optional property 'r0_calib' found, default:\n");
1053  	}
1054  
1055  	dev_info(&i2c->dev,
1056  		"%s: r0_calib: 0x%x,temperature_calib: 0x%x",
1057  		__func__, max98390->ref_rdc_value,
1058  		max98390->ambient_temp_value);
1059  
1060  	ret = device_property_read_string(&i2c->dev, "maxim,dsm_param_name",
1061  				       &max98390->dsm_param_name);
1062  	if (ret)
1063  		max98390->dsm_param_name = "default";
1064  
1065  	/* voltage/current slot configuration */
1066  	max98390_slot_config(i2c, max98390);
1067  
1068  	/* regmap initialization */
1069  	max98390->regmap = devm_regmap_init_i2c(i2c, &max98390_regmap);
1070  	if (IS_ERR(max98390->regmap)) {
1071  		ret = PTR_ERR(max98390->regmap);
1072  		dev_err(&i2c->dev,
1073  			"Failed to allocate regmap: %d\n", ret);
1074  		return ret;
1075  	}
1076  
1077  	reset_gpio = devm_gpiod_get_optional(&i2c->dev,
1078  					     "reset", GPIOD_OUT_HIGH);
1079  
1080  	/* Power on device */
1081  	if (reset_gpio) {
1082  		usleep_range(1000, 2000);
1083  		/* bring out of reset */
1084  		gpiod_set_value_cansleep(reset_gpio, 0);
1085  		usleep_range(1000, 2000);
1086  	}
1087  
1088  	/* Check Revision ID */
1089  	ret = regmap_read(max98390->regmap,
1090  		MAX98390_R24FF_REV_ID, &reg);
1091  	if (ret) {
1092  		dev_err(&i2c->dev,
1093  			"ret=%d, Failed to read: 0x%02X\n",
1094  			ret, MAX98390_R24FF_REV_ID);
1095  		return ret;
1096  	}
1097  	dev_info(&i2c->dev, "MAX98390 revisionID: 0x%02X\n", reg);
1098  
1099  	ret = devm_snd_soc_register_component(&i2c->dev,
1100  			&soc_codec_dev_max98390,
1101  			max98390_dai, ARRAY_SIZE(max98390_dai));
1102  
1103  	return ret;
1104  }
1105  
1106  static const struct i2c_device_id max98390_i2c_id[] = {
1107  	{ "max98390", 0},
1108  	{},
1109  };
1110  
1111  MODULE_DEVICE_TABLE(i2c, max98390_i2c_id);
1112  
1113  #if defined(CONFIG_OF)
1114  static const struct of_device_id max98390_of_match[] = {
1115  	{ .compatible = "maxim,max98390", },
1116  	{}
1117  };
1118  MODULE_DEVICE_TABLE(of, max98390_of_match);
1119  #endif
1120  
1121  #ifdef CONFIG_ACPI
1122  static const struct acpi_device_id max98390_acpi_match[] = {
1123  	{ "MX98390", 0 },
1124  	{},
1125  };
1126  MODULE_DEVICE_TABLE(acpi, max98390_acpi_match);
1127  #endif
1128  
1129  static struct i2c_driver max98390_i2c_driver = {
1130  	.driver = {
1131  		.name = "max98390",
1132  		.of_match_table = of_match_ptr(max98390_of_match),
1133  		.acpi_match_table = ACPI_PTR(max98390_acpi_match),
1134  		.pm = &max98390_pm,
1135  	},
1136  	.probe = max98390_i2c_probe,
1137  	.id_table = max98390_i2c_id,
1138  };
1139  
1140  module_i2c_driver(max98390_i2c_driver)
1141  
1142  MODULE_DESCRIPTION("ALSA SoC MAX98390 driver");
1143  MODULE_AUTHOR("Steve Lee <steves.lee@maximintegrated.com>");
1144  MODULE_LICENSE("GPL");
1145