diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/device_pm.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index c14a00d3dca6..d047739f3380 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
@@ -901,15 +901,30 @@ EXPORT_SYMBOL_GPL(acpi_dev_resume_early); | |||
901 | int acpi_subsys_prepare(struct device *dev) | 901 | int acpi_subsys_prepare(struct device *dev) |
902 | { | 902 | { |
903 | /* | 903 | /* |
904 | * Follow PCI and resume devices suspended at run time before running | 904 | * Devices having power.ignore_children set may still be necessary for |
905 | * their system suspend callbacks. | 905 | * suspending their children in the next phase of device suspend. |
906 | */ | 906 | */ |
907 | pm_runtime_resume(dev); | 907 | if (dev->power.ignore_children) |
908 | pm_runtime_resume(dev); | ||
909 | |||
908 | return pm_generic_prepare(dev); | 910 | return pm_generic_prepare(dev); |
909 | } | 911 | } |
910 | EXPORT_SYMBOL_GPL(acpi_subsys_prepare); | 912 | EXPORT_SYMBOL_GPL(acpi_subsys_prepare); |
911 | 913 | ||
912 | /** | 914 | /** |
915 | * acpi_subsys_suspend - Run the device driver's suspend callback. | ||
916 | * @dev: Device to handle. | ||
917 | * | ||
918 | * Follow PCI and resume devices suspended at run time before running their | ||
919 | * system suspend callbacks. | ||
920 | */ | ||
921 | int acpi_subsys_suspend(struct device *dev) | ||
922 | { | ||
923 | pm_runtime_resume(dev); | ||
924 | return pm_generic_suspend(dev); | ||
925 | } | ||
926 | |||
927 | /** | ||
913 | * acpi_subsys_suspend_late - Suspend device using ACPI. | 928 | * acpi_subsys_suspend_late - Suspend device using ACPI. |
914 | * @dev: Device to suspend. | 929 | * @dev: Device to suspend. |
915 | * | 930 | * |
@@ -937,6 +952,23 @@ int acpi_subsys_resume_early(struct device *dev) | |||
937 | return ret ? ret : pm_generic_resume_early(dev); | 952 | return ret ? ret : pm_generic_resume_early(dev); |
938 | } | 953 | } |
939 | EXPORT_SYMBOL_GPL(acpi_subsys_resume_early); | 954 | EXPORT_SYMBOL_GPL(acpi_subsys_resume_early); |
955 | |||
956 | /** | ||
957 | * acpi_subsys_freeze - Run the device driver's freeze callback. | ||
958 | * @dev: Device to handle. | ||
959 | */ | ||
960 | int acpi_subsys_freeze(struct device *dev) | ||
961 | { | ||
962 | /* | ||
963 | * This used to be done in acpi_subsys_prepare() for all devices and | ||
964 | * some drivers may depend on it, so do it here. Ideally, however, | ||
965 | * runtime-suspended devices should not be touched during freeze/thaw | ||
966 | * transitions. | ||
967 | */ | ||
968 | pm_runtime_resume(dev); | ||
969 | return pm_generic_freeze(dev); | ||
970 | } | ||
971 | |||
940 | #endif /* CONFIG_PM_SLEEP */ | 972 | #endif /* CONFIG_PM_SLEEP */ |
941 | 973 | ||
942 | static struct dev_pm_domain acpi_general_pm_domain = { | 974 | static struct dev_pm_domain acpi_general_pm_domain = { |
@@ -947,8 +979,11 @@ static struct dev_pm_domain acpi_general_pm_domain = { | |||
947 | #endif | 979 | #endif |
948 | #ifdef CONFIG_PM_SLEEP | 980 | #ifdef CONFIG_PM_SLEEP |
949 | .prepare = acpi_subsys_prepare, | 981 | .prepare = acpi_subsys_prepare, |
982 | .suspend = acpi_subsys_suspend, | ||
950 | .suspend_late = acpi_subsys_suspend_late, | 983 | .suspend_late = acpi_subsys_suspend_late, |
951 | .resume_early = acpi_subsys_resume_early, | 984 | .resume_early = acpi_subsys_resume_early, |
985 | .freeze = acpi_subsys_freeze, | ||
986 | .poweroff = acpi_subsys_suspend, | ||
952 | .poweroff_late = acpi_subsys_suspend_late, | 987 | .poweroff_late = acpi_subsys_suspend_late, |
953 | .restore_early = acpi_subsys_resume_early, | 988 | .restore_early = acpi_subsys_resume_early, |
954 | #endif | 989 | #endif |