diff options
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.patch | 85 |
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 */ |