struct msm_dp_panel kept its own copy of the drm_connector, a plain alias
of msm_dp.connector assigned once in msm_dp_modeset_init(). It was only
dereferenced in three places, each of which either already has a
connector at hand or is reached from a caller that does:

 - msm_dp_display_set_mode() runs from the .atomic_enable bridge
   callback, which can fetch the connector from the atomic state;
 - msm_dp_display_get_modes() is called from the .get_modes bridge
   callback, which is passed the connector;
 - msm_dp_panel_handle_sink_request() is called from
   msm_dp_display_process_hpd_high(), which holds the connector.

Pass the connector down to those functions and drop the duplicate field.

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Dmitry Baryshkov <[email protected]>
---
 drivers/gpu/drm/msm/dp/dp_display.c | 27 +++++++++++----------------
 drivers/gpu/drm/msm/dp/dp_display.h |  3 ++-
 drivers/gpu/drm/msm/dp/dp_drm.c     |  2 +-
 drivers/gpu/drm/msm/dp/dp_panel.c   |  5 +++--
 drivers/gpu/drm/msm/dp/dp_panel.h   |  4 ++--
 5 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 7f55cace596f..461420a72820 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -304,7 +304,7 @@ static int msm_dp_display_process_hpd_high(struct 
msm_dp_display_private *dp)
        dp->msm_dp_display.psr_supported = dp->panel->psr_cap.version && 
psr_enabled;
 
        dp->audio_supported = info->has_audio;
-       msm_dp_panel_handle_sink_request(dp->panel, drm_edid);
+       msm_dp_panel_handle_sink_request(dp->panel, drm_edid, connector);
 
        /*
         * set sink to normal operation mode -- D0
@@ -600,7 +600,8 @@ static int msm_dp_init_sub_modules(struct 
msm_dp_display_private *dp)
 
 static int msm_dp_display_set_mode(struct msm_dp *msm_dp_display,
                                   const struct drm_display_mode *adjusted_mode,
-                                  struct msm_dp_panel *msm_dp_panel)
+                                  struct msm_dp_panel *msm_dp_panel,
+                                  struct drm_connector *connector)
 {
        struct msm_dp_display_private *dp;
        u32 bpp;
@@ -611,7 +612,7 @@ static int msm_dp_display_set_mode(struct msm_dp 
*msm_dp_display,
        if (msm_dp_display_check_video_test(msm_dp_display))
                bpp = msm_dp_display_get_test_bpp(msm_dp_display);
        else
-               bpp = msm_dp_panel->connector->display_info.bpc * 3;
+               bpp = connector->display_info.bpc * 3;
 
        msm_dp_panel->msm_dp_mode.bpp = bpp ? bpp : 24; /* Default bpp */
        msm_dp_panel->msm_dp_mode.v_active_low =
@@ -619,7 +620,7 @@ static int msm_dp_display_set_mode(struct msm_dp 
*msm_dp_display,
        msm_dp_panel->msm_dp_mode.h_active_low =
                !!(adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC);
        msm_dp_panel->msm_dp_mode.out_fmt_is_yuv_420 =
-               drm_mode_is_420_only(&msm_dp_panel->connector->display_info, 
adjusted_mode) &&
+               drm_mode_is_420_only(&connector->display_info, adjusted_mode) &&
                msm_dp_panel->vsc_sdp_supported;
        msm_dp_panel_init_panel_info(msm_dp_panel);
 
@@ -769,18 +770,14 @@ enum drm_mode_status msm_dp_bridge_mode_valid(struct 
drm_bridge *bridge,
        return MODE_OK;
 }
 
-int msm_dp_display_get_modes(struct msm_dp *dp)
+int msm_dp_display_get_modes(struct msm_dp *dp, struct drm_connector 
*connector)
 {
-       struct msm_dp_display_private *msm_dp_display;
-
        if (!dp) {
                DRM_ERROR("invalid params\n");
                return 0;
        }
 
-       msm_dp_display = container_of(dp, struct msm_dp_display_private, 
msm_dp_display);
-
-       return drm_edid_connector_add_modes(msm_dp_display->panel->connector);
+       return drm_edid_connector_add_modes(connector);
 }
 
 bool msm_dp_display_check_video_test(struct msm_dp *dp)
@@ -1350,13 +1347,10 @@ static int msm_dp_modeset_init(struct msm_display 
*display,
                               struct drm_device *dev, struct drm_encoder 
*encoder)
 {
        struct msm_dp *msm_dp_display = container_of(display, struct msm_dp, 
display);
-       struct msm_dp_display_private *msm_dp_priv;
        int ret;
 
        msm_dp_display->drm_dev = dev;
 
-       msm_dp_priv = container_of(msm_dp_display, struct 
msm_dp_display_private, msm_dp_display);
-
        ret = msm_dp_bridge_init(msm_dp_display, dev, encoder);
        if (ret) {
                DRM_DEV_ERROR(dev->dev,
@@ -1373,8 +1367,6 @@ static int msm_dp_modeset_init(struct msm_display 
*display,
                return ret;
        }
 
-       msm_dp_priv->panel->connector = msm_dp_display->connector;
-
        return 0;
 }
 
@@ -1438,9 +1430,12 @@ void msm_dp_bridge_atomic_pre_enable(struct drm_bridge 
*drm_bridge,
        struct msm_dp_display_private *msm_dp_display;
        struct drm_crtc *crtc;
        struct drm_crtc_state *crtc_state;
+       struct drm_connector *connector;
 
        msm_dp_display = container_of(dp, struct msm_dp_display_private, 
msm_dp_display);
 
+       connector = drm_atomic_get_new_connector_for_encoder(state, 
drm_bridge->encoder);
+
        crtc = drm_atomic_get_new_crtc_for_encoder(state, drm_bridge->encoder);
        if (!crtc)
                return;
@@ -1451,7 +1446,7 @@ void msm_dp_bridge_atomic_pre_enable(struct drm_bridge 
*drm_bridge,
         * state and runs before the bridge's .atomic_enable(), so the mode must
         * be programmed here, in .atomic_pre_enable().
         */
-       msm_dp_display_set_mode(dp, &crtc_state->adjusted_mode, 
msm_dp_display->panel);
+       msm_dp_display_set_mode(dp, &crtc_state->adjusted_mode, 
msm_dp_display->panel, connector);
 }
 
 void msm_dp_bridge_atomic_enable(struct drm_bridge *drm_bridge,
diff --git a/drivers/gpu/drm/msm/dp/dp_display.h 
b/drivers/gpu/drm/msm/dp/dp_display.h
index 8c34a473c7db..f1523dbe33d5 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.h
+++ b/drivers/gpu/drm/msm/dp/dp_display.h
@@ -28,7 +28,8 @@ struct msm_dp {
        bool psr_supported;
 };
 
-int msm_dp_display_get_modes(struct msm_dp *msm_dp_display);
+int msm_dp_display_get_modes(struct msm_dp *msm_dp_display,
+                            struct drm_connector *connector);
 bool msm_dp_display_check_video_test(struct msm_dp *msm_dp_display);
 int msm_dp_display_get_test_bpp(struct msm_dp *msm_dp_display);
 void msm_dp_display_signal_audio_start(struct msm_dp *msm_dp_display);
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index da005babe411..8dbe7d682ddf 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -32,7 +32,7 @@ static int msm_dp_bridge_get_modes(struct drm_bridge *bridge, 
struct drm_connect
        dp = to_dp_bridge(bridge)->msm_dp_display;
 
        /* pluggable case assumes EDID is read when HPD */
-       rc = msm_dp_display_get_modes(dp);
+       rc = msm_dp_display_get_modes(dp, connector);
        if (rc <= 0) {
                DRM_ERROR("failed to get DP sink modes, rc=%d\n", rc);
                return rc;
diff --git a/drivers/gpu/drm/msm/dp/dp_panel.c 
b/drivers/gpu/drm/msm/dp/dp_panel.c
index bde4a772d22c..30a44e7e8e62 100644
--- a/drivers/gpu/drm/msm/dp/dp_panel.c
+++ b/drivers/gpu/drm/msm/dp/dp_panel.c
@@ -305,7 +305,8 @@ static u8 msm_dp_panel_get_edid_checksum(const struct edid 
*edid)
 }
 
 void msm_dp_panel_handle_sink_request(struct msm_dp_panel *msm_dp_panel,
-                                     const struct drm_edid *drm_edid)
+                                     const struct drm_edid *drm_edid,
+                                     struct drm_connector *connector)
 {
        struct msm_dp_panel_private *panel;
 
@@ -324,7 +325,7 @@ void msm_dp_panel_handle_sink_request(struct msm_dp_panel 
*msm_dp_panel,
                if (edid)
                        checksum = msm_dp_panel_get_edid_checksum(edid);
                else
-                       checksum = msm_dp_panel->connector->real_edid_checksum;
+                       checksum = connector->real_edid_checksum;
 
                msm_dp_link_send_edid_checksum(panel->link, checksum);
                msm_dp_link_send_test_response(panel->link);
diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h 
b/drivers/gpu/drm/msm/dp/dp_panel.h
index 53b7b4463551..f73e11e57ced 100644
--- a/drivers/gpu/drm/msm/dp/dp_panel.h
+++ b/drivers/gpu/drm/msm/dp/dp_panel.h
@@ -33,7 +33,6 @@ struct msm_dp_panel {
        u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
 
        struct msm_dp_link_info link_info;
-       struct drm_connector *connector;
        struct msm_dp_display_mode msm_dp_mode;
        struct msm_dp_panel_psr psr_cap;
        bool video_test;
@@ -51,7 +50,8 @@ int msm_dp_panel_read_link_caps(struct msm_dp_panel 
*msm_dp_panel,
 u32 msm_dp_panel_get_mode_bpp(struct msm_dp_panel *msm_dp_panel, u32 
mode_max_bpp,
                        u32 mode_pclk_khz);
 void msm_dp_panel_handle_sink_request(struct msm_dp_panel *msm_dp_panel,
-                                     const struct drm_edid *drm_edid);
+                                     const struct drm_edid *drm_edid,
+                                     struct drm_connector *connector);
 void msm_dp_panel_tpg_config(struct msm_dp_panel *msm_dp_panel, bool enable);
 
 void msm_dp_panel_clear_dsc_dto(struct msm_dp_panel *msm_dp_panel);

-- 
2.47.3

Reply via email to