diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 4e8b087..0c82321 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -617,7 +617,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 *); diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c index 3aaac11..c02e204 100644 --- a/linux-core/drm_sysfs.c +++ b/linux-core/drm_sysfs.c @@ -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; } diff --git a/linux-core/i915_drv.c b/linux-core/i915_drv.c index a5f60ee..c1b2441 100644 --- a/linux-core/i915_drv.c +++ b/linux-core/i915_drv.c @@ -265,10 +265,9 @@ static void i915_restore_vga(struct drm_device *dev) /* Read 3 bytes of color data from each index */ for (i = 0; i < 256 * 3; i++) outb(dev_priv->saveDACDATA[i], VGA_DACDATA); - } -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; @@ -279,6 +278,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); @@ -377,9 +379,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; }