re-create ACPI battery sysfs files on resume from suspend

Fixes the upstream changes to the dropped
acpi-update-battery-information-on-notification-0x81.patch.
This commit is contained in:
Kyle McMartin 2011-03-23 09:42:21 -04:00
parent e8c0dae39e
commit 1121f6ddf0
2 changed files with 96 additions and 0 deletions

View File

@ -0,0 +1,89 @@
From lenb@kernel.org Wed Mar 23 03:07:45 2011
From: Len Brown <lenb@kernel.org>
To: linux-acpi@vger.kernel.org
Cc: Kyle McMartin <kyle@redhat.com>, Len Brown <len.brown@intel.com>
Subject: [PATCH 35/42] ACPI battery: fribble sysfs files from a resume notifier
Date: Wed, 23 Mar 2011 02:42:48 -0400
From: Kyle McMartin <kyle@redhat.com>
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@redhat.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
---
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
--
1.7.4.1.343.ga91df

View File

@ -640,6 +640,7 @@ Patch390: linux-2.6-defaults-acpi-video.patch
Patch391: linux-2.6-acpi-video-dos.patch
Patch393: acpi-ec-add-delay-before-write.patch
Patch394: linux-2.6-acpi-debug-infinite-loop.patch
Patch399: acpi_battery-fribble-sysfs-files-from-a-resume-notifier.patch
Patch450: linux-2.6-input-kill-stupid-messages.patch
Patch452: linux-2.6.30-no-pcspkr-modalias.patch
@ -1215,6 +1216,7 @@ ApplyPatch linux-2.6-defaults-acpi-video.patch
ApplyPatch linux-2.6-acpi-video-dos.patch
ApplyPatch acpi-ec-add-delay-before-write.patch
ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch
ApplyPatch acpi_battery-fribble-sysfs-files-from-a-resume-notifier.patch
# Various low-impact patches to aid debugging.
ApplyPatch linux-2.6-debug-sizeof-structs.patch
@ -1954,6 +1956,11 @@ fi
# and build.
%changelog
* Wed Mar 23 2011 Kyle McMartin <kmcmartin@redhat.com>
- Re-create ACPI battery sysfs files on resume from suspend, fixes the
upstream changes to the dropped
acpi-update-battery-information-on-notification-0x81.patch.
* Wed Mar 23 2011 Kyle McMartin <kmcmartin@redhat.com>
- Update to 2.6.38-git12
- Enable I2C_DIOLAN_U2C USB i2c adapter [all], I2C_PXA [i686].