Commit c200da5d authored by Alan Jenkins's avatar Alan Jenkins Committed by Len Brown

eeepc-laptop: switch to dev_pm_ops

This also involves switching the resume handler from the acpi device
to the platform device.  Using the more fine grained handlers allows
two improvements:

1. We only need to recheck rfkill state after resume from hibernation.

2. The wireless LED workaround accounts for up to 1.1s out of 1.7s
resuming devices (when wireless is enabled).  We can limit the
workaround to thaw(), so that it only delays suspend to disk.

The workaround is only likely to help when hibernation is aborted.
Suspend to ram cannot be aborted by the user.  Device suspend errors may
well happen before eeepc-laptop would even be frozen.  Suspend errors
which happen after that could be pretty funky anyway.
Signed-off-by: default avatarAlan Jenkins <alan-jenkins@tuffmail.co.uk>
Signed-off-by: default avatarCorentin Chary <corentincj@iksaif.net>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent c1edd99f
...@@ -150,10 +150,19 @@ struct eeepc_hotk { ...@@ -150,10 +150,19 @@ struct eeepc_hotk {
static struct eeepc_hotk *ehotk; static struct eeepc_hotk *ehotk;
/* Platform device/driver */ /* Platform device/driver */
static int eeepc_hotk_thaw(struct device *device);
static int eeepc_hotk_restore(struct device *device);
static struct dev_pm_ops eeepc_pm_ops = {
.thaw = eeepc_hotk_thaw,
.restore = eeepc_hotk_restore,
};
static struct platform_driver platform_driver = { static struct platform_driver platform_driver = {
.driver = { .driver = {
.name = EEEPC_HOTK_FILE, .name = EEEPC_HOTK_FILE,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = &eeepc_pm_ops,
} }
}; };
...@@ -192,7 +201,6 @@ static struct key_entry eeepc_keymap[] = { ...@@ -192,7 +201,6 @@ static struct key_entry eeepc_keymap[] = {
*/ */
static int eeepc_hotk_add(struct acpi_device *device); static int eeepc_hotk_add(struct acpi_device *device);
static int eeepc_hotk_remove(struct acpi_device *device, int type); static int eeepc_hotk_remove(struct acpi_device *device, int type);
static int eeepc_hotk_resume(struct acpi_device *device);
static void eeepc_hotk_notify(struct acpi_device *device, u32 event); static void eeepc_hotk_notify(struct acpi_device *device, u32 event);
static const struct acpi_device_id eeepc_device_ids[] = { static const struct acpi_device_id eeepc_device_ids[] = {
...@@ -209,7 +217,6 @@ static struct acpi_driver eeepc_hotk_driver = { ...@@ -209,7 +217,6 @@ static struct acpi_driver eeepc_hotk_driver = {
.ops = { .ops = {
.add = eeepc_hotk_add, .add = eeepc_hotk_add,
.remove = eeepc_hotk_remove, .remove = eeepc_hotk_remove,
.resume = eeepc_hotk_resume,
.notify = eeepc_hotk_notify, .notify = eeepc_hotk_notify,
}, },
}; };
...@@ -821,7 +828,7 @@ static int eeepc_setup_pci_hotplug(void) ...@@ -821,7 +828,7 @@ static int eeepc_setup_pci_hotplug(void)
return ret; return ret;
} }
static int eeepc_hotk_resume(struct acpi_device *device) static int eeepc_hotk_thaw(struct device *device)
{ {
if (ehotk->wlan_rfkill) { if (ehotk->wlan_rfkill) {
bool wlan; bool wlan;
...@@ -829,14 +836,20 @@ static int eeepc_hotk_resume(struct acpi_device *device) ...@@ -829,14 +836,20 @@ static int eeepc_hotk_resume(struct acpi_device *device)
/* /*
* Work around bios bug - acpi _PTS turns off the wireless led * Work around bios bug - acpi _PTS turns off the wireless led
* during suspend. Normally it restores it on resume, but * during suspend. Normally it restores it on resume, but
* we should kick it ourselves in case suspend is aborted. * we should kick it ourselves in case hibernation is aborted.
*/ */
wlan = get_acpi(CM_ASL_WLAN); wlan = get_acpi(CM_ASL_WLAN);
set_acpi(CM_ASL_WLAN, wlan); set_acpi(CM_ASL_WLAN, wlan);
}
return 0;
}
/* Refresh both rfkill state and pci hotplug */ static int eeepc_hotk_restore(struct device *device)
{
/* Refresh both wlan rfkill state and pci hotplug */
if (ehotk->wlan_rfkill)
eeepc_rfkill_hotplug(); eeepc_rfkill_hotplug();
}
if (ehotk->bluetooth_rfkill) if (ehotk->bluetooth_rfkill)
rfkill_set_sw_state(ehotk->bluetooth_rfkill, rfkill_set_sw_state(ehotk->bluetooth_rfkill,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment