aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0632-drm-vc4-hdmi-Take-the-sink-maximum-TMDS-clock-into-a.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0632-drm-vc4-hdmi-Take-the-sink-maximum-TMDS-clock-into-a.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0632-drm-vc4-hdmi-Take-the-sink-maximum-TMDS-clock-into-a.patch40
1 files changed, 40 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0632-drm-vc4-hdmi-Take-the-sink-maximum-TMDS-clock-into-a.patch b/target/linux/bcm27xx/patches-5.15/950-0632-drm-vc4-hdmi-Take-the-sink-maximum-TMDS-clock-into-a.patch
new file mode 100644
index 0000000000..b9b1636b16
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0632-drm-vc4-hdmi-Take-the-sink-maximum-TMDS-clock-into-a.patch
@@ -0,0 +1,40 @@
+From e63d40712a11de18ea217c2211dfd3ae937bab7f Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Mon, 13 Dec 2021 15:33:11 +0100
+Subject: [PATCH] drm/vc4: hdmi: Take the sink maximum TMDS clock into
+ account
+
+In the function that validates that the clock isn't too high, we've only
+taken our controller limitations into account so far.
+
+However, the sink can have a limit on the maximum TMDS clock it can deal
+with too which is exposed through the EDID and the drm_display_info.
+
+Make sure we check it.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -1254,12 +1254,18 @@ static enum drm_mode_status
+ vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
+ unsigned long long clock)
+ {
++ const struct drm_connector *connector = &vc4_hdmi->connector;
++ const struct drm_display_info *info = &connector->display_info;
++
+ if (clock > vc4_hdmi->variant->max_pixel_clock)
+ return MODE_CLOCK_HIGH;
+
+ if (vc4_hdmi->disable_4kp60 && clock > HDMI_14_MAX_TMDS_CLK)
+ return MODE_CLOCK_HIGH;
+
++ if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000))
++ return MODE_CLOCK_HIGH;
++
+ return MODE_OK;
+ }
+