diff mbox

Work around negative s16 battery current on Acer

Message ID 4A4C2EDC.6070209@marcansoft.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Hector Martin July 2, 2009, 3:51 a.m. UTC
Andrew Morton wrote:
> acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
> kernel version are you patching here?

Updated patch for 2.6.30 attached. current_now got renamed to rate_now.

Comments

Andrew Morton July 2, 2009, 10:56 p.m. UTC | #1
On Thu, 02 Jul 2009 05:51:56 +0200
Hector Martin <hector@marcansoft.com> wrote:

> Andrew Morton wrote:
> > acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
> > kernel version are you patching here?
> 
> Updated patch for 2.6.30 attached. current_now got renamed to rate_now.

The patch has no changelog.

We could go fishing through the mailing list to find the original
changelog, but perhaps it is no longer accurate.  Or we could type in a
new changelog but that also has accuracy problems.

So please always resend the full changelog (possibly after revising it)
with each version of a patch.

--
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 mbox

Patch

--- linux-2.6.30-gentoo-r1/drivers/acpi/battery.c.old	2009-07-02 04:04:52.000000000 +0200
+++ linux-2.6.30-gentoo-r1/drivers/acpi/battery.c	2009-07-02 04:07:20.000000000 +0200
@@ -85,6 +85,10 @@  static const struct acpi_device_id batte
 
 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
 
+/* For buggy DSDTs that report negative 16-bit values for either charging
+ * or discharging current and/or report 0 as 65536 due to bad math.
+ */
+#define QUIRK_SIGNED16_CURRENT 0x0001
 
 struct acpi_battery {
 	struct mutex lock;
@@ -112,6 +116,7 @@  struct acpi_battery {
 	int state;
 	int power_unit;
 	u8 alarm_present;
+	long quirks;
 };
 
 #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
@@ -390,6 +395,11 @@  static int acpi_battery_get_state(struct
 				 state_offsets, ARRAY_SIZE(state_offsets));
 	battery->update_time = jiffies;
 	kfree(buffer.pointer);
+
+	if ((battery->quirks & QUIRK_SIGNED16_CURRENT) &&
+	    battery->rate_now != -1)
+		battery->rate_now = abs((s16)battery->rate_now);
+
 	return result;
 }
 
@@ -495,6 +505,14 @@  static void sysfs_remove_battery(struct 
 }
 #endif
 
+static void acpi_battery_quirks(struct acpi_battery *battery)
+{
+	battery->quirks = 0;
+	if (dmi_name_in_vendors("Acer") && battery->power_unit) {
+		battery->quirks |= QUIRK_SIGNED16_CURRENT;
+	}
+}
+
 static int acpi_battery_update(struct acpi_battery *battery)
 {
 	int result, old_present = acpi_battery_present(battery);
@@ -513,6 +531,7 @@  static int acpi_battery_update(struct ac
 		result = acpi_battery_get_info(battery);
 		if (result)
 			return result;
+		acpi_battery_quirks(battery);
 		acpi_battery_init_alarm(battery);
 	}
 #ifdef CONFIG_ACPI_SYSFS_POWER