Merge branch 'battery' into release
authorLen Brown <len.brown@intel.com>
Sat, 19 Sep 2009 05:56:17 +0000 (01:56 -0400)
committerLen Brown <len.brown@intel.com>
Sat, 19 Sep 2009 05:56:17 +0000 (01:56 -0400)
1  2 
drivers/acpi/battery.c

diff --combined drivers/acpi/battery.c
@@@ -31,6 -31,7 +31,7 @@@
  #include <linux/types.h>
  #include <linux/jiffies.h>
  #include <linux/async.h>
+ #include <linux/dmi.h>
  
  #ifdef CONFIG_ACPI_PROCFS_POWER
  #include <linux/proc_fs.h>
@@@ -45,8 -46,6 +46,8 @@@
  #include <linux/power_supply.h>
  #endif
  
 +#define PREFIX "ACPI: "
 +
  #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
  
  #define ACPI_BATTERY_CLASS            "battery"
@@@ -87,6 -86,10 +88,10 @@@ static const struct acpi_device_id batt
  
  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;
        int state;
        int power_unit;
        u8 alarm_present;
+       long quirks;
  };
  
  #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
@@@ -392,6 -396,11 +398,11 @@@ static int acpi_battery_get_state(struc
                                 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;
  }
  
@@@ -497,6 -506,14 +508,14 @@@ static void sysfs_remove_battery(struc
  }
  #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);
                result = acpi_battery_get_info(battery);
                if (result)
                        return result;
+               acpi_battery_quirks(battery);
                acpi_battery_init_alarm(battery);
        }
  #ifdef CONFIG_ACPI_SYSFS_POWER