|
@@ -22,7 +22,6 @@
|
|
|
|
|
|
struct armada_frame_work {
|
|
|
struct armada_plane_work work;
|
|
|
- struct drm_pending_vblank_event *event;
|
|
|
struct armada_regs regs[4];
|
|
|
};
|
|
|
|
|
@@ -220,15 +219,24 @@ static void armada_drm_plane_work_call(struct armada_crtc *dcrtc,
|
|
|
void (*fn)(struct armada_crtc *, struct armada_plane_work *))
|
|
|
{
|
|
|
struct armada_plane *dplane = drm_to_armada_plane(work->plane);
|
|
|
+ struct drm_pending_vblank_event *event = work->event;
|
|
|
struct drm_framebuffer *fb = work->old_fb;
|
|
|
|
|
|
if (fn)
|
|
|
fn(dcrtc, work);
|
|
|
drm_crtc_vblank_put(&dcrtc->crtc);
|
|
|
|
|
|
- /* Finally, queue the process-half of the cleanup. */
|
|
|
- if (fb)
|
|
|
- armada_drm_queue_unref_work(dcrtc->crtc.dev, fb);
|
|
|
+ if (event || fb) {
|
|
|
+ struct drm_device *dev = dcrtc->crtc.dev;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&dev->event_lock, flags);
|
|
|
+ if (event)
|
|
|
+ drm_crtc_send_vblank_event(&dcrtc->crtc, event);
|
|
|
+ if (fb)
|
|
|
+ __armada_drm_queue_unref_work(dev, fb);
|
|
|
+ spin_unlock_irqrestore(&dev->event_lock, flags);
|
|
|
+ }
|
|
|
|
|
|
wake_up(&dplane->frame_wait);
|
|
|
}
|
|
@@ -281,15 +289,6 @@ static void armada_drm_crtc_finish_frame_work(struct armada_crtc *dcrtc,
|
|
|
struct armada_plane_work *work)
|
|
|
{
|
|
|
struct armada_frame_work *fwork = container_of(work, struct armada_frame_work, work);
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- if (fwork->event) {
|
|
|
- struct drm_device *dev = dcrtc->crtc.dev;
|
|
|
-
|
|
|
- spin_lock_irqsave(&dev->event_lock, flags);
|
|
|
- drm_crtc_send_vblank_event(&dcrtc->crtc, fwork->event);
|
|
|
- spin_unlock_irqrestore(&dev->event_lock, flags);
|
|
|
- }
|
|
|
|
|
|
kfree(fwork);
|
|
|
}
|
|
@@ -1032,7 +1031,7 @@ static int armada_drm_crtc_page_flip(struct drm_crtc *crtc,
|
|
|
if (!work)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- work->event = event;
|
|
|
+ work->work.event = event;
|
|
|
work->work.old_fb = dcrtc->crtc.primary->fb;
|
|
|
|
|
|
i = armada_drm_crtc_calc_fb(fb, crtc->x, crtc->y, work->regs,
|