From: Abhinav Kumar <quic_abhin...@quicinc.com> In preparation of DP MST where link caps are read for the immediate downstream device and the edid is read through sideband messaging, split the msm_dp_panel_read_sink_caps() into two parts which read the link parameters and the edid parts respectively. Also drop the panel drm_edid cached as we actually don't need it.
Signed-off-by: Abhinav Kumar <quic_abhin...@quicinc.com> Signed-off-by: Yongxing Mou <quic_yong...@quicinc.com> --- drivers/gpu/drm/msm/dp/dp_display.c | 13 +++++---- drivers/gpu/drm/msm/dp/dp_panel.c | 55 ++++++++++++++++++++----------------- drivers/gpu/drm/msm/dp/dp_panel.h | 6 ++-- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index 6f05a939ce9e648e9601597155999b6f85adfcff..4a9b65647cdef1ed6c3bb851f93df0db8be977af 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -389,7 +389,11 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) dp->link->lttpr_count = msm_dp_display_lttpr_init(dp, dpcd); - rc = msm_dp_panel_read_sink_caps(dp->panel, connector); + rc = msm_dp_panel_read_link_caps(dp->panel); + if (rc) + goto end; + + rc = msm_dp_panel_read_edid(dp->panel, connector); if (rc) goto end; @@ -720,7 +724,6 @@ static int msm_dp_irq_hpd_handle(struct msm_dp_display_private *dp, u32 data) static void msm_dp_display_deinit_sub_modules(struct msm_dp_display_private *dp) { msm_dp_audio_put(dp->audio); - msm_dp_panel_put(dp->panel); msm_dp_aux_put(dp->aux); } @@ -783,7 +786,7 @@ static int msm_dp_init_sub_modules(struct msm_dp_display_private *dp) rc = PTR_ERR(dp->ctrl); DRM_ERROR("failed to initialize ctrl, rc = %d\n", rc); dp->ctrl = NULL; - goto error_ctrl; + goto error_link; } dp->audio = msm_dp_audio_get(dp->msm_dp_display.pdev, dp->catalog); @@ -791,13 +794,11 @@ static int msm_dp_init_sub_modules(struct msm_dp_display_private *dp) rc = PTR_ERR(dp->audio); pr_err("failed to initialize audio, rc = %d\n", rc); dp->audio = NULL; - goto error_ctrl; + goto error_link; } return rc; -error_ctrl: - msm_dp_panel_put(dp->panel); error_link: msm_dp_aux_put(dp->aux); error: diff --git a/drivers/gpu/drm/msm/dp/dp_panel.c b/drivers/gpu/drm/msm/dp/dp_panel.c index 4e8ab75c771b1e3a2d62f75e9993e1062118482b..d9041e235104a74b3cc50ff2e307eae0c4301ef3 100644 --- a/drivers/gpu/drm/msm/dp/dp_panel.c +++ b/drivers/gpu/drm/msm/dp/dp_panel.c @@ -118,14 +118,13 @@ static u32 msm_dp_panel_get_supported_bpp(struct msm_dp_panel *msm_dp_panel, return min_supported_bpp; } -int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel, - struct drm_connector *connector) +int msm_dp_panel_read_link_caps(struct msm_dp_panel *msm_dp_panel) { int rc, bw_code; int count; struct msm_dp_panel_private *panel; - if (!msm_dp_panel || !connector) { + if (!msm_dp_panel) { DRM_ERROR("invalid input\n"); return -EINVAL; } @@ -160,26 +159,29 @@ int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel, rc = drm_dp_read_downstream_info(panel->aux, msm_dp_panel->dpcd, msm_dp_panel->downstream_ports); - if (rc) - return rc; + return rc; +} - drm_edid_free(msm_dp_panel->drm_edid); +int msm_dp_panel_read_edid(struct msm_dp_panel *msm_dp_panel, struct drm_connector *connector) +{ + struct msm_dp_panel_private *panel; + const struct drm_edid *drm_edid; + + panel = container_of(msm_dp_panel, struct msm_dp_panel_private, msm_dp_panel); - msm_dp_panel->drm_edid = drm_edid_read_ddc(connector, &panel->aux->ddc); + drm_edid = drm_edid_read_ddc(connector, &panel->aux->ddc); - drm_edid_connector_update(connector, msm_dp_panel->drm_edid); + drm_edid_connector_update(connector, drm_edid); - if (!msm_dp_panel->drm_edid) { + if (!drm_edid) { DRM_ERROR("panel edid read failed\n"); /* check edid read fail is due to unplug */ if (!msm_dp_catalog_link_is_connected(panel->catalog)) { - rc = -ETIMEDOUT; - goto end; + return -ETIMEDOUT; } } -end: - return rc; + return 0; } u32 msm_dp_panel_get_mode_bpp(struct msm_dp_panel *msm_dp_panel, @@ -208,15 +210,20 @@ u32 msm_dp_panel_get_mode_bpp(struct msm_dp_panel *msm_dp_panel, int msm_dp_panel_get_modes(struct msm_dp_panel *msm_dp_panel, struct drm_connector *connector) { + struct msm_dp_panel_private *panel; + const struct drm_edid *drm_edid; + if (!msm_dp_panel) { DRM_ERROR("invalid input\n"); return -EINVAL; } - if (msm_dp_panel->drm_edid) - return drm_edid_connector_add_modes(connector); + panel = container_of(msm_dp_panel, struct msm_dp_panel_private, msm_dp_panel); + + drm_edid = drm_edid_read_ddc(connector, &panel->aux->ddc); + drm_edid_connector_update(connector, drm_edid); - return 0; + return drm_edid_connector_add_modes(connector); } static u8 msm_dp_panel_get_edid_checksum(const struct edid *edid) @@ -229,6 +236,7 @@ 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) { struct msm_dp_panel_private *panel; + const struct drm_edid *drm_edid; if (!msm_dp_panel) { DRM_ERROR("invalid input\n"); @@ -238,8 +246,13 @@ void msm_dp_panel_handle_sink_request(struct msm_dp_panel *msm_dp_panel) panel = container_of(msm_dp_panel, struct msm_dp_panel_private, msm_dp_panel); if (panel->link->sink_request & DP_TEST_LINK_EDID_READ) { + drm_edid = drm_edid_read_ddc(msm_dp_panel->connector, &panel->aux->ddc); + + if (!drm_edid) + return; + /* FIXME: get rid of drm_edid_raw() */ - const struct edid *edid = drm_edid_raw(msm_dp_panel->drm_edid); + const struct edid *edid = drm_edid_raw(drm_edid); u8 checksum; if (edid) @@ -515,11 +528,3 @@ struct msm_dp_panel *msm_dp_panel_get(struct device *dev, struct drm_dp_aux *aux return msm_dp_panel; } - -void msm_dp_panel_put(struct msm_dp_panel *msm_dp_panel) -{ - if (!msm_dp_panel) - return; - - drm_edid_free(msm_dp_panel->drm_edid); -} diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h index 4906f4f09f2451cfed3c1007f38b4db7dfdb1d90..7f139478e1012d5b8f1f745f0de5fc3943745428 100644 --- a/drivers/gpu/drm/msm/dp/dp_panel.h +++ b/drivers/gpu/drm/msm/dp/dp_panel.h @@ -32,7 +32,6 @@ struct msm_dp_panel { u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; struct msm_dp_link_info link_info; - const struct drm_edid *drm_edid; struct drm_connector *connector; struct msm_dp_display_mode msm_dp_mode; struct msm_dp_panel_psr psr_cap; @@ -51,7 +50,9 @@ int msm_dp_panel_timing_cfg(struct msm_dp_panel *msm_dp_panel); int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel, struct drm_connector *connector); u32 msm_dp_panel_get_mode_bpp(struct msm_dp_panel *msm_dp_panel, u32 mode_max_bpp, - u32 mode_pclk_khz); + u32 mode_pclk_khz); +int msm_dp_panel_read_link_caps(struct msm_dp_panel *dp_panel); +int msm_dp_panel_read_edid(struct msm_dp_panel *dp_panel, struct drm_connector *connector); int msm_dp_panel_get_modes(struct msm_dp_panel *msm_dp_panel, struct drm_connector *connector); void msm_dp_panel_handle_sink_request(struct msm_dp_panel *msm_dp_panel); @@ -86,5 +87,4 @@ static inline bool is_lane_count_valid(u32 lane_count) struct msm_dp_panel *msm_dp_panel_get(struct device *dev, struct drm_dp_aux *aux, struct msm_dp_link *link, struct msm_dp_catalog *catalog); -void msm_dp_panel_put(struct msm_dp_panel *msm_dp_panel); #endif /* _DP_PANEL_H_ */ -- 2.34.1