On Tuesday, March 22, 2011, Kyle McMartin wrote: > From: Kyle McMartin <kyle@xxxxxxxxxx> > > Commit da8aeb92 re-poked the battery on resume, but Linus reports that > it broke his eee and partially reverted it in b23fffd7. Unfortunately > this also results in my x201s giving crack values until the sysfs files > are poked again. In the revert message, it was suggested that we poke it > from a PM notifier, so let's do that. > > With this in place, I haven't noticed the units going nutty on my > gnome-power-manager across a dozen suspends or so... > > Signed-off-by: Kyle McMartin <kyle@xxxxxxxxxx> Acked-by: Rafael J. Wysocki <rjw@xxxxxxx> > --- > > drivers/acpi/battery.c | 22 ++++++++++++++++++++++ > 1 files changed, 22 insertions(+), 0 deletions(-) > > diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c > index ac1a599..fcc13ac 100644 > --- a/drivers/acpi/battery.c > +++ b/drivers/acpi/battery.c > @@ -33,6 +33,7 @@ > #include <linux/async.h> > #include <linux/dmi.h> > #include <linux/slab.h> > +#include <linux/suspend.h> > > #ifdef CONFIG_ACPI_PROCFS_POWER > #include <linux/proc_fs.h> > @@ -102,6 +103,7 @@ struct acpi_battery { > struct mutex lock; > struct power_supply bat; > struct acpi_device *device; > + struct notifier_block pm_nb; > unsigned long update_time; > int rate_now; > int capacity_now; > @@ -940,6 +942,21 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) > power_supply_changed(&battery->bat); > } > > +static int battery_notify(struct notifier_block *nb, > + unsigned long mode, void *_unused) > +{ > + struct acpi_battery *battery = container_of(nb, struct acpi_battery, > + pm_nb); > + switch (mode) { > + case PM_POST_SUSPEND: > + sysfs_remove_battery(battery); > + sysfs_add_battery(battery); > + break; > + } > + > + return 0; > +} > + > static int acpi_battery_add(struct acpi_device *device) > { > int result = 0; > @@ -972,6 +989,10 @@ static int acpi_battery_add(struct acpi_device *device) > #endif > kfree(battery); > } > + > + battery->pm_nb.notifier_call = battery_notify; > + register_pm_notifier(&battery->pm_nb); > + > return result; > } > > @@ -982,6 +1003,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type) > if (!device || !acpi_driver_data(device)) > return -EINVAL; > battery = acpi_driver_data(device); > + unregister_pm_notifier(&battery->pm_nb); > #ifdef CONFIG_ACPI_PROCFS_POWER > acpi_battery_remove_fs(device); > #endif > > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html