diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2017-07-08 05:16:53 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2017-12-08 07:19:49 -0500 |
commit | eb19be5bbe2aaf84cb347ca2a07ec19f2b92594f (patch) | |
tree | 2cd19d1300ef04f2f99e6d45cfedda8adafb6450 | |
parent | b972a80f447da0b69648c33c719fe3089a17dacc (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.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.h | 1 |
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 | ||
23 | struct armada_frame_work { | 23 | struct 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 | ||
45 | struct armada_plane_state { | 46 | struct armada_plane_state { |