aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-4.14/950-0176-drm-vc4-Fix-sleeps-during-the-IRQ-handler-for-DSI-tr.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-4.14/950-0176-drm-vc4-Fix-sleeps-during-the-IRQ-handler-for-DSI-tr.patch')
-rw-r--r--target/linux/brcm2708/patches-4.14/950-0176-drm-vc4-Fix-sleeps-during-the-IRQ-handler-for-DSI-tr.patch73
1 files changed, 0 insertions, 73 deletions
diff --git a/target/linux/brcm2708/patches-4.14/950-0176-drm-vc4-Fix-sleeps-during-the-IRQ-handler-for-DSI-tr.patch b/target/linux/brcm2708/patches-4.14/950-0176-drm-vc4-Fix-sleeps-during-the-IRQ-handler-for-DSI-tr.patch
deleted file mode 100644
index d6949b617b..0000000000
--- a/target/linux/brcm2708/patches-4.14/950-0176-drm-vc4-Fix-sleeps-during-the-IRQ-handler-for-DSI-tr.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From 659c52fe8a86264c5119c0592654898d09fe8f28 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 13 Oct 2017 17:12:55 -0700
-Subject: [PATCH 176/454] drm/vc4: Fix sleeps during the IRQ handler for DSI
- transactions.
-
-VC4's DSI1 has a bug where the AXI connection is broken for 32-bit
-writes from the CPU, so we use the DMA engine to DMA 32-bit values
-into registers instead. That sleeps, so we can't do it from the top
-half.
-
-As a solution, use an interrupt thread so that all our writes happen
-when sleeping is is allowed.
-
-v2: Use IRQF_ONESHOT (suggested by Boris)
-v3: Style nitpicks.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Link: https://patchwork.freedesktop.org/patch/msgid/20171014001255.32005-1-eric@anholt.net
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com> (v2)
-(cherry picked from commit af0c8c10564aac5b6d67308129ec09c4ad5db476)
----
- drivers/gpu/drm/vc4/vc4_dsi.c | 32 ++++++++++++++++++++++++++++++--
- 1 file changed, 30 insertions(+), 2 deletions(-)
-
---- a/drivers/gpu/drm/vc4/vc4_dsi.c
-+++ b/drivers/gpu/drm/vc4/vc4_dsi.c
-@@ -1383,6 +1383,27 @@ static void dsi_handle_error(struct vc4_
- *ret = IRQ_HANDLED;
- }
-
-+/*
-+ * Initial handler for port 1 where we need the reg_dma workaround.
-+ * The register DMA writes sleep, so we can't do it in the top half.
-+ * Instead we use IRQF_ONESHOT so that the IRQ gets disabled in the
-+ * parent interrupt contrller until our interrupt thread is done.
-+ */
-+static irqreturn_t vc4_dsi_irq_defer_to_thread_handler(int irq, void *data)
-+{
-+ struct vc4_dsi *dsi = data;
-+ u32 stat = DSI_PORT_READ(INT_STAT);
-+
-+ if (!stat)
-+ return IRQ_NONE;
-+
-+ return IRQ_WAKE_THREAD;
-+}
-+
-+/*
-+ * Normal IRQ handler for port 0, or the threaded IRQ handler for port
-+ * 1 where we need the reg_dma workaround.
-+ */
- static irqreturn_t vc4_dsi_irq_handler(int irq, void *data)
- {
- struct vc4_dsi *dsi = data;
-@@ -1566,8 +1587,15 @@ static int vc4_dsi_bind(struct device *d
- /* Clear any existing interrupt state. */
- DSI_PORT_WRITE(INT_STAT, DSI_PORT_READ(INT_STAT));
-
-- ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
-- vc4_dsi_irq_handler, 0, "vc4 dsi", dsi);
-+ if (dsi->reg_dma_mem)
-+ ret = devm_request_threaded_irq(dev, platform_get_irq(pdev, 0),
-+ vc4_dsi_irq_defer_to_thread_handler,
-+ vc4_dsi_irq_handler,
-+ IRQF_ONESHOT,
-+ "vc4 dsi", dsi);
-+ else
-+ ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
-+ vc4_dsi_irq_handler, 0, "vc4 dsi", dsi);
- if (ret) {
- if (ret != -EPROBE_DEFER)
- dev_err(dev, "Failed to get interrupt: %d\n", ret);