aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/pci-driver.c135
1 files changed, 53 insertions, 82 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 02bf4d4125e4..b7e67c2f40b9 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -486,6 +486,8 @@ static void pci_pm_default_suspend(struct pci_dev *pci_dev)
486 486
487 if (!pci_is_bridge(pci_dev)) 487 if (!pci_is_bridge(pci_dev))
488 pci_prepare_to_sleep(pci_dev); 488 pci_prepare_to_sleep(pci_dev);
489
490 pci_fixup_device(pci_fixup_suspend, pci_dev);
489} 491}
490 492
491static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev) 493static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
@@ -536,16 +538,13 @@ static int pci_pm_suspend(struct device *dev)
536 if (pci_has_legacy_pm_support(pci_dev)) 538 if (pci_has_legacy_pm_support(pci_dev))
537 return pci_legacy_suspend(dev, PMSG_SUSPEND); 539 return pci_legacy_suspend(dev, PMSG_SUSPEND);
538 540
539 if (drv && drv->pm) { 541 if (drv && drv->pm && drv->pm->suspend) {
540 if (drv->pm->suspend) { 542 error = drv->pm->suspend(dev);
541 error = drv->pm->suspend(dev); 543 suspend_report_result(drv->pm->suspend, error);
542 suspend_report_result(drv->pm->suspend, error);
543 }
544 } else {
545 pci_pm_default_suspend(pci_dev);
546 } 544 }
547 545
548 pci_fixup_device(pci_fixup_suspend, pci_dev); 546 if (!error)
547 pci_pm_default_suspend(pci_dev);
549 548
550 return error; 549 return error;
551} 550}
@@ -559,15 +558,14 @@ static int pci_pm_suspend_noirq(struct device *dev)
559 if (pci_has_legacy_pm_support(pci_dev)) 558 if (pci_has_legacy_pm_support(pci_dev))
560 return pci_legacy_suspend_late(dev, PMSG_SUSPEND); 559 return pci_legacy_suspend_late(dev, PMSG_SUSPEND);
561 560
562 if (drv && drv->pm) { 561 if (drv && drv->pm && drv->pm->suspend_noirq) {
563 if (drv->pm->suspend_noirq) { 562 error = drv->pm->suspend_noirq(dev);
564 error = drv->pm->suspend_noirq(dev); 563 suspend_report_result(drv->pm->suspend_noirq, error);
565 suspend_report_result(drv->pm->suspend_noirq, error);
566 }
567 } else {
568 pci_pm_set_unknown_state(pci_dev);
569 } 564 }
570 565
566 if (!error)
567 pci_pm_set_unknown_state(pci_dev);
568
571 return error; 569 return error;
572} 570}
573 571
@@ -580,14 +578,10 @@ static int pci_pm_resume(struct device *dev)
580 if (pci_has_legacy_pm_support(pci_dev)) 578 if (pci_has_legacy_pm_support(pci_dev))
581 return pci_legacy_resume(dev); 579 return pci_legacy_resume(dev);
582 580
583 if (drv && drv->pm) { 581 error = pci_pm_default_resume(pci_dev);
584 pci_fixup_device(pci_fixup_resume, pci_dev);
585 582
586 if (drv->pm->resume) 583 if (!error && drv && drv->pm && drv->pm->resume)
587 error = drv->pm->resume(dev); 584 error = drv->pm->resume(dev);
588 } else {
589 error = pci_pm_default_resume(pci_dev);
590 }
591 585
592 return error; 586 return error;
593} 587}
@@ -601,14 +595,10 @@ static int pci_pm_resume_noirq(struct device *dev)
601 if (pci_has_legacy_pm_support(pci_dev)) 595 if (pci_has_legacy_pm_support(pci_dev))
602 return pci_legacy_resume_early(dev); 596 return pci_legacy_resume_early(dev);
603 597
604 if (drv && drv->pm) { 598 pci_pm_default_resume_noirq(pci_dev);
605 pci_fixup_device(pci_fixup_resume_early, pci_dev);
606 599
607 if (drv->pm->resume_noirq) 600 if (drv && drv->pm && drv->pm->resume_noirq)
608 error = drv->pm->resume_noirq(dev); 601 error = drv->pm->resume_noirq(dev);
609 } else {
610 pci_pm_default_resume_noirq(pci_dev);
611 }
612 602
613 return error; 603 return error;
614} 604}
@@ -633,15 +623,14 @@ static int pci_pm_freeze(struct device *dev)
633 if (pci_has_legacy_pm_support(pci_dev)) 623 if (pci_has_legacy_pm_support(pci_dev))
634 return pci_legacy_suspend(dev, PMSG_FREEZE); 624 return pci_legacy_suspend(dev, PMSG_FREEZE);
635 625
636 if (drv && drv->pm) { 626 if (drv && drv->pm && drv->pm->freeze) {
637 if (drv->pm->freeze) { 627 error = drv->pm->freeze(dev);
638 error = drv->pm->freeze(dev); 628 suspend_report_result(drv->pm->freeze, error);
639 suspend_report_result(drv->pm->freeze, error);
640 }
641 } else {
642 pci_pm_default_suspend_generic(pci_dev);
643 } 629 }
644 630
631 if (!error)
632 pci_pm_default_suspend_generic(pci_dev);
633
645 return error; 634 return error;
646} 635}
647 636
@@ -654,15 +643,14 @@ static int pci_pm_freeze_noirq(struct device *dev)
654 if (pci_has_legacy_pm_support(pci_dev)) 643 if (pci_has_legacy_pm_support(pci_dev))
655 return pci_legacy_suspend_late(dev, PMSG_FREEZE); 644 return pci_legacy_suspend_late(dev, PMSG_FREEZE);
656 645
657 if (drv && drv->pm) { 646 if (drv && drv->pm && drv->pm->freeze_noirq) {
658 if (drv->pm->freeze_noirq) { 647 error = drv->pm->freeze_noirq(dev);
659 error = drv->pm->freeze_noirq(dev); 648 suspend_report_result(drv->pm->freeze_noirq, error);
660 suspend_report_result(drv->pm->freeze_noirq, error);
661 }
662 } else {
663 pci_pm_set_unknown_state(pci_dev);
664 } 649 }
665 650
651 if (!error)
652 pci_pm_set_unknown_state(pci_dev);
653
666 return error; 654 return error;
667} 655}
668 656
@@ -675,12 +663,10 @@ static int pci_pm_thaw(struct device *dev)
675 if (pci_has_legacy_pm_support(pci_dev)) 663 if (pci_has_legacy_pm_support(pci_dev))
676 return pci_legacy_resume(dev); 664 return pci_legacy_resume(dev);
677 665
678 if (drv && drv->pm) { 666 pci_pm_reenable_device(pci_dev);
679 if (drv->pm->thaw) 667
680 error = drv->pm->thaw(dev); 668 if (drv && drv->pm && drv->pm->thaw)
681 } else { 669 error = drv->pm->thaw(dev);
682 pci_pm_reenable_device(pci_dev);
683 }
684 670
685 return error; 671 return error;
686} 672}
@@ -694,12 +680,10 @@ static int pci_pm_thaw_noirq(struct device *dev)
694 if (pci_has_legacy_pm_support(pci_dev)) 680 if (pci_has_legacy_pm_support(pci_dev))
695 return pci_legacy_resume_early(dev); 681 return pci_legacy_resume_early(dev);
696 682
697 if (drv && drv->pm) { 683 pci_update_current_state(pci_dev, PCI_D0);
698 if (drv->pm->thaw_noirq) 684
699 error = drv->pm->thaw_noirq(dev); 685 if (drv && drv->pm && drv->pm->thaw_noirq)
700 } else { 686 error = drv->pm->thaw_noirq(dev);
701 pci_update_current_state(pci_dev, PCI_D0);
702 }
703 687
704 return error; 688 return error;
705} 689}
@@ -713,16 +697,13 @@ static int pci_pm_poweroff(struct device *dev)
713 if (pci_has_legacy_pm_support(pci_dev)) 697 if (pci_has_legacy_pm_support(pci_dev))
714 return pci_legacy_suspend(dev, PMSG_HIBERNATE); 698 return pci_legacy_suspend(dev, PMSG_HIBERNATE);
715 699
716 if (drv && drv->pm) { 700 if (drv && drv->pm && drv->pm->poweroff) {
717 if (drv->pm->poweroff) { 701 error = drv->pm->poweroff(dev);
718 error = drv->pm->poweroff(dev); 702 suspend_report_result(drv->pm->poweroff, error);
719 suspend_report_result(drv->pm->poweroff, error);
720 }
721 } else {
722 pci_pm_default_suspend(pci_dev);
723 } 703 }
724 704
725 pci_fixup_device(pci_fixup_suspend, pci_dev); 705 if (!error)
706 pci_pm_default_suspend(pci_dev);
726 707
727 return error; 708 return error;
728} 709}
@@ -735,11 +716,9 @@ static int pci_pm_poweroff_noirq(struct device *dev)
735 if (pci_has_legacy_pm_support(to_pci_dev(dev))) 716 if (pci_has_legacy_pm_support(to_pci_dev(dev)))
736 return pci_legacy_suspend_late(dev, PMSG_HIBERNATE); 717 return pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
737 718
738 if (drv && drv->pm) { 719 if (drv && drv->pm && drv->pm->poweroff_noirq) {
739 if (drv->pm->poweroff_noirq) { 720 error = drv->pm->poweroff_noirq(dev);
740 error = drv->pm->poweroff_noirq(dev); 721 suspend_report_result(drv->pm->poweroff_noirq, error);
741 suspend_report_result(drv->pm->poweroff_noirq, error);
742 }
743 } 722 }
744 723
745 return error; 724 return error;
@@ -754,14 +733,10 @@ static int pci_pm_restore(struct device *dev)
754 if (pci_has_legacy_pm_support(pci_dev)) 733 if (pci_has_legacy_pm_support(pci_dev))
755 return pci_legacy_resume(dev); 734 return pci_legacy_resume(dev);
756 735
757 if (drv && drv->pm) { 736 error = pci_pm_default_resume(pci_dev);
758 pci_fixup_device(pci_fixup_resume, pci_dev);
759 737
760 if (drv->pm->restore) 738 if (!error && drv && drv->pm && drv->pm->restore)
761 error = drv->pm->restore(dev); 739 error = drv->pm->restore(dev);
762 } else {
763 error = pci_pm_default_resume(pci_dev);
764 }
765 740
766 return error; 741 return error;
767} 742}
@@ -775,14 +750,10 @@ static int pci_pm_restore_noirq(struct device *dev)
775 if (pci_has_legacy_pm_support(pci_dev)) 750 if (pci_has_legacy_pm_support(pci_dev))
776 return pci_legacy_resume_early(dev); 751 return pci_legacy_resume_early(dev);
777 752
778 if (drv && drv->pm) { 753 pci_pm_default_resume_noirq(pci_dev);
779 pci_fixup_device(pci_fixup_resume_early, pci_dev);
780 754
781 if (drv->pm->restore_noirq) 755 if (drv && drv->pm && drv->pm->restore_noirq)
782 error = drv->pm->restore_noirq(dev); 756 error = drv->pm->restore_noirq(dev);
783 } else {
784 pci_pm_default_resume_noirq(pci_dev);
785 }
786 757
787 return error; 758 return error;
788} 759}