at v5.7-rc7 9.0 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * pm_runtime.h - Device run-time power management helper functions. 4 * 5 * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl> 6 */ 7 8#ifndef _LINUX_PM_RUNTIME_H 9#define _LINUX_PM_RUNTIME_H 10 11#include <linux/device.h> 12#include <linux/notifier.h> 13#include <linux/pm.h> 14 15#include <linux/jiffies.h> 16 17/* Runtime PM flag argument bits */ 18#define RPM_ASYNC 0x01 /* Request is asynchronous */ 19#define RPM_NOWAIT 0x02 /* Don't wait for concurrent 20 state change */ 21#define RPM_GET_PUT 0x04 /* Increment/decrement the 22 usage_count */ 23#define RPM_AUTO 0x08 /* Use autosuspend_delay */ 24 25#ifdef CONFIG_PM 26extern struct workqueue_struct *pm_wq; 27 28static inline bool queue_pm_work(struct work_struct *work) 29{ 30 return queue_work(pm_wq, work); 31} 32 33extern int pm_generic_runtime_suspend(struct device *dev); 34extern int pm_generic_runtime_resume(struct device *dev); 35extern int pm_runtime_force_suspend(struct device *dev); 36extern int pm_runtime_force_resume(struct device *dev); 37 38extern int __pm_runtime_idle(struct device *dev, int rpmflags); 39extern int __pm_runtime_suspend(struct device *dev, int rpmflags); 40extern int __pm_runtime_resume(struct device *dev, int rpmflags); 41extern int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count); 42extern int pm_schedule_suspend(struct device *dev, unsigned int delay); 43extern int __pm_runtime_set_status(struct device *dev, unsigned int status); 44extern int pm_runtime_barrier(struct device *dev); 45extern void pm_runtime_enable(struct device *dev); 46extern void __pm_runtime_disable(struct device *dev, bool check_resume); 47extern void pm_runtime_allow(struct device *dev); 48extern void pm_runtime_forbid(struct device *dev); 49extern void pm_runtime_no_callbacks(struct device *dev); 50extern void pm_runtime_irq_safe(struct device *dev); 51extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); 52extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); 53extern u64 pm_runtime_autosuspend_expiration(struct device *dev); 54extern void pm_runtime_update_max_time_suspended(struct device *dev, 55 s64 delta_ns); 56extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable); 57extern void pm_runtime_clean_up_links(struct device *dev); 58extern void pm_runtime_get_suppliers(struct device *dev); 59extern void pm_runtime_put_suppliers(struct device *dev); 60extern void pm_runtime_new_link(struct device *dev); 61extern void pm_runtime_drop_link(struct device *dev); 62 63static inline int pm_runtime_get_if_in_use(struct device *dev) 64{ 65 return pm_runtime_get_if_active(dev, false); 66} 67 68static inline void pm_suspend_ignore_children(struct device *dev, bool enable) 69{ 70 dev->power.ignore_children = enable; 71} 72 73static inline void pm_runtime_get_noresume(struct device *dev) 74{ 75 atomic_inc(&dev->power.usage_count); 76} 77 78static inline void pm_runtime_put_noidle(struct device *dev) 79{ 80 atomic_add_unless(&dev->power.usage_count, -1, 0); 81} 82 83static inline bool pm_runtime_suspended(struct device *dev) 84{ 85 return dev->power.runtime_status == RPM_SUSPENDED 86 && !dev->power.disable_depth; 87} 88 89static inline bool pm_runtime_active(struct device *dev) 90{ 91 return dev->power.runtime_status == RPM_ACTIVE 92 || dev->power.disable_depth; 93} 94 95static inline bool pm_runtime_status_suspended(struct device *dev) 96{ 97 return dev->power.runtime_status == RPM_SUSPENDED; 98} 99 100static inline bool pm_runtime_enabled(struct device *dev) 101{ 102 return !dev->power.disable_depth; 103} 104 105static inline bool pm_runtime_callbacks_present(struct device *dev) 106{ 107 return !dev->power.no_callbacks; 108} 109 110static inline void pm_runtime_mark_last_busy(struct device *dev) 111{ 112 WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns()); 113} 114 115static inline bool pm_runtime_is_irq_safe(struct device *dev) 116{ 117 return dev->power.irq_safe; 118} 119 120extern u64 pm_runtime_suspended_time(struct device *dev); 121 122#else /* !CONFIG_PM */ 123 124static inline bool queue_pm_work(struct work_struct *work) { return false; } 125 126static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } 127static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } 128static inline int pm_runtime_force_suspend(struct device *dev) { return 0; } 129static inline int pm_runtime_force_resume(struct device *dev) { return 0; } 130 131static inline int __pm_runtime_idle(struct device *dev, int rpmflags) 132{ 133 return -ENOSYS; 134} 135static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) 136{ 137 return -ENOSYS; 138} 139static inline int __pm_runtime_resume(struct device *dev, int rpmflags) 140{ 141 return 1; 142} 143static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) 144{ 145 return -ENOSYS; 146} 147static inline int pm_runtime_get_if_in_use(struct device *dev) 148{ 149 return -EINVAL; 150} 151static inline int pm_runtime_get_if_active(struct device *dev, 152 bool ign_usage_count) 153{ 154 return -EINVAL; 155} 156static inline int __pm_runtime_set_status(struct device *dev, 157 unsigned int status) { return 0; } 158static inline int pm_runtime_barrier(struct device *dev) { return 0; } 159static inline void pm_runtime_enable(struct device *dev) {} 160static inline void __pm_runtime_disable(struct device *dev, bool c) {} 161static inline void pm_runtime_allow(struct device *dev) {} 162static inline void pm_runtime_forbid(struct device *dev) {} 163 164static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {} 165static inline void pm_runtime_get_noresume(struct device *dev) {} 166static inline void pm_runtime_put_noidle(struct device *dev) {} 167static inline bool pm_runtime_suspended(struct device *dev) { return false; } 168static inline bool pm_runtime_active(struct device *dev) { return true; } 169static inline bool pm_runtime_status_suspended(struct device *dev) { return false; } 170static inline bool pm_runtime_enabled(struct device *dev) { return false; } 171 172static inline void pm_runtime_no_callbacks(struct device *dev) {} 173static inline void pm_runtime_irq_safe(struct device *dev) {} 174static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; } 175 176static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; } 177static inline void pm_runtime_mark_last_busy(struct device *dev) {} 178static inline void __pm_runtime_use_autosuspend(struct device *dev, 179 bool use) {} 180static inline void pm_runtime_set_autosuspend_delay(struct device *dev, 181 int delay) {} 182static inline u64 pm_runtime_autosuspend_expiration( 183 struct device *dev) { return 0; } 184static inline void pm_runtime_set_memalloc_noio(struct device *dev, 185 bool enable){} 186static inline void pm_runtime_clean_up_links(struct device *dev) {} 187static inline void pm_runtime_get_suppliers(struct device *dev) {} 188static inline void pm_runtime_put_suppliers(struct device *dev) {} 189static inline void pm_runtime_new_link(struct device *dev) {} 190static inline void pm_runtime_drop_link(struct device *dev) {} 191 192#endif /* !CONFIG_PM */ 193 194static inline int pm_runtime_idle(struct device *dev) 195{ 196 return __pm_runtime_idle(dev, 0); 197} 198 199static inline int pm_runtime_suspend(struct device *dev) 200{ 201 return __pm_runtime_suspend(dev, 0); 202} 203 204static inline int pm_runtime_autosuspend(struct device *dev) 205{ 206 return __pm_runtime_suspend(dev, RPM_AUTO); 207} 208 209static inline int pm_runtime_resume(struct device *dev) 210{ 211 return __pm_runtime_resume(dev, 0); 212} 213 214static inline int pm_request_idle(struct device *dev) 215{ 216 return __pm_runtime_idle(dev, RPM_ASYNC); 217} 218 219static inline int pm_request_resume(struct device *dev) 220{ 221 return __pm_runtime_resume(dev, RPM_ASYNC); 222} 223 224static inline int pm_request_autosuspend(struct device *dev) 225{ 226 return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); 227} 228 229static inline int pm_runtime_get(struct device *dev) 230{ 231 return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); 232} 233 234static inline int pm_runtime_get_sync(struct device *dev) 235{ 236 return __pm_runtime_resume(dev, RPM_GET_PUT); 237} 238 239static inline int pm_runtime_put(struct device *dev) 240{ 241 return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); 242} 243 244static inline int pm_runtime_put_autosuspend(struct device *dev) 245{ 246 return __pm_runtime_suspend(dev, 247 RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); 248} 249 250static inline int pm_runtime_put_sync(struct device *dev) 251{ 252 return __pm_runtime_idle(dev, RPM_GET_PUT); 253} 254 255static inline int pm_runtime_put_sync_suspend(struct device *dev) 256{ 257 return __pm_runtime_suspend(dev, RPM_GET_PUT); 258} 259 260static inline int pm_runtime_put_sync_autosuspend(struct device *dev) 261{ 262 return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); 263} 264 265static inline int pm_runtime_set_active(struct device *dev) 266{ 267 return __pm_runtime_set_status(dev, RPM_ACTIVE); 268} 269 270static inline int pm_runtime_set_suspended(struct device *dev) 271{ 272 return __pm_runtime_set_status(dev, RPM_SUSPENDED); 273} 274 275static inline void pm_runtime_disable(struct device *dev) 276{ 277 __pm_runtime_disable(dev, true); 278} 279 280static inline void pm_runtime_use_autosuspend(struct device *dev) 281{ 282 __pm_runtime_use_autosuspend(dev, true); 283} 284 285static inline void pm_runtime_dont_use_autosuspend(struct device *dev) 286{ 287 __pm_runtime_use_autosuspend(dev, false); 288} 289 290#endif