diff options
Diffstat (limited to 'drivers/virtio/virtio_pci.c')
-rw-r--r-- | drivers/virtio/virtio_pci.c | 74 |
1 files changed, 8 insertions, 66 deletions
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 635e1efb3792..2e03d416b9af 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
@@ -720,24 +720,6 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev) | |||
720 | } | 720 | } |
721 | 721 | ||
722 | #ifdef CONFIG_PM | 722 | #ifdef CONFIG_PM |
723 | static int virtio_pci_suspend(struct device *dev) | ||
724 | { | ||
725 | struct pci_dev *pci_dev = to_pci_dev(dev); | ||
726 | |||
727 | pci_save_state(pci_dev); | ||
728 | pci_set_power_state(pci_dev, PCI_D3hot); | ||
729 | return 0; | ||
730 | } | ||
731 | |||
732 | static int virtio_pci_resume(struct device *dev) | ||
733 | { | ||
734 | struct pci_dev *pci_dev = to_pci_dev(dev); | ||
735 | |||
736 | pci_restore_state(pci_dev); | ||
737 | pci_set_power_state(pci_dev, PCI_D0); | ||
738 | return 0; | ||
739 | } | ||
740 | |||
741 | static int virtio_pci_freeze(struct device *dev) | 723 | static int virtio_pci_freeze(struct device *dev) |
742 | { | 724 | { |
743 | struct pci_dev *pci_dev = to_pci_dev(dev); | 725 | struct pci_dev *pci_dev = to_pci_dev(dev); |
@@ -758,59 +740,24 @@ static int virtio_pci_freeze(struct device *dev) | |||
758 | return ret; | 740 | return ret; |
759 | } | 741 | } |
760 | 742 | ||
761 | static int restore_common(struct device *dev) | 743 | static int virtio_pci_restore(struct device *dev) |
762 | { | ||
763 | struct pci_dev *pci_dev = to_pci_dev(dev); | ||
764 | struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev); | ||
765 | int ret; | ||
766 | |||
767 | ret = pci_enable_device(pci_dev); | ||
768 | if (ret) | ||
769 | return ret; | ||
770 | pci_set_master(pci_dev); | ||
771 | vp_finalize_features(&vp_dev->vdev); | ||
772 | |||
773 | return ret; | ||
774 | } | ||
775 | |||
776 | static int virtio_pci_thaw(struct device *dev) | ||
777 | { | 744 | { |
778 | struct pci_dev *pci_dev = to_pci_dev(dev); | 745 | struct pci_dev *pci_dev = to_pci_dev(dev); |
779 | struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev); | 746 | struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev); |
780 | struct virtio_driver *drv; | 747 | struct virtio_driver *drv; |
781 | int ret; | 748 | int ret; |
782 | 749 | ||
783 | ret = restore_common(dev); | ||
784 | if (ret) | ||
785 | return ret; | ||
786 | |||
787 | drv = container_of(vp_dev->vdev.dev.driver, | 750 | drv = container_of(vp_dev->vdev.dev.driver, |
788 | struct virtio_driver, driver); | 751 | struct virtio_driver, driver); |
789 | 752 | ||
790 | if (drv && drv->thaw) | 753 | ret = pci_enable_device(pci_dev); |
791 | ret = drv->thaw(&vp_dev->vdev); | 754 | if (ret) |
792 | else if (drv && drv->restore) | 755 | return ret; |
793 | ret = drv->restore(&vp_dev->vdev); | ||
794 | |||
795 | /* Finally, tell the device we're all set */ | ||
796 | if (!ret) | ||
797 | vp_set_status(&vp_dev->vdev, vp_dev->saved_status); | ||
798 | |||
799 | return ret; | ||
800 | } | ||
801 | |||
802 | static int virtio_pci_restore(struct device *dev) | ||
803 | { | ||
804 | struct pci_dev *pci_dev = to_pci_dev(dev); | ||
805 | struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev); | ||
806 | struct virtio_driver *drv; | ||
807 | int ret; | ||
808 | 756 | ||
809 | drv = container_of(vp_dev->vdev.dev.driver, | 757 | pci_set_master(pci_dev); |
810 | struct virtio_driver, driver); | 758 | vp_finalize_features(&vp_dev->vdev); |
811 | 759 | ||
812 | ret = restore_common(dev); | 760 | if (drv && drv->restore) |
813 | if (!ret && drv && drv->restore) | ||
814 | ret = drv->restore(&vp_dev->vdev); | 761 | ret = drv->restore(&vp_dev->vdev); |
815 | 762 | ||
816 | /* Finally, tell the device we're all set */ | 763 | /* Finally, tell the device we're all set */ |
@@ -821,12 +768,7 @@ static int virtio_pci_restore(struct device *dev) | |||
821 | } | 768 | } |
822 | 769 | ||
823 | static const struct dev_pm_ops virtio_pci_pm_ops = { | 770 | static const struct dev_pm_ops virtio_pci_pm_ops = { |
824 | .suspend = virtio_pci_suspend, | 771 | SET_SYSTEM_SLEEP_PM_OPS(virtio_pci_freeze, virtio_pci_restore) |
825 | .resume = virtio_pci_resume, | ||
826 | .freeze = virtio_pci_freeze, | ||
827 | .thaw = virtio_pci_thaw, | ||
828 | .restore = virtio_pci_restore, | ||
829 | .poweroff = virtio_pci_suspend, | ||
830 | }; | 772 | }; |
831 | #endif | 773 | #endif |
832 | 774 | ||