eeepc-wmi: add hibernate/resume callbacks
authorCorentin Chary <corentincj@iksaif.net>
Sun, 6 Feb 2011 12:28:32 +0000 (13:28 +0100)
committerMatthew Garrett <mjg@redhat.com>
Mon, 28 Mar 2011 10:05:16 +0000 (06:05 -0400)
Signed-off-by: Corentin Chary <corentincj@iksaif.net>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
drivers/platform/x86/eeepc-wmi.c

index de501fb3d1bbf7ceb14af505db2544b3f257cd52..583ba78a7f7d2d5f456f7a6ee867ccebaadb581f 100644 (file)
@@ -1183,10 +1183,59 @@ static int eeepc_wmi_remove(struct platform_device *device)
        return 0;
 }
 
+/*
+ * Platform driver - hibernate/resume callbacks
+ */
+static int eeepc_hotk_thaw(struct device *device)
+{
+       struct eeepc_wmi *eeepc = dev_get_drvdata(device);
+
+       if (eeepc->wlan_rfkill) {
+               bool wlan;
+
+               /*
+                * Work around bios bug - acpi _PTS turns off the wireless led
+                * during suspend.  Normally it restores it on resume, but
+                * we should kick it ourselves in case hibernation is aborted.
+                */
+               wlan = eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_WLAN);
+               eeepc_wmi_set_devstate(EEEPC_WMI_DEVID_WLAN, wlan, NULL);
+       }
+
+       return 0;
+}
+
+static int eeepc_hotk_restore(struct device *device)
+{
+       struct eeepc_wmi *eeepc = dev_get_drvdata(device);
+       int bl;
+
+       /* Refresh both wlan rfkill state and pci hotplug */
+       if (eeepc->wlan_rfkill)
+               eeepc_rfkill_hotplug(eeepc);
+
+       if (eeepc->bluetooth_rfkill) {
+               bl = !eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_BLUETOOTH);
+               rfkill_set_sw_state(eeepc->bluetooth_rfkill, bl);
+}
+       if (eeepc->wwan3g_rfkill) {
+               bl = !eeepc_wmi_get_devstate_simple(EEEPC_WMI_DEVID_WWAN3G);
+               rfkill_set_sw_state(eeepc->wwan3g_rfkill, bl);
+       }
+
+       return 0;
+}
+
+static const struct dev_pm_ops eeepc_pm_ops = {
+       .thaw = eeepc_hotk_thaw,
+       .restore = eeepc_hotk_restore,
+};
+
 static struct platform_driver platform_driver = {
        .driver = {
                .name = EEEPC_WMI_FILE,
                .owner = THIS_MODULE,
+               .pm = &eeepc_pm_ops,
        },
 };