From: Russell King <rmk+kernel@armlinux.org.uk>
Date: Sat, 8 Jul 2017 10:16:53 +0100
Subject: drm/armada: move event sending into armada_plane_work
Git-commit: eb19be5bbe2aaf84cb347ca2a07ec19f2b92594f
Patch-mainline: v4.16-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166
Move the sending of events into the armada_plane_work structure, and
combine the processing in armada_drm_plane_work_call().
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
drivers/gpu/drm/armada/armada_crtc.c | 27 +++++++++++++--------------
drivers/gpu/drm/armada/armada_crtc.h | 1 +
2 files changed, 14 insertions(+), 14 deletions(-)
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -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(s
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
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(str
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,
--- a/drivers/gpu/drm/armada/armada_crtc.h
+++ b/drivers/gpu/drm/armada/armada_crtc.h
@@ -40,6 +40,7 @@ struct armada_plane_work {
void (*cancel)(struct armada_crtc *, struct armada_plane_work *);
struct drm_plane *plane;
struct drm_framebuffer *old_fb;
+ struct drm_pending_vblank_event *event;
};
struct armada_plane_state {