Skip to content

Commit b7d4664

Browse files
Sakari Ailusrafaeljw
authored andcommitted
PM: runtime: Add pm_runtime_put_autosuspend() replacement
Add __pm_runtime_put_autosuspend() that replaces pm_runtime_put_autosuspend() for new users. The intent is to later re-purpose pm_runtime_put_autosuspend() to also mark the device's last busy stamp---which is what the vast majority of users actually need. This is also described in pm_runtime_put_autosuspend() documentation. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent c0ef3df commit b7d4664

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

Documentation/power/runtime_pm.rst

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ suspending the device are satisfied) and to queue up a suspend request for the
154154
device in that case. If there is no idle callback, or if the callback returns
155155
0, then the PM core will attempt to carry out a runtime suspend of the device,
156156
also respecting devices configured for autosuspend. In essence this means a
157-
call to pm_runtime_autosuspend() (do note that drivers needs to update the
157+
call to __pm_runtime_autosuspend() (do note that drivers needs to update the
158158
device last busy mark, pm_runtime_mark_last_busy(), to control the delay under
159159
this circumstance). To prevent this (for example, if the callback routine has
160160
started a delayed suspend), the routine must return a non-zero value. Negative
@@ -409,6 +409,10 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
409409
pm_request_idle(dev) and return its result
410410

411411
`int pm_runtime_put_autosuspend(struct device *dev);`
412+
- does the same as __pm_runtime_put_autosuspend() for now, but in the
413+
future, will also call pm_runtime_mark_last_busy() as well, DO NOT USE!
414+
415+
`int __pm_runtime_put_autosuspend(struct device *dev);`
412416
- decrement the device's usage counter; if the result is 0 then run
413417
pm_request_autosuspend(dev) and return its result
414418

@@ -539,6 +543,7 @@ It is safe to execute the following helper functions from interrupt context:
539543
- pm_runtime_put_noidle()
540544
- pm_runtime_put()
541545
- pm_runtime_put_autosuspend()
546+
- __pm_runtime_put_autosuspend()
542547
- pm_runtime_enable()
543548
- pm_suspend_ignore_children()
544549
- pm_runtime_set_active()
@@ -864,9 +869,9 @@ automatically be delayed until the desired period of inactivity has elapsed.
864869

865870
Inactivity is determined based on the power.last_busy field. Drivers should
866871
call pm_runtime_mark_last_busy() to update this field after carrying out I/O,
867-
typically just before calling pm_runtime_put_autosuspend(). The desired length
868-
of the inactivity period is a matter of policy. Subsystems can set this length
869-
initially by calling pm_runtime_set_autosuspend_delay(), but after device
872+
typically just before calling __pm_runtime_put_autosuspend(). The desired
873+
length of the inactivity period is a matter of policy. Subsystems can set this
874+
length initially by calling pm_runtime_set_autosuspend_delay(), but after device
870875
registration the length should be controlled by user space, using the
871876
/sys/devices/.../power/autosuspend_delay_ms attribute.
872877

@@ -877,7 +882,7 @@ instead of the non-autosuspend counterparts::
877882

878883
Instead of: pm_runtime_suspend use: pm_runtime_autosuspend;
879884
Instead of: pm_schedule_suspend use: pm_request_autosuspend;
880-
Instead of: pm_runtime_put use: pm_runtime_put_autosuspend;
885+
Instead of: pm_runtime_put use: __pm_runtime_put_autosuspend;
881886
Instead of: pm_runtime_put_sync use: pm_runtime_put_sync_autosuspend.
882887

883888
Drivers may also continue to use the non-autosuspend helper functions; they
@@ -916,7 +921,7 @@ Here is a schematic pseudo-code example::
916921
lock(&foo->private_lock);
917922
if (--foo->num_pending_requests == 0) {
918923
pm_runtime_mark_last_busy(&foo->dev);
919-
pm_runtime_put_autosuspend(&foo->dev);
924+
__pm_runtime_put_autosuspend(&foo->dev);
920925
} else {
921926
foo_process_next_request(foo);
922927
}

include/linux/pm_runtime.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,18 @@ static inline int pm_runtime_put(struct device *dev)
448448
return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
449449
}
450450

451+
/**
452+
* __pm_runtime_put_autosuspend - Drop device usage counter and queue autosuspend if 0.
453+
* @dev: Target device.
454+
*
455+
* Decrement the runtime PM usage counter of @dev and if it turns out to be
456+
* equal to 0, queue up a work item for @dev like in pm_request_autosuspend().
457+
*/
458+
static inline int __pm_runtime_put_autosuspend(struct device *dev)
459+
{
460+
return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
461+
}
462+
451463
/**
452464
* pm_runtime_put_autosuspend - Drop device usage counter and queue autosuspend if 0.
453465
* @dev: Target device.

0 commit comments

Comments
 (0)