Branch data Line data Source code
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 26 : : extern struct workqueue_struct *pm_wq; 27 : : 28 : : static inline bool queue_pm_work(struct work_struct *work) 29 : : { 30 : : return queue_work(pm_wq, work); 31 : : } 32 : : 33 : : extern int pm_generic_runtime_suspend(struct device *dev); 34 : : extern int pm_generic_runtime_resume(struct device *dev); 35 : : extern int pm_runtime_force_suspend(struct device *dev); 36 : : extern int pm_runtime_force_resume(struct device *dev); 37 : : 38 : : extern int __pm_runtime_idle(struct device *dev, int rpmflags); 39 : : extern int __pm_runtime_suspend(struct device *dev, int rpmflags); 40 : : extern int __pm_runtime_resume(struct device *dev, int rpmflags); 41 : : extern int pm_runtime_get_if_in_use(struct device *dev); 42 : : extern int pm_schedule_suspend(struct device *dev, unsigned int delay); 43 : : extern int __pm_runtime_set_status(struct device *dev, unsigned int status); 44 : : extern int pm_runtime_barrier(struct device *dev); 45 : : extern void pm_runtime_enable(struct device *dev); 46 : : extern void __pm_runtime_disable(struct device *dev, bool check_resume); 47 : : extern void pm_runtime_allow(struct device *dev); 48 : : extern void pm_runtime_forbid(struct device *dev); 49 : : extern void pm_runtime_no_callbacks(struct device *dev); 50 : : extern void pm_runtime_irq_safe(struct device *dev); 51 : : extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); 52 : : extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); 53 : : extern u64 pm_runtime_autosuspend_expiration(struct device *dev); 54 : : extern void pm_runtime_update_max_time_suspended(struct device *dev, 55 : : s64 delta_ns); 56 : : extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable); 57 : : extern void pm_runtime_clean_up_links(struct device *dev); 58 : : extern void pm_runtime_get_suppliers(struct device *dev); 59 : : extern void pm_runtime_put_suppliers(struct device *dev); 60 : : extern void pm_runtime_new_link(struct device *dev); 61 : : extern void pm_runtime_drop_link(struct device *dev); 62 : : 63 : : static inline void pm_suspend_ignore_children(struct device *dev, bool enable) 64 : : { 65 : 3 : dev->power.ignore_children = enable; 66 : : } 67 : : 68 : : static inline void pm_runtime_get_noresume(struct device *dev) 69 : : { 70 : 3 : atomic_inc(&dev->power.usage_count); 71 : : } 72 : : 73 : : static inline void pm_runtime_put_noidle(struct device *dev) 74 : : { 75 : 3 : atomic_add_unless(&dev->power.usage_count, -1, 0); 76 : : } 77 : : 78 : : static inline bool pm_runtime_suspended(struct device *dev) 79 : : { 80 : 3 : return dev->power.runtime_status == RPM_SUSPENDED 81 : 3 : && !dev->power.disable_depth; 82 : : } 83 : : 84 : : static inline bool pm_runtime_active(struct device *dev) 85 : : { 86 : 3 : return dev->power.runtime_status == RPM_ACTIVE 87 : 3 : || dev->power.disable_depth; 88 : : } 89 : : 90 : : static inline bool pm_runtime_status_suspended(struct device *dev) 91 : : { 92 : 0 : return dev->power.runtime_status == RPM_SUSPENDED; 93 : : } 94 : : 95 : : static inline bool pm_runtime_enabled(struct device *dev) 96 : : { 97 : 3 : return !dev->power.disable_depth; 98 : : } 99 : : 100 : : static inline bool pm_runtime_callbacks_present(struct device *dev) 101 : : { 102 : 3 : return !dev->power.no_callbacks; 103 : : } 104 : : 105 : : static inline void pm_runtime_mark_last_busy(struct device *dev) 106 : : { 107 : 3 : WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns()); 108 : : } 109 : : 110 : : static inline bool pm_runtime_is_irq_safe(struct device *dev) 111 : : { 112 : 0 : return dev->power.irq_safe; 113 : : } 114 : : 115 : : extern u64 pm_runtime_suspended_time(struct device *dev); 116 : : 117 : : #else /* !CONFIG_PM */ 118 : : 119 : : static inline bool queue_pm_work(struct work_struct *work) { return false; } 120 : : 121 : : static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } 122 : : static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } 123 : : static inline int pm_runtime_force_suspend(struct device *dev) { return 0; } 124 : : static inline int pm_runtime_force_resume(struct device *dev) { return 0; } 125 : : 126 : : static inline int __pm_runtime_idle(struct device *dev, int rpmflags) 127 : : { 128 : : return -ENOSYS; 129 : : } 130 : : static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) 131 : : { 132 : : return -ENOSYS; 133 : : } 134 : : static inline int __pm_runtime_resume(struct device *dev, int rpmflags) 135 : : { 136 : : return 1; 137 : : } 138 : : static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) 139 : : { 140 : : return -ENOSYS; 141 : : } 142 : : static inline int pm_runtime_get_if_in_use(struct device *dev) 143 : : { 144 : : return -EINVAL; 145 : : } 146 : : static inline int __pm_runtime_set_status(struct device *dev, 147 : : unsigned int status) { return 0; } 148 : : static inline int pm_runtime_barrier(struct device *dev) { return 0; } 149 : : static inline void pm_runtime_enable(struct device *dev) {} 150 : : static inline void __pm_runtime_disable(struct device *dev, bool c) {} 151 : : static inline void pm_runtime_allow(struct device *dev) {} 152 : : static inline void pm_runtime_forbid(struct device *dev) {} 153 : : 154 : : static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {} 155 : : static inline void pm_runtime_get_noresume(struct device *dev) {} 156 : : static inline void pm_runtime_put_noidle(struct device *dev) {} 157 : : static inline bool pm_runtime_suspended(struct device *dev) { return false; } 158 : : static inline bool pm_runtime_active(struct device *dev) { return true; } 159 : : static inline bool pm_runtime_status_suspended(struct device *dev) { return false; } 160 : : static inline bool pm_runtime_enabled(struct device *dev) { return false; } 161 : : 162 : : static inline void pm_runtime_no_callbacks(struct device *dev) {} 163 : : static inline void pm_runtime_irq_safe(struct device *dev) {} 164 : : static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; } 165 : : 166 : : static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; } 167 : : static inline void pm_runtime_mark_last_busy(struct device *dev) {} 168 : : static inline void __pm_runtime_use_autosuspend(struct device *dev, 169 : : bool use) {} 170 : : static inline void pm_runtime_set_autosuspend_delay(struct device *dev, 171 : : int delay) {} 172 : : static inline u64 pm_runtime_autosuspend_expiration( 173 : : struct device *dev) { return 0; } 174 : : static inline void pm_runtime_set_memalloc_noio(struct device *dev, 175 : : bool enable){} 176 : : static inline void pm_runtime_clean_up_links(struct device *dev) {} 177 : : static inline void pm_runtime_get_suppliers(struct device *dev) {} 178 : : static inline void pm_runtime_put_suppliers(struct device *dev) {} 179 : : static inline void pm_runtime_new_link(struct device *dev) {} 180 : : static inline void pm_runtime_drop_link(struct device *dev) {} 181 : : 182 : : #endif /* !CONFIG_PM */ 183 : : 184 : : static inline int pm_runtime_idle(struct device *dev) 185 : : { 186 : : return __pm_runtime_idle(dev, 0); 187 : : } 188 : : 189 : : static inline int pm_runtime_suspend(struct device *dev) 190 : : { 191 : : return __pm_runtime_suspend(dev, 0); 192 : : } 193 : : 194 : : static inline int pm_runtime_autosuspend(struct device *dev) 195 : : { 196 : 0 : return __pm_runtime_suspend(dev, RPM_AUTO); 197 : : } 198 : : 199 : : static inline int pm_runtime_resume(struct device *dev) 200 : : { 201 : 0 : return __pm_runtime_resume(dev, 0); 202 : : } 203 : : 204 : : static inline int pm_request_idle(struct device *dev) 205 : : { 206 : 3 : return __pm_runtime_idle(dev, RPM_ASYNC); 207 : : } 208 : : 209 : : static inline int pm_request_resume(struct device *dev) 210 : : { 211 : 0 : return __pm_runtime_resume(dev, RPM_ASYNC); 212 : : } 213 : : 214 : : static inline int pm_request_autosuspend(struct device *dev) 215 : : { 216 : 0 : return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); 217 : : } 218 : : 219 : : static inline int pm_runtime_get(struct device *dev) 220 : : { 221 : 3 : return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); 222 : : } 223 : : 224 : : static inline int pm_runtime_get_sync(struct device *dev) 225 : : { 226 : 3 : return __pm_runtime_resume(dev, RPM_GET_PUT); 227 : : } 228 : : 229 : : static inline int pm_runtime_put(struct device *dev) 230 : : { 231 : 3 : return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); 232 : : } 233 : : 234 : : static inline int pm_runtime_put_autosuspend(struct device *dev) 235 : : { 236 : 3 : return __pm_runtime_suspend(dev, 237 : : RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); 238 : : } 239 : : 240 : : static inline int pm_runtime_put_sync(struct device *dev) 241 : : { 242 : 3 : return __pm_runtime_idle(dev, RPM_GET_PUT); 243 : : } 244 : : 245 : : static inline int pm_runtime_put_sync_suspend(struct device *dev) 246 : : { 247 : 0 : return __pm_runtime_suspend(dev, RPM_GET_PUT); 248 : : } 249 : : 250 : : static inline int pm_runtime_put_sync_autosuspend(struct device *dev) 251 : : { 252 : 3 : return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); 253 : : } 254 : : 255 : : static inline int pm_runtime_set_active(struct device *dev) 256 : : { 257 : 3 : return __pm_runtime_set_status(dev, RPM_ACTIVE); 258 : : } 259 : : 260 : : static inline int pm_runtime_set_suspended(struct device *dev) 261 : : { 262 : 1 : return __pm_runtime_set_status(dev, RPM_SUSPENDED); 263 : : } 264 : : 265 : : static inline void pm_runtime_disable(struct device *dev) 266 : : { 267 : 3 : __pm_runtime_disable(dev, true); 268 : : } 269 : : 270 : : static inline void pm_runtime_use_autosuspend(struct device *dev) 271 : : { 272 : 3 : __pm_runtime_use_autosuspend(dev, true); 273 : : } 274 : : 275 : : static inline void pm_runtime_dont_use_autosuspend(struct device *dev) 276 : : { 277 : : __pm_runtime_use_autosuspend(dev, false); 278 : : } 279 : : 280 : : #endif