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