![Rafael J. Wysocki](/assets/img/avatar_default.png)
Currently, wakeup sysfs attributes are created for all devices, regardless of whether or not they are wakeup-capable. This is excessive and complicates wakeup device identification from user space (i.e. to identify wakeup-capable devices user space has to read /sys/devices/.../power/wakeup for all devices and see if they are not empty). Fix this issue by avoiding to create wakeup sysfs files for devices that cannot wake up the system from sleep states (i.e. whose power.can_wakeup flags are unset during registration) and modify device_set_wakeup_capable() so that it adds (or removes) the relevant sysfs attributes if a device's wakeup capability status is changed. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
76 lines
2.1 KiB
C
76 lines
2.1 KiB
C
#ifdef CONFIG_PM_RUNTIME
|
|
|
|
extern void pm_runtime_init(struct device *dev);
|
|
extern void pm_runtime_remove(struct device *dev);
|
|
|
|
#else /* !CONFIG_PM_RUNTIME */
|
|
|
|
static inline void pm_runtime_init(struct device *dev) {}
|
|
static inline void pm_runtime_remove(struct device *dev) {}
|
|
|
|
#endif /* !CONFIG_PM_RUNTIME */
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
|
|
/* kernel/power/main.c */
|
|
extern int pm_async_enabled;
|
|
|
|
/* drivers/base/power/main.c */
|
|
extern struct list_head dpm_list; /* The active device list */
|
|
|
|
static inline struct device *to_device(struct list_head *entry)
|
|
{
|
|
return container_of(entry, struct device, power.entry);
|
|
}
|
|
|
|
extern void device_pm_init(struct device *dev);
|
|
extern void device_pm_add(struct device *);
|
|
extern void device_pm_remove(struct device *);
|
|
extern void device_pm_move_before(struct device *, struct device *);
|
|
extern void device_pm_move_after(struct device *, struct device *);
|
|
extern void device_pm_move_last(struct device *);
|
|
|
|
#else /* !CONFIG_PM_SLEEP */
|
|
|
|
static inline void device_pm_init(struct device *dev)
|
|
{
|
|
spin_lock_init(&dev->power.lock);
|
|
pm_runtime_init(dev);
|
|
}
|
|
|
|
static inline void device_pm_remove(struct device *dev)
|
|
{
|
|
pm_runtime_remove(dev);
|
|
}
|
|
|
|
static inline void device_pm_add(struct device *dev) {}
|
|
static inline void device_pm_move_before(struct device *deva,
|
|
struct device *devb) {}
|
|
static inline void device_pm_move_after(struct device *deva,
|
|
struct device *devb) {}
|
|
static inline void device_pm_move_last(struct device *dev) {}
|
|
|
|
#endif /* !CONFIG_PM_SLEEP */
|
|
|
|
#ifdef CONFIG_PM
|
|
|
|
/*
|
|
* sysfs.c
|
|
*/
|
|
|
|
extern int dpm_sysfs_add(struct device *dev);
|
|
extern void dpm_sysfs_remove(struct device *dev);
|
|
extern void rpm_sysfs_remove(struct device *dev);
|
|
extern int wakeup_sysfs_add(struct device *dev);
|
|
extern void wakeup_sysfs_remove(struct device *dev);
|
|
|
|
#else /* CONFIG_PM */
|
|
|
|
static inline int dpm_sysfs_add(struct device *dev) { return 0; }
|
|
static inline void dpm_sysfs_remove(struct device *dev) {}
|
|
static inline void rpm_sysfs_remove(struct device *dev) {}
|
|
static inline int wakeup_sysfs_add(struct device *dev) { return 0; }
|
|
static inline void wakeup_sysfs_remove(struct device *dev) {}
|
|
|
|
#endif
|