Skip to contentSkip to conversation

acpi: preserve correct battery state through suspend/resume cycles

PATCH Applied [email protected] 3 participants 3 messages Oct 10, 2006 – Oct 14, 2006 ACPI

lore
Share & tools
lore
#0 lore raw

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
diff -puN drivers/acpi/battery.c~acpi-preserve-correct-battery-state-through-suspend-resume-cycles drivers/acpi/battery.c
@@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(str
 
 static 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 ac
 	return 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;

_

#1 lore raw
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.

Applied
#2 lore raw
In reply to [email protected]

Applied.

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.

---

 drivers/acpi/battery.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+)

diff -puN drivers/acpi/battery.c~acpi-preserve-correct-battery-state-through-suspend-resume-cycles drivers/acpi/battery.c

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(str
 
 static 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 ac
 	return 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