summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch')
-rw-r--r--target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch78
1 files changed, 0 insertions, 78 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch b/target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch
deleted file mode 100644
index 07fd80ff37..0000000000
--- a/target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 160cee9f3b24ef830fdf3abbe56f4de94eeea812 Mon Sep 17 00:00:00 2001
-From: Dom Cobley <popcornmix@gmail.com>
-Date: Fri, 21 Apr 2023 20:23:42 +0100
-Subject: [PATCH] bcm2835-dma: Fix dma_abort for 40-bit channels
-
-It wasn't aborting the transfer and caused stop/start
-of hdmi audio dma to be unreliable.
-
-New sequence approved by Broadcom.
-
-Signed-off-by: Dom Cobley <popcornmix@gmail.com>
----
- drivers/dma/bcm2835-dma.c | 42 ++++++++++++++++++++++++++-------------
- 1 file changed, 28 insertions(+), 14 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -651,10 +651,6 @@ static void bcm2835_dma_abort(struct bcm
- {
- void __iomem *chan_base = c->chan_base;
- long int timeout = 10000;
-- u32 wait_mask = BCM2835_DMA_WAITING_FOR_WRITES;
--
-- if (c->is_40bit_channel)
-- wait_mask = BCM2711_DMA40_WAITING_FOR_WRITES;
-
- /*
- * A zero control block address means the channel is idle.
-@@ -663,19 +659,37 @@ static void bcm2835_dma_abort(struct bcm
- if (!readl(chan_base + BCM2835_DMA_ADDR))
- return;
-
-- /* Write 0 to the active bit - Pause the DMA */
-- writel(0, chan_base + BCM2835_DMA_CS);
--
-- /* Wait for any current AXI transfer to complete */
-- while ((readl(chan_base + BCM2835_DMA_CS) & wait_mask) && --timeout)
-- cpu_relax();
--
-- /* Peripheral might be stuck and fail to signal AXI write responses */
-- if (!timeout)
-- dev_err(c->vc.chan.device->dev,
-- "failed to complete outstanding writes\n");
-+ if (c->is_40bit_channel) {
-+ /* Halt the current DMA */
-+ writel(readl(chan_base + BCM2711_DMA40_CS) | BCM2711_DMA40_HALT,
-+ chan_base + BCM2711_DMA40_CS);
-+
-+ while ((readl(chan_base + BCM2711_DMA40_CS) & BCM2711_DMA40_HALT) && --timeout)
-+ cpu_relax();
-+
-+ /* Peripheral might be stuck and fail to halt */
-+ if (!timeout)
-+ dev_err(c->vc.chan.device->dev,
-+ "failed to halt dma\n");
-+
-+ writel(0, chan_base + BCM2711_DMA40_CS);
-+ writel(0, chan_base + BCM2711_DMA40_CB);
-+ } else {
-+ /* Write 0 to the active bit - Pause the DMA */
-+ writel(0, chan_base + BCM2835_DMA_CS);
-+
-+ /* Wait for any current AXI transfer to complete */
-+ while ((readl(chan_base + BCM2835_DMA_CS) & BCM2835_DMA_WAITING_FOR_WRITES)
-+ && --timeout)
-+ cpu_relax();
-+
-+ /* Peripheral might be stuck and fail to signal AXI write responses */
-+ if (!timeout)
-+ dev_err(c->vc.chan.device->dev,
-+ "failed to complete outstanding writes\n");
-
-- writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS);
-+ writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS);
-+ }
- }
-
- static void bcm2835_dma_start_desc(struct bcm2835_chan *c)