xref: /linux-6.15/include/linux/pm_runtime.h (revision d690b2cd)
15e928f77SRafael J. Wysocki /*
25e928f77SRafael J. Wysocki  * pm_runtime.h - Device run-time power management helper functions.
35e928f77SRafael J. Wysocki  *
45e928f77SRafael J. Wysocki  * Copyright (C) 2009 Rafael J. Wysocki <[email protected]>
55e928f77SRafael J. Wysocki  *
65e928f77SRafael J. Wysocki  * This file is released under the GPLv2.
75e928f77SRafael J. Wysocki  */
85e928f77SRafael J. Wysocki 
95e928f77SRafael J. Wysocki #ifndef _LINUX_PM_RUNTIME_H
105e928f77SRafael J. Wysocki #define _LINUX_PM_RUNTIME_H
115e928f77SRafael J. Wysocki 
125e928f77SRafael J. Wysocki #include <linux/device.h>
135e928f77SRafael J. Wysocki #include <linux/pm.h>
145e928f77SRafael J. Wysocki 
155e928f77SRafael J. Wysocki #ifdef CONFIG_PM_RUNTIME
165e928f77SRafael J. Wysocki 
175e928f77SRafael J. Wysocki extern struct workqueue_struct *pm_wq;
185e928f77SRafael J. Wysocki 
195e928f77SRafael J. Wysocki extern int pm_runtime_idle(struct device *dev);
205e928f77SRafael J. Wysocki extern int pm_runtime_suspend(struct device *dev);
215e928f77SRafael J. Wysocki extern int pm_runtime_resume(struct device *dev);
225e928f77SRafael J. Wysocki extern int pm_request_idle(struct device *dev);
235e928f77SRafael J. Wysocki extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
245e928f77SRafael J. Wysocki extern int pm_request_resume(struct device *dev);
255e928f77SRafael J. Wysocki extern int __pm_runtime_get(struct device *dev, bool sync);
265e928f77SRafael J. Wysocki extern int __pm_runtime_put(struct device *dev, bool sync);
275e928f77SRafael J. Wysocki extern int __pm_runtime_set_status(struct device *dev, unsigned int status);
285e928f77SRafael J. Wysocki extern int pm_runtime_barrier(struct device *dev);
295e928f77SRafael J. Wysocki extern void pm_runtime_enable(struct device *dev);
305e928f77SRafael J. Wysocki extern void __pm_runtime_disable(struct device *dev, bool check_resume);
3153823639SRafael J. Wysocki extern void pm_runtime_allow(struct device *dev);
3253823639SRafael J. Wysocki extern void pm_runtime_forbid(struct device *dev);
335e928f77SRafael J. Wysocki 
345e928f77SRafael J. Wysocki static inline bool pm_children_suspended(struct device *dev)
355e928f77SRafael J. Wysocki {
365e928f77SRafael J. Wysocki 	return dev->power.ignore_children
375e928f77SRafael J. Wysocki 		|| !atomic_read(&dev->power.child_count);
385e928f77SRafael J. Wysocki }
395e928f77SRafael J. Wysocki 
405e928f77SRafael J. Wysocki static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
415e928f77SRafael J. Wysocki {
425e928f77SRafael J. Wysocki 	dev->power.ignore_children = enable;
435e928f77SRafael J. Wysocki }
445e928f77SRafael J. Wysocki 
455e928f77SRafael J. Wysocki static inline void pm_runtime_get_noresume(struct device *dev)
465e928f77SRafael J. Wysocki {
475e928f77SRafael J. Wysocki 	atomic_inc(&dev->power.usage_count);
485e928f77SRafael J. Wysocki }
495e928f77SRafael J. Wysocki 
505e928f77SRafael J. Wysocki static inline void pm_runtime_put_noidle(struct device *dev)
515e928f77SRafael J. Wysocki {
525e928f77SRafael J. Wysocki 	atomic_add_unless(&dev->power.usage_count, -1, 0);
535e928f77SRafael J. Wysocki }
545e928f77SRafael J. Wysocki 
557a1a8eb5SRafael J. Wysocki static inline bool device_run_wake(struct device *dev)
567a1a8eb5SRafael J. Wysocki {
577a1a8eb5SRafael J. Wysocki 	return dev->power.run_wake;
587a1a8eb5SRafael J. Wysocki }
597a1a8eb5SRafael J. Wysocki 
607a1a8eb5SRafael J. Wysocki static inline void device_set_run_wake(struct device *dev, bool enable)
617a1a8eb5SRafael J. Wysocki {
627a1a8eb5SRafael J. Wysocki 	dev->power.run_wake = enable;
637a1a8eb5SRafael J. Wysocki }
647a1a8eb5SRafael J. Wysocki 
65*d690b2cdSRafael J. Wysocki static inline bool pm_runtime_suspended(struct device *dev)
66*d690b2cdSRafael J. Wysocki {
67*d690b2cdSRafael J. Wysocki 	return dev->power.runtime_status == RPM_SUSPENDED;
68*d690b2cdSRafael J. Wysocki }
69*d690b2cdSRafael J. Wysocki 
705e928f77SRafael J. Wysocki #else /* !CONFIG_PM_RUNTIME */
715e928f77SRafael J. Wysocki 
725e928f77SRafael J. Wysocki static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; }
735e928f77SRafael J. Wysocki static inline int pm_runtime_suspend(struct device *dev) { return -ENOSYS; }
745e928f77SRafael J. Wysocki static inline int pm_runtime_resume(struct device *dev) { return 0; }
755e928f77SRafael J. Wysocki static inline int pm_request_idle(struct device *dev) { return -ENOSYS; }
765e928f77SRafael J. Wysocki static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
775e928f77SRafael J. Wysocki {
785e928f77SRafael J. Wysocki 	return -ENOSYS;
795e928f77SRafael J. Wysocki }
805e928f77SRafael J. Wysocki static inline int pm_request_resume(struct device *dev) { return 0; }
815e928f77SRafael J. Wysocki static inline int __pm_runtime_get(struct device *dev, bool sync) { return 1; }
825e928f77SRafael J. Wysocki static inline int __pm_runtime_put(struct device *dev, bool sync) { return 0; }
835e928f77SRafael J. Wysocki static inline int __pm_runtime_set_status(struct device *dev,
845e928f77SRafael J. Wysocki 					    unsigned int status) { return 0; }
855e928f77SRafael J. Wysocki static inline int pm_runtime_barrier(struct device *dev) { return 0; }
865e928f77SRafael J. Wysocki static inline void pm_runtime_enable(struct device *dev) {}
875e928f77SRafael J. Wysocki static inline void __pm_runtime_disable(struct device *dev, bool c) {}
8853823639SRafael J. Wysocki static inline void pm_runtime_allow(struct device *dev) {}
8953823639SRafael J. Wysocki static inline void pm_runtime_forbid(struct device *dev) {}
905e928f77SRafael J. Wysocki 
915e928f77SRafael J. Wysocki static inline bool pm_children_suspended(struct device *dev) { return false; }
925e928f77SRafael J. Wysocki static inline void pm_suspend_ignore_children(struct device *dev, bool en) {}
935e928f77SRafael J. Wysocki static inline void pm_runtime_get_noresume(struct device *dev) {}
945e928f77SRafael J. Wysocki static inline void pm_runtime_put_noidle(struct device *dev) {}
957a1a8eb5SRafael J. Wysocki static inline bool device_run_wake(struct device *dev) { return false; }
967a1a8eb5SRafael J. Wysocki static inline void device_set_run_wake(struct device *dev, bool enable) {}
97*d690b2cdSRafael J. Wysocki static inline bool pm_runtime_suspended(struct device *dev) { return false; }
985e928f77SRafael J. Wysocki 
995e928f77SRafael J. Wysocki #endif /* !CONFIG_PM_RUNTIME */
1005e928f77SRafael J. Wysocki 
1015e928f77SRafael J. Wysocki static inline int pm_runtime_get(struct device *dev)
1025e928f77SRafael J. Wysocki {
1035e928f77SRafael J. Wysocki 	return __pm_runtime_get(dev, false);
1045e928f77SRafael J. Wysocki }
1055e928f77SRafael J. Wysocki 
1065e928f77SRafael J. Wysocki static inline int pm_runtime_get_sync(struct device *dev)
1075e928f77SRafael J. Wysocki {
1085e928f77SRafael J. Wysocki 	return __pm_runtime_get(dev, true);
1095e928f77SRafael J. Wysocki }
1105e928f77SRafael J. Wysocki 
1115e928f77SRafael J. Wysocki static inline int pm_runtime_put(struct device *dev)
1125e928f77SRafael J. Wysocki {
1135e928f77SRafael J. Wysocki 	return __pm_runtime_put(dev, false);
1145e928f77SRafael J. Wysocki }
1155e928f77SRafael J. Wysocki 
1165e928f77SRafael J. Wysocki static inline int pm_runtime_put_sync(struct device *dev)
1175e928f77SRafael J. Wysocki {
1185e928f77SRafael J. Wysocki 	return __pm_runtime_put(dev, true);
1195e928f77SRafael J. Wysocki }
1205e928f77SRafael J. Wysocki 
1215e928f77SRafael J. Wysocki static inline int pm_runtime_set_active(struct device *dev)
1225e928f77SRafael J. Wysocki {
1235e928f77SRafael J. Wysocki 	return __pm_runtime_set_status(dev, RPM_ACTIVE);
1245e928f77SRafael J. Wysocki }
1255e928f77SRafael J. Wysocki 
1265e928f77SRafael J. Wysocki static inline void pm_runtime_set_suspended(struct device *dev)
1275e928f77SRafael J. Wysocki {
1285e928f77SRafael J. Wysocki 	__pm_runtime_set_status(dev, RPM_SUSPENDED);
1295e928f77SRafael J. Wysocki }
1305e928f77SRafael J. Wysocki 
1315e928f77SRafael J. Wysocki static inline void pm_runtime_disable(struct device *dev)
1325e928f77SRafael J. Wysocki {
1335e928f77SRafael J. Wysocki 	__pm_runtime_disable(dev, true);
1345e928f77SRafael J. Wysocki }
1355e928f77SRafael J. Wysocki 
1365e928f77SRafael J. Wysocki #endif
137