You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: PM: Add empty suspend/resume device irq functions PM/Hibernate: Move NVS routines into a seperate file (v2). PM/Hibernate: Rename disk.c to hibernate.c PM: Separate suspend to RAM functionality from core Driver Core: Rework platform suspend/resume, print warning PM: Remove device_type suspend()/resume() PM/Hibernate: Move memory shrinking to snapshot.c (rev. 2) PM/Suspend: Do not shrink memory before suspend PM: Remove bus_type suspend_late()/resume_early() V2 PM core: rename suspend and resume functions PM: Rename device_power_down/up() PM: Remove unused asm/suspend.h x86: unify power/cpu_(32|64).c x86: unify power/cpu_(32|64) copyright notes x86: unify power/cpu_(32|64) regarding restoring processor state x86: unify power/cpu_(32|64) regarding saving processor state x86: unify power/cpu_(32|64) global variables x86: unify power/cpu_(32|64) headers PM: Warn if interrupts are enabled during suspend-resume of sysdevs PM/ACPI/x86: Fix sparse warning in arch/x86/kernel/acpi/sleep.c
This commit is contained in:
@@ -75,9 +75,6 @@ may need to apply in domain-specific ways to their devices:
|
||||
struct bus_type {
|
||||
...
|
||||
int (*suspend)(struct device *dev, pm_message_t state);
|
||||
int (*suspend_late)(struct device *dev, pm_message_t state);
|
||||
|
||||
int (*resume_early)(struct device *dev);
|
||||
int (*resume)(struct device *dev);
|
||||
};
|
||||
|
||||
@@ -226,20 +223,7 @@ The phases are seen by driver notifications issued in this order:
|
||||
|
||||
This call should handle parts of device suspend logic that require
|
||||
sleeping. It probably does work to quiesce the device which hasn't
|
||||
been abstracted into class.suspend() or bus.suspend_late().
|
||||
|
||||
3 bus.suspend_late(dev, message) is called with IRQs disabled, and
|
||||
with only one CPU active. Until the bus.resume_early() phase
|
||||
completes (see later), IRQs are not enabled again. This method
|
||||
won't be exposed by all busses; for message based busses like USB,
|
||||
I2C, or SPI, device interactions normally require IRQs. This bus
|
||||
call may be morphed into a driver call with bus-specific parameters.
|
||||
|
||||
This call might save low level hardware state that might otherwise
|
||||
be lost in the upcoming low power state, and actually put the
|
||||
device into a low power state ... so that in some cases the device
|
||||
may stay partly usable until this late. This "late" call may also
|
||||
help when coping with hardware that behaves badly.
|
||||
been abstracted into class.suspend().
|
||||
|
||||
The pm_message_t parameter is currently used to refine those semantics
|
||||
(described later).
|
||||
@@ -351,19 +335,11 @@ devices processing each phase's calls before the next phase begins.
|
||||
|
||||
The phases are seen by driver notifications issued in this order:
|
||||
|
||||
1 bus.resume_early(dev) is called with IRQs disabled, and with
|
||||
only one CPU active. As with bus.suspend_late(), this method
|
||||
won't be supported on busses that require IRQs in order to
|
||||
interact with devices.
|
||||
1 bus.resume(dev) reverses the effects of bus.suspend(). This may
|
||||
be morphed into a device driver call with bus-specific parameters;
|
||||
implementations may sleep.
|
||||
|
||||
This reverses the effects of bus.suspend_late().
|
||||
|
||||
2 bus.resume(dev) is called next. This may be morphed into a device
|
||||
driver call with bus-specific parameters; implementations may sleep.
|
||||
|
||||
This reverses the effects of bus.suspend().
|
||||
|
||||
3 class.resume(dev) is called for devices associated with a class
|
||||
2 class.resume(dev) is called for devices associated with a class
|
||||
that has such a method. Implementations may sleep.
|
||||
|
||||
This reverses the effects of class.suspend(), and would usually
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef __ALPHA_SUSPEND_H
|
||||
#define __ALPHA_SUSPEND_H
|
||||
|
||||
/* Dummy include. */
|
||||
|
||||
#endif /* __ALPHA_SUSPEND_H */
|
||||
@@ -1,4 +0,0 @@
|
||||
#ifndef _ASMARM_SUSPEND_H
|
||||
#define _ASMARM_SUSPEND_H
|
||||
|
||||
#endif
|
||||
@@ -1 +0,0 @@
|
||||
/* dummy (must be non-empty to prevent prejudicial removal...) */
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef _M68K_SUSPEND_H
|
||||
#define _M68K_SUSPEND_H
|
||||
|
||||
/* Dummy include. */
|
||||
|
||||
#endif /* _M68K_SUSPEND_H */
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef __ASM_SUSPEND_H
|
||||
#define __ASM_SUSPEND_H
|
||||
|
||||
/* Somewhen... Maybe :-) */
|
||||
|
||||
#endif /* __ASM_SUSPEND_H */
|
||||
@@ -1,5 +0,0 @@
|
||||
#ifndef __ASM_S390_SUSPEND_H
|
||||
#define __ASM_S390_SUSPEND_H
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#ifndef __UM_SUSPEND_H
|
||||
#define __UM_SUSPEND_H
|
||||
|
||||
#endif
|
||||
@@ -104,7 +104,7 @@ int acpi_save_state_mem(void)
|
||||
initial_gs = per_cpu_offset(smp_processor_id());
|
||||
#endif
|
||||
initial_code = (unsigned long)wakeup_long64;
|
||||
saved_magic = 0x123456789abcdef0;
|
||||
saved_magic = 0x123456789abcdef0L;
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1233,9 +1233,9 @@ static int suspend(int vetoable)
|
||||
int err;
|
||||
struct apm_user *as;
|
||||
|
||||
device_suspend(PMSG_SUSPEND);
|
||||
dpm_suspend_start(PMSG_SUSPEND);
|
||||
|
||||
device_power_down(PMSG_SUSPEND);
|
||||
dpm_suspend_noirq(PMSG_SUSPEND);
|
||||
|
||||
local_irq_disable();
|
||||
sysdev_suspend(PMSG_SUSPEND);
|
||||
@@ -1259,9 +1259,9 @@ static int suspend(int vetoable)
|
||||
sysdev_resume();
|
||||
local_irq_enable();
|
||||
|
||||
device_power_up(PMSG_RESUME);
|
||||
dpm_resume_noirq(PMSG_RESUME);
|
||||
|
||||
device_resume(PMSG_RESUME);
|
||||
dpm_resume_end(PMSG_RESUME);
|
||||
queue_event(APM_NORMAL_RESUME, NULL);
|
||||
spin_lock(&user_list_lock);
|
||||
for (as = user_list; as != NULL; as = as->next) {
|
||||
@@ -1277,7 +1277,7 @@ static void standby(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
device_power_down(PMSG_SUSPEND);
|
||||
dpm_suspend_noirq(PMSG_SUSPEND);
|
||||
|
||||
local_irq_disable();
|
||||
sysdev_suspend(PMSG_SUSPEND);
|
||||
@@ -1291,7 +1291,7 @@ static void standby(void)
|
||||
sysdev_resume();
|
||||
local_irq_enable();
|
||||
|
||||
device_power_up(PMSG_RESUME);
|
||||
dpm_resume_noirq(PMSG_RESUME);
|
||||
}
|
||||
|
||||
static apm_event_t get_event(void)
|
||||
@@ -1376,7 +1376,7 @@ static void check_events(void)
|
||||
ignore_bounce = 1;
|
||||
if ((event != APM_NORMAL_RESUME)
|
||||
|| (ignore_normal_resume == 0)) {
|
||||
device_resume(PMSG_RESUME);
|
||||
dpm_resume_end(PMSG_RESUME);
|
||||
queue_event(event, NULL);
|
||||
}
|
||||
ignore_normal_resume = 0;
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
nostackp := $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_cpu_$(BITS).o := $(nostackp)
|
||||
|
||||
obj-$(CONFIG_PM_SLEEP) += cpu_$(BITS).o
|
||||
obj-$(CONFIG_PM_SLEEP) += cpu.o
|
||||
obj-$(CONFIG_HIBERNATION) += hibernate_$(BITS).o hibernate_asm_$(BITS).o
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Suspend and hibernation support for x86-64
|
||||
* Suspend support specific for i386/x86-64.
|
||||
*
|
||||
* Distribute under GPLv2
|
||||
*
|
||||
@@ -8,18 +8,28 @@
|
||||
* Copyright (c) 2001 Patrick Mochel <mochel@osdl.org>
|
||||
*/
|
||||
|
||||
#include <linux/smp.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/xcr.h>
|
||||
#include <asm/suspend.h>
|
||||
|
||||
static void fix_processor_context(void);
|
||||
#ifdef CONFIG_X86_32
|
||||
static struct saved_context saved_context;
|
||||
|
||||
unsigned long saved_context_ebx;
|
||||
unsigned long saved_context_esp, saved_context_ebp;
|
||||
unsigned long saved_context_esi, saved_context_edi;
|
||||
unsigned long saved_context_eflags;
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
struct saved_context saved_context;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* __save_processor_state - save CPU registers before creating a
|
||||
@@ -38,19 +48,35 @@ struct saved_context saved_context;
|
||||
*/
|
||||
static void __save_processor_state(struct saved_context *ctxt)
|
||||
{
|
||||
#ifdef CONFIG_X86_32
|
||||
mtrr_save_fixed_ranges(NULL);
|
||||
#endif
|
||||
kernel_fpu_begin();
|
||||
|
||||
/*
|
||||
* descriptor tables
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
store_gdt(&ctxt->gdt);
|
||||
store_idt(&ctxt->idt);
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
store_gdt((struct desc_ptr *)&ctxt->gdt_limit);
|
||||
store_idt((struct desc_ptr *)&ctxt->idt_limit);
|
||||
#endif
|
||||
store_tr(ctxt->tr);
|
||||
|
||||
/* XMM0..XMM15 should be handled by kernel_fpu_begin(). */
|
||||
/*
|
||||
* segment registers
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
savesegment(es, ctxt->es);
|
||||
savesegment(fs, ctxt->fs);
|
||||
savesegment(gs, ctxt->gs);
|
||||
savesegment(ss, ctxt->ss);
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
asm volatile ("movw %%ds, %0" : "=m" (ctxt->ds));
|
||||
asm volatile ("movw %%es, %0" : "=m" (ctxt->es));
|
||||
asm volatile ("movw %%fs, %0" : "=m" (ctxt->fs));
|
||||
@@ -62,30 +88,87 @@ static void __save_processor_state(struct saved_context *ctxt)
|
||||
rdmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base);
|
||||
mtrr_save_fixed_ranges(NULL);
|
||||
|
||||
rdmsrl(MSR_EFER, ctxt->efer);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* control registers
|
||||
*/
|
||||
rdmsrl(MSR_EFER, ctxt->efer);
|
||||
ctxt->cr0 = read_cr0();
|
||||
ctxt->cr2 = read_cr2();
|
||||
ctxt->cr3 = read_cr3();
|
||||
#ifdef CONFIG_X86_32
|
||||
ctxt->cr4 = read_cr4_safe();
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
ctxt->cr4 = read_cr4();
|
||||
ctxt->cr8 = read_cr8();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Needed by apm.c */
|
||||
void save_processor_state(void)
|
||||
{
|
||||
__save_processor_state(&saved_context);
|
||||
}
|
||||
#ifdef CONFIG_X86_32
|
||||
EXPORT_SYMBOL(save_processor_state);
|
||||
#endif
|
||||
|
||||
static void do_fpu_end(void)
|
||||
{
|
||||
/*
|
||||
* Restore FPU regs if necessary
|
||||
* Restore FPU regs if necessary.
|
||||
*/
|
||||
kernel_fpu_end();
|
||||
}
|
||||
|
||||
static void fix_processor_context(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
||||
|
||||
set_tss_desc(cpu, t); /*
|
||||
* This just modifies memory; should not be
|
||||
* necessary. But... This is necessary, because
|
||||
* 386 hardware has concept of busy TSS or some
|
||||
* similar stupidity.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
get_cpu_gdt_table(cpu)[GDT_ENTRY_TSS].type = 9;
|
||||
|
||||
syscall_init(); /* This sets MSR_*STAR and related */
|
||||
#endif
|
||||
load_TR_desc(); /* This does ltr */
|
||||
load_LDT(¤t->active_mm->context); /* This does lldt */
|
||||
|
||||
/*
|
||||
* Now maybe reload the debug registers
|
||||
*/
|
||||
if (current->thread.debugreg7) {
|
||||
#ifdef CONFIG_X86_32
|
||||
set_debugreg(current->thread.debugreg0, 0);
|
||||
set_debugreg(current->thread.debugreg1, 1);
|
||||
set_debugreg(current->thread.debugreg2, 2);
|
||||
set_debugreg(current->thread.debugreg3, 3);
|
||||
/* no 4 and 5 */
|
||||
set_debugreg(current->thread.debugreg6, 6);
|
||||
set_debugreg(current->thread.debugreg7, 7);
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
loaddebug(¤t->thread, 0);
|
||||
loaddebug(¤t->thread, 1);
|
||||
loaddebug(¤t->thread, 2);
|
||||
loaddebug(¤t->thread, 3);
|
||||
/* no 4 and 5 */
|
||||
loaddebug(¤t->thread, 6);
|
||||
loaddebug(¤t->thread, 7);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* __restore_processor_state - restore the contents of CPU registers saved
|
||||
* by __save_processor_state()
|
||||
@@ -96,9 +179,16 @@ static void __restore_processor_state(struct saved_context *ctxt)
|
||||
/*
|
||||
* control registers
|
||||
*/
|
||||
/* cr4 was introduced in the Pentium CPU */
|
||||
#ifdef CONFIG_X86_32
|
||||
if (ctxt->cr4)
|
||||
write_cr4(ctxt->cr4);
|
||||
#else
|
||||
/* CONFIG X86_64 */
|
||||
wrmsrl(MSR_EFER, ctxt->efer);
|
||||
write_cr8(ctxt->cr8);
|
||||
write_cr4(ctxt->cr4);
|
||||
#endif
|
||||
write_cr3(ctxt->cr3);
|
||||
write_cr2(ctxt->cr2);
|
||||
write_cr0(ctxt->cr0);
|
||||
@@ -107,13 +197,31 @@ static void __restore_processor_state(struct saved_context *ctxt)
|
||||
* now restore the descriptor tables to their proper values
|
||||
* ltr is done i fix_processor_context().
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
load_gdt(&ctxt->gdt);
|
||||
load_idt(&ctxt->idt);
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
load_gdt((const struct desc_ptr *)&ctxt->gdt_limit);
|
||||
load_idt((const struct desc_ptr *)&ctxt->idt_limit);
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* segment registers
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
loadsegment(es, ctxt->es);
|
||||
loadsegment(fs, ctxt->fs);
|
||||
loadsegment(gs, ctxt->gs);
|
||||
loadsegment(ss, ctxt->ss);
|
||||
|
||||
/*
|
||||
* sysenter MSRs
|
||||
*/
|
||||
if (boot_cpu_has(X86_FEATURE_SEP))
|
||||
enable_sep_cpu();
|
||||
#else
|
||||
/* CONFIG_X86_64 */
|
||||
asm volatile ("movw %0, %%ds" :: "r" (ctxt->ds));
|
||||
asm volatile ("movw %0, %%es" :: "r" (ctxt->es));
|
||||
asm volatile ("movw %0, %%fs" :: "r" (ctxt->fs));
|
||||
@@ -123,6 +231,7 @@ static void __restore_processor_state(struct saved_context *ctxt)
|
||||
wrmsrl(MSR_FS_BASE, ctxt->fs_base);
|
||||
wrmsrl(MSR_GS_BASE, ctxt->gs_base);
|
||||
wrmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* restore XCR0 for xsave capable cpu's.
|
||||
@@ -134,41 +243,17 @@ static void __restore_processor_state(struct saved_context *ctxt)
|
||||
|
||||
do_fpu_end();
|
||||
mtrr_ap_init();
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
mcheck_init(&boot_cpu_data);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Needed by apm.c */
|
||||
void restore_processor_state(void)
|
||||
{
|
||||
__restore_processor_state(&saved_context);
|
||||
}
|
||||
|
||||
static void fix_processor_context(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
||||
|
||||
/*
|
||||
* This just modifies memory; should not be necessary. But... This
|
||||
* is necessary, because 386 hardware has concept of busy TSS or some
|
||||
* similar stupidity.
|
||||
*/
|
||||
set_tss_desc(cpu, t);
|
||||
|
||||
get_cpu_gdt_table(cpu)[GDT_ENTRY_TSS].type = 9;
|
||||
|
||||
syscall_init(); /* This sets MSR_*STAR and related */
|
||||
load_TR_desc(); /* This does ltr */
|
||||
load_LDT(¤t->active_mm->context); /* This does lldt */
|
||||
|
||||
/*
|
||||
* Now maybe reload the debug registers
|
||||
*/
|
||||
if (current->thread.debugreg7){
|
||||
loaddebug(¤t->thread, 0);
|
||||
loaddebug(¤t->thread, 1);
|
||||
loaddebug(¤t->thread, 2);
|
||||
loaddebug(¤t->thread, 3);
|
||||
/* no 4 and 5 */
|
||||
loaddebug(¤t->thread, 6);
|
||||
loaddebug(¤t->thread, 7);
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_X86_32
|
||||
EXPORT_SYMBOL(restore_processor_state);
|
||||
#endif
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Suspend support specific for i386.
|
||||
*
|
||||
* Distribute under GPLv2
|
||||
*
|
||||
* Copyright (c) 2002 Pavel Machek <pavel@suse.cz>
|
||||
* Copyright (c) 2001 Patrick Mochel <mochel@osdl.org>
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/xcr.h>
|
||||
#include <asm/suspend.h>
|
||||
|
||||
static struct saved_context saved_context;
|
||||
|
||||
unsigned long saved_context_ebx;
|
||||
unsigned long saved_context_esp, saved_context_ebp;
|
||||
unsigned long saved_context_esi, saved_context_edi;
|
||||
unsigned long saved_context_eflags;
|
||||
|
||||
static void __save_processor_state(struct saved_context *ctxt)
|
||||
{
|
||||
mtrr_save_fixed_ranges(NULL);
|
||||
kernel_fpu_begin();
|
||||
|
||||
/*
|
||||
* descriptor tables
|
||||
*/
|
||||
store_gdt(&ctxt->gdt);
|
||||
store_idt(&ctxt->idt);
|
||||
store_tr(ctxt->tr);
|
||||
|
||||
/*
|
||||
* segment registers
|
||||
*/
|
||||
savesegment(es, ctxt->es);
|
||||
savesegment(fs, ctxt->fs);
|
||||
savesegment(gs, ctxt->gs);
|
||||
savesegment(ss, ctxt->ss);
|
||||
|
||||
/*
|
||||
* control registers
|
||||
*/
|
||||
ctxt->cr0 = read_cr0();
|
||||
ctxt->cr2 = read_cr2();
|
||||
ctxt->cr3 = read_cr3();
|
||||
ctxt->cr4 = read_cr4_safe();
|
||||
}
|
||||
|
||||
/* Needed by apm.c */
|
||||
void save_processor_state(void)
|
||||
{
|
||||
__save_processor_state(&saved_context);
|
||||
}
|
||||
EXPORT_SYMBOL(save_processor_state);
|
||||
|
||||
static void do_fpu_end(void)
|
||||
{
|
||||
/*
|
||||
* Restore FPU regs if necessary.
|
||||
*/
|
||||
kernel_fpu_end();
|
||||
}
|
||||
|
||||
static void fix_processor_context(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
||||
|
||||
set_tss_desc(cpu, t); /*
|
||||
* This just modifies memory; should not be
|
||||
* necessary. But... This is necessary, because
|
||||
* 386 hardware has concept of busy TSS or some
|
||||
* similar stupidity.
|
||||
*/
|
||||
|
||||
load_TR_desc(); /* This does ltr */
|
||||
load_LDT(¤t->active_mm->context); /* This does lldt */
|
||||
|
||||
/*
|
||||
* Now maybe reload the debug registers
|
||||
*/
|
||||
if (current->thread.debugreg7) {
|
||||
set_debugreg(current->thread.debugreg0, 0);
|
||||
set_debugreg(current->thread.debugreg1, 1);
|
||||
set_debugreg(current->thread.debugreg2, 2);
|
||||
set_debugreg(current->thread.debugreg3, 3);
|
||||
/* no 4 and 5 */
|
||||
set_debugreg(current->thread.debugreg6, 6);
|
||||
set_debugreg(current->thread.debugreg7, 7);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void __restore_processor_state(struct saved_context *ctxt)
|
||||
{
|
||||
/*
|
||||
* control registers
|
||||
*/
|
||||
/* cr4 was introduced in the Pentium CPU */
|
||||
if (ctxt->cr4)
|
||||
write_cr4(ctxt->cr4);
|
||||
write_cr3(ctxt->cr3);
|
||||
write_cr2(ctxt->cr2);
|
||||
write_cr0(ctxt->cr0);
|
||||
|
||||
/*
|
||||
* now restore the descriptor tables to their proper values
|
||||
* ltr is done i fix_processor_context().
|
||||
*/
|
||||
load_gdt(&ctxt->gdt);
|
||||
load_idt(&ctxt->idt);
|
||||
|
||||
/*
|
||||
* segment registers
|
||||
*/
|
||||
loadsegment(es, ctxt->es);
|
||||
loadsegment(fs, ctxt->fs);
|
||||
loadsegment(gs, ctxt->gs);
|
||||
loadsegment(ss, ctxt->ss);
|
||||
|
||||
/*
|
||||
* sysenter MSRs
|
||||
*/
|
||||
if (boot_cpu_has(X86_FEATURE_SEP))
|
||||
enable_sep_cpu();
|
||||
|
||||
/*
|
||||
* restore XCR0 for xsave capable cpu's.
|
||||
*/
|
||||
if (cpu_has_xsave)
|
||||
xsetbv(XCR_XFEATURE_ENABLED_MASK, pcntxt_mask);
|
||||
|
||||
fix_processor_context();
|
||||
do_fpu_end();
|
||||
mtrr_ap_init();
|
||||
mcheck_init(&boot_cpu_data);
|
||||
}
|
||||
|
||||
/* Needed by apm.c */
|
||||
void restore_processor_state(void)
|
||||
{
|
||||
__restore_processor_state(&saved_context);
|
||||
}
|
||||
EXPORT_SYMBOL(restore_processor_state);
|
||||
+12
-24
@@ -469,22 +469,6 @@ static void platform_drv_shutdown(struct device *_dev)
|
||||
drv->shutdown(dev);
|
||||
}
|
||||
|
||||
static int platform_drv_suspend(struct device *_dev, pm_message_t state)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
return drv->suspend(dev, state);
|
||||
}
|
||||
|
||||
static int platform_drv_resume(struct device *_dev)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
return drv->resume(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* platform_driver_register
|
||||
* @drv: platform driver structure
|
||||
@@ -498,10 +482,10 @@ int platform_driver_register(struct platform_driver *drv)
|
||||
drv->driver.remove = platform_drv_remove;
|
||||
if (drv->shutdown)
|
||||
drv->driver.shutdown = platform_drv_shutdown;
|
||||
if (drv->suspend)
|
||||
drv->driver.suspend = platform_drv_suspend;
|
||||
if (drv->resume)
|
||||
drv->driver.resume = platform_drv_resume;
|
||||
if (drv->suspend || drv->resume)
|
||||
pr_warning("Platform driver '%s' needs updating - please use "
|
||||
"dev_pm_ops\n", drv->driver.name);
|
||||
|
||||
return driver_register(&drv->driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_driver_register);
|
||||
@@ -633,10 +617,12 @@ static int platform_match(struct device *dev, struct device_driver *drv)
|
||||
|
||||
static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
|
||||
{
|
||||
struct platform_driver *pdrv = to_platform_driver(dev->driver);
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int ret = 0;
|
||||
|
||||
if (dev->driver && dev->driver->suspend)
|
||||
ret = dev->driver->suspend(dev, mesg);
|
||||
if (dev->driver && pdrv->suspend)
|
||||
ret = pdrv->suspend(pdev, mesg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -667,10 +653,12 @@ static int platform_legacy_resume_early(struct device *dev)
|
||||
|
||||
static int platform_legacy_resume(struct device *dev)
|
||||
{
|
||||
struct platform_driver *pdrv = to_platform_driver(dev->driver);
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int ret = 0;
|
||||
|
||||
if (dev->driver && dev->driver->resume)
|
||||
ret = dev->driver->resume(dev);
|
||||
if (dev->driver && pdrv->resume)
|
||||
ret = pdrv->resume(pdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
+34
-60
@@ -315,13 +315,13 @@ static void pm_dev_err(struct device *dev, pm_message_t state, char *info,
|
||||
/*------------------------- Resume routines -------------------------*/
|
||||
|
||||
/**
|
||||
* resume_device_noirq - Power on one device (early resume).
|
||||
* device_resume_noirq - Power on one device (early resume).
|
||||
* @dev: Device.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* Must be called with interrupts disabled.
|
||||
*/
|
||||
static int resume_device_noirq(struct device *dev, pm_message_t state)
|
||||
static int device_resume_noirq(struct device *dev, pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
@@ -334,9 +334,6 @@ static int resume_device_noirq(struct device *dev, pm_message_t state)
|
||||
if (dev->bus->pm) {
|
||||
pm_dev_dbg(dev, state, "EARLY ");
|
||||
error = pm_noirq_op(dev, dev->bus->pm, state);
|
||||
} else if (dev->bus->resume_early) {
|
||||
pm_dev_dbg(dev, state, "legacy EARLY ");
|
||||
error = dev->bus->resume_early(dev);
|
||||
}
|
||||
End:
|
||||
TRACE_RESUME(error);
|
||||
@@ -344,16 +341,16 @@ static int resume_device_noirq(struct device *dev, pm_message_t state)
|
||||
}
|
||||
|
||||
/**
|
||||
* dpm_power_up - Power on all regular (non-sysdev) devices.
|
||||
* dpm_resume_noirq - Power on all regular (non-sysdev) devices.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* Execute the appropriate "noirq resume" callback for all devices marked
|
||||
* as DPM_OFF_IRQ.
|
||||
* Call the "noirq" resume handlers for all devices marked as
|
||||
* DPM_OFF_IRQ and enable device drivers to receive interrupts.
|
||||
*
|
||||
* Must be called under dpm_list_mtx. Device drivers should not receive
|
||||
* interrupts while it's being executed.
|
||||
*/
|
||||
static void dpm_power_up(pm_message_t state)
|
||||
void dpm_resume_noirq(pm_message_t state)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
@@ -363,33 +360,21 @@ static void dpm_power_up(pm_message_t state)
|
||||
int error;
|
||||
|
||||
dev->power.status = DPM_OFF;
|
||||
error = resume_device_noirq(dev, state);
|
||||
error = device_resume_noirq(dev, state);
|
||||
if (error)
|
||||
pm_dev_err(dev, state, " early", error);
|
||||
}
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
}
|
||||
|
||||
/**
|
||||
* device_power_up - Turn on all devices that need special attention.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* Call the "early" resume handlers and enable device drivers to receive
|
||||
* interrupts.
|
||||
*/
|
||||
void device_power_up(pm_message_t state)
|
||||
{
|
||||
dpm_power_up(state);
|
||||
resume_device_irqs();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_power_up);
|
||||
EXPORT_SYMBOL_GPL(dpm_resume_noirq);
|
||||
|
||||
/**
|
||||
* resume_device - Restore state for one device.
|
||||
* device_resume - Restore state for one device.
|
||||
* @dev: Device.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*/
|
||||
static int resume_device(struct device *dev, pm_message_t state)
|
||||
static int device_resume(struct device *dev, pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
@@ -414,9 +399,6 @@ static int resume_device(struct device *dev, pm_message_t state)
|
||||
if (dev->type->pm) {
|
||||
pm_dev_dbg(dev, state, "type ");
|
||||
error = pm_op(dev, dev->type->pm, state);
|
||||
} else if (dev->type->resume) {
|
||||
pm_dev_dbg(dev, state, "legacy type ");
|
||||
error = dev->type->resume(dev);
|
||||
}
|
||||
if (error)
|
||||
goto End;
|
||||
@@ -462,7 +444,7 @@ static void dpm_resume(pm_message_t state)
|
||||
dev->power.status = DPM_RESUMING;
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
|
||||
error = resume_device(dev, state);
|
||||
error = device_resume(dev, state);
|
||||
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
if (error)
|
||||
@@ -480,11 +462,11 @@ static void dpm_resume(pm_message_t state)
|
||||
}
|
||||
|
||||
/**
|
||||
* complete_device - Complete a PM transition for given device
|
||||
* device_complete - Complete a PM transition for given device
|
||||
* @dev: Device.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*/
|
||||
static void complete_device(struct device *dev, pm_message_t state)
|
||||
static void device_complete(struct device *dev, pm_message_t state)
|
||||
{
|
||||
down(&dev->sem);
|
||||
|
||||
@@ -527,7 +509,7 @@ static void dpm_complete(pm_message_t state)
|
||||
dev->power.status = DPM_ON;
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
|
||||
complete_device(dev, state);
|
||||
device_complete(dev, state);
|
||||
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
}
|
||||
@@ -540,19 +522,19 @@ static void dpm_complete(pm_message_t state)
|
||||
}
|
||||
|
||||
/**
|
||||
* device_resume - Restore state of each device in system.
|
||||
* dpm_resume_end - Restore state of each device in system.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* Resume all the devices, unlock them all, and allow new
|
||||
* devices to be registered once again.
|
||||
*/
|
||||
void device_resume(pm_message_t state)
|
||||
void dpm_resume_end(pm_message_t state)
|
||||
{
|
||||
might_sleep();
|
||||
dpm_resume(state);
|
||||
dpm_complete(state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_resume);
|
||||
EXPORT_SYMBOL_GPL(dpm_resume_end);
|
||||
|
||||
|
||||
/*------------------------- Suspend routines -------------------------*/
|
||||
@@ -577,13 +559,13 @@ static pm_message_t resume_event(pm_message_t sleep_state)
|
||||
}
|
||||
|
||||
/**
|
||||
* suspend_device_noirq - Shut down one device (late suspend).
|
||||
* device_suspend_noirq - Shut down one device (late suspend).
|
||||
* @dev: Device.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* This is called with interrupts off and only a single CPU running.
|
||||
*/
|
||||
static int suspend_device_noirq(struct device *dev, pm_message_t state)
|
||||
static int device_suspend_noirq(struct device *dev, pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
@@ -593,24 +575,20 @@ static int suspend_device_noirq(struct device *dev, pm_message_t state)
|
||||
if (dev->bus->pm) {
|
||||
pm_dev_dbg(dev, state, "LATE ");
|
||||
error = pm_noirq_op(dev, dev->bus->pm, state);
|
||||
} else if (dev->bus->suspend_late) {
|
||||
pm_dev_dbg(dev, state, "legacy LATE ");
|
||||
error = dev->bus->suspend_late(dev, state);
|
||||
suspend_report_result(dev->bus->suspend_late, error);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* device_power_down - Shut down special devices.
|
||||
* dpm_suspend_noirq - Power down all regular (non-sysdev) devices.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* Prevent device drivers from receiving interrupts and call the "late"
|
||||
* Prevent device drivers from receiving interrupts and call the "noirq"
|
||||
* suspend handlers.
|
||||
*
|
||||
* Must be called under dpm_list_mtx.
|
||||
*/
|
||||
int device_power_down(pm_message_t state)
|
||||
int dpm_suspend_noirq(pm_message_t state)
|
||||
{
|
||||
struct device *dev;
|
||||
int error = 0;
|
||||
@@ -618,7 +596,7 @@ int device_power_down(pm_message_t state)
|
||||
suspend_device_irqs();
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
list_for_each_entry_reverse(dev, &dpm_list, power.entry) {
|
||||
error = suspend_device_noirq(dev, state);
|
||||
error = device_suspend_noirq(dev, state);
|
||||
if (error) {
|
||||
pm_dev_err(dev, state, " late", error);
|
||||
break;
|
||||
@@ -627,17 +605,17 @@ int device_power_down(pm_message_t state)
|
||||
}
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
if (error)
|
||||
device_power_up(resume_event(state));
|
||||
dpm_resume_noirq(resume_event(state));
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_power_down);
|
||||
EXPORT_SYMBOL_GPL(dpm_suspend_noirq);
|
||||
|
||||
/**
|
||||
* suspend_device - Save state of one device.
|
||||
* device_suspend - Save state of one device.
|
||||
* @dev: Device.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*/
|
||||
static int suspend_device(struct device *dev, pm_message_t state)
|
||||
static int device_suspend(struct device *dev, pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
@@ -660,10 +638,6 @@ static int suspend_device(struct device *dev, pm_message_t state)
|
||||
if (dev->type->pm) {
|
||||
pm_dev_dbg(dev, state, "type ");
|
||||
error = pm_op(dev, dev->type->pm, state);
|
||||
} else if (dev->type->suspend) {
|
||||
pm_dev_dbg(dev, state, "legacy type ");
|
||||
error = dev->type->suspend(dev, state);
|
||||
suspend_report_result(dev->type->suspend, error);
|
||||
}
|
||||
if (error)
|
||||
goto End;
|
||||
@@ -704,7 +678,7 @@ static int dpm_suspend(pm_message_t state)
|
||||
get_device(dev);
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
|
||||
error = suspend_device(dev, state);
|
||||
error = device_suspend(dev, state);
|
||||
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
if (error) {
|
||||
@@ -723,11 +697,11 @@ static int dpm_suspend(pm_message_t state)
|
||||
}
|
||||
|
||||
/**
|
||||
* prepare_device - Execute the ->prepare() callback(s) for given device.
|
||||
* device_prepare - Execute the ->prepare() callback(s) for given device.
|
||||
* @dev: Device.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*/
|
||||
static int prepare_device(struct device *dev, pm_message_t state)
|
||||
static int device_prepare(struct device *dev, pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
@@ -781,7 +755,7 @@ static int dpm_prepare(pm_message_t state)
|
||||
dev->power.status = DPM_PREPARING;
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
|
||||
error = prepare_device(dev, state);
|
||||
error = device_prepare(dev, state);
|
||||
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
if (error) {
|
||||
@@ -807,12 +781,12 @@ static int dpm_prepare(pm_message_t state)
|
||||
}
|
||||
|
||||
/**
|
||||
* device_suspend - Save state and stop all devices in system.
|
||||
* dpm_suspend_start - Save state and stop all devices in system.
|
||||
* @state: PM transition of the system being carried out.
|
||||
*
|
||||
* Prepare and suspend all devices.
|
||||
*/
|
||||
int device_suspend(pm_message_t state)
|
||||
int dpm_suspend_start(pm_message_t state)
|
||||
{
|
||||
int error;
|
||||
|
||||
@@ -822,7 +796,7 @@ int device_suspend(pm_message_t state)
|
||||
error = dpm_suspend(state);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_suspend);
|
||||
EXPORT_SYMBOL_GPL(dpm_suspend_start);
|
||||
|
||||
void __suspend_report_result(const char *function, void *fn, int ret)
|
||||
{
|
||||
|
||||
@@ -343,11 +343,15 @@ static void __sysdev_resume(struct sys_device *dev)
|
||||
/* First, call the class-specific one */
|
||||
if (cls->resume)
|
||||
cls->resume(dev);
|
||||
WARN_ONCE(!irqs_disabled(),
|
||||
"Interrupts enabled after %pF\n", cls->resume);
|
||||
|
||||
/* Call auxillary drivers next. */
|
||||
list_for_each_entry(drv, &cls->drivers, entry) {
|
||||
if (drv->resume)
|
||||
drv->resume(dev);
|
||||
WARN_ONCE(!irqs_disabled(),
|
||||
"Interrupts enabled after %pF\n", drv->resume);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -377,6 +381,9 @@ int sysdev_suspend(pm_message_t state)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
WARN_ONCE(!irqs_disabled(),
|
||||
"Interrupts enabled while suspending system devices\n");
|
||||
|
||||
pr_debug("Suspending System Devices\n");
|
||||
|
||||
list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) {
|
||||
@@ -393,6 +400,9 @@ int sysdev_suspend(pm_message_t state)
|
||||
if (ret)
|
||||
goto aux_driver;
|
||||
}
|
||||
WARN_ONCE(!irqs_disabled(),
|
||||
"Interrupts enabled after %pF\n",
|
||||
drv->suspend);
|
||||
}
|
||||
|
||||
/* Now call the generic one */
|
||||
@@ -400,6 +410,9 @@ int sysdev_suspend(pm_message_t state)
|
||||
ret = cls->suspend(sysdev, state);
|
||||
if (ret)
|
||||
goto cls_driver;
|
||||
WARN_ONCE(!irqs_disabled(),
|
||||
"Interrupts enabled after %pF\n",
|
||||
cls->suspend);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -452,6 +465,9 @@ int sysdev_resume(void)
|
||||
{
|
||||
struct sysdev_class *cls;
|
||||
|
||||
WARN_ONCE(!irqs_disabled(),
|
||||
"Interrupts enabled while resuming system devices\n");
|
||||
|
||||
pr_debug("Resuming System Devices\n");
|
||||
|
||||
list_for_each_entry(cls, &system_kset->list, kset.kobj.entry) {
|
||||
|
||||
@@ -43,7 +43,7 @@ static int xen_suspend(void *data)
|
||||
if (err) {
|
||||
printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
|
||||
err);
|
||||
device_power_up(PMSG_RESUME);
|
||||
dpm_resume_noirq(PMSG_RESUME);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ static int xen_suspend(void *data)
|
||||
}
|
||||
|
||||
sysdev_resume();
|
||||
device_power_up(PMSG_RESUME);
|
||||
dpm_resume_noirq(PMSG_RESUME);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -92,18 +92,18 @@ static void do_suspend(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
err = device_suspend(PMSG_SUSPEND);
|
||||
err = dpm_suspend_start(PMSG_SUSPEND);
|
||||
if (err) {
|
||||
printk(KERN_ERR "xen suspend: device_suspend %d\n", err);
|
||||
printk(KERN_ERR "xen suspend: dpm_suspend_start %d\n", err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
printk(KERN_DEBUG "suspending xenstore...\n");
|
||||
xs_suspend();
|
||||
|
||||
err = device_power_down(PMSG_SUSPEND);
|
||||
err = dpm_suspend_noirq(PMSG_SUSPEND);
|
||||
if (err) {
|
||||
printk(KERN_ERR "device_power_down failed: %d\n", err);
|
||||
printk(KERN_ERR "dpm_suspend_noirq failed: %d\n", err);
|
||||
goto resume_devices;
|
||||
}
|
||||
|
||||
@@ -119,10 +119,10 @@ static void do_suspend(void)
|
||||
} else
|
||||
xs_suspend_cancel();
|
||||
|
||||
device_power_up(PMSG_RESUME);
|
||||
dpm_resume_noirq(PMSG_RESUME);
|
||||
|
||||
resume_devices:
|
||||
device_resume(PMSG_RESUME);
|
||||
dpm_resume_end(PMSG_RESUME);
|
||||
|
||||
/* Make sure timer events get retriggered on all CPUs */
|
||||
clock_was_set();
|
||||
|
||||
@@ -62,8 +62,6 @@ struct bus_type {
|
||||
void (*shutdown)(struct device *dev);
|
||||
|
||||
int (*suspend)(struct device *dev, pm_message_t state);
|
||||
int (*suspend_late)(struct device *dev, pm_message_t state);
|
||||
int (*resume_early)(struct device *dev);
|
||||
int (*resume)(struct device *dev);
|
||||
|
||||
struct dev_pm_ops *pm;
|
||||
@@ -291,9 +289,6 @@ struct device_type {
|
||||
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
|
||||
void (*release)(struct device *dev);
|
||||
|
||||
int (*suspend)(struct device *dev, pm_message_t state);
|
||||
int (*resume)(struct device *dev);
|
||||
|
||||
struct dev_pm_ops *pm;
|
||||
};
|
||||
|
||||
|
||||
@@ -183,6 +183,7 @@ extern void disable_irq(unsigned int irq);
|
||||
extern void enable_irq(unsigned int irq);
|
||||
|
||||
/* The following three functions are for the core kernel use only. */
|
||||
#ifdef CONFIG_GENERIC_HARDIRQS
|
||||
extern void suspend_device_irqs(void);
|
||||
extern void resume_device_irqs(void);
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@@ -190,6 +191,11 @@ extern int check_wakeup_irqs(void);
|
||||
#else
|
||||
static inline int check_wakeup_irqs(void) { return 0; }
|
||||
#endif
|
||||
#else
|
||||
static inline void suspend_device_irqs(void) { };
|
||||
static inline void resume_device_irqs(void) { };
|
||||
static inline int check_wakeup_irqs(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS)
|
||||
|
||||
|
||||
+5
-6
@@ -382,14 +382,13 @@ struct dev_pm_info {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
extern void device_pm_lock(void);
|
||||
extern int sysdev_resume(void);
|
||||
extern void device_power_up(pm_message_t state);
|
||||
extern void device_resume(pm_message_t state);
|
||||
extern void dpm_resume_noirq(pm_message_t state);
|
||||
extern void dpm_resume_end(pm_message_t state);
|
||||
|
||||
extern void device_pm_unlock(void);
|
||||
extern int sysdev_suspend(pm_message_t state);
|
||||
extern int device_power_down(pm_message_t state);
|
||||
extern int device_suspend(pm_message_t state);
|
||||
extern int device_prepare_suspend(pm_message_t state);
|
||||
extern int dpm_suspend_noirq(pm_message_t state);
|
||||
extern int dpm_suspend_start(pm_message_t state);
|
||||
|
||||
extern void __suspend_report_result(const char *function, void *fn, int ret);
|
||||
|
||||
@@ -403,7 +402,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret);
|
||||
#define device_pm_lock() do {} while (0)
|
||||
#define device_pm_unlock() do {} while (0)
|
||||
|
||||
static inline int device_suspend(pm_message_t state)
|
||||
static inline int dpm_suspend_start(pm_message_t state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user