ACPI battery: fribble sysfs files from a resume notifier
Commitda8aeb92
re-poked the battery on resume, but Linus reports that it broke his eee and partially reverted it inb23fffd7
. 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@redhat.com> Acked-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Родитель
521cb40b0c
Коммит
25be582152
|
@ -33,6 +33,7 @@
|
||||||
#include <linux/async.h>
|
#include <linux/async.h>
|
||||||
#include <linux/dmi.h>
|
#include <linux/dmi.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
|
@ -102,6 +103,7 @@ struct acpi_battery {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct power_supply bat;
|
struct power_supply bat;
|
||||||
struct acpi_device *device;
|
struct acpi_device *device;
|
||||||
|
struct notifier_block pm_nb;
|
||||||
unsigned long update_time;
|
unsigned long update_time;
|
||||||
int rate_now;
|
int rate_now;
|
||||||
int capacity_now;
|
int capacity_now;
|
||||||
|
@ -940,6 +942,21 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
||||||
power_supply_changed(&battery->bat);
|
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)
|
static int acpi_battery_add(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
@ -972,6 +989,10 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||||
#endif
|
#endif
|
||||||
kfree(battery);
|
kfree(battery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
battery->pm_nb.notifier_call = battery_notify;
|
||||||
|
register_pm_notifier(&battery->pm_nb);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -982,6 +1003,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
|
||||||
if (!device || !acpi_driver_data(device))
|
if (!device || !acpi_driver_data(device))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
battery = acpi_driver_data(device);
|
battery = acpi_driver_data(device);
|
||||||
|
unregister_pm_notifier(&battery->pm_nb);
|
||||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||||
acpi_battery_remove_fs(device);
|
acpi_battery_remove_fs(device);
|
||||||
#endif
|
#endif
|
||||||
|
|
Загрузка…
Ссылка в новой задаче