Merge git://git.infradead.org/mtd-2.6
[pandora-kernel.git] / drivers / gpu / drm / drm_irq.c
index a263b70..9d3a503 100644 (file)
@@ -34,6 +34,7 @@
  */
 
 #include "drmP.h"
+#include "drm_trace.h"
 
 #include <linux/interrupt.h>   /* For task queue support */
 #include <linux/slab.h>
@@ -57,6 +58,9 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
 {
        struct drm_irq_busid *p = data;
 
+       if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
+               return -EINVAL;
+
        if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
                return -EINVAL;
 
@@ -211,7 +215,7 @@ int drm_irq_install(struct drm_device *dev)
        if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
                return -EINVAL;
 
-       if (dev->pdev->irq == 0)
+       if (drm_dev_to_irq(dev) == 0)
                return -EINVAL;
 
        mutex_lock(&dev->struct_mutex);
@@ -229,7 +233,7 @@ int drm_irq_install(struct drm_device *dev)
        dev->irq_enabled = 1;
        mutex_unlock(&dev->struct_mutex);
 
-       DRM_DEBUG("irq=%d\n", dev->pdev->irq);
+       DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
 
        /* Before installing handler */
        dev->driver->irq_preinstall(dev);
@@ -302,14 +306,14 @@ int drm_irq_uninstall(struct drm_device * dev)
        if (!irq_enabled)
                return -EINVAL;
 
-       DRM_DEBUG("irq=%d\n", dev->pdev->irq);
+       DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
 
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                vga_client_register(dev->pdev, NULL, NULL, NULL);
 
        dev->driver->irq_uninstall(dev);
 
-       free_irq(dev->pdev->irq, dev);
+       free_irq(drm_dev_to_irq(dev), dev);
 
        return 0;
 }
@@ -341,7 +345,7 @@ int drm_control(struct drm_device *dev, void *data,
                if (drm_core_check_feature(dev, DRIVER_MODESET))
                        return 0;
                if (dev->if_version < DRM_IF_VERSION(1, 2) &&
-                   ctl->irq != dev->pdev->irq)
+                   ctl->irq != drm_dev_to_irq(dev))
                        return -EINVAL;
                return drm_irq_install(dev);
        case DRM_UNINST_HANDLER:
@@ -587,6 +591,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
                return -ENOMEM;
 
        e->pipe = pipe;
+       e->base.pid = current->pid;
        e->event.base.type = DRM_EVENT_VBLANK;
        e->event.base.length = sizeof e->event;
        e->event.user_data = vblwait->request.signal;
@@ -614,6 +619,9 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
        DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n",
                  vblwait->request.sequence, seq, pipe);
 
+       trace_drm_vblank_event_queued(current->pid, pipe,
+                                     vblwait->request.sequence);
+
        e->event.sequence = vblwait->request.sequence;
        if ((seq - vblwait->request.sequence) <= (1 << 23)) {
                e->event.tv_sec = now.tv_sec;
@@ -621,6 +629,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
                drm_vblank_put(dev, e->pipe);
                list_add_tail(&e->base.link, &e->base.file_priv->event_list);
                wake_up_interruptible(&e->base.file_priv->event_wait);
+               trace_drm_vblank_event_delivered(current->pid, pipe,
+                                                vblwait->request.sequence);
        } else {
                list_add_tail(&e->base.link, &dev->vblank_event_list);
        }
@@ -651,7 +661,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
        int ret = 0;
        unsigned int flags, seq, crtc;
 
-       if ((!dev->pdev->irq) || (!dev->irq_enabled))
+       if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
                return -EINVAL;
 
        if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
@@ -751,9 +761,13 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc)
                drm_vblank_put(dev, e->pipe);
                list_move_tail(&e->base.link, &e->base.file_priv->event_list);
                wake_up_interruptible(&e->base.file_priv->event_wait);
+               trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
+                                                e->event.sequence);
        }
 
        spin_unlock_irqrestore(&dev->event_lock, flags);
+
+       trace_drm_vblank_event(crtc, seq);
 }
 
 /**