From: Shaohua Li Add pm_ops.valid callback, so only the available pm states show in /sys/power/state. And this also makes an earlier states error report at enter_state before we do actual suspend/resume. Signed-off-by: Shaohua Li Acked-by: Pavel Machek Signed-off-by: Andrew Morton --- drivers/acpi/sleep/main.c | 8 ++++++++ include/linux/pm.h | 1 + kernel/power/main.c | 5 ++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff -puN drivers/acpi/sleep/main.c~introduce-valid-callback-for-pm_ops drivers/acpi/sleep/main.c --- 25/drivers/acpi/sleep/main.c~introduce-valid-callback-for-pm_ops Tue Sep 20 16:08:46 2005 +++ 25-akpm/drivers/acpi/sleep/main.c Tue Sep 20 16:08:46 2005 @@ -158,7 +158,15 @@ int acpi_suspend(u32 acpi_state) return -EINVAL; } +static int acpi_pm_state_valid(suspend_state_t pm_state) +{ + u32 acpi_state = acpi_suspend_states[pm_state]; + + return sleep_states[acpi_state]; +} + static struct pm_ops acpi_pm_ops = { + .valid = acpi_pm_state_valid, .prepare = acpi_pm_prepare, .enter = acpi_pm_enter, .finish = acpi_pm_finish, diff -puN include/linux/pm.h~introduce-valid-callback-for-pm_ops include/linux/pm.h --- 25/include/linux/pm.h~introduce-valid-callback-for-pm_ops Tue Sep 20 16:08:46 2005 +++ 25-akpm/include/linux/pm.h Tue Sep 20 16:08:46 2005 @@ -170,6 +170,7 @@ typedef int __bitwise suspend_disk_metho struct pm_ops { suspend_disk_method_t pm_disk_mode; + int (*valid)(suspend_state_t state); int (*prepare)(suspend_state_t state); int (*enter)(suspend_state_t state); int (*finish)(suspend_state_t state); diff -puN kernel/power/main.c~introduce-valid-callback-for-pm_ops kernel/power/main.c --- 25/kernel/power/main.c~introduce-valid-callback-for-pm_ops Tue Sep 20 16:08:46 2005 +++ 25-akpm/kernel/power/main.c Tue Sep 20 16:08:46 2005 @@ -167,6 +167,8 @@ static int enter_state(suspend_state_t s { int error; + if (pm_ops->valid && !pm_ops->valid(state)) + return -ENODEV; if (down_trylock(&pm_sem)) return -EBUSY; @@ -236,7 +238,8 @@ static ssize_t state_show(struct subsyst char * s = buf; for (i = 0; i < PM_SUSPEND_MAX; i++) { - if (pm_states[i]) + if (pm_states[i] && pm_ops && (!pm_ops->valid + ||(pm_ops->valid && pm_ops->valid(i)))) s += sprintf(s,"%s ",pm_states[i]); } s += sprintf(s,"\n"); _