drm/msm/hdmi: program HDMI timings during atomic_pre_enable
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Wed, 26 Feb 2025 08:59:25 +0000 (10:59 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Wed, 5 Mar 2025 02:34:12 +0000 (04:34 +0200)
The mode_set callback is deprecated, it doesn't get the
drm_bridge_state, just mode-related argumetns. Also Abhinav pointed out
that HDMI timings should be programmed before setting up HDMI PHY and
PLL. Rework the code to program HDMI timings at the start of
atomic_pre_enable().

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/639652/
Link: https://lore.kernel.org/r/20250226-bridge-hdmi-connector-v8-2-340af24b35cc@linaro.org
drivers/gpu/drm/msm/hdmi/hdmi_bridge.c

index 457364ebcad7dc8fc0e28523116be65417c5b487..64e9605f9e3bb58c6652b9e0746b3be3039bf31e 100644 (file)
@@ -126,15 +126,28 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi)
        hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val);
 }
 
+static void msm_hdmi_set_timings(struct hdmi *hdmi,
+                                const struct drm_display_mode *mode);
+
 static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge,
                                              struct drm_atomic_state *state)
 {
        struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
        struct hdmi *hdmi = hdmi_bridge->hdmi;
        struct hdmi_phy *phy = hdmi->phy;
+       struct drm_encoder *encoder = bridge->encoder;
+       struct drm_connector *connector;
+       struct drm_connector_state *conn_state;
+       struct drm_crtc_state *crtc_state;
 
        DBG("power up");
 
+       connector = drm_atomic_get_new_connector_for_encoder(state, encoder);
+       conn_state = drm_atomic_get_new_connector_state(state, connector);
+       crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
+
+       msm_hdmi_set_timings(hdmi, &crtc_state->adjusted_mode);
+
        if (!hdmi->power_on) {
                msm_hdmi_phy_resource_enable(phy);
                msm_hdmi_power_on(bridge);
@@ -177,17 +190,12 @@ static void msm_hdmi_bridge_atomic_post_disable(struct drm_bridge *bridge,
        }
 }
 
-static void msm_hdmi_bridge_mode_set(struct drm_bridge *bridge,
-                const struct drm_display_mode *mode,
-                const struct drm_display_mode *adjusted_mode)
+static void msm_hdmi_set_timings(struct hdmi *hdmi,
+                                const struct drm_display_mode *mode)
 {
-       struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
-       struct hdmi *hdmi = hdmi_bridge->hdmi;
        int hstart, hend, vstart, vend;
        uint32_t frame_ctrl;
 
-       mode = adjusted_mode;
-
        hdmi->pixclock = mode->clock * 1000;
 
        hstart = mode->htotal - mode->hsync_start;
@@ -306,7 +314,6 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = {
        .atomic_reset = drm_atomic_helper_bridge_reset,
        .atomic_pre_enable = msm_hdmi_bridge_atomic_pre_enable,
        .atomic_post_disable = msm_hdmi_bridge_atomic_post_disable,
-       .mode_set = msm_hdmi_bridge_mode_set,
        .mode_valid = msm_hdmi_bridge_mode_valid,
        .edid_read = msm_hdmi_bridge_edid_read,
        .detect = msm_hdmi_bridge_detect,