@@ -363,6 +363,9 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
void pm_runtime_get_noresume(struct device *dev);
- increment the device's usage counter
+ int pm_runtime_get_noidle(struct device *dev);
+ - increment the device's usage counter if it was not 0 and return it
+
int pm_runtime_get(struct device *dev);
- increment the device's usage counter, run pm_request_resume(dev) and
return its result
@@ -66,6 +66,11 @@ static inline void pm_runtime_get_noresume(struct device *dev)
atomic_inc(&dev->power.usage_count);
}
+static inline int pm_runtime_get_noidle(struct device *dev)
+{
+ return atomic_add_unless(&dev->power.usage_count, 1, 0);
+}
+
static inline void pm_runtime_put_noidle(struct device *dev)
{
atomic_add_unless(&dev->power.usage_count, -1, 0);
@@ -153,6 +158,7 @@ static inline void pm_runtime_forbid(struct device *dev) {}
static inline bool pm_children_suspended(struct device *dev) { return false; }
static inline void pm_runtime_get_noresume(struct device *dev) {}
+static inline bool pm_runtime_get_noidle(struct device *dev) { return true; }
static inline void pm_runtime_put_noidle(struct device *dev) {}
static inline bool device_run_wake(struct device *dev) { return false; }
static inline void device_set_run_wake(struct device *dev, bool enable) {}
Introduce pm_runtime_get_noidle to for situations where it is not desireable to touch an idling device. One use scenario is periodic hangchecks performed by the drm/i915 driver which can be omitted on a device in a runtime idle state. Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reported-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: linux-pm@vger.kernel.org --- Documentation/power/runtime_pm.txt | 3 +++ include/linux/pm_runtime.h | 6 ++++++ 2 files changed, 9 insertions(+)