drm/panel-edp: Add STA 116QHD024002
[drm/drm-misc.git] / sound / soc / codecs / max9860.c
blob4015ed2c47ecfe6410bd8a42428579844f803103
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Driver for the MAX9860 Mono Audio Voice Codec
4 //
5 // https://datasheets.maximintegrated.com/en/ds/MAX9860.pdf
6 //
7 // The driver does not support sidetone since the DVST register field is
8 // backwards with the mute near the maximum level instead of the minimum.
9 //
10 // Author: Peter Rosin <peda@axentia.s>
11 // Copyright 2016 Axentia Technologies
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/clk.h>
16 #include <linux/kernel.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/regmap.h>
19 #include <linux/i2c.h>
20 #include <linux/regulator/consumer.h>
21 #include <sound/soc.h>
22 #include <sound/soc-dapm.h>
23 #include <sound/pcm_params.h>
24 #include <sound/tlv.h>
26 #include "max9860.h"
28 struct max9860_priv {
29 struct regmap *regmap;
30 struct regulator *dvddio;
31 struct notifier_block dvddio_nb;
32 u8 psclk;
33 unsigned long pclk_rate;
34 int fmt;
37 static int max9860_dvddio_event(struct notifier_block *nb,
38 unsigned long event, void *data)
40 struct max9860_priv *max9860 = container_of(nb, struct max9860_priv,
41 dvddio_nb);
42 if (event & REGULATOR_EVENT_DISABLE) {
43 regcache_mark_dirty(max9860->regmap);
44 regcache_cache_only(max9860->regmap, true);
47 return 0;
50 static const struct reg_default max9860_reg_defaults[] = {
51 { MAX9860_PWRMAN, 0x00 },
52 { MAX9860_INTEN, 0x00 },
53 { MAX9860_SYSCLK, 0x00 },
54 { MAX9860_AUDIOCLKHIGH, 0x00 },
55 { MAX9860_AUDIOCLKLOW, 0x00 },
56 { MAX9860_IFC1A, 0x00 },
57 { MAX9860_IFC1B, 0x00 },
58 { MAX9860_VOICEFLTR, 0x00 },
59 { MAX9860_DACATTN, 0x00 },
60 { MAX9860_ADCLEVEL, 0x00 },
61 { MAX9860_DACGAIN, 0x00 },
62 { MAX9860_MICGAIN, 0x00 },
63 { MAX9860_MICADC, 0x00 },
64 { MAX9860_NOISEGATE, 0x00 },
67 static bool max9860_readable(struct device *dev, unsigned int reg)
69 switch (reg) {
70 case MAX9860_INTRSTATUS ... MAX9860_MICGAIN:
71 case MAX9860_MICADC ... MAX9860_PWRMAN:
72 case MAX9860_REVISION:
73 return true;
76 return false;
79 static bool max9860_writeable(struct device *dev, unsigned int reg)
81 switch (reg) {
82 case MAX9860_INTEN ... MAX9860_MICGAIN:
83 case MAX9860_MICADC ... MAX9860_PWRMAN:
84 return true;
87 return false;
90 static bool max9860_volatile(struct device *dev, unsigned int reg)
92 switch (reg) {
93 case MAX9860_INTRSTATUS:
94 case MAX9860_MICREADBACK:
95 return true;
98 return false;
101 static bool max9860_precious(struct device *dev, unsigned int reg)
103 switch (reg) {
104 case MAX9860_INTRSTATUS:
105 return true;
108 return false;
111 static const struct regmap_config max9860_regmap = {
112 .reg_bits = 8,
113 .val_bits = 8,
115 .readable_reg = max9860_readable,
116 .writeable_reg = max9860_writeable,
117 .volatile_reg = max9860_volatile,
118 .precious_reg = max9860_precious,
120 .max_register = MAX9860_MAX_REGISTER,
121 .reg_defaults = max9860_reg_defaults,
122 .num_reg_defaults = ARRAY_SIZE(max9860_reg_defaults),
123 .cache_type = REGCACHE_RBTREE,
126 static const DECLARE_TLV_DB_SCALE(dva_tlv, -9100, 100, 1);
127 static const DECLARE_TLV_DB_SCALE(dvg_tlv, 0, 600, 0);
128 static const DECLARE_TLV_DB_SCALE(adc_tlv, -1200, 100, 0);
129 static const DECLARE_TLV_DB_RANGE(pam_tlv,
130 0, MAX9860_PAM_MAX - 1, TLV_DB_SCALE_ITEM(-2000, 2000, 1),
131 MAX9860_PAM_MAX, MAX9860_PAM_MAX, TLV_DB_SCALE_ITEM(3000, 0, 0));
132 static const DECLARE_TLV_DB_SCALE(pgam_tlv, 0, 100, 0);
133 static const DECLARE_TLV_DB_SCALE(anth_tlv, -7600, 400, 1);
134 static const DECLARE_TLV_DB_SCALE(agcth_tlv, -1800, 100, 0);
136 static const char * const agchld_text[] = {
137 "AGC Disabled", "50ms", "100ms", "400ms"
140 static SOC_ENUM_SINGLE_DECL(agchld_enum, MAX9860_MICADC,
141 MAX9860_AGCHLD_SHIFT, agchld_text);
143 static const char * const agcsrc_text[] = {
144 "Left ADC", "Left/Right ADC"
147 static SOC_ENUM_SINGLE_DECL(agcsrc_enum, MAX9860_MICADC,
148 MAX9860_AGCSRC_SHIFT, agcsrc_text);
150 static const char * const agcatk_text[] = {
151 "3ms", "12ms", "50ms", "200ms"
154 static SOC_ENUM_SINGLE_DECL(agcatk_enum, MAX9860_MICADC,
155 MAX9860_AGCATK_SHIFT, agcatk_text);
157 static const char * const agcrls_text[] = {
158 "78ms", "156ms", "312ms", "625ms",
159 "1.25s", "2.5s", "5s", "10s"
162 static SOC_ENUM_SINGLE_DECL(agcrls_enum, MAX9860_MICADC,
163 MAX9860_AGCRLS_SHIFT, agcrls_text);
165 static const char * const filter_text[] = {
166 "Disabled",
167 "Elliptical HP 217Hz notch (16kHz)",
168 "Butterworth HP 500Hz (16kHz)",
169 "Elliptical HP 217Hz notch (8kHz)",
170 "Butterworth HP 500Hz (8kHz)",
171 "Butterworth HP 200Hz (48kHz)"
174 static SOC_ENUM_SINGLE_DECL(avflt_enum, MAX9860_VOICEFLTR,
175 MAX9860_AVFLT_SHIFT, filter_text);
177 static SOC_ENUM_SINGLE_DECL(dvflt_enum, MAX9860_VOICEFLTR,
178 MAX9860_DVFLT_SHIFT, filter_text);
180 static const struct snd_kcontrol_new max9860_controls[] = {
181 SOC_SINGLE_TLV("Master Playback Volume", MAX9860_DACATTN,
182 MAX9860_DVA_SHIFT, MAX9860_DVA_MUTE, 1, dva_tlv),
183 SOC_SINGLE_TLV("DAC Gain Volume", MAX9860_DACGAIN,
184 MAX9860_DVG_SHIFT, MAX9860_DVG_MAX, 0, dvg_tlv),
185 SOC_DOUBLE_TLV("Line Capture Volume", MAX9860_ADCLEVEL,
186 MAX9860_ADCLL_SHIFT, MAX9860_ADCRL_SHIFT, MAX9860_ADCxL_MIN, 1,
187 adc_tlv),
189 SOC_ENUM("AGC Hold Time", agchld_enum),
190 SOC_ENUM("AGC/Noise Gate Source", agcsrc_enum),
191 SOC_ENUM("AGC Attack Time", agcatk_enum),
192 SOC_ENUM("AGC Release Time", agcrls_enum),
194 SOC_SINGLE_TLV("Noise Gate Threshold Volume", MAX9860_NOISEGATE,
195 MAX9860_ANTH_SHIFT, MAX9860_ANTH_MAX, 0, anth_tlv),
196 SOC_SINGLE_TLV("AGC Signal Threshold Volume", MAX9860_NOISEGATE,
197 MAX9860_AGCTH_SHIFT, MAX9860_AGCTH_MIN, 1, agcth_tlv),
199 SOC_SINGLE_TLV("Mic PGA Volume", MAX9860_MICGAIN,
200 MAX9860_PGAM_SHIFT, MAX9860_PGAM_MIN, 1, pgam_tlv),
201 SOC_SINGLE_TLV("Mic Preamp Volume", MAX9860_MICGAIN,
202 MAX9860_PAM_SHIFT, MAX9860_PAM_MAX, 0, pam_tlv),
204 SOC_ENUM("ADC Filter", avflt_enum),
205 SOC_ENUM("DAC Filter", dvflt_enum),
208 static const struct snd_soc_dapm_widget max9860_dapm_widgets[] = {
209 SND_SOC_DAPM_INPUT("MICL"),
210 SND_SOC_DAPM_INPUT("MICR"),
212 SND_SOC_DAPM_ADC("ADCL", NULL, MAX9860_PWRMAN, MAX9860_ADCLEN_SHIFT, 0),
213 SND_SOC_DAPM_ADC("ADCR", NULL, MAX9860_PWRMAN, MAX9860_ADCREN_SHIFT, 0),
215 SND_SOC_DAPM_AIF_OUT("AIFOUTL", "Capture", 0, SND_SOC_NOPM, 0, 0),
216 SND_SOC_DAPM_AIF_OUT("AIFOUTR", "Capture", 1, SND_SOC_NOPM, 0, 0),
218 SND_SOC_DAPM_AIF_IN("AIFINL", "Playback", 0, SND_SOC_NOPM, 0, 0),
219 SND_SOC_DAPM_AIF_IN("AIFINR", "Playback", 1, SND_SOC_NOPM, 0, 0),
221 SND_SOC_DAPM_DAC("DAC", NULL, MAX9860_PWRMAN, MAX9860_DACEN_SHIFT, 0),
223 SND_SOC_DAPM_OUTPUT("OUT"),
225 SND_SOC_DAPM_SUPPLY("Supply", SND_SOC_NOPM, 0, 0,
226 NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
227 SND_SOC_DAPM_REGULATOR_SUPPLY("AVDD", 0, 0),
228 SND_SOC_DAPM_REGULATOR_SUPPLY("DVDD", 0, 0),
229 SND_SOC_DAPM_CLOCK_SUPPLY("mclk"),
232 static const struct snd_soc_dapm_route max9860_dapm_routes[] = {
233 { "ADCL", NULL, "MICL" },
234 { "ADCR", NULL, "MICR" },
235 { "AIFOUTL", NULL, "ADCL" },
236 { "AIFOUTR", NULL, "ADCR" },
238 { "DAC", NULL, "AIFINL" },
239 { "DAC", NULL, "AIFINR" },
240 { "OUT", NULL, "DAC" },
242 { "Supply", NULL, "AVDD" },
243 { "Supply", NULL, "DVDD" },
244 { "Supply", NULL, "mclk" },
246 { "DAC", NULL, "Supply" },
247 { "ADCL", NULL, "Supply" },
248 { "ADCR", NULL, "Supply" },
251 static int max9860_hw_params(struct snd_pcm_substream *substream,
252 struct snd_pcm_hw_params *params,
253 struct snd_soc_dai *dai)
255 struct snd_soc_component *component = dai->component;
256 struct max9860_priv *max9860 = snd_soc_component_get_drvdata(component);
257 u8 master;
258 u8 ifc1a = 0;
259 u8 ifc1b = 0;
260 u8 sysclk = 0;
261 unsigned long n;
262 int ret;
264 dev_dbg(component->dev, "hw_params %u Hz, %u channels\n",
265 params_rate(params),
266 params_channels(params));
268 if (params_channels(params) == 2)
269 ifc1b |= MAX9860_ST;
271 switch (max9860->fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
272 case SND_SOC_DAIFMT_CBC_CFC:
273 master = 0;
274 break;
275 case SND_SOC_DAIFMT_CBP_CFP:
276 master = MAX9860_MASTER;
277 break;
278 default:
279 return -EINVAL;
281 ifc1a |= master;
283 if (master) {
284 if (params_width(params) * params_channels(params) > 48)
285 ifc1b |= MAX9860_BSEL_64X;
286 else
287 ifc1b |= MAX9860_BSEL_48X;
290 switch (max9860->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
291 case SND_SOC_DAIFMT_I2S:
292 ifc1a |= MAX9860_DDLY;
293 ifc1b |= MAX9860_ADLY;
294 break;
295 case SND_SOC_DAIFMT_LEFT_J:
296 ifc1a |= MAX9860_WCI;
297 break;
298 case SND_SOC_DAIFMT_DSP_A:
299 if (params_width(params) != 16) {
300 dev_err(component->dev,
301 "DSP_A works for 16 bits per sample only.\n");
302 return -EINVAL;
304 ifc1a |= MAX9860_DDLY | MAX9860_WCI | MAX9860_HIZ | MAX9860_TDM;
305 ifc1b |= MAX9860_ADLY;
306 break;
307 case SND_SOC_DAIFMT_DSP_B:
308 if (params_width(params) != 16) {
309 dev_err(component->dev,
310 "DSP_B works for 16 bits per sample only.\n");
311 return -EINVAL;
313 ifc1a |= MAX9860_WCI | MAX9860_HIZ | MAX9860_TDM;
314 break;
315 default:
316 return -EINVAL;
319 switch (max9860->fmt & SND_SOC_DAIFMT_INV_MASK) {
320 case SND_SOC_DAIFMT_NB_NF:
321 break;
322 case SND_SOC_DAIFMT_NB_IF:
323 switch (max9860->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
324 case SND_SOC_DAIFMT_DSP_A:
325 case SND_SOC_DAIFMT_DSP_B:
326 return -EINVAL;
328 ifc1a ^= MAX9860_WCI;
329 break;
330 case SND_SOC_DAIFMT_IB_IF:
331 switch (max9860->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
332 case SND_SOC_DAIFMT_DSP_A:
333 case SND_SOC_DAIFMT_DSP_B:
334 return -EINVAL;
336 ifc1a ^= MAX9860_WCI;
337 fallthrough;
338 case SND_SOC_DAIFMT_IB_NF:
339 ifc1a ^= MAX9860_DBCI;
340 ifc1b ^= MAX9860_ABCI;
341 break;
342 default:
343 return -EINVAL;
346 dev_dbg(component->dev, "IFC1A %02x\n", ifc1a);
347 ret = regmap_write(max9860->regmap, MAX9860_IFC1A, ifc1a);
348 if (ret) {
349 dev_err(component->dev, "Failed to set IFC1A: %d\n", ret);
350 return ret;
352 dev_dbg(component->dev, "IFC1B %02x\n", ifc1b);
353 ret = regmap_write(max9860->regmap, MAX9860_IFC1B, ifc1b);
354 if (ret) {
355 dev_err(component->dev, "Failed to set IFC1B: %d\n", ret);
356 return ret;
360 * Check if Integer Clock Mode is possible, but avoid it in slave mode
361 * since we then do not know if lrclk is derived from pclk and the
362 * datasheet mentions that the frequencies have to match exactly in
363 * order for this to work.
365 if (params_rate(params) == 8000 || params_rate(params) == 16000) {
366 if (master) {
367 switch (max9860->pclk_rate) {
368 case 12000000:
369 sysclk = MAX9860_FREQ_12MHZ;
370 break;
371 case 13000000:
372 sysclk = MAX9860_FREQ_13MHZ;
373 break;
374 case 19200000:
375 sysclk = MAX9860_FREQ_19_2MHZ;
376 break;
377 default:
379 * Integer Clock Mode not possible. Leave
380 * sysclk at zero and fall through to the
381 * code below for PLL mode.
383 break;
386 if (sysclk && params_rate(params) == 16000)
387 sysclk |= MAX9860_16KHZ;
392 * Largest possible n:
393 * 65536 * 96 * 48kHz / 10MHz -> 30199
394 * Smallest possible n:
395 * 65536 * 96 * 8kHz / 20MHz -> 2517
396 * Both fit nicely in the available 15 bits, no need to apply any mask.
398 n = DIV_ROUND_CLOSEST_ULL(65536ULL * 96 * params_rate(params),
399 max9860->pclk_rate);
401 if (!sysclk) {
402 /* PLL mode */
403 if (params_rate(params) > 24000)
404 sysclk |= MAX9860_16KHZ;
406 if (!master)
407 n |= 1; /* trigger rapid pll lock mode */
410 sysclk |= max9860->psclk;
411 dev_dbg(component->dev, "SYSCLK %02x\n", sysclk);
412 ret = regmap_write(max9860->regmap,
413 MAX9860_SYSCLK, sysclk);
414 if (ret) {
415 dev_err(component->dev, "Failed to set SYSCLK: %d\n", ret);
416 return ret;
418 dev_dbg(component->dev, "N %lu\n", n);
419 ret = regmap_write(max9860->regmap,
420 MAX9860_AUDIOCLKHIGH, n >> 8);
421 if (ret) {
422 dev_err(component->dev, "Failed to set NHI: %d\n", ret);
423 return ret;
425 ret = regmap_write(max9860->regmap,
426 MAX9860_AUDIOCLKLOW, n & 0xff);
427 if (ret) {
428 dev_err(component->dev, "Failed to set NLO: %d\n", ret);
429 return ret;
432 if (!master) {
433 dev_dbg(component->dev, "Enable PLL\n");
434 ret = regmap_update_bits(max9860->regmap, MAX9860_AUDIOCLKHIGH,
435 MAX9860_PLL, MAX9860_PLL);
436 if (ret) {
437 dev_err(component->dev, "Failed to enable PLL: %d\n",
438 ret);
439 return ret;
443 return 0;
446 static int max9860_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
448 struct snd_soc_component *component = dai->component;
449 struct max9860_priv *max9860 = snd_soc_component_get_drvdata(component);
451 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
452 case SND_SOC_DAIFMT_CBP_CFP:
453 case SND_SOC_DAIFMT_CBC_CFC:
454 max9860->fmt = fmt;
455 return 0;
457 default:
458 return -EINVAL;
462 static const struct snd_soc_dai_ops max9860_dai_ops = {
463 .hw_params = max9860_hw_params,
464 .set_fmt = max9860_set_fmt,
467 static struct snd_soc_dai_driver max9860_dai = {
468 .name = "max9860-hifi",
469 .playback = {
470 .stream_name = "Playback",
471 .channels_min = 1,
472 .channels_max = 2,
473 .rates = SNDRV_PCM_RATE_CONTINUOUS,
474 .rate_min = 8000,
475 .rate_max = 48000,
476 .formats = SNDRV_PCM_FMTBIT_S16_LE |
477 SNDRV_PCM_FMTBIT_S24_LE |
478 SNDRV_PCM_FMTBIT_S32_LE,
480 .capture = {
481 .stream_name = "Capture",
482 .channels_min = 1,
483 .channels_max = 2,
484 .rates = SNDRV_PCM_RATE_CONTINUOUS,
485 .rate_min = 8000,
486 .rate_max = 48000,
487 .formats = SNDRV_PCM_FMTBIT_S16_LE |
488 SNDRV_PCM_FMTBIT_S24_LE |
489 SNDRV_PCM_FMTBIT_S32_LE,
491 .ops = &max9860_dai_ops,
492 .symmetric_rate = 1,
495 static int max9860_set_bias_level(struct snd_soc_component *component,
496 enum snd_soc_bias_level level)
498 struct max9860_priv *max9860 = dev_get_drvdata(component->dev);
499 int ret;
501 switch (level) {
502 case SND_SOC_BIAS_ON:
503 case SND_SOC_BIAS_PREPARE:
504 break;
506 case SND_SOC_BIAS_STANDBY:
507 ret = regmap_update_bits(max9860->regmap, MAX9860_PWRMAN,
508 MAX9860_SHDN, MAX9860_SHDN);
509 if (ret) {
510 dev_err(component->dev, "Failed to remove SHDN: %d\n",
511 ret);
512 return ret;
514 break;
516 case SND_SOC_BIAS_OFF:
517 ret = regmap_update_bits(max9860->regmap, MAX9860_PWRMAN,
518 MAX9860_SHDN, 0);
519 if (ret) {
520 dev_err(component->dev, "Failed to request SHDN: %d\n",
521 ret);
522 return ret;
524 break;
527 return 0;
530 static const struct snd_soc_component_driver max9860_component_driver = {
531 .set_bias_level = max9860_set_bias_level,
532 .controls = max9860_controls,
533 .num_controls = ARRAY_SIZE(max9860_controls),
534 .dapm_widgets = max9860_dapm_widgets,
535 .num_dapm_widgets = ARRAY_SIZE(max9860_dapm_widgets),
536 .dapm_routes = max9860_dapm_routes,
537 .num_dapm_routes = ARRAY_SIZE(max9860_dapm_routes),
538 .use_pmdown_time = 1,
539 .endianness = 1,
542 #ifdef CONFIG_PM
543 static int max9860_suspend(struct device *dev)
545 struct max9860_priv *max9860 = dev_get_drvdata(dev);
546 int ret;
548 ret = regmap_update_bits(max9860->regmap, MAX9860_SYSCLK,
549 MAX9860_PSCLK, MAX9860_PSCLK_OFF);
550 if (ret) {
551 dev_err(dev, "Failed to disable clock: %d\n", ret);
552 return ret;
555 regulator_disable(max9860->dvddio);
557 return 0;
560 static int max9860_resume(struct device *dev)
562 struct max9860_priv *max9860 = dev_get_drvdata(dev);
563 int ret;
565 ret = regulator_enable(max9860->dvddio);
566 if (ret) {
567 dev_err(dev, "Failed to enable DVDDIO: %d\n", ret);
568 return ret;
571 regcache_cache_only(max9860->regmap, false);
572 ret = regcache_sync(max9860->regmap);
573 if (ret) {
574 dev_err(dev, "Failed to sync cache: %d\n", ret);
575 return ret;
578 ret = regmap_update_bits(max9860->regmap, MAX9860_SYSCLK,
579 MAX9860_PSCLK, max9860->psclk);
580 if (ret) {
581 dev_err(dev, "Failed to enable clock: %d\n", ret);
582 return ret;
585 return 0;
587 #endif
589 static const struct dev_pm_ops max9860_pm_ops = {
590 SET_RUNTIME_PM_OPS(max9860_suspend, max9860_resume, NULL)
593 static int max9860_probe(struct i2c_client *i2c)
595 struct device *dev = &i2c->dev;
596 struct max9860_priv *max9860;
597 int ret;
598 struct clk *mclk;
599 unsigned long mclk_rate;
600 int i;
601 int intr;
603 max9860 = devm_kzalloc(dev, sizeof(struct max9860_priv), GFP_KERNEL);
604 if (!max9860)
605 return -ENOMEM;
607 max9860->dvddio = devm_regulator_get(dev, "DVDDIO");
608 if (IS_ERR(max9860->dvddio))
609 return dev_err_probe(dev, PTR_ERR(max9860->dvddio),
610 "Failed to get DVDDIO supply\n");
612 max9860->dvddio_nb.notifier_call = max9860_dvddio_event;
614 ret = devm_regulator_register_notifier(max9860->dvddio,
615 &max9860->dvddio_nb);
616 if (ret)
617 dev_err(dev, "Failed to register DVDDIO notifier: %d\n", ret);
619 ret = regulator_enable(max9860->dvddio);
620 if (ret != 0) {
621 dev_err(dev, "Failed to enable DVDDIO: %d\n", ret);
622 return ret;
625 max9860->regmap = devm_regmap_init_i2c(i2c, &max9860_regmap);
626 if (IS_ERR(max9860->regmap)) {
627 ret = PTR_ERR(max9860->regmap);
628 goto err_regulator;
631 dev_set_drvdata(dev, max9860);
634 * mclk has to be in the 10MHz to 60MHz range.
635 * psclk is used to scale mclk into pclk so that
636 * pclk is in the 10MHz to 20MHz range.
638 mclk = clk_get(dev, "mclk");
640 if (IS_ERR(mclk)) {
641 ret = PTR_ERR(mclk);
642 dev_err_probe(dev, ret, "Failed to get MCLK\n");
643 goto err_regulator;
646 mclk_rate = clk_get_rate(mclk);
647 clk_put(mclk);
649 if (mclk_rate > 60000000 || mclk_rate < 10000000) {
650 dev_err(dev, "Bad mclk %luHz (needs 10MHz - 60MHz)\n",
651 mclk_rate);
652 ret = -EINVAL;
653 goto err_regulator;
655 if (mclk_rate >= 40000000)
656 max9860->psclk = 3;
657 else if (mclk_rate >= 20000000)
658 max9860->psclk = 2;
659 else
660 max9860->psclk = 1;
661 max9860->pclk_rate = mclk_rate >> (max9860->psclk - 1);
662 max9860->psclk <<= MAX9860_PSCLK_SHIFT;
663 dev_dbg(dev, "mclk %lu pclk %lu\n", mclk_rate, max9860->pclk_rate);
665 regcache_cache_bypass(max9860->regmap, true);
666 for (i = 0; i < max9860_regmap.num_reg_defaults; ++i) {
667 ret = regmap_write(max9860->regmap,
668 max9860_regmap.reg_defaults[i].reg,
669 max9860_regmap.reg_defaults[i].def);
670 if (ret) {
671 dev_err(dev, "Failed to initialize register %u: %d\n",
672 max9860_regmap.reg_defaults[i].reg, ret);
673 goto err_regulator;
676 regcache_cache_bypass(max9860->regmap, false);
678 ret = regmap_read(max9860->regmap, MAX9860_INTRSTATUS, &intr);
679 if (ret) {
680 dev_err(dev, "Failed to clear INTRSTATUS: %d\n", ret);
681 goto err_regulator;
684 pm_runtime_set_active(dev);
685 pm_runtime_enable(dev);
686 pm_runtime_idle(dev);
688 ret = devm_snd_soc_register_component(dev, &max9860_component_driver,
689 &max9860_dai, 1);
690 if (ret) {
691 dev_err(dev, "Failed to register CODEC: %d\n", ret);
692 goto err_pm;
695 return 0;
697 err_pm:
698 pm_runtime_disable(dev);
699 err_regulator:
700 regulator_disable(max9860->dvddio);
701 return ret;
704 static void max9860_remove(struct i2c_client *i2c)
706 struct device *dev = &i2c->dev;
707 struct max9860_priv *max9860 = dev_get_drvdata(dev);
709 pm_runtime_disable(dev);
710 regulator_disable(max9860->dvddio);
713 static const struct i2c_device_id max9860_i2c_id[] = {
714 { "max9860", },
717 MODULE_DEVICE_TABLE(i2c, max9860_i2c_id);
719 static const struct of_device_id max9860_of_match[] = {
720 { .compatible = "maxim,max9860", },
723 MODULE_DEVICE_TABLE(of, max9860_of_match);
725 static struct i2c_driver max9860_i2c_driver = {
726 .probe = max9860_probe,
727 .remove = max9860_remove,
728 .id_table = max9860_i2c_id,
729 .driver = {
730 .name = "max9860",
731 .of_match_table = max9860_of_match,
732 .pm = &max9860_pm_ops,
736 module_i2c_driver(max9860_i2c_driver);
738 MODULE_DESCRIPTION("ASoC MAX9860 Mono Audio Voice Codec driver");
739 MODULE_AUTHOR("Peter Rosin <peda@axentia.se>");
740 MODULE_LICENSE("GPL v2");