patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / pci / pci-driver.c
index 4c7e169..0dea6b1 100644 (file)
@@ -299,10 +299,30 @@ static int pci_device_suspend(struct device * dev, u32 state)
 {
        struct pci_dev * pci_dev = to_pci_dev(dev);
        struct pci_driver * drv = pci_dev->driver;
+       int i = 0;
 
        if (drv && drv->suspend)
-               return drv->suspend(pci_dev,state);
-       return 0;
+               i = drv->suspend(pci_dev,state);
+               
+       pci_save_state(pci_dev, pci_dev->saved_config_space);
+       return i;
+}
+
+
+/* 
+ * Default resume method for devices that have no driver provided resume,
+ * or not even a driver at all.
+ */
+static void pci_default_resume(struct pci_dev *pci_dev)
+{
+       /* restore the PCI config space */
+       pci_restore_state(pci_dev, pci_dev->saved_config_space);
+       /* if the device was enabled before suspend, reenable */
+       if (pci_dev->is_enabled)
+               pci_enable_device(pci_dev);
+       /* if the device was busmaster before the suspend, make it busmaster again */
+       if (pci_dev->is_busmaster)
+               pci_set_master(pci_dev);
 }
 
 static int pci_device_resume(struct device * dev)
@@ -312,6 +332,8 @@ static int pci_device_resume(struct device * dev)
 
        if (drv && drv->resume)
                drv->resume(pci_dev);
+       else
+               pci_default_resume(pci_dev);
        return 0;
 }