[PATCH 04/13] PM: wakelock: Override wakelocks when using /sys/power/state

Arve Hjønnevåg
2009-02-05T02:50:17Z

This preserves existing functionality when CONFIG_WAKELOCK is set.

Signed-off-by: Arve Hjønnevåg <arve@android.com>
---
kernel/power/main.c | 7 +++++++
kernel/power/power.h | 1 +
kernel/power/wakelock.c | 4 ++++
3 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/kernel/power/main.c b/kernel/power/main.c
index 2399888..ab9fc7f 100644
--- a/kernel/power/main.c
+++ b/kernel/power/main.c
@@ -515,6 +515,10 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
p = memchr(buf, '\n', n);
len = p ? p - buf : n;

+#ifdef CONFIG_WAKELOCK
+ ignore_suspend_wakelocks = 1;
+#endif
+
/* First, check if we are requested to hibernate */
if (len == 4 && !strncmp(buf, "disk", len)) {
error = hibernate();
@@ -531,6 +535,9 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
#endif

Exit:
+#ifdef CONFIG_WAKELOCK
+ ignore_suspend_wakelocks = 0;
+#endif
return error ? error : n;
}

diff --git a/kernel/power/power.h b/kernel/power/power.h
index 1527174..ed1b7f4 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -229,4 +229,5 @@ static inline void suspend_thaw_processes(void)
extern struct workqueue_struct *suspend_work_queue;
extern struct wake_lock main_wake_lock;
extern suspend_state_t requested_suspend_state;
+extern bool ignore_suspend_wakelocks;
#endif
diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c
index c9e22f9..8a8608e 100644
--- a/kernel/power/wakelock.c
+++ b/kernel/power/wakelock.c
@@ -47,6 +47,7 @@ static int current_event_num;
struct workqueue_struct *suspend_work_queue;
struct wake_lock main_wake_lock;
suspend_state_t requested_suspend_state = PM_SUSPEND_MEM;
+bool ignore_suspend_wakelocks;
static struct wake_lock unknown_wakeup;

#ifdef CONFIG_WAKELOCK_STAT
@@ -260,6 +261,9 @@ long has_wake_lock(int type)
{
long ret;
unsigned long irqflags;
+ if (WARN_ONCE(type == WAKE_LOCK_SUSPEND && ignore_suspend_wakelocks,
+ "ignoring wakelocks\n"))
+ return 0;
spin_lock_irqsave(&list_lock, irqflags);
ret = has_wake_lock_locked(type);
spin_unlock_irqrestore(&list_lock, irqflags);
--
1.6.1

_______________________________________________
linux-pm mailing list
linux-pm@lists.linux-foundation.org