linux/drivers/base/power
Kevin Hilman 6f3c77b040 PM / Runtime: let rpm_resume() succeed if RPM_ACTIVE, even when disabled, v2
There are several drivers where the return value of
pm_runtime_get_sync() is used to decide whether or not it is safe to
access hardware and that don't provide .suspend() callbacks for system
suspend (but may use late/noirq callbacks.)  If such a driver happens
to call pm_runtime_get_sync() during system suspend, after the core
has disabled runtime PM, it will get the error code and will decide
that the hardware should not be accessed, although this may be a wrong
conclusion, depending on the state of the device when runtime PM was
disabled.

Drivers might work around this problem by using a test like:

   ret = pm_runtime_get_sync(dev);
   if (!ret || (ret == -EACCES && driver_private_data(dev)->suspended)) {
      /* access hardware */
   }

where driver_private_data(dev)->suspended is a flag set by the
driver's .suspend() method (that would have to be added for this
purpose).  However, that potentially would need to be done by multiple
drivers which means quite a lot of duplicated code and bloat.

To avoid that we can use the observation that the core sets
dev->power.is_suspended before disabling runtime PM and use that
instead of the driver's private flag.  Still, potentially many drivers
would need to repeat that same check in quite a few places, so it's
better to let the core do it.

Then we can be a bit smarter and check whether or not runtime PM was
disabled by the core only (disable_depth == 1) or by someone else in
addition to the core (disable_depth > 1).  In the former case
rpm_resume() can return 1 if the runtime PM status is RPM_ACTIVE,
because it means the device was active when the core disabled runtime
PM.  In the latter case it should still return -EACCES, because it
isn't clear why runtime PM has been disabled.

Tested on AM3730/Beagle-xM where a wakeup IRQ firing during the late
suspend phase triggers runtime PM activity in the I2C driver since the
wakeup IRQ is on an I2C-connected PMIC.

[rjw: Modified whitespace to follow the file's convention.]

Signed-off-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2012-09-22 21:15:08 +02:00
..
clock_ops.c PM: Make dev_pm_get_subsys_data() always return 0 on success 2012-08-08 20:49:33 +02:00
common.c PM: Make dev_pm_get_subsys_data() always return 0 on success 2012-08-08 20:49:33 +02:00
domain_governor.c PM / Domains: Fix computation of maximum domain off time 2012-05-11 21:11:44 +02:00
domain.c PM / Domains: Fix build warning for CONFIG_PM_RUNTIME unset 2012-07-12 22:39:49 +02:00
generic_ops.c PM / Sleep: Introduce generic callbacks for new device PM phases 2012-01-29 20:38:41 +01:00
main.c Merge branch 'pm-sleep' 2012-07-19 10:39:21 +02:00
Makefile PM / Domains: Add device stop governor function (v4) 2011-12-01 21:47:40 +01:00
opp.c device.h: cleanup users outside of linux/include (C files) 2012-03-11 14:27:37 -04:00
power.h PM / Sleep: Separate printing suspend times from initcall_debug 2012-07-01 13:31:23 +02:00
qos.c PM / QoS: Use NULL pointer instead of plain integer in qos.c 2012-07-19 00:02:36 +02:00
runtime.c PM / Runtime: let rpm_resume() succeed if RPM_ACTIVE, even when disabled, v2 2012-09-22 21:15:08 +02:00
sysfs.c PM / Sleep: Fix build warning in sysfs.c for CONFIG_PM_SLEEP unset 2012-07-12 22:40:02 +02:00
trace.c drivers/base: Add export.h for EXPORT_SYMBOL/THIS_MODULE as required. 2011-10-31 19:31:38 -04:00
wakeup.c PM / Sleep: Add user space interface for manipulating wakeup sources, v3 2012-05-01 21:26:05 +02:00