void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq) { dispc_runtime_get(); __omap_irq_unregister(dev, irq); dispc_runtime_put(); }
static void omap_crtc_vblank_irq(struct omap_drm_irq *irq, uint32_t irqstatus) { struct omap_crtc *omap_crtc = container_of(irq, struct omap_crtc, vblank_irq); struct drm_device *dev = omap_crtc->base.dev; if (dispc_mgr_go_busy(omap_crtc->channel)) return; DBG("%s: apply done", omap_crtc->name); __omap_irq_unregister(dev, &omap_crtc->vblank_irq); rmb(); WARN_ON(!omap_crtc->pending); omap_crtc->pending = false; wmb(); /* wake up userspace */ omap_crtc_complete_page_flip(&omap_crtc->base); /* wake up omap_atomic_complete */ wake_up(&omap_crtc->pending_wait); }