950-0893-ASoC-dwc-Add-DMACR-handling.patch 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. From b3b1177092d4d2ba6df74042d39aa42c5055f687 Mon Sep 17 00:00:00 2001
  2. From: Phil Elwell <[email protected]>
  3. Date: Mon, 3 Jul 2023 09:08:16 +0100
  4. Subject: [PATCH] ASoC: dwc: Add DMACR handling
  5. Add control of the DMACR register, which is required for paced DMA
  6. (i.e. DREQ) support.
  7. Signed-off-by: Phil Elwell <[email protected]>
  8. ---
  9. sound/soc/dwc/dwc-i2s.c | 13 ++++++++++---
  10. sound/soc/dwc/local.h | 13 +++++++++++++
  11. 2 files changed, 23 insertions(+), 3 deletions(-)
  12. --- a/sound/soc/dwc/dwc-i2s.c
  13. +++ b/sound/soc/dwc/dwc-i2s.c
  14. @@ -185,9 +185,9 @@ static void i2s_stop(struct dw_i2s_dev *
  15. static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
  16. {
  17. - u32 ch_reg;
  18. struct i2s_clk_config_data *config = &dev->config;
  19. -
  20. + u32 ch_reg;
  21. + u32 dmacr = 0;
  22. i2s_disable_channels(dev, stream);
  23. @@ -198,15 +198,22 @@ static void dw_i2s_config(struct dw_i2s_
  24. i2s_write_reg(dev->i2s_base, TFCR(ch_reg),
  25. dev->fifo_th - 1);
  26. i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
  27. + dmacr |= (DMACR_DMAEN_TXCH0 << ch_reg);
  28. } else {
  29. i2s_write_reg(dev->i2s_base, RCR(ch_reg),
  30. dev->xfer_resolution);
  31. i2s_write_reg(dev->i2s_base, RFCR(ch_reg),
  32. dev->fifo_th - 1);
  33. i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
  34. + dmacr |= (DMACR_DMAEN_RXCH0 << ch_reg);
  35. }
  36. -
  37. }
  38. + if (stream == SNDRV_PCM_STREAM_PLAYBACK)
  39. + dmacr |= DMACR_DMAEN_TX;
  40. + else if (stream == SNDRV_PCM_STREAM_CAPTURE)
  41. + dmacr |= DMACR_DMAEN_RX;
  42. +
  43. + i2s_write_reg(dev->i2s_base, DMACR, dmacr);
  44. }
  45. static int dw_i2s_hw_params(struct snd_pcm_substream *substream,
  46. --- a/sound/soc/dwc/local.h
  47. +++ b/sound/soc/dwc/local.h
  48. @@ -25,6 +25,8 @@
  49. #define RXFFR 0x014
  50. #define TXFFR 0x018
  51. +#define DMACR 0x200
  52. +
  53. /* Interrupt status register fields */
  54. #define ISR_TXFO BIT(5)
  55. #define ISR_TXFE BIT(4)
  56. @@ -47,6 +49,17 @@
  57. #define RFF(x) (0x40 * x + 0x050)
  58. #define TFF(x) (0x40 * x + 0x054)
  59. +#define DMACR_DMAEN_TX BIT(17)
  60. +#define DMACR_DMAEN_RX BIT(16)
  61. +#define DMACR_DMAEN_TXCH3 BIT(11)
  62. +#define DMACR_DMAEN_TXCH2 BIT(10)
  63. +#define DMACR_DMAEN_TXCH1 BIT(9)
  64. +#define DMACR_DMAEN_TXCH0 BIT(8)
  65. +#define DMACR_DMAEN_RXCH3 BIT(3)
  66. +#define DMACR_DMAEN_RXCH2 BIT(2)
  67. +#define DMACR_DMAEN_RXCH1 BIT(1)
  68. +#define DMACR_DMAEN_RXCH0 BIT(0)
  69. +
  70. /* I2SCOMPRegisters */
  71. #define I2S_COMP_PARAM_2 0x01F0
  72. #define I2S_COMP_PARAM_1 0x01F4