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 : : #ifdef CONFIG_PM_SLEEP 67 : : 68 : : /* 69 : : * Changes to device_may_wakeup take effect on the next pm state change. 70 : : */ 71 : : 72 : : static inline bool device_can_wakeup(struct device *dev) 73 : : { 74 : : return dev->power.can_wakeup; 75 : : } 76 : : 77 : : static inline bool device_may_wakeup(struct device *dev) 78 : : { 79 : : return dev->power.can_wakeup && !!dev->power.wakeup; 80 : : } 81 : : 82 : : static inline void device_set_wakeup_path(struct device *dev) 83 : : { 84 : : dev->power.wakeup_path = true; 85 : : } 86 : : 87 : : /* drivers/base/power/wakeup.c */ 88 : : extern struct wakeup_source *wakeup_source_create(const char *name); 89 : : extern void wakeup_source_destroy(struct wakeup_source *ws); 90 : : extern void wakeup_source_add(struct wakeup_source *ws); 91 : : extern void wakeup_source_remove(struct wakeup_source *ws); 92 : : extern struct wakeup_source *wakeup_source_register(struct device *dev, 93 : : const char *name); 94 : : extern void wakeup_source_unregister(struct wakeup_source *ws); 95 : : extern int device_wakeup_enable(struct device *dev); 96 : : extern int device_wakeup_disable(struct device *dev); 97 : : extern void device_set_wakeup_capable(struct device *dev, bool capable); 98 : : extern int device_init_wakeup(struct device *dev, bool val); 99 : : extern int device_set_wakeup_enable(struct device *dev, bool enable); 100 : : extern void __pm_stay_awake(struct wakeup_source *ws); 101 : : extern void pm_stay_awake(struct device *dev); 102 : : extern void __pm_relax(struct wakeup_source *ws); 103 : : extern void pm_relax(struct device *dev); 104 : : extern void pm_wakeup_ws_event(struct wakeup_source *ws, unsigned int msec, bool hard); 105 : : extern void pm_wakeup_dev_event(struct device *dev, unsigned int msec, bool hard); 106 : : 107 : : #else /* !CONFIG_PM_SLEEP */ 108 : : 109 : : static inline void device_set_wakeup_capable(struct device *dev, bool capable) 110 : : { 111 : 5382 : dev->power.can_wakeup = capable; 112 : : } 113 : : 114 : : static inline bool device_can_wakeup(struct device *dev) 115 : : { 116 : 68931 : return dev->power.can_wakeup; 117 : : } 118 : : 119 : : static inline struct wakeup_source *wakeup_source_create(const char *name) 120 : : { 121 : : return NULL; 122 : : } 123 : : 124 : : static inline void wakeup_source_destroy(struct wakeup_source *ws) {} 125 : : 126 : : static inline void wakeup_source_add(struct wakeup_source *ws) {} 127 : : 128 : : static inline void wakeup_source_remove(struct wakeup_source *ws) {} 129 : : 130 : : static inline struct wakeup_source *wakeup_source_register(struct device *dev, 131 : : const char *name) 132 : : { 133 : : return NULL; 134 : : } 135 : : 136 : : static inline void wakeup_source_unregister(struct wakeup_source *ws) {} 137 : : 138 : : static inline int device_wakeup_enable(struct device *dev) 139 : : { 140 : : dev->power.should_wakeup = true; 141 : : return 0; 142 : : } 143 : : 144 : : static inline int device_wakeup_disable(struct device *dev) 145 : : { 146 : : dev->power.should_wakeup = false; 147 : : return 0; 148 : : } 149 : : 150 : : static inline int device_set_wakeup_enable(struct device *dev, bool enable) 151 : : { 152 : 1035 : dev->power.should_wakeup = enable; 153 : : return 0; 154 : : } 155 : : 156 : : static inline int device_init_wakeup(struct device *dev, bool val) 157 : : { 158 : : device_set_wakeup_capable(dev, val); 159 : : device_set_wakeup_enable(dev, val); 160 : : return 0; 161 : : } 162 : : 163 : : static inline bool device_may_wakeup(struct device *dev) 164 : : { 165 [ + - + - : 207 : return dev->power.can_wakeup && dev->power.should_wakeup; # # # # # # # # ] 166 : : } 167 : : 168 : : static inline void device_set_wakeup_path(struct device *dev) {} 169 : : 170 : : static inline void __pm_stay_awake(struct wakeup_source *ws) {} 171 : : 172 : : static inline void pm_stay_awake(struct device *dev) {} 173 : : 174 : : static inline void __pm_relax(struct wakeup_source *ws) {} 175 : : 176 : : static inline void pm_relax(struct device *dev) {} 177 : : 178 : : static inline void pm_wakeup_ws_event(struct wakeup_source *ws, 179 : : unsigned int msec, bool hard) {} 180 : : 181 : : static inline void pm_wakeup_dev_event(struct device *dev, unsigned int msec, 182 : : bool hard) {} 183 : : 184 : : #endif /* !CONFIG_PM_SLEEP */ 185 : : 186 : : static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec) 187 : : { 188 : : return pm_wakeup_ws_event(ws, msec, false); 189 : : } 190 : : 191 : : static inline void pm_wakeup_event(struct device *dev, unsigned int msec) 192 : : { 193 : : return pm_wakeup_dev_event(dev, msec, false); 194 : : } 195 : : 196 : : static inline void pm_wakeup_hard_event(struct device *dev) 197 : : { 198 : : return pm_wakeup_dev_event(dev, 0, true); 199 : : } 200 : : 201 : : #endif /* _LINUX_PM_WAKEUP_H */