diff options
| author | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
|---|---|---|
| committer | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
| commit | c74a7469f97c0f40b46e82ee979f9fb1bb6e847c (patch) | |
| tree | f2690a1a916b73ef94657fbf0e0141ae57701825 /sound/soc/codecs/tscs42xx.c | |
| parent | 6f15a7de86c8cf2dc09fc9e6d07047efa40ef809 (diff) | |
| parent | 500775074f88d9cf5416bed2ca19592812d62c41 (diff) | |
Merge drm/drm-next into drm-intel-next-queued
We need a backmerge to get DP_DPCD_REV_14 before we push other
i915 changes to dinq that could break compilation.
Signed-off-by: Rodrigo Vivi <[email protected]>
Diffstat (limited to 'sound/soc/codecs/tscs42xx.c')
| -rw-r--r-- | sound/soc/codecs/tscs42xx.c | 203 | 
1 files changed, 127 insertions, 76 deletions
| diff --git a/sound/soc/codecs/tscs42xx.c b/sound/soc/codecs/tscs42xx.c index bbfc73a79b18..d18ff17719cc 100644 --- a/sound/soc/codecs/tscs42xx.c +++ b/sound/soc/codecs/tscs42xx.c @@ -12,6 +12,7 @@  #include <linux/module.h>  #include <linux/delay.h>  #include <linux/mutex.h> +#include <linux/clk.h>  #include <sound/tlv.h>  #include <sound/pcm_params.h>  #include <sound/soc.h> @@ -31,7 +32,6 @@ struct tscs42xx {  	int bclk_ratio;  	int samplerate; -	unsigned int blrcm;  	struct mutex audio_params_lock;  	u8 coeff_ram[COEFF_RAM_SIZE]; @@ -42,7 +42,8 @@ struct tscs42xx {  	struct regmap *regmap; -	struct device *dev; +	struct clk *sysclk; +	int sysclk_src_id;  };  struct coeff_ram_ctl { @@ -204,7 +205,8 @@ static int power_up_audio_plls(struct snd_soc_component *component)  		break;  	default:  		ret = -EINVAL; -		dev_err(component->dev, "Unrecognized PLL output freq (%d)\n", ret); +		dev_err(component->dev, +				"Unrecognized PLL output freq (%d)\n", ret);  		return ret;  	} @@ -261,7 +263,8 @@ exit:  static int coeff_ram_get(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); +	struct snd_soc_component *component = +		snd_soc_kcontrol_component(kcontrol);  	struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);  	struct coeff_ram_ctl *ctl =  		(struct coeff_ram_ctl *)kcontrol->private_value; @@ -280,7 +283,8 @@ static int coeff_ram_get(struct snd_kcontrol *kcontrol,  static int coeff_ram_put(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); +	struct snd_soc_component *component = +		snd_soc_kcontrol_component(kcontrol);  	struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);  	struct coeff_ram_ctl *ctl =  		(struct coeff_ram_ctl *)kcontrol->private_value; @@ -363,7 +367,8 @@ static int dapm_micb_event(struct snd_soc_dapm_widget *w,  static int pll_event(struct snd_soc_dapm_widget *w,  		     struct snd_kcontrol *kcontrol, int event)  { -	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); +	struct snd_soc_component *component = +		snd_soc_dapm_to_component(w->dapm);  	int ret;  	if (SND_SOC_DAPM_EVENT_ON(event)) @@ -377,7 +382,8 @@ static int pll_event(struct snd_soc_dapm_widget *w,  static int dac_event(struct snd_soc_dapm_widget *w,  		     struct snd_kcontrol *kcontrol, int event)  { -	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); +	struct snd_soc_component *component = +		snd_soc_dapm_to_component(w->dapm);  	struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);  	int ret; @@ -819,16 +825,19 @@ static int setup_sample_format(struct snd_soc_component *component,  		dev_err(component->dev, "Unsupported format width (%d)\n", ret);  		return ret;  	} -	ret = snd_soc_component_update_bits(component, R_AIC1, RM_AIC1_WL, width); +	ret = snd_soc_component_update_bits(component, +			R_AIC1, RM_AIC1_WL, width);  	if (ret < 0) { -		dev_err(component->dev, "Failed to set sample width (%d)\n", ret); +		dev_err(component->dev, +				"Failed to set sample width (%d)\n", ret);  		return ret;  	}  	return 0;  } -static int setup_sample_rate(struct snd_soc_component *component, unsigned int rate) +static int setup_sample_rate(struct snd_soc_component *component, +		unsigned int rate)  {  	struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);  	unsigned int br, bm; @@ -881,24 +890,32 @@ static int setup_sample_rate(struct snd_soc_component *component, unsigned int r  	}  	/* DAC and ADC share bit and frame clock */ -	ret = snd_soc_component_update_bits(component, R_DACSR, RM_DACSR_DBR, br); +	ret = snd_soc_component_update_bits(component, +			R_DACSR, RM_DACSR_DBR, br);  	if (ret < 0) { -		dev_err(component->dev, "Failed to update register (%d)\n", ret); +		dev_err(component->dev, +				"Failed to update register (%d)\n", ret);  		return ret;  	} -	ret = snd_soc_component_update_bits(component, R_DACSR, RM_DACSR_DBM, bm); +	ret = snd_soc_component_update_bits(component, +			R_DACSR, RM_DACSR_DBM, bm);  	if (ret < 0) { -		dev_err(component->dev, "Failed to update register (%d)\n", ret); +		dev_err(component->dev, +				"Failed to update register (%d)\n", ret);  		return ret;  	} -	ret = snd_soc_component_update_bits(component, R_ADCSR, RM_DACSR_DBR, br); +	ret = snd_soc_component_update_bits(component, +			R_ADCSR, RM_DACSR_DBR, br);  	if (ret < 0) { -		dev_err(component->dev, "Failed to update register (%d)\n", ret); +		dev_err(component->dev, +				"Failed to update register (%d)\n", ret);  		return ret;  	} -	ret = snd_soc_component_update_bits(component, R_ADCSR, RM_DACSR_DBM, bm); +	ret = snd_soc_component_update_bits(component, +			R_ADCSR, RM_DACSR_DBM, bm);  	if (ret < 0) { -		dev_err(component->dev, "Failed to update register (%d)\n", ret); +		dev_err(component->dev, +				"Failed to update register (%d)\n", ret);  		return ret;  	} @@ -1076,7 +1093,8 @@ static int tscs42xx_hw_params(struct snd_pcm_substream *substream,  	ret = setup_sample_rate(component, params_rate(params));  	if (ret < 0) { -		dev_err(component->dev, "Failed to setup sample rate (%d)\n", ret); +		dev_err(component->dev, +				"Failed to setup sample rate (%d)\n", ret);  		return ret;  	} @@ -1087,7 +1105,8 @@ static inline int dac_mute(struct snd_soc_component *component)  {  	int ret; -	ret = snd_soc_component_update_bits(component, R_CNVRTR1, RM_CNVRTR1_DACMU, +	ret = snd_soc_component_update_bits(component, +			R_CNVRTR1, RM_CNVRTR1_DACMU,  		RV_CNVRTR1_DACMU_ENABLE);  	if (ret < 0) {  		dev_err(component->dev, "Failed to mute DAC (%d)\n", @@ -1102,7 +1121,8 @@ static inline int dac_unmute(struct snd_soc_component *component)  {  	int ret; -	ret = snd_soc_component_update_bits(component, R_CNVRTR1, RM_CNVRTR1_DACMU, +	ret = snd_soc_component_update_bits(component, +			R_CNVRTR1, RM_CNVRTR1_DACMU,  		RV_CNVRTR1_DACMU_DISABLE);  	if (ret < 0) {  		dev_err(component->dev, "Failed to unmute DAC (%d)\n", @@ -1117,8 +1137,8 @@ static inline int adc_mute(struct snd_soc_component *component)  {  	int ret; -	ret = snd_soc_component_update_bits(component, R_CNVRTR0, RM_CNVRTR0_ADCMU, -		RV_CNVRTR0_ADCMU_ENABLE); +	ret = snd_soc_component_update_bits(component, +			R_CNVRTR0, RM_CNVRTR0_ADCMU, RV_CNVRTR0_ADCMU_ENABLE);  	if (ret < 0) {  		dev_err(component->dev, "Failed to mute ADC (%d)\n",  				ret); @@ -1132,8 +1152,8 @@ static inline int adc_unmute(struct snd_soc_component *component)  {  	int ret; -	ret = snd_soc_component_update_bits(component, R_CNVRTR0, RM_CNVRTR0_ADCMU, -		RV_CNVRTR0_ADCMU_DISABLE); +	ret = snd_soc_component_update_bits(component, +			R_CNVRTR0, RM_CNVRTR0_ADCMU, RV_CNVRTR0_ADCMU_DISABLE);  	if (ret < 0) {  		dev_err(component->dev, "Failed to unmute ADC (%d)\n",  				ret); @@ -1171,8 +1191,8 @@ static int tscs42xx_set_dai_fmt(struct snd_soc_dai *codec_dai,  	/* Slave mode not supported since it needs always-on frame clock */  	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {  	case SND_SOC_DAIFMT_CBM_CFM: -		ret = snd_soc_component_update_bits(component, R_AIC1, RM_AIC1_MS, -				RV_AIC1_MS_MASTER); +		ret = snd_soc_component_update_bits(component, +				R_AIC1, RM_AIC1_MS, RV_AIC1_MS_MASTER);  		if (ret < 0) {  			dev_err(component->dev,  				"Failed to set codec DAI master (%d)\n", ret); @@ -1211,14 +1231,18 @@ static int tscs42xx_set_dai_bclk_ratio(struct snd_soc_dai *codec_dai,  		return -EINVAL;  	} -	ret = snd_soc_component_update_bits(component, R_DACSR, RM_DACSR_DBCM, value); +	ret = snd_soc_component_update_bits(component, +			R_DACSR, RM_DACSR_DBCM, value);  	if (ret < 0) { -		dev_err(component->dev, "Failed to set DAC BCLK ratio (%d)\n", ret); +		dev_err(component->dev, +				"Failed to set DAC BCLK ratio (%d)\n", ret);  		return ret;  	} -	ret = snd_soc_component_update_bits(component, R_ADCSR, RM_ADCSR_ABCM, value); +	ret = snd_soc_component_update_bits(component, +			R_ADCSR, RM_ADCSR_ABCM, value);  	if (ret < 0) { -		dev_err(component->dev, "Failed to set ADC BCLK ratio (%d)\n", ret); +		dev_err(component->dev, +				"Failed to set ADC BCLK ratio (%d)\n", ret);  		return ret;  	} @@ -1231,13 +1255,46 @@ static int tscs42xx_set_dai_bclk_ratio(struct snd_soc_dai *codec_dai,  	return 0;  } -static int tscs42xx_set_dai_sysclk(struct snd_soc_dai *codec_dai, -	int clk_id, unsigned int freq, int dir) +static const struct snd_soc_dai_ops tscs42xx_dai_ops = { +	.hw_params	= tscs42xx_hw_params, +	.mute_stream	= tscs42xx_mute_stream, +	.set_fmt	= tscs42xx_set_dai_fmt, +	.set_bclk_ratio = tscs42xx_set_dai_bclk_ratio, +}; + +static int part_is_valid(struct tscs42xx *tscs42xx)  { -	struct snd_soc_component *component = codec_dai->component; +	int val;  	int ret; +	unsigned int reg; + +	ret = regmap_read(tscs42xx->regmap, R_DEVIDH, ®); +	if (ret < 0) +		return ret; + +	val = reg << 8; +	ret = regmap_read(tscs42xx->regmap, R_DEVIDL, ®); +	if (ret < 0) +		return ret; + +	val |= reg; + +	switch (val) { +	case 0x4A74: +	case 0x4A73: +		return true; +	default: +		return false; +	}; +} -	switch (clk_id) { +static int set_sysclk(struct snd_soc_component *component) +{ +	struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); +	unsigned long freq; +	int ret; + +	switch (tscs42xx->sysclk_src_id) {  	case TSCS42XX_PLL_SRC_XTAL:  	case TSCS42XX_PLL_SRC_MCLK1:  		ret = snd_soc_component_write(component, R_PLLREFSEL, @@ -1265,6 +1322,7 @@ static int tscs42xx_set_dai_sysclk(struct snd_soc_dai *codec_dai,  		return -EINVAL;  	} +	freq = clk_get_rate(tscs42xx->sysclk);  	ret = set_pll_ctl_from_input_freq(component, freq);  	if (ret < 0) {  		dev_err(component->dev, @@ -1275,41 +1333,13 @@ static int tscs42xx_set_dai_sysclk(struct snd_soc_dai *codec_dai,  	return 0;  } -static const struct snd_soc_dai_ops tscs42xx_dai_ops = { -	.hw_params	= tscs42xx_hw_params, -	.mute_stream	= tscs42xx_mute_stream, -	.set_fmt	= tscs42xx_set_dai_fmt, -	.set_bclk_ratio = tscs42xx_set_dai_bclk_ratio, -	.set_sysclk	= tscs42xx_set_dai_sysclk, -}; - -static int part_is_valid(struct tscs42xx *tscs42xx) +static int tscs42xx_probe(struct snd_soc_component *component)  { -	int val; -	int ret; -	unsigned int reg; - -	ret = regmap_read(tscs42xx->regmap, R_DEVIDH, ®); -	if (ret < 0) -		return ret; - -	val = reg << 8; -	ret = regmap_read(tscs42xx->regmap, R_DEVIDL, ®); -	if (ret < 0) -		return ret; - -	val |= reg; - -	switch (val) { -	case 0x4A74: -	case 0x4A73: -		return true; -	default: -		return false; -	}; +	return set_sysclk(component);  } -static struct snd_soc_component_driver soc_codec_dev_tscs42xx = { +static const struct snd_soc_component_driver soc_codec_dev_tscs42xx = { +	.probe			= tscs42xx_probe,  	.dapm_widgets		= tscs42xx_dapm_widgets,  	.num_dapm_widgets	= ARRAY_SIZE(tscs42xx_dapm_widgets),  	.dapm_routes		= tscs42xx_intercon, @@ -1367,11 +1397,15 @@ static const struct reg_sequence tscs42xx_patch[] = {  	{ R_AIC2, RV_AIC2_BLRCM_DAC_BCLK_LRCLK_SHARED },  }; +static char const * const src_names[TSCS42XX_PLL_SRC_CNT] = { +	"xtal", "mclk1", "mclk2"}; +  static int tscs42xx_i2c_probe(struct i2c_client *i2c,  		const struct i2c_device_id *id)  {  	struct tscs42xx *tscs42xx; -	int ret = 0; +	int src; +	int ret;  	tscs42xx = devm_kzalloc(&i2c->dev, sizeof(*tscs42xx), GFP_KERNEL);  	if (!tscs42xx) { @@ -1381,12 +1415,29 @@ static int tscs42xx_i2c_probe(struct i2c_client *i2c,  		return ret;  	}  	i2c_set_clientdata(i2c, tscs42xx); -	tscs42xx->dev = &i2c->dev; + +	for (src = TSCS42XX_PLL_SRC_XTAL; src < TSCS42XX_PLL_SRC_CNT; src++) { +		tscs42xx->sysclk = devm_clk_get(&i2c->dev, src_names[src]); +		if (!IS_ERR(tscs42xx->sysclk)) { +			break; +		} else if (PTR_ERR(tscs42xx->sysclk) != -ENOENT) { +			ret = PTR_ERR(tscs42xx->sysclk); +			dev_err(&i2c->dev, "Failed to get sysclk (%d)\n", ret); +			return ret; +		} +	} +	if (src == TSCS42XX_PLL_SRC_CNT) { +		ret = -EINVAL; +		dev_err(&i2c->dev, "Failed to get a valid clock name (%d)\n", +				ret); +		return ret; +	} +	tscs42xx->sysclk_src_id = src;  	tscs42xx->regmap = devm_regmap_init_i2c(i2c, &tscs42xx_regmap);  	if (IS_ERR(tscs42xx->regmap)) {  		ret = PTR_ERR(tscs42xx->regmap); -		dev_err(tscs42xx->dev, "Failed to allocate regmap (%d)\n", ret); +		dev_err(&i2c->dev, "Failed to allocate regmap (%d)\n", ret);  		return ret;  	} @@ -1394,21 +1445,21 @@ static int tscs42xx_i2c_probe(struct i2c_client *i2c,  	ret = part_is_valid(tscs42xx);  	if (ret <= 0) { -		dev_err(tscs42xx->dev, "No valid part (%d)\n", ret); +		dev_err(&i2c->dev, "No valid part (%d)\n", ret);  		ret = -ENODEV;  		return ret;  	}  	ret = regmap_write(tscs42xx->regmap, R_RESET, RV_RESET_ENABLE);  	if (ret < 0) { -		dev_err(tscs42xx->dev, "Failed to reset device (%d)\n", ret); +		dev_err(&i2c->dev, "Failed to reset device (%d)\n", ret);  		return ret;  	}  	ret = regmap_register_patch(tscs42xx->regmap, tscs42xx_patch,  			ARRAY_SIZE(tscs42xx_patch));  	if (ret < 0) { -		dev_err(tscs42xx->dev, "Failed to apply patch (%d)\n", ret); +		dev_err(&i2c->dev, "Failed to apply patch (%d)\n", ret);  		return ret;  	} @@ -1416,10 +1467,10 @@ static int tscs42xx_i2c_probe(struct i2c_client *i2c,  	mutex_init(&tscs42xx->coeff_ram_lock);  	mutex_init(&tscs42xx->pll_lock); -	ret = devm_snd_soc_register_component(tscs42xx->dev, &soc_codec_dev_tscs42xx, -			&tscs42xx_dai, 1); +	ret = devm_snd_soc_register_component(&i2c->dev, +			&soc_codec_dev_tscs42xx, &tscs42xx_dai, 1);  	if (ret) { -		dev_err(tscs42xx->dev, "Failed to register codec (%d)\n", ret); +		dev_err(&i2c->dev, "Failed to register codec (%d)\n", ret);  		return ret;  	} |