Skip to content

Commit

Permalink
ACPI: suspend: consolidate handling of Sx states.
Browse files Browse the repository at this point in the history
Recent changes to sleep initialization in ACPI dropped reporting of supported Sx
states above S3. Fix that and also move S5 init into same file as other Sx.
The only functional change is adding printk() for S4 and S5 cases.

Signed-off-by: Alexey Starikovskiy <[email protected]>
Acked-by: Rafael J. Wysocki <[email protected]>
Signed-off-by: Len Brown <[email protected]>
  • Loading branch information
Alexey Starikovskiy authored and lenb committed Sep 21, 2007
1 parent 335fb8f commit f216cc3
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 81 deletions.
2 changes: 1 addition & 1 deletion drivers/acpi/sleep/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
obj-y := poweroff.o wakeup.o
obj-y := wakeup.o
obj-$(CONFIG_ACPI_SLEEP) += main.o
obj-$(CONFIG_ACPI_SLEEP) += proc.o

Expand Down
53 changes: 48 additions & 5 deletions drivers/acpi/sleep/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#include <linux/dmi.h>
#include <linux/device.h>
#include <linux/suspend.h>

#include <asm/io.h>

#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
#include "sleep.h"
Expand Down Expand Up @@ -57,6 +60,27 @@ static int acpi_pm_set_target(suspend_state_t pm_state)
return error;
}

int acpi_sleep_prepare(u32 acpi_state)
{
#ifdef CONFIG_ACPI_SLEEP
/* do we have a wakeup address for S2 and S3? */
if (acpi_state == ACPI_STATE_S3) {
if (!acpi_wakeup_address) {
return -EFAULT;
}
acpi_set_firmware_waking_vector((acpi_physical_address)
virt_to_phys((void *)
acpi_wakeup_address));

}
ACPI_FLUSH_CPU_CACHE();
acpi_enable_wakeup_device_prep(acpi_state);
#endif
acpi_gpe_sleep_prepare(acpi_state);
acpi_enter_sleep_state_prep(acpi_state);
return 0;
}

/**
* acpi_pm_prepare - Do preliminary suspend work.
* @pm_state: ignored
Expand Down Expand Up @@ -350,6 +374,20 @@ int acpi_pm_device_sleep_state(struct device *dev, int wake, int *d_min_p)
return d_max;
}

static void acpi_power_off_prepare(void)
{
/* Prepare to power off the system */
acpi_sleep_prepare(ACPI_STATE_S5);
}

static void acpi_power_off(void)
{
/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
printk("%s called\n", __FUNCTION__);
local_irq_disable();
acpi_enter_sleep_state(ACPI_STATE_S5);
}

int __init acpi_sleep_init(void)
{
acpi_status status;
Expand All @@ -363,16 +401,15 @@ int __init acpi_sleep_init(void)
if (acpi_disabled)
return 0;

printk(KERN_INFO PREFIX "(supports");
#ifdef CONFIG_SUSPEND
printk(KERN_INFO PREFIX "(supports");
for (i = ACPI_STATE_S0; i < ACPI_STATE_S4; i++) {
status = acpi_get_sleep_type_data(i, &type_a, &type_b);
if (ACPI_SUCCESS(status)) {
sleep_states[i] = 1;
printk(" S%d", i);
}
}
printk(")\n");

pm_set_ops(&acpi_pm_ops);
#endif
Expand All @@ -382,10 +419,16 @@ int __init acpi_sleep_init(void)
if (ACPI_SUCCESS(status)) {
hibernation_set_ops(&acpi_hibernation_ops);
sleep_states[ACPI_STATE_S4] = 1;
printk(" S4");
}
#else
sleep_states[ACPI_STATE_S4] = 0;
#endif

status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b);
if (ACPI_SUCCESS(status)) {
sleep_states[ACPI_STATE_S5] = 1;
printk(" S5");
pm_power_off_prepare = acpi_power_off_prepare;
pm_power_off = acpi_power_off;
}
printk(")\n");
return 0;
}
75 changes: 0 additions & 75 deletions drivers/acpi/sleep/poweroff.c

This file was deleted.

0 comments on commit f216cc3

Please sign in to comment.