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---
- Power button
- Ebook switch
- Lid switch
+ - AC adapter status updates
+ - Battery status updates
endif # X86_32
#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>
[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)
{
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);
/* 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;
}