92 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 1c906a59a60887e1b997ebab63f19f33a1c69a3e Mon Sep 17 00:00:00 2001
 | |
| From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
 | |
| Date: Tue, 3 Aug 2021 13:48:25 +0300
 | |
| Subject: [PATCH 192/247] ASoC: codecs: ad193x: add support for 96kHz and
 | |
|  192kHz playback rates
 | |
| 
 | |
| ad193x devices support 96KHz and 192KHz sampling rates, when PLL/MCLK is
 | |
| referenced to 48kHz.
 | |
| Tested on ad1934.
 | |
| 
 | |
| Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
 | |
| Link: https://lore.kernel.org/r/20210803104825.2198335-1-codrin.ciubotariu@microchip.com
 | |
| Signed-off-by: Mark Brown <broonie@kernel.org>
 | |
| ---
 | |
|  sound/soc/codecs/ad193x.c | 30 ++++++++++++++++++++++++++++--
 | |
|  sound/soc/codecs/ad193x.h |  4 ++++
 | |
|  2 files changed, 32 insertions(+), 2 deletions(-)
 | |
| 
 | |
| --- a/sound/soc/codecs/ad193x.c
 | |
| +++ b/sound/soc/codecs/ad193x.c
 | |
| @@ -316,6 +316,13 @@ static int ad193x_hw_params(struct snd_p
 | |
|  	int word_len = 0, master_rate = 0;
 | |
|  	struct snd_soc_component *component = dai->component;
 | |
|  	struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
 | |
| +	bool is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
 | |
| +	u8 dacc0;
 | |
| +
 | |
| +	dev_dbg(dai->dev, "%s() rate=%u format=%#x width=%u channels=%u\n",
 | |
| +		__func__, params_rate(params), params_format(params),
 | |
| +		params_width(params), params_channels(params));
 | |
| +
 | |
|  
 | |
|  	/* bit size */
 | |
|  	switch (params_width(params)) {
 | |
| @@ -346,6 +353,25 @@ static int ad193x_hw_params(struct snd_p
 | |
|  		break;
 | |
|  	}
 | |
|  
 | |
| +	if (is_playback) {
 | |
| +		switch (params_rate(params)) {
 | |
| +		case 48000:
 | |
| +			dacc0 = AD193X_DAC_SR_48;
 | |
| +			break;
 | |
| +		case 96000:
 | |
| +			dacc0 = AD193X_DAC_SR_96;
 | |
| +			break;
 | |
| +		case 192000:
 | |
| +			dacc0 = AD193X_DAC_SR_192;
 | |
| +			break;
 | |
| +		default:
 | |
| +			dev_err(dai->dev, "invalid sampling rate: %d\n", params_rate(params));
 | |
| +			return -EINVAL;
 | |
| +		}
 | |
| +
 | |
| +		regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0, AD193X_DAC_SR_MASK, dacc0);
 | |
| +	}
 | |
| +
 | |
|  	regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0,
 | |
|  			    AD193X_PLL_INPUT_MASK, master_rate);
 | |
|  
 | |
| @@ -385,7 +411,7 @@ static struct snd_soc_dai_driver ad193x_
 | |
|  		.stream_name = "Playback",
 | |
|  		.channels_min = 2,
 | |
|  		.channels_max = 8,
 | |
| -		.rates = SNDRV_PCM_RATE_48000,
 | |
| +		.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
 | |
|  		.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
 | |
|  			SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
 | |
|  	},
 | |
| @@ -407,7 +433,7 @@ static struct snd_soc_dai_driver ad193x_
 | |
|  		.stream_name = "Playback",
 | |
|  		.channels_min = 2,
 | |
|  		.channels_max = 8,
 | |
| -		.rates = SNDRV_PCM_RATE_48000,
 | |
| +		.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
 | |
|  		.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
 | |
|  			SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
 | |
|  	},
 | |
| --- a/sound/soc/codecs/ad193x.h
 | |
| +++ b/sound/soc/codecs/ad193x.h
 | |
| @@ -37,6 +37,10 @@ int ad193x_probe(struct device *dev, str
 | |
|  #define AD193X_PLL_CLK_SRC_MCLK	(1 << 1)
 | |
|  #define AD193X_DAC_CTRL0        0x02
 | |
|  #define AD193X_DAC_POWERDOWN           0x01
 | |
| +#define AD193X_DAC_SR_MASK           0x06
 | |
| +#define AD193X_DAC_SR_48	(0 << 1)
 | |
| +#define AD193X_DAC_SR_96	(1 << 1)
 | |
| +#define AD193X_DAC_SR_192	(2 << 1)
 | |
|  #define AD193X_DAC_SERFMT_MASK		0xC0
 | |
|  #define AD193X_DAC_SERFMT_STEREO	(0 << 6)
 | |
|  #define AD193X_DAC_SERFMT_TDM		(1 << 6)
 | 
