aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-16 23:40:32 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-17 15:11:22 +0200
commit20ea6adbf199097c4f5f591ffee088340630dae4 (patch)
treed6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch
parentbca05bd072180dc38ef740b37ded9572a6db1981 (diff)
downloadupstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip
bcm27xx: add support for linux v5.15
Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch b/target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch
new file mode 100644
index 0000000000..888de174e2
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0012-drm-vc4-hdmi-Introduce-a-scdc_enabled-flag.patch
@@ -0,0 +1,101 @@
+From 4b98173449085326199e97a10d06cee4cce021a1 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Tue, 19 Oct 2021 19:13:46 +0200
+Subject: [PATCH] drm/vc4: hdmi: Introduce a scdc_enabled flag
+
+We currently rely on two functions, vc4_hdmi_supports_scrambling() and
+vc4_hdmi_mode_needs_scrambling() to determine if we should enable and
+disable the scrambler for any given mode.
+
+Since we might need to disable the controller at boot, we also always
+run vc4_hdmi_disable_scrambling() and thus call those functions without
+a mode yet, which in turns need to make some special casing in order for
+it to work.
+
+Instead of duplicating the check for whether or not we need to take care
+of the scrambler in both vc4_hdmi_enable_scrambling() and
+vc4_hdmi_disable_scrambling(), we can do that check only when we enable
+it and store whether or not it's been enabled in our private structure.
+
+We also need to initialize that flag at true to make sure we disable the
+scrambler at boot since we can't really know its state yet.
+
+This allows to simplify a bit that part of the driver, and removes one
+user of our copy of the CRTC adjusted mode outside of KMS (since
+vc4_hdmi_disable_scrambling() might be called from the hotplug interrupt
+handler).
+
+It also removes our last user of the legacy encoder->crtc pointer.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 22 ++++++++++++----------
+ drivers/gpu/drm/vc4/vc4_hdmi.h | 6 ++++++
+ 2 files changed, 18 insertions(+), 10 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -616,6 +616,8 @@ static void vc4_hdmi_enable_scrambling(s
+ VC5_HDMI_SCRAMBLER_CTL_ENABLE);
+ spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
+
++ vc4_hdmi->scdc_enabled = true;
++
+ queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work,
+ msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
+ }
+@@ -623,22 +625,14 @@ static void vc4_hdmi_enable_scrambling(s
+ static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
+ {
+ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
+- struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
+- struct drm_crtc *crtc = encoder->crtc;
+ unsigned long flags;
+
+ lockdep_assert_held(&vc4_hdmi->mutex);
+
+- /*
+- * At boot, encoder->crtc will be NULL. Since we don't know the
+- * state of the scrambler and in order to avoid any
+- * inconsistency, let's disable it all the time.
+- */
+- if (crtc && !vc4_hdmi_supports_scrambling(encoder, mode))
++ if (!vc4_hdmi->scdc_enabled)
+ return;
+
+- if (crtc && !vc4_hdmi_mode_needs_scrambling(mode))
+- return;
++ vc4_hdmi->scdc_enabled = false;
+
+ if (delayed_work_pending(&vc4_hdmi->scrambling_work))
+ cancel_delayed_work_sync(&vc4_hdmi->scrambling_work);
+@@ -2512,6 +2506,14 @@ static int vc4_hdmi_bind(struct device *
+ vc4_hdmi->pdev = pdev;
+ vc4_hdmi->variant = variant;
+
++ /*
++ * Since we don't know the state of the controller and its
++ * display (if any), let's assume it's always enabled.
++ * vc4_hdmi_disable_scrambling() will thus run at boot, make
++ * sure it's disabled, and avoid any inconsistency.
++ */
++ vc4_hdmi->scdc_enabled = true;
++
+ ret = variant->init_resources(vc4_hdmi);
+ if (ret)
+ return ret;
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
+@@ -210,6 +210,12 @@ struct vc4_hdmi {
+ * Protected by @mutex.
+ */
+ bool output_enabled;
++
++ /**
++ * @scdc_enabled: Is the HDMI controller currently running with
++ * the scrambler on? Protected by @mutex.
++ */
++ bool scdc_enabled;
+ };
+
+ static inline struct vc4_hdmi *