drm: add support for passing state into the suspend hooks.
authorDave Airlie <airlied@redhat.com>
Wed, 20 Feb 2008 00:02:20 +0000 (10:02 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 20 Feb 2008 00:05:12 +0000 (10:05 +1000)
fix i915 driver to use state for hibernate save avoidance.

Signed-off-by: Dave Airlie <airlied@redhat.com>

drivers/char/drm/drmP.h
drivers/char/drm/drm_sysfs.c
drivers/char/drm/i915_drv.c

index 19d3be5..a6789f2 100644 (file)
@@ -568,7 +568,7 @@ struct drm_driver {
        void (*postclose) (struct drm_device *, struct drm_file *);
        void (*lastclose) (struct drm_device *);
        int (*unload) (struct drm_device *);
-       int (*suspend) (struct drm_device *);
+       int (*suspend) (struct drm_device *, pm_message_t state);
        int (*resume) (struct drm_device *);
        int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
        void (*dma_ready) (struct drm_device *);
index fa36153..05ed504 100644 (file)
@@ -36,7 +36,7 @@ static int drm_sysfs_suspend(struct device *dev, pm_message_t state)
        printk(KERN_ERR "%s\n", __FUNCTION__);
 
        if (drm_dev->driver->suspend)
-               return drm_dev->driver->suspend(drm_dev);
+               return drm_dev->driver->suspend(drm_dev, state);
 
        return 0;
 }
index 35758a6..4048f39 100644 (file)
@@ -238,7 +238,7 @@ static void i915_restore_vga(struct drm_device *dev)
 
 }
 
-static int i915_suspend(struct drm_device *dev)
+static int i915_suspend(struct drm_device *dev, pm_message_t state)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int i;
@@ -249,6 +249,9 @@ static int i915_suspend(struct drm_device *dev)
                return -ENODEV;
        }
 
+       if (state.event == PM_EVENT_PRETHAW)
+               return 0;
+
        pci_save_state(dev->pdev);
        pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
 
@@ -363,9 +366,11 @@ static int i915_suspend(struct drm_device *dev)
 
        i915_save_vga(dev);
 
-       /* Shut down the device */
-       pci_disable_device(dev->pdev);
-       pci_set_power_state(dev->pdev, PCI_D3hot);
+       if (state.event == PM_EVENT_SUSPEND) {
+               /* Shut down the device */
+               pci_disable_device(dev->pdev);
+               pci_set_power_state(dev->pdev, PCI_D3hot);
+       }
 
        return 0;
 }