at91: add kernel support for sama7g5 soc
[openwrt/staging/mkresin.git] / target / linux / at91 / patches-5.10 / 192-ASoC-codecs-ad193x-add-support-for-96kHz-and-192kHz-.patch
diff --git a/target/linux/at91/patches-5.10/192-ASoC-codecs-ad193x-add-support-for-96kHz-and-192kHz-.patch b/target/linux/at91/patches-5.10/192-ASoC-codecs-ad193x-add-support-for-96kHz-and-192kHz-.patch
new file mode 100644 (file)
index 0000000..54fe858
--- /dev/null
@@ -0,0 +1,98 @@
+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(-)
+
+diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c
+index f37ab7eda615..278a55af158b 100644
+--- a/sound/soc/codecs/ad193x.c
++++ b/sound/soc/codecs/ad193x.c
+@@ -316,6 +316,13 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
+       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_pcm_substream *substream,
+               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_dai = {
+               .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_no_adc_dai = {
+               .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,
+       },
+diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h
+index 377854712c20..61f4648861d5 100644
+--- a/sound/soc/codecs/ad193x.h
++++ b/sound/soc/codecs/ad193x.h
+@@ -37,6 +37,10 @@ int ad193x_probe(struct device *dev, struct regmap *regmap,
+ #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)
+-- 
+2.32.0
+