|
@@ -901,14 +901,29 @@ EXPORT_SYMBOL_GPL(acpi_dev_resume_early);
|
|
|
int acpi_subsys_prepare(struct device *dev)
|
|
|
{
|
|
|
/*
|
|
|
- * Follow PCI and resume devices suspended at run time before running
|
|
|
- * their system suspend callbacks.
|
|
|
+ * Devices having power.ignore_children set may still be necessary for
|
|
|
+ * suspending their children in the next phase of device suspend.
|
|
|
*/
|
|
|
- pm_runtime_resume(dev);
|
|
|
+ if (dev->power.ignore_children)
|
|
|
+ pm_runtime_resume(dev);
|
|
|
+
|
|
|
return pm_generic_prepare(dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(acpi_subsys_prepare);
|
|
|
|
|
|
+/**
|
|
|
+ * acpi_subsys_suspend - Run the device driver's suspend callback.
|
|
|
+ * @dev: Device to handle.
|
|
|
+ *
|
|
|
+ * Follow PCI and resume devices suspended at run time before running their
|
|
|
+ * system suspend callbacks.
|
|
|
+ */
|
|
|
+int acpi_subsys_suspend(struct device *dev)
|
|
|
+{
|
|
|
+ pm_runtime_resume(dev);
|
|
|
+ return pm_generic_suspend(dev);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* acpi_subsys_suspend_late - Suspend device using ACPI.
|
|
|
* @dev: Device to suspend.
|
|
@@ -937,6 +952,23 @@ int acpi_subsys_resume_early(struct device *dev)
|
|
|
return ret ? ret : pm_generic_resume_early(dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(acpi_subsys_resume_early);
|
|
|
+
|
|
|
+/**
|
|
|
+ * acpi_subsys_freeze - Run the device driver's freeze callback.
|
|
|
+ * @dev: Device to handle.
|
|
|
+ */
|
|
|
+int acpi_subsys_freeze(struct device *dev)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * This used to be done in acpi_subsys_prepare() for all devices and
|
|
|
+ * some drivers may depend on it, so do it here. Ideally, however,
|
|
|
+ * runtime-suspended devices should not be touched during freeze/thaw
|
|
|
+ * transitions.
|
|
|
+ */
|
|
|
+ pm_runtime_resume(dev);
|
|
|
+ return pm_generic_freeze(dev);
|
|
|
+}
|
|
|
+
|
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
|
|
|
|
static struct dev_pm_domain acpi_general_pm_domain = {
|
|
@@ -947,8 +979,11 @@ static struct dev_pm_domain acpi_general_pm_domain = {
|
|
|
#endif
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
|
.prepare = acpi_subsys_prepare,
|
|
|
+ .suspend = acpi_subsys_suspend,
|
|
|
.suspend_late = acpi_subsys_suspend_late,
|
|
|
.resume_early = acpi_subsys_resume_early,
|
|
|
+ .freeze = acpi_subsys_freeze,
|
|
|
+ .poweroff = acpi_subsys_suspend,
|
|
|
.poweroff_late = acpi_subsys_suspend_late,
|
|
|
.restore_early = acpi_subsys_resume_early,
|
|
|
#endif
|