aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0458-drm-vc4-hdmi-Split-the-interrupt-handlers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0458-drm-vc4-hdmi-Split-the-interrupt-handlers.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0458-drm-vc4-hdmi-Split-the-interrupt-handlers.patch141
1 files changed, 0 insertions, 141 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0458-drm-vc4-hdmi-Split-the-interrupt-handlers.patch b/target/linux/bcm27xx/patches-5.10/950-0458-drm-vc4-hdmi-Split-the-interrupt-handlers.patch
deleted file mode 100644
index 5447b33259..0000000000
--- a/target/linux/bcm27xx/patches-5.10/950-0458-drm-vc4-hdmi-Split-the-interrupt-handlers.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From 423173ed6e873ec9a6ae0e62d55bd4c746f0f982 Mon Sep 17 00:00:00 2001
-From: Maxime Ripard <maxime@cerno.tech>
-Date: Mon, 11 Jan 2021 15:23:03 +0100
-Subject: [PATCH] drm/vc4: hdmi: Split the interrupt handlers
-
-The BCM2711 has two different interrupt sources to transmit and receive
-CEC messages, provided through an external interrupt chip shared between
-the two HDMI interrupt controllers.
-
-The rest of the CEC controller is identical though so we need to change
-a bit the code organisation to share the code as much as possible, yet
-still allowing to register independant handlers.
-
-Signed-off-by: Maxime Ripard <maxime@cerno.tech>
-Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
----
- drivers/gpu/drm/vc4/vc4_hdmi.c | 86 +++++++++++++++++++++++++---------
- 1 file changed, 65 insertions(+), 21 deletions(-)
-
---- a/drivers/gpu/drm/vc4/vc4_hdmi.c
-+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
-@@ -1574,15 +1574,22 @@ static int vc4_hdmi_audio_init(struct vc
- }
-
- #ifdef CONFIG_DRM_VC4_HDMI_CEC
--static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
-+static irqreturn_t vc4_cec_irq_handler_rx_thread(int irq, void *priv)
-+{
-+ struct vc4_hdmi *vc4_hdmi = priv;
-+
-+ if (vc4_hdmi->cec_rx_msg.len)
-+ cec_received_msg(vc4_hdmi->cec_adap,
-+ &vc4_hdmi->cec_rx_msg);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static irqreturn_t vc4_cec_irq_handler_tx_thread(int irq, void *priv)
- {
- struct vc4_hdmi *vc4_hdmi = priv;
-
-- if (vc4_hdmi->cec_irq_was_rx) {
-- if (vc4_hdmi->cec_rx_msg.len)
-- cec_received_msg(vc4_hdmi->cec_adap,
-- &vc4_hdmi->cec_rx_msg);
-- } else if (vc4_hdmi->cec_tx_ok) {
-+ if (vc4_hdmi->cec_tx_ok) {
- cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK,
- 0, 0, 0, 0);
- } else {
-@@ -1596,6 +1603,19 @@ static irqreturn_t vc4_cec_irq_handler_t
- return IRQ_HANDLED;
- }
-
-+static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
-+{
-+ struct vc4_hdmi *vc4_hdmi = priv;
-+ irqreturn_t ret;
-+
-+ if (vc4_hdmi->cec_irq_was_rx)
-+ ret = vc4_cec_irq_handler_rx_thread(irq, priv);
-+ else
-+ ret = vc4_cec_irq_handler_tx_thread(irq, priv);
-+
-+ return ret;
-+}
-+
- static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1)
- {
- struct drm_device *dev = vc4_hdmi->connector.dev;
-@@ -1620,31 +1640,55 @@ static void vc4_cec_read_msg(struct vc4_
- }
- }
-
-+static irqreturn_t vc4_cec_irq_handler_tx_bare(int irq, void *priv)
-+{
-+ struct vc4_hdmi *vc4_hdmi = priv;
-+ u32 cntrl1;
-+
-+ cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
-+ vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
-+ cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
-+ HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-+
-+ return IRQ_WAKE_THREAD;
-+}
-+
-+static irqreturn_t vc4_cec_irq_handler_rx_bare(int irq, void *priv)
-+{
-+ struct vc4_hdmi *vc4_hdmi = priv;
-+ u32 cntrl1;
-+
-+ vc4_hdmi->cec_rx_msg.len = 0;
-+ cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
-+ vc4_cec_read_msg(vc4_hdmi, cntrl1);
-+ cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
-+ HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-+ cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
-+
-+ HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-+
-+ return IRQ_WAKE_THREAD;
-+}
-+
- static irqreturn_t vc4_cec_irq_handler(int irq, void *priv)
- {
- struct vc4_hdmi *vc4_hdmi = priv;
- u32 stat = HDMI_READ(HDMI_CEC_CPU_STATUS);
-- u32 cntrl1, cntrl5;
-+ irqreturn_t ret;
-+ u32 cntrl5;
-
- if (!(stat & VC4_HDMI_CPU_CEC))
- return IRQ_NONE;
-- vc4_hdmi->cec_rx_msg.len = 0;
-- cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
-+
- cntrl5 = HDMI_READ(HDMI_CEC_CNTRL_5);
- vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT;
-- if (vc4_hdmi->cec_irq_was_rx) {
-- vc4_cec_read_msg(vc4_hdmi, cntrl1);
-- cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
-- HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-- cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
-- } else {
-- vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
-- cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
-- }
-- HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
-- HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC);
-+ if (vc4_hdmi->cec_irq_was_rx)
-+ ret = vc4_cec_irq_handler_rx_bare(irq, priv);
-+ else
-+ ret = vc4_cec_irq_handler_tx_bare(irq, priv);
-
-- return IRQ_WAKE_THREAD;
-+ HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC);
-+ return ret;
- }
-
- static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable)