[PATCH 09/11] x86, olpc-xo1-sci: Propagate power supply/battery events

From: Daniel Drake
Date: Sat Apr 30 2011 - 08:29:43 EST


EC events indicate change in AC power connectivity, battery state of
charge, battery error, battery presence, etc. Send notifications to
the power supply subsystem when changes are detected.

Signed-off-by: Daniel Drake <dsd@xxxxxxxxxx>
---
arch/x86/Kconfig | 4 ++-
arch/x86/platform/olpc/olpc-xo1-sci.c | 37 +++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index c40cd82..583e1c5 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2074,13 +2074,15 @@ config OLPC_XO1_PM

config OLPC_XO1_SCI
bool "OLPC XO-1 SCI extras"
- depends on OLPC && OLPC_XO1_PM
+ depends on OLPC && OLPC_XO1_PM && POWER_SUPPLY
---help---
Add support for SCI-based features of the OLPC XO-1 laptop:
- EC-driven system wakeups
- Power button
- Ebook switch
- Lid switch
+ - AC adapter status updates
+ - Battery status updates

endif # X86_32

diff --git a/arch/x86/platform/olpc/olpc-xo1-sci.c b/arch/x86/platform/olpc/olpc-xo1-sci.c
index 176e4ae..1cd800e 100644
--- a/arch/x86/platform/olpc/olpc-xo1-sci.c
+++ b/arch/x86/platform/olpc/olpc-xo1-sci.c
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/mfd/core.h>
+#include <linux/power_supply.h>
#include <linux/suspend.h>
#include <linux/workqueue.h>

@@ -52,6 +53,26 @@ static const char * const lid_wake_mode_names[] = {
[LID_WAKE_CLOSE] = "close",
};

+static void battery_status_changed(void)
+{
+ struct power_supply *psy = power_supply_get_by_name("olpc-battery");
+
+ if (psy) {
+ power_supply_changed(psy);
+ put_device(psy->dev);
+ }
+}
+
+static void ac_status_changed(void)
+{
+ struct power_supply *psy = power_supply_get_by_name("olpc-ac");
+
+ if (psy) {
+ power_supply_changed(psy);
+ put_device(psy->dev);
+ }
+}
+
/* Report current ebook switch state through input layer */
static void send_ebook_state(void)
{
@@ -151,6 +172,18 @@ static void process_sci_queue(bool propagate_events)

pr_debug(PFX "SCI 0x%x received\n", data);

+ switch (data) {
+ case EC_SCI_SRC_BATERR:
+ case EC_SCI_SRC_BATSOC:
+ case EC_SCI_SRC_BATTERY:
+ case EC_SCI_SRC_BATCRIT:
+ battery_status_changed();
+ break;
+ case EC_SCI_SRC_ACPWR:
+ ac_status_changed();
+ break;
+ }
+
if (data == EC_SCI_SRC_EBOOK && propagate_events)
send_ebook_state();
} while (data);
@@ -240,6 +273,10 @@ static int xo1_sci_resume(struct platform_device *pdev)

/* Enable all EC events */
olpc_ec_mask_write(EC_SCI_SRC_ALL);
+
+ /* Power/battery status might have changed too */
+ battery_status_changed();
+ ac_status_changed();
return 0;
}

--
1.7.4.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/