Message ID | 1348097990-5956-1-git-send-email-khilman@deeprootsystems.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Thursday, September 20, 2012, Kevin Hilman wrote: > From: Kevin Hilman <khilman@ti.com> > > When runtime PM is disabled, what we want is for callbacks not to be > called from then on. However, currently, when runtime PM is disabled, > operations such as 'get' will also fail even if the device is > currently active. > > Since calling 'get' on a device that is already RPM_ACTIVE does not > involve calling the callbacks, it should be allowed to succeed, even > if runtime PM is disabled. > > This is particularily useful in runtime PM enabled drivers that are > used during system suspend. Because runtime PM is disabled during > system suspend, currently any driver's use of pm_runtime_get* will > fail with -EACCES. This is expected if the device was already runtime > suspended, but if the device is actually active (due to recent usage, > autosuspend timeout not expired, or pm_runtime_resume() called in > ->suspend() method), the pm_runtime_get*() call should actually > succeed. > > To permit the usage described above, add a check to rpm_resume() so > that success is returned in the case where a driver is suspended (it's > ->suspend callback has been called) but is still RPM_ACTIVE. > > This patch was developed in close collaboration with Rafael J. Wysocki > <rjw@sisk.pl> > > Tested on AM3730/Beagle-xM where 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. Please resend it with a CC to linux-pm@vger.kernel.org. Nobody reads linux-pm@lists.linux-foundation.org today, I suppose ... Thanks, Rafael > Cc: Rafael J. Wysocki <rjw@sisk.pl> > Signed-off-by: Kevin Hilman <khilman@ti.com> > --- > drivers/base/power/runtime.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c > index 7d9c1cb..dafa5ec 100644 > --- a/drivers/base/power/runtime.c > +++ b/drivers/base/power/runtime.c > @@ -510,7 +510,8 @@ static int rpm_resume(struct device *dev, int rpmflags) > if (dev->power.runtime_error) > retval = -EINVAL; > else if (dev->power.disable_depth > 0) > - retval = -EACCES; > + retval = dev->power.is_suspended && > + dev->power.runtime_status == RPM_ACTIVE ? 1 : -EACCES; > if (retval) > goto out; > > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 7d9c1cb..dafa5ec 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -510,7 +510,8 @@ static int rpm_resume(struct device *dev, int rpmflags) if (dev->power.runtime_error) retval = -EINVAL; else if (dev->power.disable_depth > 0) - retval = -EACCES; + retval = dev->power.is_suspended && + dev->power.runtime_status == RPM_ACTIVE ? 1 : -EACCES; if (retval) goto out;