aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0021-drm-vc4-hdmi-Actually-check-for-the-connector-status.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0021-drm-vc4-hdmi-Actually-check-for-the-connector-status.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0021-drm-vc4-hdmi-Actually-check-for-the-connector-status.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0021-drm-vc4-hdmi-Actually-check-for-the-connector-status.patch b/target/linux/bcm27xx/patches-5.15/950-0021-drm-vc4-hdmi-Actually-check-for-the-connector-status.patch
new file mode 100644
index 0000000000..44e4d66cc3
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0021-drm-vc4-hdmi-Actually-check-for-the-connector-status.patch
@@ -0,0 +1,60 @@
+From b30b747d76946fb176bb4b044c830415d551b7bb Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Thu, 19 Aug 2021 13:50:12 +0200
+Subject: [PATCH] drm/vc4: hdmi: Actually check for the connector
+ status in hotplug
+
+The drm_helper_hpd_irq_event() documentation states that this function
+is "useful for drivers which can't or don't track hotplug interrupts for
+each connector." and that "Drivers which support hotplug interrupts for
+each connector individually and which have a more fine-grained detect
+logic should bypass this code and directly call
+drm_kms_helper_hotplug_event()". This is thus what we ended-up doing.
+
+However, what this actually means, and is further explained in the
+drm_kms_helper_hotplug_event() documentation, is that
+drm_kms_helper_hotplug_event() should be called by drivers that can
+track the connection status change, and if it has changed we should call
+that function.
+
+This underlying expectation we failed to provide is that the caller of
+drm_kms_helper_hotplug_event() should call drm_helper_probe_detect() to
+probe the new status of the connector.
+
+Since we didn't do it, it meant that even though we were sending the
+notification to user-space and the DRM clients that something changed we
+never probed or updated our internal connector status ourselves.
+
+This went mostly unnoticed since the detect callback usually doesn't
+have any side-effect. Also, if we were using the DRM fbdev emulation
+(which is a DRM client), or any user-space application that can deal
+with hotplug events, chances are they would react to the hotplug event
+by probing the connector status eventually.
+
+However, now that we have to enable the scrambler in detect() if it was
+enabled it has a side effect, and an application such as Kodi or
+modetest doesn't deal with hotplug events. This resulted with a black
+screen when Kodi or modetest was running when a screen was disconnected
+and then reconnected, or switched off and on.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -1792,10 +1792,11 @@ static void vc4_hdmi_audio_exit(struct v
+ static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
+ {
+ struct vc4_hdmi *vc4_hdmi = priv;
+- struct drm_device *dev = vc4_hdmi->connector.dev;
++ struct drm_connector *connector = &vc4_hdmi->connector;
++ struct drm_device *dev = connector->dev;
+
+ if (dev && dev->registered)
+- drm_kms_helper_hotplug_event(dev);
++ drm_connector_helper_hpd_irq_event(connector);
+
+ return IRQ_HANDLED;
+ }