summaryrefslogtreecommitdiffstats
path: root/arch/x86/platform/olpc/olpc.c
diff options
context:
space:
mode:
authorAndres Salomon2012-07-17 10:26:10 +0200
committerAndres Salomon2012-08-01 05:27:31 +0200
commit1fcfd08bd0704e1888bd73153e8d2ca3640e22f2 (patch)
tree8aacc28564c985e96927ec16360ef9b4d73efb45 /arch/x86/platform/olpc/olpc.c
parentPlatform: OLPC: move global variables into priv struct (diff)
downloadkernel-qcow2-linux-1fcfd08bd0704e1888bd73153e8d2ca3640e22f2.tar.gz
kernel-qcow2-linux-1fcfd08bd0704e1888bd73153e8d2ca3640e22f2.tar.xz
kernel-qcow2-linux-1fcfd08bd0704e1888bd73153e8d2ca3640e22f2.zip
x86: OLPC: move s/r-related EC cmds to EC driver
The new EC driver calls platform-specific suspend and resume hooks; run XO-1-specific EC commands from there, rather than deep in s/r code. If we attempt to run EC commands after the new EC driver has suspended, it is refused by the ec->suspended checks. Signed-off-by: Andres Salomon <dilinger@queued.net> Acked-by: Paul Fox <pgf@laptop.org> Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/platform/olpc/olpc.c')
-rw-r--r--arch/x86/platform/olpc/olpc.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/arch/x86/platform/olpc/olpc.c b/arch/x86/platform/olpc/olpc.c
index ed41b437b37b..27376081ddec 100644
--- a/arch/x86/platform/olpc/olpc.c
+++ b/arch/x86/platform/olpc/olpc.c
@@ -263,11 +263,6 @@ int olpc_ec_sci_query(u16 *sci_value)
}
EXPORT_SYMBOL_GPL(olpc_ec_sci_query);
-static int olpc_ec_suspend(struct platform_device *pdev)
-{
- return olpc_ec_mask_write(ec_wakeup_mask);
-}
-
static bool __init check_ofw_architecture(struct device_node *root)
{
const char *olpc_arch;
@@ -339,9 +334,40 @@ static int olpc_xo1_ec_probe(struct platform_device *pdev)
return 0;
}
+static int olpc_xo1_ec_suspend(struct platform_device *pdev)
+{
+ olpc_ec_mask_write(ec_wakeup_mask);
+
+ /*
+ * Squelch SCIs while suspended. This is a fix for
+ * <http://dev.laptop.org/ticket/1835>.
+ */
+ return olpc_ec_cmd(EC_SET_SCI_INHIBIT, NULL, 0, NULL, 0);
+}
+
+static int olpc_xo1_ec_resume(struct platform_device *pdev)
+{
+ /* Tell the EC to stop inhibiting SCIs */
+ olpc_ec_cmd(EC_SET_SCI_INHIBIT_RELEASE, NULL, 0, NULL, 0);
+
+ /*
+ * Tell the wireless module to restart USB communication.
+ * Must be done twice.
+ */
+ olpc_ec_cmd(EC_WAKE_UP_WLAN, NULL, 0, NULL, 0);
+ olpc_ec_cmd(EC_WAKE_UP_WLAN, NULL, 0, NULL, 0);
+
+ return 0;
+}
static struct olpc_ec_driver ec_xo1_driver = {
- .suspend = olpc_ec_suspend,
+ .probe = olpc_xo1_ec_probe,
+ .suspend = olpc_xo1_ec_suspend,
+ .resume = olpc_xo1_ec_resume,
+ .ec_cmd = olpc_xo1_ec_cmd,
+};
+
+static struct olpc_ec_driver ec_xo1_5_driver = {
.probe = olpc_xo1_ec_probe,
.ec_cmd = olpc_xo1_ec_cmd,
};
@@ -354,7 +380,10 @@ static int __init olpc_init(void)
return 0;
/* register the XO-1 and 1.5-specific EC handler */
- olpc_ec_driver_register(&ec_xo1_driver, NULL);
+ if (olpc_platform_info.boardrev < olpc_board_pre(0xd0)) /* XO-1 */
+ olpc_ec_driver_register(&ec_xo1_driver, NULL);
+ else
+ olpc_ec_driver_register(&ec_xo1_5_driver, NULL);
platform_device_register_simple("olpc-ec", -1, NULL, 0);
/* assume B1 and above models always have a DCON */