summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/sde/sde_crtc.c32
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder.c3
2 files changed, 23 insertions, 12 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.c b/drivers/gpu/drm/msm/sde/sde_crtc.c
index e4f68a09e37b..f1f5d415a496 100644
--- a/drivers/gpu/drm/msm/sde/sde_crtc.c
+++ b/drivers/gpu/drm/msm/sde/sde_crtc.c
@@ -453,11 +453,13 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
DBG("");
- WARN_ON(sde_crtc->event);
-
- spin_lock_irqsave(&dev->event_lock, flags);
- sde_crtc->event = crtc->state->event;
- spin_unlock_irqrestore(&dev->event_lock, flags);
+ if (sde_crtc->event) {
+ WARN_ON(sde_crtc->event);
+ } else {
+ spin_lock_irqsave(&dev->event_lock, flags);
+ sde_crtc->event = crtc->state->event;
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+ }
/*
* If no CTL has been allocated in sde_crtc_atomic_check(),
@@ -491,15 +493,17 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc,
{
struct sde_crtc *sde_crtc = to_sde_crtc(crtc);
struct drm_device *dev = crtc->dev;
+ struct drm_plane *plane;
unsigned long flags;
- DBG("%s: event: %pK", sde_crtc->name, crtc->state->event);
-
- WARN_ON(sde_crtc->event);
-
- spin_lock_irqsave(&dev->event_lock, flags);
- sde_crtc->event = crtc->state->event;
- spin_unlock_irqrestore(&dev->event_lock, flags);
+ if (sde_crtc->event) {
+ DBG("already received sde_crtc->event");
+ } else {
+ DBG("%s: event: %pK", sde_crtc->name, crtc->state->event);
+ spin_lock_irqsave(&dev->event_lock, flags);
+ sde_crtc->event = crtc->state->event;
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+ }
/*
* If no CTL has been allocated in sde_crtc_atomic_check(),
@@ -512,6 +516,10 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc,
crtc_flush_all(crtc);
request_pending(crtc, PENDING_FLIP);
+
+ drm_atomic_crtc_for_each_plane(plane, crtc) {
+ sde_plane_complete_flip(plane);
+ }
}
static int sde_crtc_set_property(struct drm_crtc *crtc,
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.c b/drivers/gpu/drm/msm/sde/sde_encoder.c
index 1cb68bfb2d65..55c200d9707d 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder.c
@@ -223,6 +223,9 @@ static bool sde_encoder_virt_mode_fixup(struct drm_encoder *drm_enc,
}
}
+ /* Call to populate mode->crtc* information required by framework */
+ drm_mode_set_crtcinfo(adj_mode, 0);
+
return ret;
}