Revert "drm/vbl rework: rework how the drm deals with vblank."
[pandora-kernel.git] / drivers / char / drm / r128_irq.c
index 5b95bd8..c76fdca 100644 (file)
 #include "r128_drm.h"
 #include "r128_drv.h"
 
-u32 r128_get_vblank_counter(struct drm_device *dev, int crtc)
-{
-       const drm_r128_private_t *dev_priv = dev->dev_private;
-
-       if (crtc != 0)
-               return 0;
-
-       return atomic_read(&dev_priv->vbl_received);
-}
-
 irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS)
 {
        struct drm_device *dev = (struct drm_device *) arg;
@@ -56,38 +46,30 @@ irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS)
        /* VBLANK interrupt */
        if (status & R128_CRTC_VBLANK_INT) {
                R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
-               atomic_inc(&dev_priv->vbl_received);
-               drm_handle_vblank(dev, 0);
+               atomic_inc(&dev->vbl_received);
+               DRM_WAKEUP(&dev->vbl_queue);
+               drm_vbl_send_signals(dev);
                return IRQ_HANDLED;
        }
        return IRQ_NONE;
 }
 
-int r128_enable_vblank(struct drm_device *dev, int crtc)
+int r128_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
 {
-       drm_r128_private_t *dev_priv = dev->dev_private;
-
-       if (crtc != 0) {
-               DRM_ERROR("%s:  bad crtc %d\n", __FUNCTION__, crtc);
-               return -EINVAL;
-       }
+       unsigned int cur_vblank;
+       int ret = 0;
 
-       R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
-       return 0;
-}
+       /* Assume that the user has missed the current sequence number
+        * by about a day rather than she wants to wait for years
+        * using vertical blanks...
+        */
+       DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
+                   (((cur_vblank = atomic_read(&dev->vbl_received))
+                     - *sequence) <= (1 << 23)));
 
-void r128_disable_vblank(struct drm_device *dev, int crtc)
-{
-       if (crtc != 0)
-               DRM_ERROR("%s:  bad crtc %d\n", __FUNCTION__, crtc);
+       *sequence = cur_vblank;
 
-       /*
-        * FIXME: implement proper interrupt disable by using the vblank
-        * counter register (if available)
-        *
-        * R128_WRITE(R128_GEN_INT_CNTL,
-        *            R128_READ(R128_GEN_INT_CNTL) & ~R128_CRTC_VBLANK_INT_EN);
-        */
+       return ret;
 }
 
 void r128_driver_irq_preinstall(struct drm_device * dev)
@@ -100,9 +82,12 @@ void r128_driver_irq_preinstall(struct drm_device * dev)
        R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
 }
 
-int r128_driver_irq_postinstall(struct drm_device * dev)
+void r128_driver_irq_postinstall(struct drm_device * dev)
 {
-       return drm_vblank_init(dev, 1);
+       drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
+
+       /* Turn on VBL interrupt */
+       R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
 }
 
 void r128_driver_irq_uninstall(struct drm_device * dev)