PM: Make ACPI wakeup from S5 work again when CONFIG_PM_SLEEP is unset
Commit074037e
(PM / Wakeup: Introduce wakeup source objects and event statistics (v3)) caused ACPI wakeup to only work if CONFIG_PM_SLEEP is set, but it also worked for CONFIG_PM_SLEEP unset before. This can be fixed by making device_set_wakeup_enable(), device_init_wakeup() and device_may_wakeup() work in the same way as before commit074037e
when CONFIG_PM_SLEEP is unset. Reported-and-tested-by: Justin Maggard <jmaggard10@gmail.com> Cc: stable@kernel.org Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
This commit is contained in:
@@ -431,6 +431,8 @@ struct dev_pm_info {
|
|||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
struct completion completion;
|
struct completion completion;
|
||||||
struct wakeup_source *wakeup;
|
struct wakeup_source *wakeup;
|
||||||
|
#else
|
||||||
|
unsigned int should_wakeup:1;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PM_RUNTIME
|
#ifdef CONFIG_PM_RUNTIME
|
||||||
struct timer_list suspend_timer;
|
struct timer_list suspend_timer;
|
||||||
|
@@ -109,11 +109,6 @@ static inline bool device_can_wakeup(struct device *dev)
|
|||||||
return dev->power.can_wakeup;
|
return dev->power.can_wakeup;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool device_may_wakeup(struct device *dev)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct wakeup_source *wakeup_source_create(const char *name)
|
static inline struct wakeup_source *wakeup_source_create(const char *name)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -134,24 +129,32 @@ static inline void wakeup_source_unregister(struct wakeup_source *ws) {}
|
|||||||
|
|
||||||
static inline int device_wakeup_enable(struct device *dev)
|
static inline int device_wakeup_enable(struct device *dev)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
dev->power.should_wakeup = true;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int device_wakeup_disable(struct device *dev)
|
static inline int device_wakeup_disable(struct device *dev)
|
||||||
{
|
{
|
||||||
|
dev->power.should_wakeup = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int device_set_wakeup_enable(struct device *dev, bool enable)
|
||||||
|
{
|
||||||
|
dev->power.should_wakeup = enable;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int device_init_wakeup(struct device *dev, bool val)
|
static inline int device_init_wakeup(struct device *dev, bool val)
|
||||||
{
|
{
|
||||||
dev->power.can_wakeup = val;
|
device_set_wakeup_capable(dev, val);
|
||||||
return val ? -EINVAL : 0;
|
device_set_wakeup_enable(dev, val);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool device_may_wakeup(struct device *dev)
|
||||||
static inline int device_set_wakeup_enable(struct device *dev, bool enable)
|
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return dev->power.can_wakeup && dev->power.should_wakeup;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __pm_stay_awake(struct wakeup_source *ws) {}
|
static inline void __pm_stay_awake(struct wakeup_source *ws) {}
|
||||||
|
Reference in New Issue
Block a user