summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/msm_atomic.c32
-rw-r--r--drivers/gpu/drm/msm/msm_kms.h7
2 files changed, 36 insertions, 3 deletions
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
index 4c20137f0791..f3dc6b33febb 100644
--- a/drivers/gpu/drm/msm/msm_atomic.c
+++ b/drivers/gpu/drm/msm/msm_atomic.c
@@ -307,13 +307,16 @@ void msm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
* and do the plane commits at the end. This is useful for drivers doing runtime
* PM since planes updates then only happen when the CRTC is actually enabled.
*/
-void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
+static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
struct drm_atomic_state *old_state)
{
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
+ struct msm_drm_private *priv = dev->dev_private;
+ struct msm_kms *kms = priv->kms;
+ int bridge_enable_count = 0;
int i;
for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
@@ -369,11 +372,38 @@ void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
* it away), so we won't call enable hooks twice.
*/
drm_bridge_pre_enable(encoder->bridge);
+ ++bridge_enable_count;
if (funcs->enable)
funcs->enable(encoder);
else
funcs->commit(encoder);
+ }
+
+ if (kms->funcs->commit) {
+ DRM_DEBUG_ATOMIC("triggering commit\n");
+ kms->funcs->commit(kms, old_state);
+ }
+
+ /* If no bridges were pre_enabled, skip iterating over them again */
+ if (bridge_enable_count == 0)
+ return;
+
+ for_each_connector_in_state(old_state, connector, old_conn_state, i) {
+ struct drm_encoder *encoder;
+
+ if (!connector->state->best_encoder)
+ continue;
+
+ if (!connector->state->crtc->state->active ||
+ !drm_atomic_crtc_needs_modeset(
+ connector->state->crtc->state))
+ continue;
+
+ encoder = connector->state->best_encoder;
+
+ DRM_DEBUG_ATOMIC("bridge enable enabling [ENCODER:%d:%s]\n",
+ encoder->base.id, encoder->name);
drm_bridge_enable(encoder->bridge);
}
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
index 63c5c8b1ca10..e6f1cad16850 100644
--- a/drivers/gpu/drm/msm/msm_kms.h
+++ b/drivers/gpu/drm/msm/msm_kms.h
@@ -50,8 +50,11 @@ struct msm_kms_funcs {
int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
/* modeset, bracketing atomic_commit(): */
- void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
- void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
+ void (*prepare_commit)(struct msm_kms *kms,
+ struct drm_atomic_state *state);
+ void (*commit)(struct msm_kms *kms, struct drm_atomic_state *state);
+ void (*complete_commit)(struct msm_kms *kms,
+ struct drm_atomic_state *state);
/* functions to wait for atomic commit completed on each CRTC */
void (*wait_for_crtc_commit_done)(struct msm_kms *kms,
struct drm_crtc *crtc);