aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/power/runtime.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-07-01 16:29:15 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2011-07-02 08:30:10 -0400
commit632e270e01d8a1ee9e8ea56c83028727f17b1d17 (patch)
tree58cbc127f9f173409f40bbaf27f8ea85c185c52d /drivers/base/power/runtime.c
parent455716e9b12ba93e93181ac88bef62e4eb5ac66c (diff)
PM / Runtime: Return special error code if runtime PM is disabled
Some callers of pm_runtime_get_sync() and other runtime PM helper functions, scsi_autopm_get_host() and scsi_autopm_get_device() in particular, need to distinguish error codes returned when runtime PM is disabled (i.e. power.disable_depth is nonzero for the given device) from error codes returned in other situations. For this reason, make the runtime PM helper functions return -EACCES when power.disable_depth is nonzero and ensure that this error code won't be returned by them in any other circumstances. Modify scsi_autopm_get_host() and scsi_autopm_get_device() to check the error code returned by pm_runtime_get_sync() and ignore -EACCES. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers/base/power/runtime.c')
-rw-r--r--drivers/base/power/runtime.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 5f5c4236f00..ee99025be6b 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -135,8 +135,9 @@ static int rpm_check_suspend_allowed(struct device *dev)
135 135
136 if (dev->power.runtime_error) 136 if (dev->power.runtime_error)
137 retval = -EINVAL; 137 retval = -EINVAL;
138 else if (atomic_read(&dev->power.usage_count) > 0 138 else if (dev->power.disable_depth > 0)
139 || dev->power.disable_depth > 0) 139 retval = -EACCES;
140 else if (atomic_read(&dev->power.usage_count) > 0)
140 retval = -EAGAIN; 141 retval = -EAGAIN;
141 else if (!pm_children_suspended(dev)) 142 else if (!pm_children_suspended(dev))
142 retval = -EBUSY; 143 retval = -EBUSY;
@@ -262,7 +263,7 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev)
262 spin_lock_irq(&dev->power.lock); 263 spin_lock_irq(&dev->power.lock);
263 } 264 }
264 dev->power.runtime_error = retval; 265 dev->power.runtime_error = retval;
265 return retval; 266 return retval != -EACCES ? retval : -EIO;
266} 267}
267 268
268/** 269/**
@@ -458,7 +459,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
458 if (dev->power.runtime_error) 459 if (dev->power.runtime_error)
459 retval = -EINVAL; 460 retval = -EINVAL;
460 else if (dev->power.disable_depth > 0) 461 else if (dev->power.disable_depth > 0)
461 retval = -EAGAIN; 462 retval = -EACCES;
462 if (retval) 463 if (retval)
463 goto out; 464 goto out;
464 465