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
