Message ID | 1467038724-13455-1-git-send-email-hehy1@lenovo.com (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Rafael Wysocki |
Headers | show |
On Monday, June 27, 2016 02:50:16 PM Ocean HY1 He wrote: > The _PTS control method is defined in the section 7.4.1 of acpi 6.0 > spec. The _PTS control method is executed by the OS during the sleep > transition process for S1, S2, S3, S4, and for orderly S5 shutdown. > > The _PTS control method provides the BIOS a mechanism for performing > some housekeeping, such as writing the sleep type value to the embedded > controller, before entering the system sleeping state. Note that some > Lenovo Server BIOS use this mechanism to detect reboot event and > prompt user by popped dialog box. > > According to section 7.5 of acpi 6.0 spec, _PTS should run after _TTS. > Add a _PTS evaulation to the existing _TTS reboot notifier and change > the notifier name to reflect the fact that it's not for _TTS only any > more. > > Signed-off-by: Ocean He <hehy1@lenovo.com> > Signed-off-by: Nagananda Chumbalkar <nchumbalkar@lenovo.com> Applied, thanks! -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 7a2e4d4..2b38c1b 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c @@ -47,15 +47,32 @@ static void acpi_sleep_tts_switch(u32 acpi_state) } } -static int tts_notify_reboot(struct notifier_block *this, +static void acpi_sleep_pts_switch(u32 acpi_state) +{ + acpi_status status; + + status = acpi_execute_simple_method(NULL, "\\_PTS", acpi_state); + if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { + /* + * OS can't evaluate the _PTS object correctly. Some warning + * message will be printed. But it won't break anything. + */ + printk(KERN_NOTICE "Failure in evaluating _PTS object\n"); + } +} + +static int sleep_notify_reboot(struct notifier_block *this, unsigned long code, void *x) { acpi_sleep_tts_switch(ACPI_STATE_S5); + + acpi_sleep_pts_switch(ACPI_STATE_S5); + return NOTIFY_DONE; } -static struct notifier_block tts_notifier = { - .notifier_call = tts_notify_reboot, +static struct notifier_block sleep_notifier = { + .notifier_call = sleep_notify_reboot, .next = NULL, .priority = 0, }; @@ -899,9 +916,9 @@ int __init acpi_sleep_init(void) pr_info(PREFIX "(supports%s)\n", supported); /* - * Register the tts_notifier to reboot notifier list so that the _TTS - * object can also be evaluated when the system enters S5. + * Register the sleep_notifier to reboot notifier list so that the _TTS + * and _PTS object can also be evaluated when the system enters S5. */ - register_reboot_notifier(&tts_notifier); + register_reboot_notifier(&sleep_notifier); return 0; }