aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-02-18 06:42:40 -0500
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-03-03 09:16:03 -0500
commit17f6b8a0270f7a40b3dbe07dbcb6cb7f67ce570a (patch)
treef4000460037d8e1fbac86a710ae28da852a9f3ab
parent8b37c3264788a13861f318a8bfc7d73f0d0986ce (diff)
drm: rcar-du: Reorder CRTC functions
The next commit will need functions to be reordered to avoid forward declarations. Do it separately to help review. This only moves functions without any change to the code. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_crtc.c142
1 files changed, 83 insertions, 59 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
index 25c7a998fc2c..e0562f2b3261 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
@@ -99,6 +99,10 @@ static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc)
99 clk_disable_unprepare(rcrtc->clock); 99 clk_disable_unprepare(rcrtc->clock);
100} 100}
101 101
102/* -----------------------------------------------------------------------------
103 * Hardware Setup
104 */
105
102static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc) 106static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc)
103{ 107{
104 const struct drm_display_mode *mode = &rcrtc->crtc.mode; 108 const struct drm_display_mode *mode = &rcrtc->crtc.mode;
@@ -256,6 +260,55 @@ void rcar_du_crtc_update_planes(struct drm_crtc *crtc)
256 dspr); 260 dspr);
257} 261}
258 262
263/* -----------------------------------------------------------------------------
264 * Page Flip
265 */
266
267void rcar_du_crtc_cancel_page_flip(struct rcar_du_crtc *rcrtc,
268 struct drm_file *file)
269{
270 struct drm_pending_vblank_event *event;
271 struct drm_device *dev = rcrtc->crtc.dev;
272 unsigned long flags;
273
274 /* Destroy the pending vertical blanking event associated with the
275 * pending page flip, if any, and disable vertical blanking interrupts.
276 */
277 spin_lock_irqsave(&dev->event_lock, flags);
278 event = rcrtc->event;
279 if (event && event->base.file_priv == file) {
280 rcrtc->event = NULL;
281 event->base.destroy(&event->base);
282 drm_vblank_put(dev, rcrtc->index);
283 }
284 spin_unlock_irqrestore(&dev->event_lock, flags);
285}
286
287static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc)
288{
289 struct drm_pending_vblank_event *event;
290 struct drm_device *dev = rcrtc->crtc.dev;
291 unsigned long flags;
292
293 spin_lock_irqsave(&dev->event_lock, flags);
294 event = rcrtc->event;
295 rcrtc->event = NULL;
296 spin_unlock_irqrestore(&dev->event_lock, flags);
297
298 if (event == NULL)
299 return;
300
301 spin_lock_irqsave(&dev->event_lock, flags);
302 drm_send_vblank_event(dev, rcrtc->index, event);
303 spin_unlock_irqrestore(&dev->event_lock, flags);
304
305 drm_vblank_put(dev, rcrtc->index);
306}
307
308/* -----------------------------------------------------------------------------
309 * Start/Stop and Suspend/Resume
310 */
311
259static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc) 312static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc)
260{ 313{
261 struct drm_crtc *crtc = &rcrtc->crtc; 314 struct drm_crtc *crtc = &rcrtc->crtc;
@@ -350,6 +403,10 @@ static void rcar_du_crtc_update_base(struct rcar_du_crtc *rcrtc)
350 rcar_du_plane_update_base(rcrtc->plane); 403 rcar_du_plane_update_base(rcrtc->plane);
351} 404}
352 405
406/* -----------------------------------------------------------------------------
407 * CRTC Functions
408 */
409
353static void rcar_du_crtc_dpms(struct drm_crtc *crtc, int mode) 410static void rcar_du_crtc_dpms(struct drm_crtc *crtc, int mode)
354{ 411{
355 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); 412 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
@@ -485,65 +542,6 @@ static const struct drm_crtc_helper_funcs crtc_helper_funcs = {
485 .disable = rcar_du_crtc_disable, 542 .disable = rcar_du_crtc_disable,
486}; 543};
487 544
488void rcar_du_crtc_cancel_page_flip(struct rcar_du_crtc *rcrtc,
489 struct drm_file *file)
490{
491 struct drm_pending_vblank_event *event;
492 struct drm_device *dev = rcrtc->crtc.dev;
493 unsigned long flags;
494
495 /* Destroy the pending vertical blanking event associated with the
496 * pending page flip, if any, and disable vertical blanking interrupts.
497 */
498 spin_lock_irqsave(&dev->event_lock, flags);
499 event = rcrtc->event;
500 if (event && event->base.file_priv == file) {
501 rcrtc->event = NULL;
502 event->base.destroy(&event->base);
503 drm_vblank_put(dev, rcrtc->index);
504 }
505 spin_unlock_irqrestore(&dev->event_lock, flags);
506}
507
508static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc)
509{
510 struct drm_pending_vblank_event *event;
511 struct drm_device *dev = rcrtc->crtc.dev;
512 unsigned long flags;
513
514 spin_lock_irqsave(&dev->event_lock, flags);
515 event = rcrtc->event;
516 rcrtc->event = NULL;
517 spin_unlock_irqrestore(&dev->event_lock, flags);
518
519 if (event == NULL)
520 return;
521
522 spin_lock_irqsave(&dev->event_lock, flags);
523 drm_send_vblank_event(dev, rcrtc->index, event);
524 spin_unlock_irqrestore(&dev->event_lock, flags);
525
526 drm_vblank_put(dev, rcrtc->index);
527}
528
529static irqreturn_t rcar_du_crtc_irq(int irq, void *arg)
530{
531 struct rcar_du_crtc *rcrtc = arg;
532 irqreturn_t ret = IRQ_NONE;
533 u32 status;
534
535 status = rcar_du_crtc_read(rcrtc, DSSR);
536 rcar_du_crtc_write(rcrtc, DSRCR, status & DSRCR_MASK);
537
538 if (status & DSSR_FRM) {
539 drm_handle_vblank(rcrtc->crtc.dev, rcrtc->index);
540 rcar_du_crtc_finish_page_flip(rcrtc);
541 ret = IRQ_HANDLED;
542 }
543
544 return ret;
545}
546
547static int rcar_du_crtc_page_flip(struct drm_crtc *crtc, 545static int rcar_du_crtc_page_flip(struct drm_crtc *crtc,
548 struct drm_framebuffer *fb, 546 struct drm_framebuffer *fb,
549 struct drm_pending_vblank_event *event, 547 struct drm_pending_vblank_event *event,
@@ -580,6 +578,32 @@ static const struct drm_crtc_funcs crtc_funcs = {
580 .page_flip = rcar_du_crtc_page_flip, 578 .page_flip = rcar_du_crtc_page_flip,
581}; 579};
582 580
581/* -----------------------------------------------------------------------------
582 * Interrupt Handling
583 */
584
585static irqreturn_t rcar_du_crtc_irq(int irq, void *arg)
586{
587 struct rcar_du_crtc *rcrtc = arg;
588 irqreturn_t ret = IRQ_NONE;
589 u32 status;
590
591 status = rcar_du_crtc_read(rcrtc, DSSR);
592 rcar_du_crtc_write(rcrtc, DSRCR, status & DSRCR_MASK);
593
594 if (status & DSSR_FRM) {
595 drm_handle_vblank(rcrtc->crtc.dev, rcrtc->index);
596 rcar_du_crtc_finish_page_flip(rcrtc);
597 ret = IRQ_HANDLED;
598 }
599
600 return ret;
601}
602
603/* -----------------------------------------------------------------------------
604 * Initialization
605 */
606
583int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index) 607int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
584{ 608{
585 static const unsigned int mmio_offsets[] = { 609 static const unsigned int mmio_offsets[] = {