summaryrefslogtreecommitdiffstats
path: root/acpi-update-battery-information-on-notification-0x81.patch
diff options
context:
space:
mode:
authorKyle McMartin <kyle@dreadnought.i.jkkm.org>2010-09-23 11:16:03 -0400
committerKyle McMartin <kyle@dreadnought.i.jkkm.org>2010-09-23 11:16:03 -0400
commit6406b98a0e3692eba8739976e7143363c5cc394c (patch)
treebea0dcae896f07aad161397ec2f8d62d1a521419 /acpi-update-battery-information-on-notification-0x81.patch
parent5c8b9db40cf6638816fdd24702d7148fc110c2ac (diff)
downloadkernel-6406b98a0e3692eba8739976e7143363c5cc394c.tar.gz
kernel-6406b98a0e3692eba8739976e7143363c5cc394c.tar.xz
kernel-6406b98a0e3692eba8739976e7143363c5cc394c.zip
Snipe ACPI patch from mjg59 to fix battery levels on some laptops
Diffstat (limited to 'acpi-update-battery-information-on-notification-0x81.patch')
-rw-r--r--acpi-update-battery-information-on-notification-0x81.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/acpi-update-battery-information-on-notification-0x81.patch b/acpi-update-battery-information-on-notification-0x81.patch
new file mode 100644
index 000000000..5fe34b9c0
--- /dev/null
+++ b/acpi-update-battery-information-on-notification-0x81.patch
@@ -0,0 +1,96 @@
+From kyle@infradead.org Wed Sep 22 18:35:38 2010
+From: Matthew Garrett <mjg@redhat.com>
+To: linux-acpi@vger.kernel.org
+Cc: linux-kernel@vger.kernel.org, Matthew Garrett <mjg@redhat.com>
+Subject: [PATCH] acpi: Update battery information on notification 0x81
+Date: Mon, 16 Aug 2010 16:32:19 -0400
+
+A notification event 0x81 from an ACPI battery device requires us to
+re-read the battery information structure. Do so, and if the battery's
+reporting units have changed (as is the case on some Thinkpads) destroy
+and recreate the battery in order to populate the fields correctly.
+
+Signed-off-by: Matthew Garrett <mjg@redhat.com>
+---
+ drivers/acpi/battery.c | 22 +++++++++++++++++-----
+ 1 files changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
+index dc58402..69638c4 100644
+--- a/drivers/acpi/battery.c
++++ b/drivers/acpi/battery.c
+@@ -562,9 +562,10 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
+ }
+ }
+
+-static int acpi_battery_update(struct acpi_battery *battery)
++static int acpi_battery_update(struct acpi_battery *battery, bool get_info)
+ {
+ int result, old_present = acpi_battery_present(battery);
++ int old_power_unit = battery->power_unit;
+ result = acpi_battery_get_status(battery);
+ if (result)
+ return result;
+@@ -587,6 +588,16 @@ static int acpi_battery_update(struct acpi_battery *battery)
+ if (!battery->bat.dev)
+ sysfs_add_battery(battery);
+ #endif
++ if (get_info) {
++ acpi_battery_get_info(battery);
++#ifdef CONFIG_ACPI_SYSFS_POWER
++ if (old_power_unit != battery->power_unit) {
++ /* The battery has changed its reporting units */
++ sysfs_remove_battery(battery);
++ sysfs_add_battery(battery);
++ }
++#endif
++ }
+ return acpi_battery_get_state(battery);
+ }
+
+@@ -762,7 +773,7 @@ static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = {
+ static int acpi_battery_read(int fid, struct seq_file *seq)
+ {
+ struct acpi_battery *battery = seq->private;
+- int result = acpi_battery_update(battery);
++ int result = acpi_battery_update(battery, false);
+ return acpi_print_funcs[fid](seq, result);
+ }
+
+@@ -877,7 +888,8 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
+ #ifdef CONFIG_ACPI_SYSFS_POWER
+ old = battery->bat.dev;
+ #endif
+- acpi_battery_update(battery);
++ acpi_battery_update(battery, (event == ACPI_BATTERY_NOTIFY_INFO ? true
++ : false));
+ acpi_bus_generate_proc_event(device, event,
+ acpi_battery_present(battery));
+ acpi_bus_generate_netlink_event(device->pnp.device_class,
+@@ -908,7 +920,7 @@ static int acpi_battery_add(struct acpi_device *device)
+ if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle,
+ "_BIX", &handle)))
+ set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
+- acpi_battery_update(battery);
++ acpi_battery_update(battery, false);
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ result = acpi_battery_add_fs(device);
+ #endif
+@@ -951,7 +963,7 @@ static int acpi_battery_resume(struct acpi_device *device)
+ return -EINVAL;
+ battery = acpi_driver_data(device);
+ battery->update_time = 0;
+- acpi_battery_update(battery);
++ acpi_battery_update(battery, true);
+ return 0;
+ }
+
+--
+1.7.2.1
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at http://www.tux.org/lkml/
+