Commit abfe2d7b authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Jeff Garzik

Hibernation: Introduce system_entering_hibernation

Introduce boolean function system_entering_hibernation() returning
'true' during the last phase of hibernation, in which devices are
being put into low power states and the sleep state (for example,
ACPI S4) is finally entered.

Some device drivers need such a function to check if the system is
in the final phase of hibernation.  In particular, some SATA drivers
are going to use it for blacklisting systems in which the disks
should not be spun down during the last phase of hibernation (the
BIOS will do that anyway).
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent f3b8436a
...@@ -237,6 +237,7 @@ extern int hibernate_nvs_alloc(void); ...@@ -237,6 +237,7 @@ extern int hibernate_nvs_alloc(void);
extern void hibernate_nvs_free(void); extern void hibernate_nvs_free(void);
extern void hibernate_nvs_save(void); extern void hibernate_nvs_save(void);
extern void hibernate_nvs_restore(void); extern void hibernate_nvs_restore(void);
extern bool system_entering_hibernation(void);
#else /* CONFIG_HIBERNATION */ #else /* CONFIG_HIBERNATION */
static inline int swsusp_page_is_forbidden(struct page *p) { return 0; } static inline int swsusp_page_is_forbidden(struct page *p) { return 0; }
static inline void swsusp_set_page_free(struct page *p) {} static inline void swsusp_set_page_free(struct page *p) {}
...@@ -252,6 +253,7 @@ static inline int hibernate_nvs_alloc(void) { return 0; } ...@@ -252,6 +253,7 @@ static inline int hibernate_nvs_alloc(void) { return 0; }
static inline void hibernate_nvs_free(void) {} static inline void hibernate_nvs_free(void) {}
static inline void hibernate_nvs_save(void) {} static inline void hibernate_nvs_save(void) {}
static inline void hibernate_nvs_restore(void) {} static inline void hibernate_nvs_restore(void) {}
static inline bool system_entering_hibernation(void) { return false; }
#endif /* CONFIG_HIBERNATION */ #endif /* CONFIG_HIBERNATION */
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
......
...@@ -71,6 +71,14 @@ void hibernation_set_ops(struct platform_hibernation_ops *ops) ...@@ -71,6 +71,14 @@ void hibernation_set_ops(struct platform_hibernation_ops *ops)
mutex_unlock(&pm_mutex); mutex_unlock(&pm_mutex);
} }
static bool entering_platform_hibernation;
bool system_entering_hibernation(void)
{
return entering_platform_hibernation;
}
EXPORT_SYMBOL(system_entering_hibernation);
#ifdef CONFIG_PM_DEBUG #ifdef CONFIG_PM_DEBUG
static void hibernation_debug_sleep(void) static void hibernation_debug_sleep(void)
{ {
...@@ -411,6 +419,7 @@ int hibernation_platform_enter(void) ...@@ -411,6 +419,7 @@ int hibernation_platform_enter(void)
if (error) if (error)
goto Close; goto Close;
entering_platform_hibernation = true;
suspend_console(); suspend_console();
error = device_suspend(PMSG_HIBERNATE); error = device_suspend(PMSG_HIBERNATE);
if (error) { if (error) {
...@@ -445,6 +454,7 @@ int hibernation_platform_enter(void) ...@@ -445,6 +454,7 @@ int hibernation_platform_enter(void)
Finish: Finish:
hibernation_ops->finish(); hibernation_ops->finish();
Resume_devices: Resume_devices:
entering_platform_hibernation = false;
device_resume(PMSG_RESTORE); device_resume(PMSG_RESTORE);
resume_console(); resume_console();
Close: Close:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment