at91: add kernel support for sama7g5 soc
[openwrt/staging/dedeckeh.git] / target / linux / at91 / patches-5.10 / 192-ASoC-codecs-ad193x-add-support-for-96kHz-and-192kHz-.patch
1 From 1c906a59a60887e1b997ebab63f19f33a1c69a3e Mon Sep 17 00:00:00 2001
2 From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
3 Date: Tue, 3 Aug 2021 13:48:25 +0300
4 Subject: [PATCH 192/247] ASoC: codecs: ad193x: add support for 96kHz and
5 192kHz playback rates
6
7 ad193x devices support 96KHz and 192KHz sampling rates, when PLL/MCLK is
8 referenced to 48kHz.
9 Tested on ad1934.
10
11 Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
12 Link: https://lore.kernel.org/r/20210803104825.2198335-1-codrin.ciubotariu@microchip.com
13 Signed-off-by: Mark Brown <broonie@kernel.org>
14 ---
15 sound/soc/codecs/ad193x.c | 30 ++++++++++++++++++++++++++++--
16 sound/soc/codecs/ad193x.h | 4 ++++
17 2 files changed, 32 insertions(+), 2 deletions(-)
18
19 diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
20 index f37ab7eda615..278a55af158b 100644
21 --- a/sound/soc/codecs/ad193x.c
22 +++ b/sound/soc/codecs/ad193x.c
23 @@ -316,6 +316,13 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
24 int word_len = 0, master_rate = 0;
25 struct snd_soc_component *component = dai->component;
26 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
27 + bool is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
28 + u8 dacc0;
29 +
30 + dev_dbg(dai->dev, "%s() rate=%u format=%#x width=%u channels=%u\n",
31 + __func__, params_rate(params), params_format(params),
32 + params_width(params), params_channels(params));
33 +
34
35 /* bit size */
36 switch (params_width(params)) {
37 @@ -346,6 +353,25 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
38 break;
39 }
40
41 + if (is_playback) {
42 + switch (params_rate(params)) {
43 + case 48000:
44 + dacc0 = AD193X_DAC_SR_48;
45 + break;
46 + case 96000:
47 + dacc0 = AD193X_DAC_SR_96;
48 + break;
49 + case 192000:
50 + dacc0 = AD193X_DAC_SR_192;
51 + break;
52 + default:
53 + dev_err(dai->dev, "invalid sampling rate: %d\n", params_rate(params));
54 + return -EINVAL;
55 + }
56 +
57 + regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0, AD193X_DAC_SR_MASK, dacc0);
58 + }
59 +
60 regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0,
61 AD193X_PLL_INPUT_MASK, master_rate);
62
63 @@ -385,7 +411,7 @@ static struct snd_soc_dai_driver ad193x_dai = {
64 .stream_name = "Playback",
65 .channels_min = 2,
66 .channels_max = 8,
67 - .rates = SNDRV_PCM_RATE_48000,
68 + .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
69 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
70 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
71 },
72 @@ -407,7 +433,7 @@ static struct snd_soc_dai_driver ad193x_no_adc_dai = {
73 .stream_name = "Playback",
74 .channels_min = 2,
75 .channels_max = 8,
76 - .rates = SNDRV_PCM_RATE_48000,
77 + .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
78 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
79 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
80 },
81 diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h
82 index 377854712c20..61f4648861d5 100644
83 --- a/sound/soc/codecs/ad193x.h
84 +++ b/sound/soc/codecs/ad193x.h
85 @@ -37,6 +37,10 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
86 #define AD193X_PLL_CLK_SRC_MCLK (1 << 1)
87 #define AD193X_DAC_CTRL0 0x02
88 #define AD193X_DAC_POWERDOWN 0x01
89 +#define AD193X_DAC_SR_MASK 0x06
90 +#define AD193X_DAC_SR_48 (0 << 1)
91 +#define AD193X_DAC_SR_96 (1 << 1)
92 +#define AD193X_DAC_SR_192 (2 << 1)
93 #define AD193X_DAC_SERFMT_MASK 0xC0
94 #define AD193X_DAC_SERFMT_STEREO (0 << 6)
95 #define AD193X_DAC_SERFMT_TDM (1 << 6)
96 --
97 2.32.0
98