aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2011-03-19 02:38:50 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2011-03-19 02:38:50 -0400
commit97eb3f24352ec6632c2127b35d8087d2a809a9b9 (patch)
tree722948059bbd325bbca232269490124231df80d4 /drivers/pci/pci.c
parent439581ec07fa9cf3f519dd461a2cf41cfd3adcb4 (diff)
parentdef179c271ac9b5020deca798470521f14d11edd (diff)
Merge branch 'next' into for-linus
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r--drivers/pci/pci.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index e98c8104297b..b714d787bddd 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -937,14 +937,13 @@ pci_save_state(struct pci_dev *dev)
937 * pci_restore_state - Restore the saved state of a PCI device 937 * pci_restore_state - Restore the saved state of a PCI device
938 * @dev: - PCI device that we're dealing with 938 * @dev: - PCI device that we're dealing with
939 */ 939 */
940int 940void pci_restore_state(struct pci_dev *dev)
941pci_restore_state(struct pci_dev *dev)
942{ 941{
943 int i; 942 int i;
944 u32 val; 943 u32 val;
945 944
946 if (!dev->state_saved) 945 if (!dev->state_saved)
947 return 0; 946 return;
948 947
949 /* PCI Express register must be restored first */ 948 /* PCI Express register must be restored first */
950 pci_restore_pcie_state(dev); 949 pci_restore_pcie_state(dev);
@@ -968,8 +967,6 @@ pci_restore_state(struct pci_dev *dev)
968 pci_restore_iov_state(dev); 967 pci_restore_iov_state(dev);
969 968
970 dev->state_saved = false; 969 dev->state_saved = false;
971
972 return 0;
973} 970}
974 971
975static int do_pci_enable_device(struct pci_dev *dev, int bars) 972static int do_pci_enable_device(struct pci_dev *dev, int bars)
@@ -1007,6 +1004,18 @@ static int __pci_enable_device_flags(struct pci_dev *dev,
1007 int err; 1004 int err;
1008 int i, bars = 0; 1005 int i, bars = 0;
1009 1006
1007 /*
1008 * Power state could be unknown at this point, either due to a fresh
1009 * boot or a device removal call. So get the current power state
1010 * so that things like MSI message writing will behave as expected
1011 * (e.g. if the device really is in D0 at enable time).
1012 */
1013 if (dev->pm_cap) {
1014 u16 pmcsr;
1015 pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
1016 dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
1017 }
1018
1010 if (atomic_add_return(1, &dev->enable_cnt) > 1) 1019 if (atomic_add_return(1, &dev->enable_cnt) > 1)
1011 return 0; /* already enabled */ 1020 return 0; /* already enabled */
1012 1021
@@ -1288,22 +1297,6 @@ bool pci_check_pme_status(struct pci_dev *dev)
1288 return ret; 1297 return ret;
1289} 1298}
1290 1299
1291/*
1292 * Time to wait before the system can be put into a sleep state after reporting
1293 * a wakeup event signaled by a PCI device.
1294 */
1295#define PCI_WAKEUP_COOLDOWN 100
1296
1297/**
1298 * pci_wakeup_event - Report a wakeup event related to a given PCI device.
1299 * @dev: Device to report the wakeup event for.
1300 */
1301void pci_wakeup_event(struct pci_dev *dev)
1302{
1303 if (device_may_wakeup(&dev->dev))
1304 pm_wakeup_event(&dev->dev, PCI_WAKEUP_COOLDOWN);
1305}
1306
1307/** 1300/**
1308 * pci_pme_wakeup - Wake up a PCI device if its PME Status bit is set. 1301 * pci_pme_wakeup - Wake up a PCI device if its PME Status bit is set.
1309 * @dev: Device to handle. 1302 * @dev: Device to handle.
@@ -1315,8 +1308,8 @@ void pci_wakeup_event(struct pci_dev *dev)
1315static int pci_pme_wakeup(struct pci_dev *dev, void *ign) 1308static int pci_pme_wakeup(struct pci_dev *dev, void *ign)
1316{ 1309{
1317 if (pci_check_pme_status(dev)) { 1310 if (pci_check_pme_status(dev)) {
1318 pm_request_resume(&dev->dev);
1319 pci_wakeup_event(dev); 1311 pci_wakeup_event(dev);
1312 pm_request_resume(&dev->dev);
1320 } 1313 }
1321 return 0; 1314 return 0;
1322} 1315}