aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0416-drm-vc4-hdmi-Use-the-connector-state-pixel-rate-for-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0416-drm-vc4-hdmi-Use-the-connector-state-pixel-rate-for-.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0416-drm-vc4-hdmi-Use-the-connector-state-pixel-rate-for-.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0416-drm-vc4-hdmi-Use-the-connector-state-pixel-rate-for-.patch b/target/linux/bcm27xx/patches-5.10/950-0416-drm-vc4-hdmi-Use-the-connector-state-pixel-rate-for-.patch
new file mode 100644
index 0000000000..b1de0c29ee
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0416-drm-vc4-hdmi-Use-the-connector-state-pixel-rate-for-.patch
@@ -0,0 +1,102 @@
+From 6d15419acb9914041e90bc88044d87bbcdcfec00 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Tue, 15 Dec 2020 16:42:41 +0100
+Subject: [PATCH] drm/vc4: hdmi: Use the connector state pixel rate for
+ the PHY
+
+The PHY initialisation parameters are not based on the pixel clock but
+the TMDS clock rate which can be the pixel clock in the standard case,
+but could be adjusted based on some parameters like the bits per color.
+
+Since the TMDS clock rate is stored in our custom connector state
+already, let's reuse it from there instead of computing it again.
+
+Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +-
+ drivers/gpu/drm/vc4/vc4_hdmi.h | 11 +++++------
+ drivers/gpu/drm/vc4/vc4_hdmi_phy.c | 8 +++++---
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -761,7 +761,7 @@ static void vc4_hdmi_encoder_pre_crtc_co
+ }
+
+ if (vc4_hdmi->variant->phy_init)
+- vc4_hdmi->variant->phy_init(vc4_hdmi, mode);
++ vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state);
+
+ HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
+ HDMI_READ(HDMI_SCHEDULER_CONTROL) |
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
+@@ -21,10 +21,9 @@ to_vc4_hdmi_encoder(struct drm_encoder *
+ return container_of(encoder, struct vc4_hdmi_encoder, base.base);
+ }
+
+-struct drm_display_mode;
+-
+ struct vc4_hdmi;
+ struct vc4_hdmi_register;
++struct vc4_hdmi_connector_state;
+
+ enum vc4_hdmi_phy_channel {
+ PHY_LANE_0 = 0,
+@@ -77,9 +76,9 @@ struct vc4_hdmi_variant {
+ void (*set_timings)(struct vc4_hdmi *vc4_hdmi,
+ struct drm_display_mode *mode);
+
+- /* Callback to initialize the PHY according to the mode */
++ /* Callback to initialize the PHY according to the connector state */
+ void (*phy_init)(struct vc4_hdmi *vc4_hdmi,
+- struct drm_display_mode *mode);
++ struct vc4_hdmi_connector_state *vc4_conn_state);
+
+ /* Callback to disable the PHY */
+ void (*phy_disable)(struct vc4_hdmi *vc4_hdmi);
+@@ -199,13 +198,13 @@ conn_state_to_vc4_hdmi_conn_state(struct
+ }
+
+ void vc4_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi,
+- struct drm_display_mode *mode);
++ struct vc4_hdmi_connector_state *vc4_conn_state);
+ void vc4_hdmi_phy_disable(struct vc4_hdmi *vc4_hdmi);
+ void vc4_hdmi_phy_rng_enable(struct vc4_hdmi *vc4_hdmi);
+ void vc4_hdmi_phy_rng_disable(struct vc4_hdmi *vc4_hdmi);
+
+ void vc5_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi,
+- struct drm_display_mode *mode);
++ struct vc4_hdmi_connector_state *vc4_conn_state);
+ void vc5_hdmi_phy_disable(struct vc4_hdmi *vc4_hdmi);
+ void vc5_hdmi_phy_rng_enable(struct vc4_hdmi *vc4_hdmi);
+ void vc5_hdmi_phy_rng_disable(struct vc4_hdmi *vc4_hdmi);
+--- a/drivers/gpu/drm/vc4/vc4_hdmi_phy.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi_phy.c
+@@ -127,7 +127,8 @@
+
+ #define OSCILLATOR_FREQUENCY 54000000
+
+-void vc4_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi, struct drm_display_mode *mode)
++void vc4_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi,
++ struct vc4_hdmi_connector_state *conn_state)
+ {
+ /* PHY should be in reset, like
+ * vc4_hdmi_encoder_disable() does.
+@@ -339,11 +340,12 @@ static void vc5_hdmi_reset_phy(struct vc
+ HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL, BIT(10));
+ }
+
+-void vc5_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi, struct drm_display_mode *mode)
++void vc5_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi,
++ struct vc4_hdmi_connector_state *conn_state)
+ {
+ const struct phy_lane_settings *chan0_settings, *chan1_settings, *chan2_settings, *clock_settings;
+ const struct vc4_hdmi_variant *variant = vc4_hdmi->variant;
+- unsigned long long pixel_freq = mode->clock * 1000;
++ unsigned long long pixel_freq = conn_state->pixel_rate;
+ unsigned long long vco_freq;
+ unsigned char word_sel;
+ u8 vco_sel, vco_div;