mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 15:02:32 +00:00
05ed7dc50d
Patches automatically rebased. Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
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)
|