aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/omapdrm/omap_crtc.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 7b93880a4577..f456544bf300 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -554,6 +554,7 @@ static void vblank_cb(void *arg)
554 struct drm_device *dev = crtc->dev; 554 struct drm_device *dev = crtc->dev;
555 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 555 struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
556 unsigned long flags; 556 unsigned long flags;
557 struct drm_framebuffer *fb;
557 558
558 spin_lock_irqsave(&dev->event_lock, flags); 559 spin_lock_irqsave(&dev->event_lock, flags);
559 560
@@ -561,10 +562,15 @@ static void vblank_cb(void *arg)
561 if (omap_crtc->event) 562 if (omap_crtc->event)
562 drm_send_vblank_event(dev, omap_crtc->pipe, omap_crtc->event); 563 drm_send_vblank_event(dev, omap_crtc->pipe, omap_crtc->event);
563 564
565 fb = omap_crtc->old_fb;
566
564 omap_crtc->event = NULL; 567 omap_crtc->event = NULL;
565 omap_crtc->old_fb = NULL; 568 omap_crtc->old_fb = NULL;
566 569
567 spin_unlock_irqrestore(&dev->event_lock, flags); 570 spin_unlock_irqrestore(&dev->event_lock, flags);
571
572 if (fb)
573 drm_framebuffer_unreference(fb);
568} 574}
569 575
570static void page_flip_worker(struct work_struct *work) 576static void page_flip_worker(struct work_struct *work)
@@ -620,6 +626,7 @@ static int omap_crtc_page_flip_locked(struct drm_crtc *crtc,
620 626
621 omap_crtc->event = event; 627 omap_crtc->event = event;
622 omap_crtc->old_fb = primary->fb = fb; 628 omap_crtc->old_fb = primary->fb = fb;
629 drm_framebuffer_reference(omap_crtc->old_fb);
623 630
624 spin_unlock_irqrestore(&dev->event_lock, flags); 631 spin_unlock_irqrestore(&dev->event_lock, flags);
625 632