Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
f2a66185
Commit
f2a66185
authored
Aug 14, 2010
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'nvs' into release
parents
9fe6206f
618d7fd0
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
33 additions
and
80 deletions
+33
-80
drivers/acpi/sleep.c
drivers/acpi/sleep.c
+21
-39
drivers/acpi/sleep.h
drivers/acpi/sleep.h
+2
-3
drivers/acpi/wakeup.c
drivers/acpi/wakeup.c
+10
-38
No files found.
drivers/acpi/sleep.c
View file @
f2a66185
...
...
@@ -70,10 +70,10 @@ static int acpi_sleep_prepare(u32 acpi_state)
}
ACPI_FLUSH_CPU_CACHE
();
acpi_enable_wakeup_device_prep
(
acpi_state
);
#endif
printk
(
KERN_INFO
PREFIX
"Preparing to enter system sleep state S%d
\n
"
,
acpi_state
);
acpi_enable_wakeup_devices
(
acpi_state
);
acpi_enter_sleep_state_prep
(
acpi_state
);
return
0
;
}
...
...
@@ -118,6 +118,16 @@ static int acpi_pm_freeze(void)
return
0
;
}
/**
* acpi_pre_suspend - Enable wakeup devices, "freeze" EC and save NVS.
*/
static
int
acpi_pm_pre_suspend
(
void
)
{
acpi_pm_freeze
();
suspend_nvs_save
();
return
0
;
}
/**
* __acpi_pm_prepare - Prepare the platform to enter the target state.
*
...
...
@@ -127,11 +137,9 @@ static int acpi_pm_freeze(void)
static
int
__acpi_pm_prepare
(
void
)
{
int
error
=
acpi_sleep_prepare
(
acpi_target_sleep_state
);
suspend_nvs_save
();
if
(
error
)
acpi_target_sleep_state
=
ACPI_STATE_S0
;
return
error
;
}
...
...
@@ -142,9 +150,8 @@ static int __acpi_pm_prepare(void)
static
int
acpi_pm_prepare
(
void
)
{
int
error
=
__acpi_pm_prepare
();
if
(
!
error
)
acpi_pm_
freeze
();
acpi_pm_
pre_suspend
();
return
error
;
}
...
...
@@ -159,7 +166,6 @@ static void acpi_pm_finish(void)
{
u32
acpi_state
=
acpi_target_sleep_state
;
suspend_nvs_free
();
acpi_ec_unblock_transactions
();
if
(
acpi_state
==
ACPI_STATE_S0
)
...
...
@@ -167,7 +173,7 @@ static void acpi_pm_finish(void)
printk
(
KERN_INFO
PREFIX
"Waking up from system sleep state S%d
\n
"
,
acpi_state
);
acpi_disable_wakeup_device
(
acpi_state
);
acpi_disable_wakeup_device
s
(
acpi_state
);
acpi_leave_sleep_state
(
acpi_state
);
/* reset firmware waking vector */
...
...
@@ -181,6 +187,7 @@ static void acpi_pm_finish(void)
*/
static
void
acpi_pm_end
(
void
)
{
suspend_nvs_free
();
/*
* This is necessary in case acpi_pm_finish() is not called during a
* failing transition to a sleep state.
...
...
@@ -251,7 +258,6 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
}
local_irq_save
(
flags
);
acpi_enable_wakeup_device
(
acpi_state
);
switch
(
acpi_state
)
{
case
ACPI_STATE_S1
:
barrier
();
...
...
@@ -297,11 +303,6 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
return
ACPI_SUCCESS
(
status
)
?
0
:
-
EFAULT
;
}
static
void
acpi_suspend_finish
(
void
)
{
acpi_pm_finish
();
}
static
int
acpi_suspend_state_valid
(
suspend_state_t
pm_state
)
{
u32
acpi_state
;
...
...
@@ -323,7 +324,7 @@ static struct platform_suspend_ops acpi_suspend_ops = {
.
begin
=
acpi_suspend_begin
,
.
prepare_late
=
acpi_pm_prepare
,
.
enter
=
acpi_suspend_enter
,
.
wake
=
acpi_
suspend
_finish
,
.
wake
=
acpi_
pm
_finish
,
.
end
=
acpi_pm_end
,
};
...
...
@@ -336,9 +337,9 @@ static struct platform_suspend_ops acpi_suspend_ops = {
static
int
acpi_suspend_begin_old
(
suspend_state_t
pm_state
)
{
int
error
=
acpi_suspend_begin
(
pm_state
);
if
(
!
error
)
error
=
__acpi_pm_prepare
();
return
error
;
}
...
...
@@ -349,9 +350,9 @@ static int acpi_suspend_begin_old(suspend_state_t pm_state)
static
struct
platform_suspend_ops
acpi_suspend_ops_old
=
{
.
valid
=
acpi_suspend_state_valid
,
.
begin
=
acpi_suspend_begin_old
,
.
prepare_late
=
acpi_pm_
freeze
,
.
prepare_late
=
acpi_pm_
pre_suspend
,
.
enter
=
acpi_suspend_enter
,
.
wake
=
acpi_
suspend
_finish
,
.
wake
=
acpi_
pm
_finish
,
.
end
=
acpi_pm_end
,
.
recover
=
acpi_pm_finish
,
};
...
...
@@ -423,16 +424,6 @@ static int acpi_hibernation_begin(void)
return
error
;
}
static
int
acpi_hibernation_pre_snapshot
(
void
)
{
int
error
=
acpi_pm_prepare
();
if
(
!
error
)
suspend_nvs_save
();
return
error
;
}
static
int
acpi_hibernation_enter
(
void
)
{
acpi_status
status
=
AE_OK
;
...
...
@@ -441,7 +432,6 @@ static int acpi_hibernation_enter(void)
ACPI_FLUSH_CPU_CACHE
();
local_irq_save
(
flags
);
acpi_enable_wakeup_device
(
ACPI_STATE_S4
);
/* This shouldn't return. If it returns, we have a problem */
status
=
acpi_enter_sleep_state
(
ACPI_STATE_S4
);
/* Reprogram control registers and execute _BFS */
...
...
@@ -481,7 +471,7 @@ static void acpi_pm_thaw(void)
static
struct
platform_hibernation_ops
acpi_hibernation_ops
=
{
.
begin
=
acpi_hibernation_begin
,
.
end
=
acpi_pm_end
,
.
pre_snapshot
=
acpi_
hibernation_pre_snapshot
,
.
pre_snapshot
=
acpi_
pm_prepare
,
.
finish
=
acpi_pm_finish
,
.
prepare
=
acpi_pm_prepare
,
.
enter
=
acpi_hibernation_enter
,
...
...
@@ -517,13 +507,6 @@ static int acpi_hibernation_begin_old(void)
return
error
;
}
static
int
acpi_hibernation_pre_snapshot_old
(
void
)
{
acpi_pm_freeze
();
suspend_nvs_save
();
return
0
;
}
/*
* The following callbacks are used if the pre-ACPI 2.0 suspend ordering has
* been requested.
...
...
@@ -531,7 +514,7 @@ static int acpi_hibernation_pre_snapshot_old(void)
static
struct
platform_hibernation_ops
acpi_hibernation_ops_old
=
{
.
begin
=
acpi_hibernation_begin_old
,
.
end
=
acpi_pm_end
,
.
pre_snapshot
=
acpi_
hibernation_pre_snapshot_ol
d
,
.
pre_snapshot
=
acpi_
pm_pre_suspen
d
,
.
prepare
=
acpi_pm_freeze
,
.
finish
=
acpi_pm_finish
,
.
enter
=
acpi_hibernation_enter
,
...
...
@@ -695,7 +678,6 @@ static void acpi_power_off(void)
/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
printk
(
KERN_DEBUG
"%s called
\n
"
,
__func__
);
local_irq_disable
();
acpi_enable_wakeup_device
(
ACPI_STATE_S5
);
acpi_enter_sleep_state
(
ACPI_STATE_S5
);
}
...
...
drivers/acpi/sleep.h
View file @
f2a66185
...
...
@@ -2,9 +2,8 @@
extern
u8
sleep_states
[];
extern
int
acpi_suspend
(
u32
state
);
extern
void
acpi_enable_wakeup_device_prep
(
u8
sleep_state
);
extern
void
acpi_enable_wakeup_device
(
u8
sleep_state
);
extern
void
acpi_disable_wakeup_device
(
u8
sleep_state
);
extern
void
acpi_enable_wakeup_devices
(
u8
sleep_state
);
extern
void
acpi_disable_wakeup_devices
(
u8
sleep_state
);
extern
struct
list_head
acpi_wakeup_device_list
;
extern
struct
mutex
acpi_device_lock
;
drivers/acpi/wakeup.c
View file @
f2a66185
...
...
@@ -21,45 +21,17 @@
ACPI_MODULE_NAME
(
"wakeup_devices"
)
/**
* acpi_enable_wakeup_device
_prep - Prepare wake-up device
s.
* acpi_enable_wakeup_device
s - Enable wake-up device GPE
s.
* @sleep_state: ACPI system sleep state.
*
* Enable all wake-up devices' power, unless the requested system sleep state is
* too deep.
* Enable wakeup device power of devices with the state.enable flag set and set
* the wakeup enable mask bits in the GPE registers that correspond to wakeup
* devices.
*/
void
acpi_enable_wakeup_device
_prep
(
u8
sleep_state
)
void
acpi_enable_wakeup_device
s
(
u8
sleep_state
)
{
struct
list_head
*
node
,
*
next
;
list_for_each_safe
(
node
,
next
,
&
acpi_wakeup_device_list
)
{
struct
acpi_device
*
dev
=
container_of
(
node
,
struct
acpi_device
,
wakeup_list
);
if
(
!
dev
->
wakeup
.
flags
.
valid
||
!
dev
->
wakeup
.
state
.
enabled
||
(
sleep_state
>
(
u32
)
dev
->
wakeup
.
sleep_state
))
continue
;
acpi_enable_wakeup_device_power
(
dev
,
sleep_state
);
}
}
/**
* acpi_enable_wakeup_device - Enable wake-up device GPEs.
* @sleep_state: ACPI system sleep state.
*
* Enable all wake-up devices' GPEs, with the assumption that
* acpi_disable_all_gpes() was executed before, so we don't need to disable any
* GPEs here.
*/
void
acpi_enable_wakeup_device
(
u8
sleep_state
)
{
struct
list_head
*
node
,
*
next
;
/*
* Caution: this routine must be invoked when interrupt is disabled
* Refer ACPI2.0: P212
*/
list_for_each_safe
(
node
,
next
,
&
acpi_wakeup_device_list
)
{
struct
acpi_device
*
dev
=
container_of
(
node
,
struct
acpi_device
,
wakeup_list
);
...
...
@@ -68,6 +40,9 @@ void acpi_enable_wakeup_device(u8 sleep_state)
||
sleep_state
>
(
u32
)
dev
->
wakeup
.
sleep_state
)
continue
;
if
(
dev
->
wakeup
.
state
.
enabled
)
acpi_enable_wakeup_device_power
(
dev
,
sleep_state
);
/* The wake-up power should have been enabled already. */
acpi_enable_gpe
(
dev
->
wakeup
.
gpe_device
,
dev
->
wakeup
.
gpe_number
,
ACPI_GPE_TYPE_WAKE
);
...
...
@@ -75,13 +50,10 @@ void acpi_enable_wakeup_device(u8 sleep_state)
}
/**
* acpi_disable_wakeup_device - Disable devices' wakeup capability.
* acpi_disable_wakeup_device
s
- Disable devices' wakeup capability.
* @sleep_state: ACPI system sleep state.
*
* This function only affects devices with wakeup.state.enabled set, which means
* that it reverses the changes made by acpi_enable_wakeup_device_prep().
*/
void
acpi_disable_wakeup_device
(
u8
sleep_state
)
void
acpi_disable_wakeup_device
s
(
u8
sleep_state
)
{
struct
list_head
*
node
,
*
next
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment