xref: /openbmc/linux/sound/soc/codecs/max9860.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1a93532dbSPeter Rosin // SPDX-License-Identifier: GPL-2.0
2a93532dbSPeter Rosin //
3a93532dbSPeter Rosin // Driver for the MAX9860 Mono Audio Voice Codec
4a93532dbSPeter Rosin //
5a93532dbSPeter Rosin // https://datasheets.maximintegrated.com/en/ds/MAX9860.pdf
6a93532dbSPeter Rosin //
7a93532dbSPeter Rosin // The driver does not support sidetone since the DVST register field is
8a93532dbSPeter Rosin // backwards with the mute near the maximum level instead of the minimum.
9a93532dbSPeter Rosin //
10a93532dbSPeter Rosin // Author: Peter Rosin <peda@axentia.s>
11a93532dbSPeter Rosin //         Copyright 2016 Axentia Technologies
123b2af7f7SPeter Rosin 
133b2af7f7SPeter Rosin #include <linux/init.h>
143b2af7f7SPeter Rosin #include <linux/module.h>
153b2af7f7SPeter Rosin #include <linux/clk.h>
163b2af7f7SPeter Rosin #include <linux/kernel.h>
173b2af7f7SPeter Rosin #include <linux/pm_runtime.h>
183b2af7f7SPeter Rosin #include <linux/regmap.h>
193b2af7f7SPeter Rosin #include <linux/i2c.h>
203b2af7f7SPeter Rosin #include <linux/regulator/consumer.h>
213b2af7f7SPeter Rosin #include <sound/soc.h>
223b2af7f7SPeter Rosin #include <sound/soc-dapm.h>
233b2af7f7SPeter Rosin #include <sound/pcm_params.h>
243b2af7f7SPeter Rosin #include <sound/tlv.h>
253b2af7f7SPeter Rosin 
263b2af7f7SPeter Rosin #include "max9860.h"
273b2af7f7SPeter Rosin 
283b2af7f7SPeter Rosin struct max9860_priv {
293b2af7f7SPeter Rosin 	struct regmap *regmap;
303b2af7f7SPeter Rosin 	struct regulator *dvddio;
313b2af7f7SPeter Rosin 	struct notifier_block dvddio_nb;
323b2af7f7SPeter Rosin 	u8 psclk;
333b2af7f7SPeter Rosin 	unsigned long pclk_rate;
343b2af7f7SPeter Rosin 	int fmt;
353b2af7f7SPeter Rosin };
363b2af7f7SPeter Rosin 
max9860_dvddio_event(struct notifier_block * nb,unsigned long event,void * data)373b2af7f7SPeter Rosin static int max9860_dvddio_event(struct notifier_block *nb,
383b2af7f7SPeter Rosin 				unsigned long event, void *data)
393b2af7f7SPeter Rosin {
403b2af7f7SPeter Rosin 	struct max9860_priv *max9860 = container_of(nb, struct max9860_priv,
413b2af7f7SPeter Rosin 						    dvddio_nb);
423b2af7f7SPeter Rosin 	if (event & REGULATOR_EVENT_DISABLE) {
433b2af7f7SPeter Rosin 		regcache_mark_dirty(max9860->regmap);
443b2af7f7SPeter Rosin 		regcache_cache_only(max9860->regmap, true);
453b2af7f7SPeter Rosin 	}
463b2af7f7SPeter Rosin 
473b2af7f7SPeter Rosin 	return 0;
483b2af7f7SPeter Rosin }
493b2af7f7SPeter Rosin 
503b2af7f7SPeter Rosin static const struct reg_default max9860_reg_defaults[] = {
513b2af7f7SPeter Rosin 	{ MAX9860_PWRMAN,       0x00 },
523b2af7f7SPeter Rosin 	{ MAX9860_INTEN,        0x00 },
533b2af7f7SPeter Rosin 	{ MAX9860_SYSCLK,       0x00 },
543b2af7f7SPeter Rosin 	{ MAX9860_AUDIOCLKHIGH, 0x00 },
553b2af7f7SPeter Rosin 	{ MAX9860_AUDIOCLKLOW,  0x00 },
563b2af7f7SPeter Rosin 	{ MAX9860_IFC1A,        0x00 },
573b2af7f7SPeter Rosin 	{ MAX9860_IFC1B,        0x00 },
583b2af7f7SPeter Rosin 	{ MAX9860_VOICEFLTR,    0x00 },
593b2af7f7SPeter Rosin 	{ MAX9860_DACATTN,      0x00 },
603b2af7f7SPeter Rosin 	{ MAX9860_ADCLEVEL,     0x00 },
613b2af7f7SPeter Rosin 	{ MAX9860_DACGAIN,      0x00 },
623b2af7f7SPeter Rosin 	{ MAX9860_MICGAIN,      0x00 },
633b2af7f7SPeter Rosin 	{ MAX9860_MICADC,       0x00 },
643b2af7f7SPeter Rosin 	{ MAX9860_NOISEGATE,    0x00 },
653b2af7f7SPeter Rosin };
663b2af7f7SPeter Rosin 
max9860_readable(struct device * dev,unsigned int reg)673b2af7f7SPeter Rosin static bool max9860_readable(struct device *dev, unsigned int reg)
683b2af7f7SPeter Rosin {
693b2af7f7SPeter Rosin 	switch (reg) {
703b2af7f7SPeter Rosin 	case MAX9860_INTRSTATUS ... MAX9860_MICGAIN:
713b2af7f7SPeter Rosin 	case MAX9860_MICADC ... MAX9860_PWRMAN:
723b2af7f7SPeter Rosin 	case MAX9860_REVISION:
733b2af7f7SPeter Rosin 		return true;
743b2af7f7SPeter Rosin 	}
753b2af7f7SPeter Rosin 
763b2af7f7SPeter Rosin 	return false;
773b2af7f7SPeter Rosin }
783b2af7f7SPeter Rosin 
max9860_writeable(struct device * dev,unsigned int reg)793b2af7f7SPeter Rosin static bool max9860_writeable(struct device *dev, unsigned int reg)
803b2af7f7SPeter Rosin {
813b2af7f7SPeter Rosin 	switch (reg) {
823b2af7f7SPeter Rosin 	case MAX9860_INTEN ... MAX9860_MICGAIN:
833b2af7f7SPeter Rosin 	case MAX9860_MICADC ... MAX9860_PWRMAN:
843b2af7f7SPeter Rosin 		return true;
853b2af7f7SPeter Rosin 	}
863b2af7f7SPeter Rosin 
873b2af7f7SPeter Rosin 	return false;
883b2af7f7SPeter Rosin }
893b2af7f7SPeter Rosin 
max9860_volatile(struct device * dev,unsigned int reg)903b2af7f7SPeter Rosin static bool max9860_volatile(struct device *dev, unsigned int reg)
913b2af7f7SPeter Rosin {
923b2af7f7SPeter Rosin 	switch (reg) {
933b2af7f7SPeter Rosin 	case MAX9860_INTRSTATUS:
943b2af7f7SPeter Rosin 	case MAX9860_MICREADBACK:
953b2af7f7SPeter Rosin 		return true;
963b2af7f7SPeter Rosin 	}
973b2af7f7SPeter Rosin 
983b2af7f7SPeter Rosin 	return false;
993b2af7f7SPeter Rosin }
1003b2af7f7SPeter Rosin 
max9860_precious(struct device * dev,unsigned int reg)1013b2af7f7SPeter Rosin static bool max9860_precious(struct device *dev, unsigned int reg)
1023b2af7f7SPeter Rosin {
1033b2af7f7SPeter Rosin 	switch (reg) {
1043b2af7f7SPeter Rosin 	case MAX9860_INTRSTATUS:
1053b2af7f7SPeter Rosin 		return true;
1063b2af7f7SPeter Rosin 	}
1073b2af7f7SPeter Rosin 
1083b2af7f7SPeter Rosin 	return false;
1093b2af7f7SPeter Rosin }
1103b2af7f7SPeter Rosin 
111716540fdSWei Yongjun static const struct regmap_config max9860_regmap = {
1123b2af7f7SPeter Rosin 	.reg_bits = 8,
1133b2af7f7SPeter Rosin 	.val_bits = 8,
1143b2af7f7SPeter Rosin 
1153b2af7f7SPeter Rosin 	.readable_reg = max9860_readable,
1163b2af7f7SPeter Rosin 	.writeable_reg = max9860_writeable,
1173b2af7f7SPeter Rosin 	.volatile_reg = max9860_volatile,
1183b2af7f7SPeter Rosin 	.precious_reg = max9860_precious,
1193b2af7f7SPeter Rosin 
1203b2af7f7SPeter Rosin 	.max_register = MAX9860_MAX_REGISTER,
1213b2af7f7SPeter Rosin 	.reg_defaults = max9860_reg_defaults,
1223b2af7f7SPeter Rosin 	.num_reg_defaults = ARRAY_SIZE(max9860_reg_defaults),
1233b2af7f7SPeter Rosin 	.cache_type = REGCACHE_RBTREE,
1243b2af7f7SPeter Rosin };
1253b2af7f7SPeter Rosin 
1263b2af7f7SPeter Rosin static const DECLARE_TLV_DB_SCALE(dva_tlv, -9100, 100, 1);
1273b2af7f7SPeter Rosin static const DECLARE_TLV_DB_SCALE(dvg_tlv, 0, 600, 0);
1283b2af7f7SPeter Rosin static const DECLARE_TLV_DB_SCALE(adc_tlv, -1200, 100, 0);
1293b2af7f7SPeter Rosin static const DECLARE_TLV_DB_RANGE(pam_tlv,
1303b2af7f7SPeter Rosin 	0, MAX9860_PAM_MAX - 1,             TLV_DB_SCALE_ITEM(-2000, 2000, 1),
1313b2af7f7SPeter Rosin 	MAX9860_PAM_MAX, MAX9860_PAM_MAX,   TLV_DB_SCALE_ITEM(3000, 0, 0));
1323b2af7f7SPeter Rosin static const DECLARE_TLV_DB_SCALE(pgam_tlv, 0, 100, 0);
1333b2af7f7SPeter Rosin static const DECLARE_TLV_DB_SCALE(anth_tlv, -7600, 400, 1);
1343b2af7f7SPeter Rosin static const DECLARE_TLV_DB_SCALE(agcth_tlv, -1800, 100, 0);
1353b2af7f7SPeter Rosin 
1363b2af7f7SPeter Rosin static const char * const agchld_text[] = {
1373b2af7f7SPeter Rosin 	"AGC Disabled", "50ms", "100ms", "400ms"
1383b2af7f7SPeter Rosin };
1393b2af7f7SPeter Rosin 
1403b2af7f7SPeter Rosin static SOC_ENUM_SINGLE_DECL(agchld_enum, MAX9860_MICADC,
1413b2af7f7SPeter Rosin 			    MAX9860_AGCHLD_SHIFT, agchld_text);
1423b2af7f7SPeter Rosin 
1433b2af7f7SPeter Rosin static const char * const agcsrc_text[] = {
1443b2af7f7SPeter Rosin 	"Left ADC", "Left/Right ADC"
1453b2af7f7SPeter Rosin };
1463b2af7f7SPeter Rosin 
1473b2af7f7SPeter Rosin static SOC_ENUM_SINGLE_DECL(agcsrc_enum, MAX9860_MICADC,
1483b2af7f7SPeter Rosin 			    MAX9860_AGCSRC_SHIFT, agcsrc_text);
1493b2af7f7SPeter Rosin 
1503b2af7f7SPeter Rosin static const char * const agcatk_text[] = {
1513b2af7f7SPeter Rosin 	"3ms", "12ms", "50ms", "200ms"
1523b2af7f7SPeter Rosin };
1533b2af7f7SPeter Rosin 
1543b2af7f7SPeter Rosin static SOC_ENUM_SINGLE_DECL(agcatk_enum, MAX9860_MICADC,
1553b2af7f7SPeter Rosin 			    MAX9860_AGCATK_SHIFT, agcatk_text);
1563b2af7f7SPeter Rosin 
1573b2af7f7SPeter Rosin static const char * const agcrls_text[] = {
1583b2af7f7SPeter Rosin 	"78ms", "156ms", "312ms", "625ms",
1593b2af7f7SPeter Rosin 	"1.25s", "2.5s", "5s", "10s"
1603b2af7f7SPeter Rosin };
1613b2af7f7SPeter Rosin 
1623b2af7f7SPeter Rosin static SOC_ENUM_SINGLE_DECL(agcrls_enum, MAX9860_MICADC,
1633b2af7f7SPeter Rosin 			    MAX9860_AGCRLS_SHIFT, agcrls_text);
1643b2af7f7SPeter Rosin 
1653b2af7f7SPeter Rosin static const char * const filter_text[] = {
1663b2af7f7SPeter Rosin 	"Disabled",
1673b2af7f7SPeter Rosin 	"Elliptical HP 217Hz notch (16kHz)",
1683b2af7f7SPeter Rosin 	"Butterworth HP 500Hz (16kHz)",
1693b2af7f7SPeter Rosin 	"Elliptical HP 217Hz notch (8kHz)",
1703b2af7f7SPeter Rosin 	"Butterworth HP 500Hz (8kHz)",
1713b2af7f7SPeter Rosin 	"Butterworth HP 200Hz (48kHz)"
1723b2af7f7SPeter Rosin };
1733b2af7f7SPeter Rosin 
1743b2af7f7SPeter Rosin static SOC_ENUM_SINGLE_DECL(avflt_enum, MAX9860_VOICEFLTR,
1753b2af7f7SPeter Rosin 			    MAX9860_AVFLT_SHIFT, filter_text);
1763b2af7f7SPeter Rosin 
1773b2af7f7SPeter Rosin static SOC_ENUM_SINGLE_DECL(dvflt_enum, MAX9860_VOICEFLTR,
1783b2af7f7SPeter Rosin 			    MAX9860_DVFLT_SHIFT, filter_text);
1793b2af7f7SPeter Rosin 
1803b2af7f7SPeter Rosin static const struct snd_kcontrol_new max9860_controls[] = {
1813b2af7f7SPeter Rosin SOC_SINGLE_TLV("Master Playback Volume", MAX9860_DACATTN,
1823b2af7f7SPeter Rosin 	       MAX9860_DVA_SHIFT, MAX9860_DVA_MUTE, 1, dva_tlv),
1833b2af7f7SPeter Rosin SOC_SINGLE_TLV("DAC Gain Volume", MAX9860_DACGAIN,
1843b2af7f7SPeter Rosin 	       MAX9860_DVG_SHIFT, MAX9860_DVG_MAX, 0, dvg_tlv),
1853b2af7f7SPeter Rosin SOC_DOUBLE_TLV("Line Capture Volume", MAX9860_ADCLEVEL,
1863b2af7f7SPeter Rosin 	       MAX9860_ADCLL_SHIFT, MAX9860_ADCRL_SHIFT, MAX9860_ADCxL_MIN, 1,
1873b2af7f7SPeter Rosin 	       adc_tlv),
1883b2af7f7SPeter Rosin 
1893b2af7f7SPeter Rosin SOC_ENUM("AGC Hold Time", agchld_enum),
1903b2af7f7SPeter Rosin SOC_ENUM("AGC/Noise Gate Source", agcsrc_enum),
1913b2af7f7SPeter Rosin SOC_ENUM("AGC Attack Time", agcatk_enum),
1923b2af7f7SPeter Rosin SOC_ENUM("AGC Release Time", agcrls_enum),
1933b2af7f7SPeter Rosin 
1943b2af7f7SPeter Rosin SOC_SINGLE_TLV("Noise Gate Threshold Volume", MAX9860_NOISEGATE,
1953b2af7f7SPeter Rosin 	       MAX9860_ANTH_SHIFT, MAX9860_ANTH_MAX, 0, anth_tlv),
1963b2af7f7SPeter Rosin SOC_SINGLE_TLV("AGC Signal Threshold Volume", MAX9860_NOISEGATE,
1973b2af7f7SPeter Rosin 	       MAX9860_AGCTH_SHIFT, MAX9860_AGCTH_MIN, 1, agcth_tlv),
1983b2af7f7SPeter Rosin 
1993b2af7f7SPeter Rosin SOC_SINGLE_TLV("Mic PGA Volume", MAX9860_MICGAIN,
2003b2af7f7SPeter Rosin 	       MAX9860_PGAM_SHIFT, MAX9860_PGAM_MIN, 1, pgam_tlv),
2013b2af7f7SPeter Rosin SOC_SINGLE_TLV("Mic Preamp Volume", MAX9860_MICGAIN,
2023b2af7f7SPeter Rosin 	       MAX9860_PAM_SHIFT, MAX9860_PAM_MAX, 0, pam_tlv),
2033b2af7f7SPeter Rosin 
2043b2af7f7SPeter Rosin SOC_ENUM("ADC Filter", avflt_enum),
2053b2af7f7SPeter Rosin SOC_ENUM("DAC Filter", dvflt_enum),
2063b2af7f7SPeter Rosin };
2073b2af7f7SPeter Rosin 
2083b2af7f7SPeter Rosin static const struct snd_soc_dapm_widget max9860_dapm_widgets[] = {
2093b2af7f7SPeter Rosin SND_SOC_DAPM_INPUT("MICL"),
2103b2af7f7SPeter Rosin SND_SOC_DAPM_INPUT("MICR"),
2113b2af7f7SPeter Rosin 
2123b2af7f7SPeter Rosin SND_SOC_DAPM_ADC("ADCL", NULL, MAX9860_PWRMAN, MAX9860_ADCLEN_SHIFT, 0),
2133b2af7f7SPeter Rosin SND_SOC_DAPM_ADC("ADCR", NULL, MAX9860_PWRMAN, MAX9860_ADCREN_SHIFT, 0),
2143b2af7f7SPeter Rosin 
2153b2af7f7SPeter Rosin SND_SOC_DAPM_AIF_OUT("AIFOUTL", "Capture", 0, SND_SOC_NOPM, 0, 0),
2163b2af7f7SPeter Rosin SND_SOC_DAPM_AIF_OUT("AIFOUTR", "Capture", 1, SND_SOC_NOPM, 0, 0),
2173b2af7f7SPeter Rosin 
2183b2af7f7SPeter Rosin SND_SOC_DAPM_AIF_IN("AIFINL", "Playback", 0, SND_SOC_NOPM, 0, 0),
2193b2af7f7SPeter Rosin SND_SOC_DAPM_AIF_IN("AIFINR", "Playback", 1, SND_SOC_NOPM, 0, 0),
2203b2af7f7SPeter Rosin 
2213b2af7f7SPeter Rosin SND_SOC_DAPM_DAC("DAC", NULL, MAX9860_PWRMAN, MAX9860_DACEN_SHIFT, 0),
2223b2af7f7SPeter Rosin 
2233b2af7f7SPeter Rosin SND_SOC_DAPM_OUTPUT("OUT"),
2243b2af7f7SPeter Rosin 
2253b2af7f7SPeter Rosin SND_SOC_DAPM_SUPPLY("Supply", SND_SOC_NOPM, 0, 0,
2263b2af7f7SPeter Rosin 		    NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2273b2af7f7SPeter Rosin SND_SOC_DAPM_REGULATOR_SUPPLY("AVDD", 0, 0),
2283b2af7f7SPeter Rosin SND_SOC_DAPM_REGULATOR_SUPPLY("DVDD", 0, 0),
2293b2af7f7SPeter Rosin SND_SOC_DAPM_CLOCK_SUPPLY("mclk"),
2303b2af7f7SPeter Rosin };
2313b2af7f7SPeter Rosin 
2323b2af7f7SPeter Rosin static const struct snd_soc_dapm_route max9860_dapm_routes[] = {
2333b2af7f7SPeter Rosin 	{ "ADCL", NULL, "MICL" },
2343b2af7f7SPeter Rosin 	{ "ADCR", NULL, "MICR" },
2353b2af7f7SPeter Rosin 	{ "AIFOUTL", NULL, "ADCL" },
2363b2af7f7SPeter Rosin 	{ "AIFOUTR", NULL, "ADCR" },
2373b2af7f7SPeter Rosin 
2383b2af7f7SPeter Rosin 	{ "DAC", NULL, "AIFINL" },
2393b2af7f7SPeter Rosin 	{ "DAC", NULL, "AIFINR" },
2403b2af7f7SPeter Rosin 	{ "OUT", NULL, "DAC" },
2413b2af7f7SPeter Rosin 
2423b2af7f7SPeter Rosin 	{ "Supply", NULL, "AVDD" },
2433b2af7f7SPeter Rosin 	{ "Supply", NULL, "DVDD" },
2443b2af7f7SPeter Rosin 	{ "Supply", NULL, "mclk" },
2453b2af7f7SPeter Rosin 
2463b2af7f7SPeter Rosin 	{ "DAC", NULL, "Supply" },
2473b2af7f7SPeter Rosin 	{ "ADCL", NULL, "Supply" },
2483b2af7f7SPeter Rosin 	{ "ADCR", NULL, "Supply" },
2493b2af7f7SPeter Rosin };
2503b2af7f7SPeter Rosin 
max9860_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)2513b2af7f7SPeter Rosin static int max9860_hw_params(struct snd_pcm_substream *substream,
2523b2af7f7SPeter Rosin 			     struct snd_pcm_hw_params *params,
2533b2af7f7SPeter Rosin 			     struct snd_soc_dai *dai)
2543b2af7f7SPeter Rosin {
255fbf60d97SKuninori Morimoto 	struct snd_soc_component *component = dai->component;
256fbf60d97SKuninori Morimoto 	struct max9860_priv *max9860 = snd_soc_component_get_drvdata(component);
2573b2af7f7SPeter Rosin 	u8 master;
2583b2af7f7SPeter Rosin 	u8 ifc1a = 0;
2593b2af7f7SPeter Rosin 	u8 ifc1b = 0;
2603b2af7f7SPeter Rosin 	u8 sysclk = 0;
2613b2af7f7SPeter Rosin 	unsigned long n;
2623b2af7f7SPeter Rosin 	int ret;
2633b2af7f7SPeter Rosin 
264fbf60d97SKuninori Morimoto 	dev_dbg(component->dev, "hw_params %u Hz, %u channels\n",
2653b2af7f7SPeter Rosin 		params_rate(params),
2663b2af7f7SPeter Rosin 		params_channels(params));
2673b2af7f7SPeter Rosin 
2683b2af7f7SPeter Rosin 	if (params_channels(params) == 2)
2693b2af7f7SPeter Rosin 		ifc1b |= MAX9860_ST;
2703b2af7f7SPeter Rosin 
271d14c87d8SMark Brown 	switch (max9860->fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
272d14c87d8SMark Brown 	case SND_SOC_DAIFMT_CBC_CFC:
2733b2af7f7SPeter Rosin 		master = 0;
2743b2af7f7SPeter Rosin 		break;
275d14c87d8SMark Brown 	case SND_SOC_DAIFMT_CBP_CFP:
2763b2af7f7SPeter Rosin 		master = MAX9860_MASTER;
2773b2af7f7SPeter Rosin 		break;
2783b2af7f7SPeter Rosin 	default:
2793b2af7f7SPeter Rosin 		return -EINVAL;
2803b2af7f7SPeter Rosin 	}
2813b2af7f7SPeter Rosin 	ifc1a |= master;
2823b2af7f7SPeter Rosin 
2833b2af7f7SPeter Rosin 	if (master) {
2843b2af7f7SPeter Rosin 		if (params_width(params) * params_channels(params) > 48)
2853b2af7f7SPeter Rosin 			ifc1b |= MAX9860_BSEL_64X;
2863b2af7f7SPeter Rosin 		else
2873b2af7f7SPeter Rosin 			ifc1b |= MAX9860_BSEL_48X;
2883b2af7f7SPeter Rosin 	}
2893b2af7f7SPeter Rosin 
2903b2af7f7SPeter Rosin 	switch (max9860->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2913b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_I2S:
2923b2af7f7SPeter Rosin 		ifc1a |= MAX9860_DDLY;
2933b2af7f7SPeter Rosin 		ifc1b |= MAX9860_ADLY;
2943b2af7f7SPeter Rosin 		break;
2953b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_LEFT_J:
2963b2af7f7SPeter Rosin 		ifc1a |= MAX9860_WCI;
2973b2af7f7SPeter Rosin 		break;
2983b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_DSP_A:
2993b2af7f7SPeter Rosin 		if (params_width(params) != 16) {
300fbf60d97SKuninori Morimoto 			dev_err(component->dev,
3013b2af7f7SPeter Rosin 				"DSP_A works for 16 bits per sample only.\n");
3023b2af7f7SPeter Rosin 			return -EINVAL;
3033b2af7f7SPeter Rosin 		}
3043b2af7f7SPeter Rosin 		ifc1a |= MAX9860_DDLY | MAX9860_WCI | MAX9860_HIZ | MAX9860_TDM;
3053b2af7f7SPeter Rosin 		ifc1b |= MAX9860_ADLY;
3063b2af7f7SPeter Rosin 		break;
3073b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_DSP_B:
3083b2af7f7SPeter Rosin 		if (params_width(params) != 16) {
309fbf60d97SKuninori Morimoto 			dev_err(component->dev,
3103b2af7f7SPeter Rosin 				"DSP_B works for 16 bits per sample only.\n");
3113b2af7f7SPeter Rosin 			return -EINVAL;
3123b2af7f7SPeter Rosin 		}
3133b2af7f7SPeter Rosin 		ifc1a |= MAX9860_WCI | MAX9860_HIZ | MAX9860_TDM;
3143b2af7f7SPeter Rosin 		break;
3153b2af7f7SPeter Rosin 	default:
3163b2af7f7SPeter Rosin 		return -EINVAL;
3173b2af7f7SPeter Rosin 	}
3183b2af7f7SPeter Rosin 
3193b2af7f7SPeter Rosin 	switch (max9860->fmt & SND_SOC_DAIFMT_INV_MASK) {
3203b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_NB_NF:
3213b2af7f7SPeter Rosin 		break;
3223b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_NB_IF:
3233b2af7f7SPeter Rosin 		switch (max9860->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
3243b2af7f7SPeter Rosin 		case SND_SOC_DAIFMT_DSP_A:
3253b2af7f7SPeter Rosin 		case SND_SOC_DAIFMT_DSP_B:
3263b2af7f7SPeter Rosin 			return -EINVAL;
3273b2af7f7SPeter Rosin 		}
3283b2af7f7SPeter Rosin 		ifc1a ^= MAX9860_WCI;
3293b2af7f7SPeter Rosin 		break;
3303b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_IB_IF:
3313b2af7f7SPeter Rosin 		switch (max9860->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
3323b2af7f7SPeter Rosin 		case SND_SOC_DAIFMT_DSP_A:
3333b2af7f7SPeter Rosin 		case SND_SOC_DAIFMT_DSP_B:
3343b2af7f7SPeter Rosin 			return -EINVAL;
3353b2af7f7SPeter Rosin 		}
3363b2af7f7SPeter Rosin 		ifc1a ^= MAX9860_WCI;
3373e146b55SGustavo A. R. Silva 		fallthrough;
3383b2af7f7SPeter Rosin 	case SND_SOC_DAIFMT_IB_NF:
3393b2af7f7SPeter Rosin 		ifc1a ^= MAX9860_DBCI;
3403b2af7f7SPeter Rosin 		ifc1b ^= MAX9860_ABCI;
3413b2af7f7SPeter Rosin 		break;
3423b2af7f7SPeter Rosin 	default:
3433b2af7f7SPeter Rosin 		return -EINVAL;
3443b2af7f7SPeter Rosin 	}
3453b2af7f7SPeter Rosin 
346fbf60d97SKuninori Morimoto 	dev_dbg(component->dev, "IFC1A  %02x\n", ifc1a);
3473b2af7f7SPeter Rosin 	ret = regmap_write(max9860->regmap, MAX9860_IFC1A, ifc1a);
3483b2af7f7SPeter Rosin 	if (ret) {
349fbf60d97SKuninori Morimoto 		dev_err(component->dev, "Failed to set IFC1A: %d\n", ret);
3503b2af7f7SPeter Rosin 		return ret;
3513b2af7f7SPeter Rosin 	}
352fbf60d97SKuninori Morimoto 	dev_dbg(component->dev, "IFC1B  %02x\n", ifc1b);
3533b2af7f7SPeter Rosin 	ret = regmap_write(max9860->regmap, MAX9860_IFC1B, ifc1b);
3543b2af7f7SPeter Rosin 	if (ret) {
355fbf60d97SKuninori Morimoto 		dev_err(component->dev, "Failed to set IFC1B: %d\n", ret);
3563b2af7f7SPeter Rosin 		return ret;
3573b2af7f7SPeter Rosin 	}
3583b2af7f7SPeter Rosin 
3593b2af7f7SPeter Rosin 	/*
3603b2af7f7SPeter Rosin 	 * Check if Integer Clock Mode is possible, but avoid it in slave mode
3613b2af7f7SPeter Rosin 	 * since we then do not know if lrclk is derived from pclk and the
3623b2af7f7SPeter Rosin 	 * datasheet mentions that the frequencies have to match exactly in
3633b2af7f7SPeter Rosin 	 * order for this to work.
3643b2af7f7SPeter Rosin 	 */
3653b2af7f7SPeter Rosin 	if (params_rate(params) == 8000 || params_rate(params) == 16000) {
3663b2af7f7SPeter Rosin 		if (master) {
3673b2af7f7SPeter Rosin 			switch (max9860->pclk_rate) {
3683b2af7f7SPeter Rosin 			case 12000000:
3693b2af7f7SPeter Rosin 				sysclk = MAX9860_FREQ_12MHZ;
3703b2af7f7SPeter Rosin 				break;
3713b2af7f7SPeter Rosin 			case 13000000:
3723b2af7f7SPeter Rosin 				sysclk = MAX9860_FREQ_13MHZ;
3733b2af7f7SPeter Rosin 				break;
3743b2af7f7SPeter Rosin 			case 19200000:
3753b2af7f7SPeter Rosin 				sysclk = MAX9860_FREQ_19_2MHZ;
3763b2af7f7SPeter Rosin 				break;
3773b2af7f7SPeter Rosin 			default:
3783b2af7f7SPeter Rosin 				/*
3793b2af7f7SPeter Rosin 				 * Integer Clock Mode not possible. Leave
3803b2af7f7SPeter Rosin 				 * sysclk at zero and fall through to the
3813b2af7f7SPeter Rosin 				 * code below for PLL mode.
3823b2af7f7SPeter Rosin 				 */
3833b2af7f7SPeter Rosin 				break;
3843b2af7f7SPeter Rosin 			}
3853b2af7f7SPeter Rosin 
3863b2af7f7SPeter Rosin 			if (sysclk && params_rate(params) == 16000)
3873b2af7f7SPeter Rosin 				sysclk |= MAX9860_16KHZ;
3883b2af7f7SPeter Rosin 		}
3893b2af7f7SPeter Rosin 	}
3903b2af7f7SPeter Rosin 
3913b2af7f7SPeter Rosin 	/*
3923b2af7f7SPeter Rosin 	 * Largest possible n:
3933b2af7f7SPeter Rosin 	 *    65536 * 96 * 48kHz / 10MHz -> 30199
3943b2af7f7SPeter Rosin 	 * Smallest possible n:
3953b2af7f7SPeter Rosin 	 *    65536 * 96 *  8kHz / 20MHz -> 2517
3963b2af7f7SPeter Rosin 	 * Both fit nicely in the available 15 bits, no need to apply any mask.
3973b2af7f7SPeter Rosin 	 */
3983b2af7f7SPeter Rosin 	n = DIV_ROUND_CLOSEST_ULL(65536ULL * 96 * params_rate(params),
3993b2af7f7SPeter Rosin 				  max9860->pclk_rate);
4003b2af7f7SPeter Rosin 
4013b2af7f7SPeter Rosin 	if (!sysclk) {
4023b2af7f7SPeter Rosin 		/* PLL mode */
4033b2af7f7SPeter Rosin 		if (params_rate(params) > 24000)
4043b2af7f7SPeter Rosin 			sysclk |= MAX9860_16KHZ;
4053b2af7f7SPeter Rosin 
4063b2af7f7SPeter Rosin 		if (!master)
4073b2af7f7SPeter Rosin 			n |= 1; /* trigger rapid pll lock mode */
4083b2af7f7SPeter Rosin 	}
4093b2af7f7SPeter Rosin 
4103b2af7f7SPeter Rosin 	sysclk |= max9860->psclk;
411fbf60d97SKuninori Morimoto 	dev_dbg(component->dev, "SYSCLK %02x\n", sysclk);
4123b2af7f7SPeter Rosin 	ret = regmap_write(max9860->regmap,
4133b2af7f7SPeter Rosin 			   MAX9860_SYSCLK, sysclk);
4143b2af7f7SPeter Rosin 	if (ret) {
415fbf60d97SKuninori Morimoto 		dev_err(component->dev, "Failed to set SYSCLK: %d\n", ret);
4163b2af7f7SPeter Rosin 		return ret;
4173b2af7f7SPeter Rosin 	}
418fbf60d97SKuninori Morimoto 	dev_dbg(component->dev, "N %lu\n", n);
4193b2af7f7SPeter Rosin 	ret = regmap_write(max9860->regmap,
4203b2af7f7SPeter Rosin 			   MAX9860_AUDIOCLKHIGH, n >> 8);
4213b2af7f7SPeter Rosin 	if (ret) {
422fbf60d97SKuninori Morimoto 		dev_err(component->dev, "Failed to set NHI: %d\n", ret);
4233b2af7f7SPeter Rosin 		return ret;
4243b2af7f7SPeter Rosin 	}
4253b2af7f7SPeter Rosin 	ret = regmap_write(max9860->regmap,
4263b2af7f7SPeter Rosin 			   MAX9860_AUDIOCLKLOW, n & 0xff);
4273b2af7f7SPeter Rosin 	if (ret) {
428fbf60d97SKuninori Morimoto 		dev_err(component->dev, "Failed to set NLO: %d\n", ret);
4293b2af7f7SPeter Rosin 		return ret;
4303b2af7f7SPeter Rosin 	}
4313b2af7f7SPeter Rosin 
4323b2af7f7SPeter Rosin 	if (!master) {
433fbf60d97SKuninori Morimoto 		dev_dbg(component->dev, "Enable PLL\n");
4343b2af7f7SPeter Rosin 		ret = regmap_update_bits(max9860->regmap, MAX9860_AUDIOCLKHIGH,
4353b2af7f7SPeter Rosin 					 MAX9860_PLL, MAX9860_PLL);
4363b2af7f7SPeter Rosin 		if (ret) {
437d0ca5a47SPeter Rosin 			dev_err(component->dev, "Failed to enable PLL: %d\n",
438d0ca5a47SPeter Rosin 				ret);
4393b2af7f7SPeter Rosin 			return ret;
4403b2af7f7SPeter Rosin 		}
4413b2af7f7SPeter Rosin 	}
4423b2af7f7SPeter Rosin 
4433b2af7f7SPeter Rosin 	return 0;
4443b2af7f7SPeter Rosin }
4453b2af7f7SPeter Rosin 
max9860_set_fmt(struct snd_soc_dai * dai,unsigned int fmt)4463b2af7f7SPeter Rosin static int max9860_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
4473b2af7f7SPeter Rosin {
448fbf60d97SKuninori Morimoto 	struct snd_soc_component *component = dai->component;
449fbf60d97SKuninori Morimoto 	struct max9860_priv *max9860 = snd_soc_component_get_drvdata(component);
4503b2af7f7SPeter Rosin 
4518366d8caSMark Brown 	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
4528366d8caSMark Brown 	case SND_SOC_DAIFMT_CBP_CFP:
4538366d8caSMark Brown 	case SND_SOC_DAIFMT_CBC_CFC:
4543b2af7f7SPeter Rosin 		max9860->fmt = fmt;
4553b2af7f7SPeter Rosin 		return 0;
4563b2af7f7SPeter Rosin 
4573b2af7f7SPeter Rosin 	default:
4583b2af7f7SPeter Rosin 		return -EINVAL;
4593b2af7f7SPeter Rosin 	}
4603b2af7f7SPeter Rosin }
4613b2af7f7SPeter Rosin 
4623b2af7f7SPeter Rosin static const struct snd_soc_dai_ops max9860_dai_ops = {
4633b2af7f7SPeter Rosin 	.hw_params = max9860_hw_params,
4643b2af7f7SPeter Rosin 	.set_fmt = max9860_set_fmt,
4653b2af7f7SPeter Rosin };
4663b2af7f7SPeter Rosin 
4673b2af7f7SPeter Rosin static struct snd_soc_dai_driver max9860_dai = {
4683b2af7f7SPeter Rosin 	.name = "max9860-hifi",
4693b2af7f7SPeter Rosin 	.playback = {
4703b2af7f7SPeter Rosin 		.stream_name = "Playback",
4713b2af7f7SPeter Rosin 		.channels_min = 1,
4723b2af7f7SPeter Rosin 		.channels_max = 2,
4733b2af7f7SPeter Rosin 		.rates = SNDRV_PCM_RATE_CONTINUOUS,
4743b2af7f7SPeter Rosin 		.rate_min = 8000,
4753b2af7f7SPeter Rosin 		.rate_max = 48000,
4763b2af7f7SPeter Rosin 		.formats = SNDRV_PCM_FMTBIT_S16_LE |
4773b2af7f7SPeter Rosin 			   SNDRV_PCM_FMTBIT_S24_LE |
4783b2af7f7SPeter Rosin 			   SNDRV_PCM_FMTBIT_S32_LE,
4793b2af7f7SPeter Rosin 	},
4803b2af7f7SPeter Rosin 	.capture = {
4813b2af7f7SPeter Rosin 		.stream_name = "Capture",
4823b2af7f7SPeter Rosin 		.channels_min = 1,
4833b2af7f7SPeter Rosin 		.channels_max = 2,
4843b2af7f7SPeter Rosin 		.rates = SNDRV_PCM_RATE_CONTINUOUS,
4853b2af7f7SPeter Rosin 		.rate_min = 8000,
4863b2af7f7SPeter Rosin 		.rate_max = 48000,
4873b2af7f7SPeter Rosin 		.formats = SNDRV_PCM_FMTBIT_S16_LE |
4883b2af7f7SPeter Rosin 			   SNDRV_PCM_FMTBIT_S24_LE |
4893b2af7f7SPeter Rosin 			   SNDRV_PCM_FMTBIT_S32_LE,
4903b2af7f7SPeter Rosin 	},
4913b2af7f7SPeter Rosin 	.ops = &max9860_dai_ops,
492cb40d1b4SKuninori Morimoto 	.symmetric_rate = 1,
4933b2af7f7SPeter Rosin };
4943b2af7f7SPeter Rosin 
max9860_set_bias_level(struct snd_soc_component * component,enum snd_soc_bias_level level)495fbf60d97SKuninori Morimoto static int max9860_set_bias_level(struct snd_soc_component *component,
4963b2af7f7SPeter Rosin 				  enum snd_soc_bias_level level)
4973b2af7f7SPeter Rosin {
498fbf60d97SKuninori Morimoto 	struct max9860_priv *max9860 = dev_get_drvdata(component->dev);
4993b2af7f7SPeter Rosin 	int ret;
5003b2af7f7SPeter Rosin 
5013b2af7f7SPeter Rosin 	switch (level) {
5023b2af7f7SPeter Rosin 	case SND_SOC_BIAS_ON:
5033b2af7f7SPeter Rosin 	case SND_SOC_BIAS_PREPARE:
5043b2af7f7SPeter Rosin 		break;
5053b2af7f7SPeter Rosin 
5063b2af7f7SPeter Rosin 	case SND_SOC_BIAS_STANDBY:
5073b2af7f7SPeter Rosin 		ret = regmap_update_bits(max9860->regmap, MAX9860_PWRMAN,
5083b2af7f7SPeter Rosin 					 MAX9860_SHDN, MAX9860_SHDN);
5093b2af7f7SPeter Rosin 		if (ret) {
510d0ca5a47SPeter Rosin 			dev_err(component->dev, "Failed to remove SHDN: %d\n",
511d0ca5a47SPeter Rosin 				ret);
5123b2af7f7SPeter Rosin 			return ret;
5133b2af7f7SPeter Rosin 		}
5143b2af7f7SPeter Rosin 		break;
5153b2af7f7SPeter Rosin 
5163b2af7f7SPeter Rosin 	case SND_SOC_BIAS_OFF:
5173b2af7f7SPeter Rosin 		ret = regmap_update_bits(max9860->regmap, MAX9860_PWRMAN,
5183b2af7f7SPeter Rosin 					 MAX9860_SHDN, 0);
5193b2af7f7SPeter Rosin 		if (ret) {
520fbf60d97SKuninori Morimoto 			dev_err(component->dev, "Failed to request SHDN: %d\n",
5213b2af7f7SPeter Rosin 				ret);
5223b2af7f7SPeter Rosin 			return ret;
5233b2af7f7SPeter Rosin 		}
5243b2af7f7SPeter Rosin 		break;
5253b2af7f7SPeter Rosin 	}
5263b2af7f7SPeter Rosin 
5273b2af7f7SPeter Rosin 	return 0;
5283b2af7f7SPeter Rosin }
5293b2af7f7SPeter Rosin 
530fbf60d97SKuninori Morimoto static const struct snd_soc_component_driver max9860_component_driver = {
5313b2af7f7SPeter Rosin 	.set_bias_level		= max9860_set_bias_level,
5323b2af7f7SPeter Rosin 	.controls		= max9860_controls,
5333b2af7f7SPeter Rosin 	.num_controls		= ARRAY_SIZE(max9860_controls),
5343b2af7f7SPeter Rosin 	.dapm_widgets		= max9860_dapm_widgets,
5353b2af7f7SPeter Rosin 	.num_dapm_widgets	= ARRAY_SIZE(max9860_dapm_widgets),
5363b2af7f7SPeter Rosin 	.dapm_routes		= max9860_dapm_routes,
5373b2af7f7SPeter Rosin 	.num_dapm_routes	= ARRAY_SIZE(max9860_dapm_routes),
538fbf60d97SKuninori Morimoto 	.use_pmdown_time	= 1,
539fbf60d97SKuninori Morimoto 	.endianness		= 1,
5403b2af7f7SPeter Rosin };
5413b2af7f7SPeter Rosin 
5423b2af7f7SPeter Rosin #ifdef CONFIG_PM
max9860_suspend(struct device * dev)5433b2af7f7SPeter Rosin static int max9860_suspend(struct device *dev)
5443b2af7f7SPeter Rosin {
5453b2af7f7SPeter Rosin 	struct max9860_priv *max9860 = dev_get_drvdata(dev);
5463b2af7f7SPeter Rosin 	int ret;
5473b2af7f7SPeter Rosin 
5483b2af7f7SPeter Rosin 	ret = regmap_update_bits(max9860->regmap, MAX9860_SYSCLK,
5493b2af7f7SPeter Rosin 				 MAX9860_PSCLK, MAX9860_PSCLK_OFF);
5503b2af7f7SPeter Rosin 	if (ret) {
5513b2af7f7SPeter Rosin 		dev_err(dev, "Failed to disable clock: %d\n", ret);
5523b2af7f7SPeter Rosin 		return ret;
5533b2af7f7SPeter Rosin 	}
5543b2af7f7SPeter Rosin 
5553b2af7f7SPeter Rosin 	regulator_disable(max9860->dvddio);
5563b2af7f7SPeter Rosin 
5573b2af7f7SPeter Rosin 	return 0;
5583b2af7f7SPeter Rosin }
5593b2af7f7SPeter Rosin 
max9860_resume(struct device * dev)5603b2af7f7SPeter Rosin static int max9860_resume(struct device *dev)
5613b2af7f7SPeter Rosin {
5623b2af7f7SPeter Rosin 	struct max9860_priv *max9860 = dev_get_drvdata(dev);
5633b2af7f7SPeter Rosin 	int ret;
5643b2af7f7SPeter Rosin 
5653b2af7f7SPeter Rosin 	ret = regulator_enable(max9860->dvddio);
5663b2af7f7SPeter Rosin 	if (ret) {
5673b2af7f7SPeter Rosin 		dev_err(dev, "Failed to enable DVDDIO: %d\n", ret);
5683b2af7f7SPeter Rosin 		return ret;
5693b2af7f7SPeter Rosin 	}
5703b2af7f7SPeter Rosin 
5713b2af7f7SPeter Rosin 	regcache_cache_only(max9860->regmap, false);
5723b2af7f7SPeter Rosin 	ret = regcache_sync(max9860->regmap);
5733b2af7f7SPeter Rosin 	if (ret) {
5743b2af7f7SPeter Rosin 		dev_err(dev, "Failed to sync cache: %d\n", ret);
5753b2af7f7SPeter Rosin 		return ret;
5763b2af7f7SPeter Rosin 	}
5773b2af7f7SPeter Rosin 
5783b2af7f7SPeter Rosin 	ret = regmap_update_bits(max9860->regmap, MAX9860_SYSCLK,
5793b2af7f7SPeter Rosin 				 MAX9860_PSCLK, max9860->psclk);
5803b2af7f7SPeter Rosin 	if (ret) {
5813b2af7f7SPeter Rosin 		dev_err(dev, "Failed to enable clock: %d\n", ret);
5823b2af7f7SPeter Rosin 		return ret;
5833b2af7f7SPeter Rosin 	}
5843b2af7f7SPeter Rosin 
5853b2af7f7SPeter Rosin 	return 0;
5863b2af7f7SPeter Rosin }
5873b2af7f7SPeter Rosin #endif
5883b2af7f7SPeter Rosin 
589716540fdSWei Yongjun static const struct dev_pm_ops max9860_pm_ops = {
5903b2af7f7SPeter Rosin 	SET_RUNTIME_PM_OPS(max9860_suspend, max9860_resume, NULL)
5913b2af7f7SPeter Rosin };
5923b2af7f7SPeter Rosin 
max9860_probe(struct i2c_client * i2c)5930ae91ec4SPeter Rosin static int max9860_probe(struct i2c_client *i2c)
5943b2af7f7SPeter Rosin {
5953b2af7f7SPeter Rosin 	struct device *dev = &i2c->dev;
5963b2af7f7SPeter Rosin 	struct max9860_priv *max9860;
5973b2af7f7SPeter Rosin 	int ret;
5983b2af7f7SPeter Rosin 	struct clk *mclk;
5993b2af7f7SPeter Rosin 	unsigned long mclk_rate;
6003b2af7f7SPeter Rosin 	int i;
6013b2af7f7SPeter Rosin 	int intr;
6023b2af7f7SPeter Rosin 
6033b2af7f7SPeter Rosin 	max9860 = devm_kzalloc(dev, sizeof(struct max9860_priv), GFP_KERNEL);
6043b2af7f7SPeter Rosin 	if (!max9860)
6053b2af7f7SPeter Rosin 		return -ENOMEM;
6063b2af7f7SPeter Rosin 
6073b2af7f7SPeter Rosin 	max9860->dvddio = devm_regulator_get(dev, "DVDDIO");
608edfe9f45SKuninori Morimoto 	if (IS_ERR(max9860->dvddio))
609edfe9f45SKuninori Morimoto 		return dev_err_probe(dev, PTR_ERR(max9860->dvddio),
610edfe9f45SKuninori Morimoto 				     "Failed to get DVDDIO supply\n");
6113b2af7f7SPeter Rosin 
6123b2af7f7SPeter Rosin 	max9860->dvddio_nb.notifier_call = max9860_dvddio_event;
6133b2af7f7SPeter Rosin 
6140bb423f2SGuennadi Liakhovetski 	ret = devm_regulator_register_notifier(max9860->dvddio,
6150bb423f2SGuennadi Liakhovetski 					       &max9860->dvddio_nb);
6163b2af7f7SPeter Rosin 	if (ret)
6173b2af7f7SPeter Rosin 		dev_err(dev, "Failed to register DVDDIO notifier: %d\n", ret);
6183b2af7f7SPeter Rosin 
6193b2af7f7SPeter Rosin 	ret = regulator_enable(max9860->dvddio);
6203b2af7f7SPeter Rosin 	if (ret != 0) {
6213b2af7f7SPeter Rosin 		dev_err(dev, "Failed to enable DVDDIO: %d\n", ret);
6223b2af7f7SPeter Rosin 		return ret;
6233b2af7f7SPeter Rosin 	}
6243b2af7f7SPeter Rosin 
6253b2af7f7SPeter Rosin 	max9860->regmap = devm_regmap_init_i2c(i2c, &max9860_regmap);
6263b2af7f7SPeter Rosin 	if (IS_ERR(max9860->regmap)) {
6273b2af7f7SPeter Rosin 		ret = PTR_ERR(max9860->regmap);
6283b2af7f7SPeter Rosin 		goto err_regulator;
6293b2af7f7SPeter Rosin 	}
6303b2af7f7SPeter Rosin 
6313b2af7f7SPeter Rosin 	dev_set_drvdata(dev, max9860);
6323b2af7f7SPeter Rosin 
6333b2af7f7SPeter Rosin 	/*
6343b2af7f7SPeter Rosin 	 * mclk has to be in the 10MHz to 60MHz range.
6353b2af7f7SPeter Rosin 	 * psclk is used to scale mclk into pclk so that
6363b2af7f7SPeter Rosin 	 * pclk is in the 10MHz to 20MHz range.
6373b2af7f7SPeter Rosin 	 */
6383b2af7f7SPeter Rosin 	mclk = clk_get(dev, "mclk");
6393b2af7f7SPeter Rosin 
6403b2af7f7SPeter Rosin 	if (IS_ERR(mclk)) {
6413b2af7f7SPeter Rosin 		ret = PTR_ERR(mclk);
642edfe9f45SKuninori Morimoto 		dev_err_probe(dev, ret, "Failed to get MCLK\n");
6433b2af7f7SPeter Rosin 		goto err_regulator;
6443b2af7f7SPeter Rosin 	}
6453b2af7f7SPeter Rosin 
6463b2af7f7SPeter Rosin 	mclk_rate = clk_get_rate(mclk);
6473b2af7f7SPeter Rosin 	clk_put(mclk);
6483b2af7f7SPeter Rosin 
6493b2af7f7SPeter Rosin 	if (mclk_rate > 60000000 || mclk_rate < 10000000) {
6503b2af7f7SPeter Rosin 		dev_err(dev, "Bad mclk %luHz (needs 10MHz - 60MHz)\n",
6513b2af7f7SPeter Rosin 			mclk_rate);
6523b2af7f7SPeter Rosin 		ret = -EINVAL;
6533b2af7f7SPeter Rosin 		goto err_regulator;
6543b2af7f7SPeter Rosin 	}
6553b2af7f7SPeter Rosin 	if (mclk_rate >= 40000000)
6563b2af7f7SPeter Rosin 		max9860->psclk = 3;
6573b2af7f7SPeter Rosin 	else if (mclk_rate >= 20000000)
6583b2af7f7SPeter Rosin 		max9860->psclk = 2;
6593b2af7f7SPeter Rosin 	else
6603b2af7f7SPeter Rosin 		max9860->psclk = 1;
6613b2af7f7SPeter Rosin 	max9860->pclk_rate = mclk_rate >> (max9860->psclk - 1);
6623b2af7f7SPeter Rosin 	max9860->psclk <<= MAX9860_PSCLK_SHIFT;
6633b2af7f7SPeter Rosin 	dev_dbg(dev, "mclk %lu pclk %lu\n", mclk_rate, max9860->pclk_rate);
6643b2af7f7SPeter Rosin 
6653b2af7f7SPeter Rosin 	regcache_cache_bypass(max9860->regmap, true);
6663b2af7f7SPeter Rosin 	for (i = 0; i < max9860_regmap.num_reg_defaults; ++i) {
6673b2af7f7SPeter Rosin 		ret = regmap_write(max9860->regmap,
6683b2af7f7SPeter Rosin 				   max9860_regmap.reg_defaults[i].reg,
6693b2af7f7SPeter Rosin 				   max9860_regmap.reg_defaults[i].def);
6703b2af7f7SPeter Rosin 		if (ret) {
6713b2af7f7SPeter Rosin 			dev_err(dev, "Failed to initialize register %u: %d\n",
6723b2af7f7SPeter Rosin 				max9860_regmap.reg_defaults[i].reg, ret);
6733b2af7f7SPeter Rosin 			goto err_regulator;
6743b2af7f7SPeter Rosin 		}
6753b2af7f7SPeter Rosin 	}
6763b2af7f7SPeter Rosin 	regcache_cache_bypass(max9860->regmap, false);
6773b2af7f7SPeter Rosin 
6783b2af7f7SPeter Rosin 	ret = regmap_read(max9860->regmap, MAX9860_INTRSTATUS, &intr);
6793b2af7f7SPeter Rosin 	if (ret) {
6803b2af7f7SPeter Rosin 		dev_err(dev, "Failed to clear INTRSTATUS: %d\n", ret);
6813b2af7f7SPeter Rosin 		goto err_regulator;
6823b2af7f7SPeter Rosin 	}
6833b2af7f7SPeter Rosin 
6843b2af7f7SPeter Rosin 	pm_runtime_set_active(dev);
6853b2af7f7SPeter Rosin 	pm_runtime_enable(dev);
6863b2af7f7SPeter Rosin 	pm_runtime_idle(dev);
6873b2af7f7SPeter Rosin 
688fbf60d97SKuninori Morimoto 	ret = devm_snd_soc_register_component(dev, &max9860_component_driver,
6893b2af7f7SPeter Rosin 					      &max9860_dai, 1);
6903b2af7f7SPeter Rosin 	if (ret) {
6913b2af7f7SPeter Rosin 		dev_err(dev, "Failed to register CODEC: %d\n", ret);
6923b2af7f7SPeter Rosin 		goto err_pm;
6933b2af7f7SPeter Rosin 	}
6943b2af7f7SPeter Rosin 
6953b2af7f7SPeter Rosin 	return 0;
6963b2af7f7SPeter Rosin 
6973b2af7f7SPeter Rosin err_pm:
6983b2af7f7SPeter Rosin 	pm_runtime_disable(dev);
6993b2af7f7SPeter Rosin err_regulator:
7003b2af7f7SPeter Rosin 	regulator_disable(max9860->dvddio);
7013b2af7f7SPeter Rosin 	return ret;
7023b2af7f7SPeter Rosin }
7033b2af7f7SPeter Rosin 
max9860_remove(struct i2c_client * i2c)704ed5c2f5fSUwe Kleine-König static void max9860_remove(struct i2c_client *i2c)
7053b2af7f7SPeter Rosin {
7063b2af7f7SPeter Rosin 	struct device *dev = &i2c->dev;
7073b2af7f7SPeter Rosin 	struct max9860_priv *max9860 = dev_get_drvdata(dev);
7083b2af7f7SPeter Rosin 
7093b2af7f7SPeter Rosin 	pm_runtime_disable(dev);
7103b2af7f7SPeter Rosin 	regulator_disable(max9860->dvddio);
7113b2af7f7SPeter Rosin }
7123b2af7f7SPeter Rosin 
7133b2af7f7SPeter Rosin static const struct i2c_device_id max9860_i2c_id[] = {
7143b2af7f7SPeter Rosin 	{ "max9860", },
7153b2af7f7SPeter Rosin 	{ }
7163b2af7f7SPeter Rosin };
7173b2af7f7SPeter Rosin MODULE_DEVICE_TABLE(i2c, max9860_i2c_id);
7183b2af7f7SPeter Rosin 
7193b2af7f7SPeter Rosin static const struct of_device_id max9860_of_match[] = {
7203b2af7f7SPeter Rosin 	{ .compatible = "maxim,max9860", },
7213b2af7f7SPeter Rosin 	{ }
7223b2af7f7SPeter Rosin };
7233b2af7f7SPeter Rosin MODULE_DEVICE_TABLE(of, max9860_of_match);
7243b2af7f7SPeter Rosin 
7253b2af7f7SPeter Rosin static struct i2c_driver max9860_i2c_driver = {
726*9abcd240SUwe Kleine-König 	.probe          = max9860_probe,
7273b2af7f7SPeter Rosin 	.remove         = max9860_remove,
7283b2af7f7SPeter Rosin 	.id_table       = max9860_i2c_id,
7293b2af7f7SPeter Rosin 	.driver         = {
7303b2af7f7SPeter Rosin 		.name           = "max9860",
7313b2af7f7SPeter Rosin 		.of_match_table = max9860_of_match,
7323b2af7f7SPeter Rosin 		.pm             = &max9860_pm_ops,
7333b2af7f7SPeter Rosin 	},
7343b2af7f7SPeter Rosin };
7353b2af7f7SPeter Rosin 
7363b2af7f7SPeter Rosin module_i2c_driver(max9860_i2c_driver);
7373b2af7f7SPeter Rosin 
7383b2af7f7SPeter Rosin MODULE_DESCRIPTION("ASoC MAX9860 Mono Audio Voice Codec driver");
7393b2af7f7SPeter Rosin MODULE_AUTHOR("Peter Rosin <peda@axentia.se>");
7403b2af7f7SPeter Rosin MODULE_LICENSE("GPL v2");
741