Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 : : /* 3 : : * pm_wakeup.h - Power management wakeup interface 4 : : * 5 : : * Copyright (C) 2008 Alan Stern 6 : : * Copyright (C) 2010 Rafael J. Wysocki, Novell Inc. 7 : : */ 8 : : 9 : : #ifndef _LINUX_PM_WAKEUP_H 10 : : #define _LINUX_PM_WAKEUP_H 11 : : 12 : : #ifndef _DEVICE_H_ 13 : : # error "please don't include this file directly" 14 : : #endif 15 : : 16 : : #include <linux/types.h> 17 : : 18 : : struct wake_irq; 19 : : 20 : : /** 21 : : * struct wakeup_source - Representation of wakeup sources 22 : : * 23 : : * @name: Name of the wakeup source 24 : : * @id: Wakeup source id 25 : : * @entry: Wakeup source list entry 26 : : * @lock: Wakeup source lock 27 : : * @wakeirq: Optional device specific wakeirq 28 : : * @timer: Wakeup timer list 29 : : * @timer_expires: Wakeup timer expiration 30 : : * @total_time: Total time this wakeup source has been active. 31 : : * @max_time: Maximum time this wakeup source has been continuously active. 32 : : * @last_time: Monotonic clock when the wakeup source's was touched last time. 33 : : * @prevent_sleep_time: Total time this source has been preventing autosleep. 34 : : * @event_count: Number of signaled wakeup events. 35 : : * @active_count: Number of times the wakeup source was activated. 36 : : * @relax_count: Number of times the wakeup source was deactivated. 37 : : * @expire_count: Number of times the wakeup source's timeout has expired. 38 : : * @wakeup_count: Number of times the wakeup source might abort suspend. 39 : : * @dev: Struct device for sysfs statistics about the wakeup source. 40 : : * @active: Status of the wakeup source. 41 : : * @autosleep_enabled: Autosleep is active, so update @prevent_sleep_time. 42 : : */ 43 : : struct wakeup_source { 44 : : const char *name; 45 : : int id; 46 : : struct list_head entry; 47 : : spinlock_t lock; 48 : : struct wake_irq *wakeirq; 49 : : struct timer_list timer; 50 : : unsigned long timer_expires; 51 : : ktime_t total_time; 52 : : ktime_t max_time; 53 : : ktime_t last_time; 54 : : ktime_t start_prevent_time; 55 : : ktime_t prevent_sleep_time; 56 : : unsigned long event_count; 57 : : unsigned long active_count; 58 : : unsigned long relax_count; 59 : : unsigned long expire_count; 60 : : unsigned long wakeup_count; 61 : : struct device *dev; 62 : : bool active:1; 63 : : bool autosleep_enabled:1; 64 : : }; 65 : : 66 : : #define for_each_wakeup_source(ws) \ 67 : : for ((ws) = wakeup_sources_walk_start(); \ 68 : : (ws); \ 69 : : (ws) = wakeup_sources_walk_next((ws))) 70 : : 71 : : #ifdef CONFIG_PM_SLEEP 72 : : 73 : : /* 74 : : * Changes to device_may_wakeup take effect on the next pm state change. 75 : : */ 76 : : 77 : 3201 : static inline bool device_can_wakeup(struct device *dev) 78 : : { 79 [ + + - - : 3201 : return dev->power.can_wakeup; - - ] 80 : : } 81 : : 82 : 11 : static inline bool device_may_wakeup(struct device *dev) 83 : : { 84 [ + - - + : 11 : return dev->power.can_wakeup && !!dev->power.wakeup; + - # # # # # # # # # # # # # # # # # # # # ] 85 : : } 86 : : 87 : : static inline void device_set_wakeup_path(struct device *dev) 88 : : { 89 : : dev->power.wakeup_path = true; 90 : : } 91 : : 92 : : /* drivers/base/power/wakeup.c */ 93 : : extern struct wakeup_source *wakeup_source_create(const char *name); 94 : : extern void wakeup_source_destroy(struct wakeup_source *ws); 95 : : extern void wakeup_source_add(struct wakeup_source *ws); 96 : : extern void wakeup_source_remove(struct wakeup_source *ws); 97 : : extern struct wakeup_source *wakeup_source_register(struct device *dev, 98 : : const char *name); 99 : : extern void wakeup_source_unregister(struct wakeup_source *ws); 100 : : extern int wakeup_sources_read_lock(void); 101 : : extern void wakeup_sources_read_unlock(int idx); 102 : : extern struct wakeup_source *wakeup_sources_walk_start(void); 103 : : extern struct wakeup_source *wakeup_sources_walk_next(struct wakeup_source *ws); 104 : : extern int device_wakeup_enable(struct device *dev); 105 : : extern int device_wakeup_disable(struct device *dev); 106 : : extern void device_set_wakeup_capable(struct device *dev, bool capable); 107 : : extern int device_init_wakeup(struct device *dev, bool val); 108 : : extern int device_set_wakeup_enable(struct device *dev, bool enable); 109 : : extern void __pm_stay_awake(struct wakeup_source *ws); 110 : : extern void pm_stay_awake(struct device *dev); 111 : : extern void __pm_relax(struct wakeup_source *ws); 112 : : extern void pm_relax(struct device *dev); 113 : : extern void pm_wakeup_ws_event(struct wakeup_source *ws, unsigned int msec, bool hard); 114 : : extern void pm_wakeup_dev_event(struct device *dev, unsigned int msec, bool hard); 115 : : 116 : : #else /* !CONFIG_PM_SLEEP */ 117 : : 118 : : static inline void device_set_wakeup_capable(struct device *dev, bool capable) 119 : : { 120 : : dev->power.can_wakeup = capable; 121 : : } 122 : : 123 : : static inline bool device_can_wakeup(struct device *dev) 124 : : { 125 : : return dev->power.can_wakeup; 126 : : } 127 : : 128 : : static inline struct wakeup_source *wakeup_source_create(const char *name) 129 : : { 130 : : return NULL; 131 : : } 132 : : 133 : : static inline void wakeup_source_destroy(struct wakeup_source *ws) {} 134 : : 135 : : static inline void wakeup_source_add(struct wakeup_source *ws) {} 136 : : 137 : : static inline void wakeup_source_remove(struct wakeup_source *ws) {} 138 : : 139 : : static inline struct wakeup_source *wakeup_source_register(struct device *dev, 140 : : const char *name) 141 : : { 142 : : return NULL; 143 : : } 144 : : 145 : : static inline void wakeup_source_unregister(struct wakeup_source *ws) {} 146 : : 147 : : static inline int device_wakeup_enable(struct device *dev) 148 : : { 149 : : dev->power.should_wakeup = true; 150 : : return 0; 151 : : } 152 : : 153 : : static inline int device_wakeup_disable(struct device *dev) 154 : : { 155 : : dev->power.should_wakeup = false; 156 : : return 0; 157 : : } 158 : : 159 : : static inline int device_set_wakeup_enable(struct device *dev, bool enable) 160 : : { 161 : : dev->power.should_wakeup = enable; 162 : : return 0; 163 : : } 164 : : 165 : : static inline int device_init_wakeup(struct device *dev, bool val) 166 : : { 167 : : device_set_wakeup_capable(dev, val); 168 : : device_set_wakeup_enable(dev, val); 169 : : return 0; 170 : : } 171 : : 172 : : static inline bool device_may_wakeup(struct device *dev) 173 : : { 174 : : return dev->power.can_wakeup && dev->power.should_wakeup; 175 : : } 176 : : 177 : : static inline void device_set_wakeup_path(struct device *dev) {} 178 : : 179 : : static inline void __pm_stay_awake(struct wakeup_source *ws) {} 180 : : 181 : : static inline void pm_stay_awake(struct device *dev) {} 182 : : 183 : : static inline void __pm_relax(struct wakeup_source *ws) {} 184 : : 185 : : static inline void pm_relax(struct device *dev) {} 186 : : 187 : : static inline void pm_wakeup_ws_event(struct wakeup_source *ws, 188 : : unsigned int msec, bool hard) {} 189 : : 190 : : static inline void pm_wakeup_dev_event(struct device *dev, unsigned int msec, 191 : : bool hard) {} 192 : : 193 : : #endif /* !CONFIG_PM_SLEEP */ 194 : : 195 : : static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec) 196 : : { 197 : : return pm_wakeup_ws_event(ws, msec, false); 198 : : } 199 : : 200 : 33 : static inline void pm_wakeup_event(struct device *dev, unsigned int msec) 201 : : { 202 : 33 : return pm_wakeup_dev_event(dev, msec, false); 203 : : } 204 : : 205 : 0 : static inline void pm_wakeup_hard_event(struct device *dev) 206 : : { 207 : 0 : return pm_wakeup_dev_event(dev, 0, true); 208 : : } 209 : : 210 : : #endif /* _LINUX_PM_WAKEUP_H */