aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0580-drm-vc4-Ensure-vc4_hdmi-doesn-t-use-2711-HPD-registe.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0580-drm-vc4-Ensure-vc4_hdmi-doesn-t-use-2711-HPD-registe.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0580-drm-vc4-Ensure-vc4_hdmi-doesn-t-use-2711-HPD-registe.patch85
1 files changed, 85 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0580-drm-vc4-Ensure-vc4_hdmi-doesn-t-use-2711-HPD-registe.patch b/target/linux/bcm27xx/patches-5.15/950-0580-drm-vc4-Ensure-vc4_hdmi-doesn-t-use-2711-HPD-registe.patch
new file mode 100644
index 0000000000..c542d240a4
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0580-drm-vc4-Ensure-vc4_hdmi-doesn-t-use-2711-HPD-registe.patch
@@ -0,0 +1,85 @@
+From 3542a39c5655242ba89bb4f51e9237cbb7e8cf09 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Fri, 19 Nov 2021 16:16:40 +0000
+Subject: [PATCH] drm/vc4: Ensure vc4_hdmi doesn't use 2711 HPD
+ registers on Pi0-3
+
+The existing logic was flawed in that it could try reading the
+2711 specific registers for HPD on a CM1/3 where the HPD GPIO
+hadn't been defined in DT.
+
+Ensure we don't do the 2711 register read on invalid hardware,
+and then
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 24 ++++++++++++++++--------
+ drivers/gpu/drm/vc4/vc4_hdmi.h | 3 +++
+ 2 files changed, 19 insertions(+), 8 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -205,14 +205,8 @@ vc4_hdmi_connector_detect(struct drm_con
+ if (gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio))
+ connected = true;
+ } else {
+- unsigned long flags;
+- u32 hotplug;
+-
+- spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
+- hotplug = HDMI_READ(HDMI_HOTPLUG);
+- spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
+-
+- if (hotplug & VC4_HDMI_HOTPLUG_CONNECTED)
++ if (vc4_hdmi->variant->hp_detect &&
++ vc4_hdmi->variant->hp_detect(vc4_hdmi))
+ connected = true;
+ }
+
+@@ -1354,6 +1348,18 @@ static u32 vc5_hdmi_channel_map(struct v
+ return channel_map;
+ }
+
++static bool vc5_hdmi_hp_detect(struct vc4_hdmi *vc4_hdmi)
++{
++ unsigned long flags;
++ u32 hotplug;
++
++ spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
++ hotplug = HDMI_READ(HDMI_HOTPLUG);
++ spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
++
++ return !!(hotplug & VC4_HDMI_HOTPLUG_CONNECTED);
++}
++
+ /* HDMI audio codec callbacks */
+ static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi,
+ unsigned int samplerate)
+@@ -2778,6 +2784,7 @@ static const struct vc4_hdmi_variant bcm
+ .phy_rng_disable = vc5_hdmi_phy_rng_disable,
+ .channel_map = vc5_hdmi_channel_map,
+ .supports_hdr = true,
++ .hp_detect = vc5_hdmi_hp_detect,
+ };
+
+ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
+@@ -2806,6 +2813,7 @@ static const struct vc4_hdmi_variant bcm
+ .phy_rng_disable = vc5_hdmi_phy_rng_disable,
+ .channel_map = vc5_hdmi_channel_map,
+ .supports_hdr = true,
++ .hp_detect = vc5_hdmi_hp_detect,
+ };
+
+ static const struct of_device_id vc4_hdmi_dt_match[] = {
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
+@@ -102,6 +102,9 @@ struct vc4_hdmi_variant {
+
+ /* Enables HDR metadata */
+ bool supports_hdr;
++
++ /* Callback for hardware specific hotplug detect */
++ bool (*hp_detect)(struct vc4_hdmi *vc4_hdmi);
+ };
+
+ /* HDMI audio information */