From 16cc165833aed30d3227efa9ac6de4a8b9d9d944 Mon Sep 17 00:00:00 2001 From: Samantha Tran Date: Thu, 30 Jul 2020 16:52:19 -0700 Subject: [PATCH] disp: msm: obtain bridge from bridge chain Commit 05193dc38197 ("drm/bridge: Make the bridge chain a double-linked list") creates a bridge chain linked list. This change updates the relevant changes to msm driver to use the list to find the bridge associated to the encoder. Change-Id: I59eb2910be96f4fff7bdbeb040d6ad204c41d747 Signed-off-by: Samantha Tran Signed-off-by: Nilaan Gunabalachandran --- msm/dp/dp_drm.c | 4 ---- msm/dp/dp_mst_drm.c | 20 +++++++++++++++----- msm/dsi/dsi_display.c | 2 +- msm/dsi/dsi_drm.c | 12 +++++++----- msm/msm_atomic.c | 18 +++++++++++++----- msm/sde/sde_encoder.c | 10 ++++------ 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/msm/dp/dp_drm.c b/msm/dp/dp_drm.c index f1e870af08..482b645fe0 100644 --- a/msm/dp/dp_drm.c +++ b/msm/dp/dp_drm.c @@ -628,7 +628,6 @@ int dp_drm_bridge_init(void *data, struct drm_encoder *encoder, goto error_free_bridge; } - encoder->bridge = &bridge->base; priv->bridges[priv->num_bridges++] = &bridge->base; display->bridge = bridge; display->max_mixer_count = max_mixer_count; @@ -646,9 +645,6 @@ void dp_drm_bridge_deinit(void *data) struct dp_display *display = data; struct dp_bridge *bridge = display->bridge; - if (bridge && bridge->base.encoder) - bridge->base.encoder->bridge = NULL; - kfree(bridge); } diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c index 7cc03cfd27..316724d435 100644 --- a/msm/dp/dp_mst_drm.c +++ b/msm/dp/dp_mst_drm.c @@ -1300,7 +1300,6 @@ int dp_mst_drm_bridge_init(void *data, struct drm_encoder *encoder) goto end; } - encoder->bridge = &bridge->base; priv->bridges[priv->num_bridges++] = &bridge->base; state = kzalloc(sizeof(*state), GFP_KERNEL); @@ -1604,6 +1603,7 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector, struct drm_crtc_state *crtc_state; struct dp_mst_bridge *bridge; struct dp_mst_bridge_state *bridge_state; + struct drm_bridge *drm_bridge; struct dp_display *dp_display = display; struct dp_mst_private *mst = dp_display->dp_mst_prv_info; struct sde_connector *c_conn = to_sde_connector(connector); @@ -1642,8 +1642,13 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector, goto end; } - bridge = to_dp_mst_bridge( - old_conn_state->best_encoder->bridge); + drm_bridge = drm_bridge_chain_get_first_bridge( + old_conn_state->best_encoder); + if (WARN_ON(!drm_bridge)) { + rc = -EINVAL; + goto end; + } + bridge = to_dp_mst_bridge(drm_bridge); bridge_state = dp_mst_get_bridge_atomic_state(state, bridge); if (IS_ERR(bridge_state)) { @@ -1691,8 +1696,13 @@ mode_set: goto end; } - bridge = to_dp_mst_bridge( - new_conn_state->best_encoder->bridge); + drm_bridge = drm_bridge_chain_get_first_bridge( + new_conn_state->best_encoder); + if (WARN_ON(!drm_bridge)) { + rc = -EINVAL; + goto end; + } + bridge = to_dp_mst_bridge(drm_bridge); bridge_state = dp_mst_get_bridge_atomic_state(state, bridge); if (IS_ERR(bridge_state)) { diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 950fbe4572..5ff0f43c1c 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -6381,7 +6381,7 @@ int dsi_display_drm_ext_bridge_init(struct dsi_display *display, return -EINVAL; drm = encoder->dev; - bridge = encoder->bridge; + bridge = drm_bridge_chain_get_first_bridge(encoder); sde_conn = to_sde_connector(connector); prev_bridge = bridge; diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index 8adea12ae8..44d5e4c5c9 100644 --- a/msm/dsi/dsi_drm.c +++ b/msm/dsi/dsi_drm.c @@ -1023,6 +1023,7 @@ int dsi_conn_post_kickoff(struct drm_connector *connector, struct msm_display_conn_params *params) { struct drm_encoder *encoder; + struct drm_bridge *bridge; struct dsi_bridge *c_bridge; struct dsi_display_mode adj_mode; struct dsi_display *display; @@ -1042,7 +1043,12 @@ int dsi_conn_post_kickoff(struct drm_connector *connector, return 0; } - c_bridge = to_dsi_bridge(encoder->bridge); + bridge = drm_bridge_chain_get_first_bridge(encoder); + if (!bridge) { + DSI_DEBUG("bridge is not available\n"); + return 0; + } + c_bridge = to_dsi_bridge(bridge); adj_mode = c_bridge->dsi_mode; display = c_bridge->display; dyn_clk_caps = &(display->panel->dyn_clk_caps); @@ -1123,7 +1129,6 @@ struct dsi_bridge *dsi_drm_bridge_init(struct dsi_display *display, goto error_free_bridge; } - encoder->bridge = &bridge->base; return bridge; error_free_bridge: kfree(bridge); @@ -1133,9 +1138,6 @@ error: void dsi_drm_bridge_cleanup(struct dsi_bridge *bridge) { - if (bridge && bridge->base.encoder) - bridge->base.encoder->bridge = NULL; - kfree(bridge); } diff --git a/msm/msm_atomic.c b/msm/msm_atomic.c index 6bddb33d98..b87c97300f 100644 --- a/msm/msm_atomic.c +++ b/msm/msm_atomic.c @@ -156,6 +156,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) old_conn_state, i) { const struct drm_encoder_helper_funcs *funcs; struct drm_encoder *encoder; + struct drm_bridge *bridge; /* * Shut down everything that's in the changeset and currently @@ -191,7 +192,8 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) * Each encoder has at most one connector (since we always steal * it away), so we won't call disable hooks twice. */ - drm_bridge_disable(encoder->bridge); + bridge = drm_bridge_chain_get_first_bridge(encoder); + drm_bridge_chain_disable(bridge); /* Right function depends upon target state. */ if (connector->state->crtc && funcs->prepare) @@ -201,7 +203,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) else funcs->dpms(encoder, DRM_MODE_DPMS_OFF); - drm_bridge_post_disable(encoder->bridge); + drm_bridge_chain_post_disable(bridge); } for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) { @@ -264,6 +266,7 @@ msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) struct drm_crtc_state *new_crtc_state; struct drm_encoder *encoder; struct drm_display_mode *mode, *adjusted_mode; + struct drm_bridge *bridge; if (!connector->state->best_encoder) continue; @@ -294,7 +297,8 @@ msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) if (funcs->mode_set) funcs->mode_set(encoder, mode, adjusted_mode); - drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); + bridge = drm_bridge_chain_get_first_bridge(encoder); + drm_bridge_chain_mode_set(bridge, mode, adjusted_mode); SDE_ATRACE_END("msm_set_mode"); } } @@ -388,6 +392,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, const struct drm_encoder_helper_funcs *funcs; struct drm_encoder *encoder; struct drm_connector_state *old_conn_state; + struct drm_bridge *bridge; if (!new_conn_state->best_encoder) continue; @@ -412,7 +417,8 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, * Each encoder has at most one connector (since we always steal * it away), so we won't call enable hooks twice. */ - drm_bridge_pre_enable(encoder->bridge); + bridge = drm_bridge_chain_get_first_bridge(encoder); + drm_bridge_chain_pre_enable(bridge); ++bridge_enable_count; if (funcs->enable) @@ -436,6 +442,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, new_conn_state, i) { struct drm_encoder *encoder; struct drm_connector_state *old_conn_state; + struct drm_bridge *bridge; if (!new_conn_state->best_encoder) continue; @@ -455,7 +462,8 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, DRM_DEBUG_ATOMIC("bridge enable enabling [ENCODER:%d:%s]\n", encoder->base.id, encoder->name); - drm_bridge_enable(encoder->bridge); + bridge = drm_bridge_chain_get_first_bridge(encoder); + drm_bridge_chain_enable(bridge); } SDE_ATRACE_END("msm_enable"); } diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index dcce678ba6..6a3af98a15 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -5218,6 +5218,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder, struct sde_connector_state *sde_conn_state = NULL; struct drm_display_mode *drm_mode = NULL; struct sde_encoder_phys *phys_enc; + struct drm_bridge *bridge; int ret = 0, i; if (!encoder) { @@ -5318,7 +5319,8 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder, drm_mode->hdisplay, drm_mode->vdisplay); drm_set_preferred_mode(conn, drm_mode->hdisplay, drm_mode->vdisplay); - if (encoder->bridge) { + bridge = drm_bridge_chain_get_first_bridge(encoder); + if (bridge) { SDE_DEBUG_ENC(sde_enc, "Bridge mapped to encoder\n"); /* * For cont-splash use case, we update the mode @@ -5328,11 +5330,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder, * be updated with the current drm mode by * calling the bridge mode set ops. */ - if (encoder->bridge->funcs) { - SDE_DEBUG_ENC(sde_enc, "calling mode_set\n"); - encoder->bridge->funcs->mode_set(encoder->bridge, - drm_mode, drm_mode); - } + drm_bridge_chain_mode_set(bridge, drm_mode, drm_mode); } else { SDE_ERROR_ENC(sde_enc, "No bridge attached to encoder\n"); }