Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Sakari Ailus and committed by
Rafael J. Wysocki
b7d46644 c0ef3df8

+23 -6
+11 -6
Documentation/power/runtime_pm.rst
··· 154 154 device in that case. If there is no idle callback, or if the callback returns 155 155 0, then the PM core will attempt to carry out a runtime suspend of the device, 156 156 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 158 158 device last busy mark, pm_runtime_mark_last_busy(), to control the delay under 159 159 this circumstance). To prevent this (for example, if the callback routine has 160 160 started a delayed suspend), the routine must return a non-zero value. Negative ··· 409 409 pm_request_idle(dev) and return its result 410 410 411 411 `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);` 412 416 - decrement the device's usage counter; if the result is 0 then run 413 417 pm_request_autosuspend(dev) and return its result 414 418 ··· 543 539 - pm_runtime_put_noidle() 544 540 - pm_runtime_put() 545 541 - pm_runtime_put_autosuspend() 542 + - __pm_runtime_put_autosuspend() 546 543 - pm_runtime_enable() 547 544 - pm_suspend_ignore_children() 548 545 - pm_runtime_set_active() ··· 869 864 870 865 Inactivity is determined based on the power.last_busy field. Drivers should 871 866 call pm_runtime_mark_last_busy() to update this field after carrying out I/O, 872 - typically just before calling pm_runtime_put_autosuspend(). The desired length 873 - of the inactivity period is a matter of policy. Subsystems can set this length 874 - initially by calling pm_runtime_set_autosuspend_delay(), but after device 867 + typically just before calling __pm_runtime_put_autosuspend(). The desired 868 + length of the inactivity period is a matter of policy. Subsystems can set this 869 + length initially by calling pm_runtime_set_autosuspend_delay(), but after device 875 870 registration the length should be controlled by user space, using the 876 871 /sys/devices/.../power/autosuspend_delay_ms attribute. 877 872 ··· 882 877 883 878 Instead of: pm_runtime_suspend use: pm_runtime_autosuspend; 884 879 Instead of: pm_schedule_suspend use: pm_request_autosuspend; 885 - Instead of: pm_runtime_put use: pm_runtime_put_autosuspend; 880 + Instead of: pm_runtime_put use: __pm_runtime_put_autosuspend; 886 881 Instead of: pm_runtime_put_sync use: pm_runtime_put_sync_autosuspend. 887 882 888 883 Drivers may also continue to use the non-autosuspend helper functions; they ··· 921 916 lock(&foo->private_lock); 922 917 if (--foo->num_pending_requests == 0) { 923 918 pm_runtime_mark_last_busy(&foo->dev); 924 - pm_runtime_put_autosuspend(&foo->dev); 919 + __pm_runtime_put_autosuspend(&foo->dev); 925 920 } else { 926 921 foo_process_next_request(foo); 927 922 }
+12
include/linux/pm_runtime.h
··· 449 449 } 450 450 451 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 + 463 + /** 452 464 * pm_runtime_put_autosuspend - Drop device usage counter and queue autosuspend if 0. 453 465 * @dev: Target device. 454 466 *