diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pci-driver.c | 135 |
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 | ||
491 | static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev) | 493 | static 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 | } |