|
@@ -27,6 +27,7 @@
|
|
|
#include <linux/export.h>
|
|
|
#include <linux/suspend.h>
|
|
|
#include <linux/syscore_ops.h>
|
|
|
+#include <linux/swait.h>
|
|
|
#include <linux/ftrace.h>
|
|
|
#include <trace/events/power.h>
|
|
|
#include <linux/compiler.h>
|
|
@@ -57,10 +58,10 @@ EXPORT_SYMBOL_GPL(pm_suspend_global_flags);
|
|
|
|
|
|
static const struct platform_suspend_ops *suspend_ops;
|
|
|
static const struct platform_s2idle_ops *s2idle_ops;
|
|
|
-static DECLARE_WAIT_QUEUE_HEAD(s2idle_wait_head);
|
|
|
+static DECLARE_SWAIT_QUEUE_HEAD(s2idle_wait_head);
|
|
|
|
|
|
enum s2idle_states __read_mostly s2idle_state;
|
|
|
-static DEFINE_SPINLOCK(s2idle_lock);
|
|
|
+static DEFINE_RAW_SPINLOCK(s2idle_lock);
|
|
|
|
|
|
void s2idle_set_ops(const struct platform_s2idle_ops *ops)
|
|
|
{
|
|
@@ -78,12 +79,12 @@ static void s2idle_enter(void)
|
|
|
{
|
|
|
trace_suspend_resume(TPS("machine_suspend"), PM_SUSPEND_TO_IDLE, true);
|
|
|
|
|
|
- spin_lock_irq(&s2idle_lock);
|
|
|
+ raw_spin_lock_irq(&s2idle_lock);
|
|
|
if (pm_wakeup_pending())
|
|
|
goto out;
|
|
|
|
|
|
s2idle_state = S2IDLE_STATE_ENTER;
|
|
|
- spin_unlock_irq(&s2idle_lock);
|
|
|
+ raw_spin_unlock_irq(&s2idle_lock);
|
|
|
|
|
|
get_online_cpus();
|
|
|
cpuidle_resume();
|
|
@@ -91,17 +92,17 @@ static void s2idle_enter(void)
|
|
|
/* Push all the CPUs into the idle loop. */
|
|
|
wake_up_all_idle_cpus();
|
|
|
/* Make the current CPU wait so it can enter the idle loop too. */
|
|
|
- wait_event(s2idle_wait_head,
|
|
|
- s2idle_state == S2IDLE_STATE_WAKE);
|
|
|
+ swait_event(s2idle_wait_head,
|
|
|
+ s2idle_state == S2IDLE_STATE_WAKE);
|
|
|
|
|
|
cpuidle_pause();
|
|
|
put_online_cpus();
|
|
|
|
|
|
- spin_lock_irq(&s2idle_lock);
|
|
|
+ raw_spin_lock_irq(&s2idle_lock);
|
|
|
|
|
|
out:
|
|
|
s2idle_state = S2IDLE_STATE_NONE;
|
|
|
- spin_unlock_irq(&s2idle_lock);
|
|
|
+ raw_spin_unlock_irq(&s2idle_lock);
|
|
|
|
|
|
trace_suspend_resume(TPS("machine_suspend"), PM_SUSPEND_TO_IDLE, false);
|
|
|
}
|
|
@@ -156,12 +157,12 @@ void s2idle_wake(void)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
|
|
|
- spin_lock_irqsave(&s2idle_lock, flags);
|
|
|
+ raw_spin_lock_irqsave(&s2idle_lock, flags);
|
|
|
if (s2idle_state > S2IDLE_STATE_NONE) {
|
|
|
s2idle_state = S2IDLE_STATE_WAKE;
|
|
|
- wake_up(&s2idle_wait_head);
|
|
|
+ swake_up(&s2idle_wait_head);
|
|
|
}
|
|
|
- spin_unlock_irqrestore(&s2idle_lock, flags);
|
|
|
+ raw_spin_unlock_irqrestore(&s2idle_lock, flags);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(s2idle_wake);
|
|
|
|
|
@@ -428,6 +429,8 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
|
|
|
arch_suspend_disable_irqs();
|
|
|
BUG_ON(!irqs_disabled());
|
|
|
|
|
|
+ system_state = SYSTEM_SUSPEND;
|
|
|
+
|
|
|
error = syscore_suspend();
|
|
|
if (!error) {
|
|
|
*wakeup = pm_wakeup_pending();
|
|
@@ -443,6 +446,8 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
|
|
|
syscore_resume();
|
|
|
}
|
|
|
|
|
|
+ system_state = SYSTEM_RUNNING;
|
|
|
+
|
|
|
arch_suspend_enable_irqs();
|
|
|
BUG_ON(irqs_disabled());
|
|
|
|