aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2017-07-08 05:16:53 -0400
committerRussell King <rmk+kernel@armlinux.org.uk>2017-12-08 07:19:49 -0500
commiteb19be5bbe2aaf84cb347ca2a07ec19f2b92594f (patch)
tree2cd19d1300ef04f2f99e6d45cfedda8adafb6450
parentb972a80f447da0b69648c33c719fe3089a17dacc (diff)
drm/armada: move event sending into armada_plane_work
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>
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.c27
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.h1
2 files changed, 14 insertions, 14 deletions
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
index d1f4171966cc..b043766c416c 100644
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -22,7 +22,6 @@
22 22
23struct armada_frame_work { 23struct armada_frame_work {
24 struct armada_plane_work work; 24 struct armada_plane_work work;
25 struct drm_pending_vblank_event *event;
26 struct armada_regs regs[4]; 25 struct armada_regs regs[4];
27}; 26};
28 27
@@ -220,15 +219,24 @@ static void armada_drm_plane_work_call(struct armada_crtc *dcrtc,
220 void (*fn)(struct armada_crtc *, struct armada_plane_work *)) 219 void (*fn)(struct armada_crtc *, struct armada_plane_work *))
221{ 220{
222 struct armada_plane *dplane = drm_to_armada_plane(work->plane); 221 struct armada_plane *dplane = drm_to_armada_plane(work->plane);
222 struct drm_pending_vblank_event *event = work->event;
223 struct drm_framebuffer *fb = work->old_fb; 223 struct drm_framebuffer *fb = work->old_fb;
224 224
225 if (fn) 225 if (fn)
226 fn(dcrtc, work); 226 fn(dcrtc, work);
227 drm_crtc_vblank_put(&dcrtc->crtc); 227 drm_crtc_vblank_put(&dcrtc->crtc);
228 228
229 /* Finally, queue the process-half of the cleanup. */ 229 if (event || fb) {
230 if (fb) 230 struct drm_device *dev = dcrtc->crtc.dev;
231 armada_drm_queue_unref_work(dcrtc->crtc.dev, fb); 231 unsigned long flags;
232
233 spin_lock_irqsave(&dev->event_lock, flags);
234 if (event)
235 drm_crtc_send_vblank_event(&dcrtc->crtc, event);
236 if (fb)
237 __armada_drm_queue_unref_work(dev, fb);
238 spin_unlock_irqrestore(&dev->event_lock, flags);
239 }
232 240
233 wake_up(&dplane->frame_wait); 241 wake_up(&dplane->frame_wait);
234} 242}
@@ -281,15 +289,6 @@ static void armada_drm_crtc_finish_frame_work(struct armada_crtc *dcrtc,
281 struct armada_plane_work *work) 289 struct armada_plane_work *work)
282{ 290{
283 struct armada_frame_work *fwork = container_of(work, struct armada_frame_work, work); 291 struct armada_frame_work *fwork = container_of(work, struct armada_frame_work, work);
284 unsigned long flags;
285
286 if (fwork->event) {
287 struct drm_device *dev = dcrtc->crtc.dev;
288
289 spin_lock_irqsave(&dev->event_lock, flags);
290 drm_crtc_send_vblank_event(&dcrtc->crtc, fwork->event);
291 spin_unlock_irqrestore(&dev->event_lock, flags);
292 }
293 292
294 kfree(fwork); 293 kfree(fwork);
295} 294}
@@ -1032,7 +1031,7 @@ static int armada_drm_crtc_page_flip(struct drm_crtc *crtc,
1032 if (!work) 1031 if (!work)
1033 return -ENOMEM; 1032 return -ENOMEM;
1034 1033
1035 work->event = event; 1034 work->work.event = event;
1036 work->work.old_fb = dcrtc->crtc.primary->fb; 1035 work->work.old_fb = dcrtc->crtc.primary->fb;
1037 1036
1038 i = armada_drm_crtc_calc_fb(fb, crtc->x, crtc->y, work->regs, 1037 i = armada_drm_crtc_calc_fb(fb, crtc->x, crtc->y, work->regs,
diff --git a/drivers/gpu/drm/armada/armada_crtc.h b/drivers/gpu/drm/armada/armada_crtc.h
index b40db72c61d8..4cdd2f0eabd9 100644
--- a/drivers/gpu/drm/armada/armada_crtc.h
+++ b/drivers/gpu/drm/armada/armada_crtc.h
@@ -40,6 +40,7 @@ struct armada_plane_work {
40 void (*cancel)(struct armada_crtc *, struct armada_plane_work *); 40 void (*cancel)(struct armada_crtc *, struct armada_plane_work *);
41 struct drm_plane *plane; 41 struct drm_plane *plane;
42 struct drm_framebuffer *old_fb; 42 struct drm_framebuffer *old_fb;
43 struct drm_pending_vblank_event *event;
43}; 44};
44 45
45struct armada_plane_state { 46struct armada_plane_state {