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 <samtran@codeaurora.org> Signed-off-by: Nilaan Gunabalachandran <ngunabal@codeaurora.org>
Этот коммит содержится в:

коммит произвёл
orion brody

родитель
4b150347fc
Коммит
16cc165833
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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)) {
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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");
|
||||
}
|
||||
|
@@ -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");
|
||||
}
|
||||
|
Ссылка в новой задаче
Block a user