summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/Kconfig4
-rw-r--r--arch/x86/platform/olpc/olpc-xo1-sci.c37
2 files changed, 40 insertions, 1 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 350ccbb4d650..a6aefbbc5cbf 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2082,7 +2082,7 @@ 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
select GPIO_CS5535
select MFD_CORE
---help---
@@ -2091,6 +2091,8 @@ config OLPC_XO1_SCI
- 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 ad0670bca833..1d4c783d7325 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;
}
OpenPOWER on IntegriCloud