X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fpci%2Fpci-driver.c;h=0dea6b1ddd52d4bc2e9619944ed720dd254729d4;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hp=4c7e1695d2111032f5cfee8740b74fac7e1168f8;hpb=c449269f45c2cdf53af08c8d0af37472f66539d9;p=linux-2.6.git diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 4c7e1695d..0dea6b1dd 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -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; }