aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0011-drm-vc4-hdmi-Introduce-an-output_enabled-flag.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0011-drm-vc4-hdmi-Introduce-an-output_enabled-flag.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0011-drm-vc4-hdmi-Introduce-an-output_enabled-flag.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0011-drm-vc4-hdmi-Introduce-an-output_enabled-flag.patch b/target/linux/bcm27xx/patches-5.15/950-0011-drm-vc4-hdmi-Introduce-an-output_enabled-flag.patch
new file mode 100644
index 0000000000..616cfd54d1
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0011-drm-vc4-hdmi-Introduce-an-output_enabled-flag.patch
@@ -0,0 +1,78 @@
+From 02631cb4e30d7bc46f2b30657a84ddeb65831798 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Tue, 19 Oct 2021 17:31:58 +0200
+Subject: [PATCH] drm/vc4: hdmi: Introduce an output_enabled flag
+
+We currently poke at encoder->crtc in the ALSA code path to determine
+whether the HDMI output is enabled or not, and thus whether we should
+allow the audio output.
+
+However, that pointer is deprecated and shouldn't really be used by
+atomic drivers anymore. Since we have the infrastructure in place now,
+let's just create a flag that we toggle to report whether the controller
+is currently enabled and use that instead of encoder->crtc in ALSA.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 16 ++++++++++++----
+ drivers/gpu/drm/vc4/vc4_hdmi.h | 6 ++++++
+ 2 files changed, 18 insertions(+), 4 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -725,6 +725,11 @@ static void vc4_hdmi_encoder_post_crtc_p
+
+ static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder)
+ {
++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
++
++ mutex_lock(&vc4_hdmi->mutex);
++ vc4_hdmi->output_enabled = false;
++ mutex_unlock(&vc4_hdmi->mutex);
+ }
+
+ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
+@@ -1218,6 +1223,11 @@ static void vc4_hdmi_encoder_post_crtc_e
+
+ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
+ {
++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
++
++ mutex_lock(&vc4_hdmi->mutex);
++ vc4_hdmi->output_enabled = true;
++ mutex_unlock(&vc4_hdmi->mutex);
+ }
+
+ static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder,
+@@ -1399,14 +1409,12 @@ static inline struct vc4_hdmi *dai_to_hd
+
+ static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi)
+ {
+- struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
+-
+ lockdep_assert_held(&vc4_hdmi->mutex);
+
+ /*
+- * The encoder doesn't have a CRTC until the first modeset.
++ * If the controller is disabled, prevent any ALSA output.
+ */
+- if (!encoder->crtc)
++ if (!vc4_hdmi->output_enabled)
+ return false;
+
+ /*
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
+@@ -204,6 +204,12 @@ struct vc4_hdmi {
+ * for use by ALSA hooks and interrupt handlers. Protected by @mutex.
+ */
+ struct drm_display_mode saved_adjusted_mode;
++
++ /**
++ * @output_enabled: Is the HDMI controller currently active?
++ * Protected by @mutex.
++ */
++ bool output_enabled;
+ };
+
+ static inline struct vc4_hdmi *