--- linux-2.6.35.x86_64/drivers/acpi/battery.c.orig 2010-12-23 10:42:09.291854595 -0500 +++ linux-2.6.35.x86_64/drivers/acpi/battery.c 2010-12-23 10:44:30.996045838 -0500 @@ -596,9 +596,10 @@ } } -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; @@ -621,6 +622,16 @@ 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 + } result = acpi_battery_get_state(battery); acpi_battery_quirks2(battery); return result; @@ -798,7 +809,7 @@ 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); } @@ -913,7 +924,8 @@ #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, @@ -944,7 +956,7 @@ 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 @@ -987,7 +999,7 @@ return -EINVAL; battery = acpi_driver_data(device); battery->update_time = 0; - acpi_battery_update(battery); + acpi_battery_update(battery, true); return 0; }