acpi: preserve correct battery state through suspend/resume cycles
PATCH 10/12 acpi: preserve correct battery state through suspend/resume cycles
From: Jiri Kosina <[email protected]>
There is a problem in th following scenario(s):
boot -> suspend -> (un)plug battery -> resume
The problem arises in both cases - i.e. suspend with battery plugged in, and resume with battery unplugged, or vice versa.
After resume, when the battery status has changed (plugged in -> unplegged or unplugged -> plugged in) during the time when the system was sleeping, the /proc/acpi/battery/*/* is wrong (showing the state before suspend, not the current state).
The following patch adds ->resume method to the ACPI battery handler, which has the only aim - to check whether the battery state has changed during sleep, and if so, update the ACPI internal data structures, so that information published through /proc/acpi/battery/*/* is correct even after suspend/resume cycle, during which the battery was removed/inserted.
The patch is against current ACPI git tree, but applies cleanly also against -mm and probably other trees. Please apply.
---
drivers/acpi/battery.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+)
drivers/acpi/battery.c renamed from drivers/acpi/battery.c~acpi-preserve-correct-battery-state-through-suspend-resume-cycles +14 -0
@@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(strstatic int acpi_battery_add (struct acpi_device *device);static int acpi_battery_remove (struct acpi_device *device,int type); +static int acpi_battery_resume (struct acpi_device *device,int status);static struct acpi_driver acpi_battery_driver = { .name =ACPI_BATTERY_DRIVER_NAME ,
@@ -71,6 +72,7 @@ static struct acpi_driver acpi_battery_d .ids = ACPI_BATTERY_HID, .ops = { .add = acpi_battery_add, + .resume = acpi_battery_resume, .remove = acpi_battery_remove, }, };
@@ -753,6 +755,18 @@ static int acpi_battery_remove(struct acreturn 0 ; } +/* this is needed to learn about changes made in suspended state */ +static int acpi_battery_resume (struct acpi_device *device,int state) +{ +struct acpi_battery *battery; + +if (!device) +return -EINVAL ; + + battery = device->driver_data; +return acpi_battery_check (battery); +} +static int __init acpi_battery_init (void ) {int result;
_
Quoted 9 lines · On Tue, 2006-10-10 at 14:20 -0700, [email protected] wrote:
The following patch adds ->resume method to the ACPI battery handler, which
has the only aim - to check whether the battery state has changed during
sleep, and if so, update the ACPI internal data structures, so that information published through/proc/acpi/battery/*/*is correct even after
suspend/resume cycle, during which the battery was removed/inserted.
This would be great for gnome-power-manager and HAL. I've got open bugzillas about this.
Richard.
Len Brown
AppliedApplied.
thanks,
-Len
Quoted 77 lines · On Tuesday 10 October 2006 17:20, [email protected] wrote:
From: Jiri Kosina <[email protected]>
There is a problem in th following scenario(s):
boot -> suspend -> (un)plug battery -> resume
The problem arises in both cases - i.e. suspend with battery plugged in, and resume with battery unplugged, or vice versa.
After resume, when the battery status has changed (plugged in -> unplegged or unplugged -> plugged in) during the time when the system was sleeping, the
/proc/acpi/battery/*/*is wrong (showing the state before suspend, not the current state).The following patch adds ->resume method to the ACPI battery handler, which has the only aim - to check whether the battery state has changed during sleep, and if so, update the ACPI internal data structures, so that information published through
/proc/acpi/battery/*/*is correct even after suspend/resume cycle, during which the battery was removed/inserted.The patch is against current ACPI git tree, but applies cleanly also against -mm and probably other trees. Please apply.
Signed-off-by Jiri Kosina <[email protected]>Cc "Brown, Len" <[email protected]>Cc Stefan Seyfried <[email protected]>Acked-by Pavel Machek <[email protected]>Signed-off-by Andrew Morton <[email protected]>---
drivers/acpi/battery.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+)diff -puN
drivers/acpi/battery.c~acpi-preserve-correct-battery-state-through-suspend-resume-cyclesdrivers/acpi/battery.cdrivers/acpi/battery.c renamed from drivers/acpi/battery.c~acpi-preserve-correct-battery-state-through-suspend-resume-cycles +14
-0@@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(strstatic int acpi_battery_add (struct acpi_device *device);static int acpi_battery_remove (struct acpi_device *device,int type); +static int acpi_battery_resume (struct acpi_device *device,int status);static struct acpi_driver acpi_battery_driver = { .name =ACPI_BATTERY_DRIVER_NAME ,@@ -71,6 +72,7 @@ static struct acpi_driver acpi_battery_d .ids = ACPI_BATTERY_HID, .ops = { .add = acpi_battery_add, + .resume = acpi_battery_resume, .remove = acpi_battery_remove, }, };@@ -753,6 +755,18 @@ static int acpi_battery_remove(struct acreturn 0 ; } +/* this is needed to learn about changes made in suspended state */ +static int acpi_battery_resume (struct acpi_device *device,int state) +{ +struct acpi_battery *battery; + +if (!device) +return -EINVAL ; + + battery = device->driver_data; +return acpi_battery_check (battery); +} +static int __init acpi_battery_init (void ) {int result;_
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html