Merge branches 'pm-pci', 'acpi-pm', 'pm-sleep' and 'pm-avs'
* pm-pci: PCI / PM: Clean up outdated comments in pci_target_state() PCI / PM: Do not clear state_saved for devices that remain suspended * acpi-pm: ACPI: EC: Dispatch the EC GPE directly on s2idle wake ACPICA: Introduce acpi_dispatch_gpe() * pm-sleep: PM / hibernate: Fix oops at snapshot_write() PM / wakeup: Make s2idle_lock a RAW_SPINLOCK PM / s2idle: Make s2idle_wait_head swait based PM / wakeup: Make events_lock a RAW_SPINLOCK PM / suspend: Prevent might sleep splats * pm-avs: PM / AVS: rockchip-io: add io selectors and supplies for PX30
This commit is contained in:
@@ -287,6 +287,8 @@ static int create_image(int platform_mode)
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
system_state = SYSTEM_SUSPEND;
|
||||
|
||||
error = syscore_suspend();
|
||||
if (error) {
|
||||
pr_err("Some system devices failed to power down, aborting hibernation\n");
|
||||
@@ -317,6 +319,7 @@ static int create_image(int platform_mode)
|
||||
syscore_resume();
|
||||
|
||||
Enable_irqs:
|
||||
system_state = SYSTEM_RUNNING;
|
||||
local_irq_enable();
|
||||
|
||||
Enable_cpus:
|
||||
@@ -445,6 +448,7 @@ static int resume_target_kernel(bool platform_mode)
|
||||
goto Enable_cpus;
|
||||
|
||||
local_irq_disable();
|
||||
system_state = SYSTEM_SUSPEND;
|
||||
|
||||
error = syscore_suspend();
|
||||
if (error)
|
||||
@@ -478,6 +482,7 @@ static int resume_target_kernel(bool platform_mode)
|
||||
syscore_resume();
|
||||
|
||||
Enable_irqs:
|
||||
system_state = SYSTEM_RUNNING;
|
||||
local_irq_enable();
|
||||
|
||||
Enable_cpus:
|
||||
@@ -563,6 +568,7 @@ int hibernation_platform_enter(void)
|
||||
goto Enable_cpus;
|
||||
|
||||
local_irq_disable();
|
||||
system_state = SYSTEM_SUSPEND;
|
||||
syscore_suspend();
|
||||
if (pm_wakeup_pending()) {
|
||||
error = -EAGAIN;
|
||||
@@ -575,6 +581,7 @@ int hibernation_platform_enter(void)
|
||||
|
||||
Power_up:
|
||||
syscore_resume();
|
||||
system_state = SYSTEM_RUNNING;
|
||||
local_irq_enable();
|
||||
|
||||
Enable_cpus:
|
||||
|
@@ -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());
|
||||
|
||||
|
@@ -186,6 +186,11 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,
|
||||
res = PAGE_SIZE - pg_offp;
|
||||
}
|
||||
|
||||
if (!data_of(data->handle)) {
|
||||
res = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
res = simple_write_to_buffer(data_of(data->handle), res, &pg_offp,
|
||||
buf, count);
|
||||
if (res > 0)
|
||||
|
Reference in New Issue
Block a user