192-ASoC-codecs-ad193x-add-support-for-96kHz-and-192kHz-.patch 3.5 KB

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