Merge tag 'drm-next-2019-07-16' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / drivers / gpu / drm / omapdrm / omap_irq.c
index 0e6b410..726a013 100644 (file)
@@ -74,6 +74,28 @@ int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait,
        return ret == 0 ? -1 : 0;
 }
 
+int omap_irq_enable_framedone(struct drm_crtc *crtc, bool enable)
+{
+       struct drm_device *dev = crtc->dev;
+       struct omap_drm_private *priv = dev->dev_private;
+       unsigned long flags;
+       enum omap_channel channel = omap_crtc_channel(crtc);
+       int framedone_irq =
+               priv->dispc_ops->mgr_get_framedone_irq(priv->dispc, channel);
+
+       DBG("dev=%p, crtc=%u, enable=%d", dev, channel, enable);
+
+       spin_lock_irqsave(&priv->wait_lock, flags);
+       if (enable)
+               priv->irq_mask |= framedone_irq;
+       else
+               priv->irq_mask &= ~framedone_irq;
+       omap_irq_update(dev);
+       spin_unlock_irqrestore(&priv->wait_lock, flags);
+
+       return 0;
+}
+
 /**
  * enable_vblank - enable vblank interrupt events
  * @dev: DRM device
@@ -206,6 +228,9 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
 
                if (irqstatus & priv->dispc_ops->mgr_get_sync_lost_irq(priv->dispc, channel))
                        omap_crtc_error_irq(crtc, irqstatus);
+
+               if (irqstatus & priv->dispc_ops->mgr_get_framedone_irq(priv->dispc, channel))
+                       omap_crtc_framedone_irq(crtc, irqstatus);
        }
 
        omap_irq_ocp_error_handler(dev, irqstatus);