Alan Jenkins wrote: > 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: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx> > --- > drivers/platform/x86/eeepc-laptop.c | 25 +++++++++++++++++++------ > 1 files changed, 19 insertions(+), 6 deletions(-) > > diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c > index df68ae6..1c94860 100644 > --- a/drivers/platform/x86/eeepc-laptop.c > +++ b/drivers/platform/x86/eeepc-laptop.c > @@ -150,10 +150,19 @@ struct eeepc_hotk { > static struct eeepc_hotk *ehotk; > > /* 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 = { > .driver = { > .name = EEEPC_HOTK_FILE, > .owner = THIS_MODULE, > + .pm = &eeepc_pm_ops, > } > }; > > @@ -192,7 +201,6 @@ static struct key_entry eeepc_keymap[] = { > */ > static int eeepc_hotk_add(struct acpi_device *device); > 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 const struct acpi_device_id eeepc_device_ids[] = { > @@ -209,7 +217,6 @@ static struct acpi_driver eeepc_hotk_driver = { > .ops = { > .add = eeepc_hotk_add, > .remove = eeepc_hotk_remove, > - .resume = eeepc_hotk_resume, > .notify = eeepc_hotk_notify, > }, > }; > @@ -821,7 +828,7 @@ error_slot: > return ret; > } > > -static int eeepc_hotk_resume(struct acpi_device *device) > +static int eeepc_hotk_thaw(struct device *device) > { > if (ehotk->wlan_rfkill) { > bool wlan; > @@ -829,14 +836,20 @@ static int eeepc_hotk_resume(struct acpi_device *device) > /* > * 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 suspend is aborted. > + * we should kick it ourselves in case hibernation is aborted. > */ > wlan = get_acpi(CM_ASL_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(); > - } > > if (ehotk->bluetooth_rfkill) > rfkill_set_sw_state(ehotk->bluetooth_rfkill, > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html