PM / Wakeirq: Add automated device wake IRQ handling
authorTony Lindgren <tony@atomide.com>
Mon, 18 May 2015 22:40:29 +0000 (15:40 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 19 May 2015 23:56:31 +0000 (01:56 +0200)
commit4990d4fe327b9d9a7a3be7103a82699406fdde69
tree00fbe86ede4fb244f56675d16dbb5581b016f2f0
parent56f487c78015936097474fd89b2ccb229d500d0f
PM / Wakeirq: Add automated device wake IRQ handling

Turns out we can automate the handling for the device_may_wakeup()
quite a bit by using the kernel wakeup source list as suggested
by Rafael J. Wysocki <rjw@rjwysocki.net>.

And as some hardware has separate dedicated wake-up interrupt
in addition to the IO interrupt, we can automate the handling by
adding a generic threaded interrupt handler that just calls the
device PM runtime to wake up the device.

This allows dropping code from device drivers as we currently
are doing it in multiple ways, and often wrong.

For most drivers, we should be able to drop the following
boilerplate code from runtime_suspend and runtime_resume
functions:

...
device_init_wakeup(dev, true);
...
if (device_may_wakeup(dev))
enable_irq_wake(irq);
...
if (device_may_wakeup(dev))
disable_irq_wake(irq);
...
device_init_wakeup(dev, false);
...

We can replace it with just the following init and exit
time code:

...
device_init_wakeup(dev, true);
dev_pm_set_wake_irq(dev, irq);
...
dev_pm_clear_wake_irq(dev);
device_init_wakeup(dev, false);
...

And for hardware with dedicated wake-up interrupts:

...
device_init_wakeup(dev, true);
dev_pm_set_dedicated_wake_irq(dev, irq);
...
dev_pm_clear_wake_irq(dev);
device_init_wakeup(dev, false);
...

Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/Makefile
drivers/base/power/main.c
drivers/base/power/power.h
drivers/base/power/runtime.c
drivers/base/power/wakeirq.c [new file with mode: 0644]
drivers/base/power/wakeup.c
include/linux/pm.h
include/linux/pm_wakeirq.h [new file with mode: 0644]
include/linux/pm_wakeup.h