Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 71104
b: refs/heads/master
c: 74f270a
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Oct 18, 2007
1 parent 6166835 commit 2abde9a
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f242d9196fd1ef4e6bf0e50d2e7f32866fb145c2
refs/heads/master: 74f270af0c1ed5b9d4413784256959dcfe3593ce
12 changes: 11 additions & 1 deletion trunk/drivers/acpi/sleep/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,12 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
#endif /* CONFIG_SUSPEND */

#ifdef CONFIG_HIBERNATION
static int acpi_hibernation_start(void)
{
acpi_target_sleep_state = ACPI_STATE_S4;
return 0;
}

static int acpi_hibernation_prepare(void)
{
return acpi_sleep_prepare(ACPI_STATE_S4);
Expand Down Expand Up @@ -258,6 +264,8 @@ static void acpi_hibernation_finish(void)

/* reset firmware waking vector */
acpi_set_firmware_waking_vector((acpi_physical_address) 0);

acpi_target_sleep_state = ACPI_STATE_S0;
}

static int acpi_hibernation_pre_restore(void)
Expand All @@ -275,9 +283,11 @@ static void acpi_hibernation_restore_cleanup(void)
}

static struct hibernation_ops acpi_hibernation_ops = {
.start = acpi_hibernation_start,
.pre_snapshot = acpi_hibernation_prepare,
.finish = acpi_hibernation_finish,
.prepare = acpi_hibernation_prepare,
.enter = acpi_hibernation_enter,
.finish = acpi_hibernation_finish,
.pre_restore = acpi_hibernation_pre_restore,
.restore_cleanup = acpi_hibernation_restore_cleanup,
};
Expand Down
38 changes: 32 additions & 6 deletions trunk/include/linux/suspend.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,16 +134,42 @@ extern void mark_free_pages(struct zone *zone);
*
* All three methods must be assigned.
*
* @prepare: prepare system for hibernation
* @enter: shut down system after state has been saved to disk
* @finish: finish/clean up after state has been reloaded
* @pre_restore: prepare system for the restoration from a hibernation image
* @restore_cleanup: clean up after a failing image restoration
* @start: Tell the platform driver that we're starting hibernation.
* Called right after shrinking memory and before freezing devices.
*
* @pre_snapshot: Prepare the platform for creating the hibernation image.
* Called right after devices have been frozen and before the nonboot
* CPUs are disabled (runs with IRQs on).
*
* @finish: Restore the previous state of the platform after the hibernation
* image has been created *or* put the platform into the normal operation
* mode after the hibernation (the same method is executed in both cases).
* Called right after the nonboot CPUs have been enabled and before
* thawing devices (runs with IRQs on).
*
* @prepare: Prepare the platform for entering the low power state.
* Called right after the hibernation image has been saved and before
* devices are prepared for entering the low power state.
*
* @enter: Put the system into the low power state after the hibernation image
* has been saved to disk.
* Called after the nonboot CPUs have been disabled and all of the low
* level devices have been shut down (runs with IRQs off).
*
* @pre_restore: Prepare system for the restoration from a hibernation image.
* Called right after devices have been frozen and before the nonboot
* CPUs are disabled (runs with IRQs on).
*
* @restore_cleanup: Clean up after a failing image restoration.
* Called right after the nonboot CPUs have been enabled and before
* thawing devices (runs with IRQs on).
*/
struct hibernation_ops {
int (*start)(void);
int (*pre_snapshot)(void);
void (*finish)(void);
int (*prepare)(void);
int (*enter)(void);
void (*finish)(void);
int (*pre_restore)(void);
void (*restore_cleanup)(void);
};
Expand Down
27 changes: 21 additions & 6 deletions trunk/kernel/power/disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,9 @@ static struct hibernation_ops *hibernation_ops;

void hibernation_set_ops(struct hibernation_ops *ops)
{
if (ops && !(ops->prepare && ops->enter && ops->finish
&& ops->pre_restore && ops->restore_cleanup)) {
if (ops && !(ops->start && ops->pre_snapshot && ops->finish
&& ops->prepare && ops->enter && ops->pre_restore
&& ops->restore_cleanup)) {
WARN_ON(1);
return;
}
Expand All @@ -69,16 +70,26 @@ void hibernation_set_ops(struct hibernation_ops *ops)
mutex_unlock(&pm_mutex);
}

/**
* platform_start - tell the platform driver that we're starting
* hibernation
*/

static int platform_start(int platform_mode)
{
return (platform_mode && hibernation_ops) ?
hibernation_ops->start() : 0;
}

/**
* platform_prepare - prepare the machine for hibernation using the
* platform_pre_snapshot - prepare the machine for hibernation using the
* platform driver if so configured and return an error code if it fails
*/

static int platform_prepare(int platform_mode)
static int platform_pre_snapshot(int platform_mode)
{
return (platform_mode && hibernation_ops) ?
hibernation_ops->prepare() : 0;
hibernation_ops->pre_snapshot() : 0;
}

/**
Expand Down Expand Up @@ -135,12 +146,16 @@ int hibernation_snapshot(int platform_mode)
if (error)
return error;

error = platform_start(platform_mode);
if (error)
return error;

suspend_console();
error = device_suspend(PMSG_FREEZE);
if (error)
goto Resume_console;

error = platform_prepare(platform_mode);
error = platform_pre_snapshot(platform_mode);
if (error)
goto Resume_devices;

Expand Down

0 comments on commit 2abde9a

Please sign in to comment.