aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2009-03-16 17:40:50 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2009-03-30 15:46:56 -0400
commit931ff68a5a53fa84bcdf9b1b179a80e54e034bd0 (patch)
tree88263b349d5eda796bb5f0724b52d1f73eeb1a8c /drivers
parent4a865905f685eaefaedf6ade362323dc52aa703b (diff)
PCI PM: Restore config spaces of all devices during early resume
At present the configuration spaces of PCI devices that have no drivers or no PM support in the drivers (either legacy or through a pm object) are not saved during suspend and, consequently, they are not restored during resume. This generally may lead to the state of the system being slightly inconsistent after the resume, so it's better to save and restore the configuration spaces of these devices as well. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Ingo Molnar <mingo@elte.hu> Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pci/pci-driver.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 3c1831c82f5b..267de88551c9 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -516,13 +516,13 @@ static int pci_pm_suspend(struct device *dev)
516 if (pci_has_legacy_pm_support(pci_dev)) 516 if (pci_has_legacy_pm_support(pci_dev))
517 return pci_legacy_suspend(dev, PMSG_SUSPEND); 517 return pci_legacy_suspend(dev, PMSG_SUSPEND);
518 518
519 pci_dev->state_saved = false;
520
519 if (!pm) { 521 if (!pm) {
520 pci_pm_default_suspend(pci_dev); 522 pci_pm_default_suspend(pci_dev);
521 goto Fixup; 523 goto Fixup;
522 } 524 }
523 525
524 pci_dev->state_saved = false;
525
526 if (pm->suspend) { 526 if (pm->suspend) {
527 pci_power_t prev = pci_dev->current_state; 527 pci_power_t prev = pci_dev->current_state;
528 int error; 528 int error;
@@ -554,8 +554,10 @@ static int pci_pm_suspend_noirq(struct device *dev)
554 if (pci_has_legacy_pm_support(pci_dev)) 554 if (pci_has_legacy_pm_support(pci_dev))
555 return pci_legacy_suspend_late(dev, PMSG_SUSPEND); 555 return pci_legacy_suspend_late(dev, PMSG_SUSPEND);
556 556
557 if (!pm) 557 if (!pm) {
558 pci_save_state(pci_dev);
558 return 0; 559 return 0;
560 }
559 561
560 if (pm->suspend_noirq) { 562 if (pm->suspend_noirq) {
561 pci_power_t prev = pci_dev->current_state; 563 pci_power_t prev = pci_dev->current_state;
@@ -650,13 +652,13 @@ static int pci_pm_freeze(struct device *dev)
650 if (pci_has_legacy_pm_support(pci_dev)) 652 if (pci_has_legacy_pm_support(pci_dev))
651 return pci_legacy_suspend(dev, PMSG_FREEZE); 653 return pci_legacy_suspend(dev, PMSG_FREEZE);
652 654
655 pci_dev->state_saved = false;
656
653 if (!pm) { 657 if (!pm) {
654 pci_pm_default_suspend(pci_dev); 658 pci_pm_default_suspend(pci_dev);
655 return 0; 659 return 0;
656 } 660 }
657 661
658 pci_dev->state_saved = false;
659
660 if (pm->freeze) { 662 if (pm->freeze) {
661 int error; 663 int error;
662 664
@@ -738,13 +740,13 @@ static int pci_pm_poweroff(struct device *dev)
738 if (pci_has_legacy_pm_support(pci_dev)) 740 if (pci_has_legacy_pm_support(pci_dev))
739 return pci_legacy_suspend(dev, PMSG_HIBERNATE); 741 return pci_legacy_suspend(dev, PMSG_HIBERNATE);
740 742
743 pci_dev->state_saved = false;
744
741 if (!pm) { 745 if (!pm) {
742 pci_pm_default_suspend(pci_dev); 746 pci_pm_default_suspend(pci_dev);
743 goto Fixup; 747 goto Fixup;
744 } 748 }
745 749
746 pci_dev->state_saved = false;
747
748 if (pm->poweroff) { 750 if (pm->poweroff) {
749 int error; 751 int error;
750 752