linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: rjw@sisk.pl (Rafael J. Wysocki)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] PM / Runtime: let rpm_resume() succeed if RPM_ACTIVE, even when disabled
Date: Sat, 22 Sep 2012 13:25:10 +0200	[thread overview]
Message-ID: <201209221325.10889.rjw@sisk.pl> (raw)
In-Reply-To: <1348267654-30697-1-git-send-email-khilman@deeprootsystems.com>

On Saturday, September 22, 2012, Kevin Hilman wrote:
> From: Kevin Hilman <khilman@ti.com>
> 
> 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.
> 
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: Alan Stern <stern@rowland.harvard.edu>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> v2: 
> - major changelog rewrite, based largely on input from Rafael 
> - add check for disable_depth == 1 and move to separate if statement,
>   both suggested by Alan Stern

OK, this looks good to me, thanks!

Alan, what do you think?

Rafael


>  drivers/base/power/runtime.c |    3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> index 7d9c1cb..d43856b 100644
> --- a/drivers/base/power/runtime.c
> +++ b/drivers/base/power/runtime.c
> @@ -509,6 +509,9 @@ static int rpm_resume(struct device *dev, int rpmflags)
>   repeat:
>  	if (dev->power.runtime_error)
>  		retval = -EINVAL;
> +	else if (dev->power.disable_depth == 1 && dev->power.is_suspended
> +		 && dev->power.runtime_status == RPM_ACTIVE)
> +		retval = 1;
>  	else if (dev->power.disable_depth > 0)
>  		retval = -EACCES;
>  	if (retval)
> 

  reply	other threads:[~2012-09-22 11:25 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-21 22:47 [PATCH v2] PM / Runtime: let rpm_resume() succeed if RPM_ACTIVE, even when disabled Kevin Hilman
2012-09-22 11:25 ` Rafael J. Wysocki [this message]
2012-09-22 15:33   ` Alan Stern
2012-09-22 19:42     ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201209221325.10889.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).