@ -12,12 +12,14 @@
# include "internal.h"
# include "sleep.h"
/*
* We didn ' t lock acpi_device_lock in the file , because it invokes oops in
* suspend / resume and isn ' t really required as this is called in S - state . At
* that time , there is no device hotplug
* */
# define _COMPONENT ACPI_SYSTEM_COMPONENT
ACPI_MODULE_NAME ( " wakeup_devices " )
extern struct list_head acpi_wakeup_device_list ;
extern spinlock_t acpi_device_lock ;
/**
* acpi_enable_wakeup_device_prep - prepare wakeup devices
* @ sleep_state : ACPI state
@ -29,7 +31,6 @@ void acpi_enable_wakeup_device_prep(u8 sleep_state)
{
struct list_head * node , * next ;
spin_lock ( & acpi_device_lock ) ;
list_for_each_safe ( node , next , & acpi_wakeup_device_list ) {
struct acpi_device * dev = container_of ( node ,
struct acpi_device ,
@ -40,11 +41,8 @@ void acpi_enable_wakeup_device_prep(u8 sleep_state)
( sleep_state > ( u32 ) dev - > wakeup . sleep_state ) )
continue ;
spin_unlock ( & acpi_device_lock ) ;
acpi_enable_wakeup_device_power ( dev , sleep_state ) ;
spin_lock ( & acpi_device_lock ) ;
}
spin_unlock ( & acpi_device_lock ) ;
}
/**
@ -60,7 +58,6 @@ void acpi_enable_wakeup_device(u8 sleep_state)
* Caution : this routine must be invoked when interrupt is disabled
* Refer ACPI2 .0 : P212
*/
spin_lock ( & acpi_device_lock ) ;
list_for_each_safe ( node , next , & acpi_wakeup_device_list ) {
struct acpi_device * dev =
container_of ( node , struct acpi_device , wakeup_list ) ;
@ -74,22 +71,17 @@ void acpi_enable_wakeup_device(u8 sleep_state)
if ( ( ! dev - > wakeup . state . enabled & & ! dev - > wakeup . flags . prepared )
| | sleep_state > ( u32 ) dev - > wakeup . sleep_state ) {
if ( dev - > wakeup . flags . run_wake ) {
spin_unlock ( & acpi_device_lock ) ;
/* set_gpe_type will disable GPE, leave it like that */
acpi_set_gpe_type ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number ,
ACPI_GPE_TYPE_RUNTIME ) ;
spin_lock ( & acpi_device_lock ) ;
}
continue ;
}
spin_unlock ( & acpi_device_lock ) ;
if ( ! dev - > wakeup . flags . run_wake )
acpi_enable_gpe ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number ) ;
spin_lock ( & acpi_device_lock ) ;
}
spin_unlock ( & acpi_device_lock ) ;
}
/**
@ -101,7 +93,6 @@ void acpi_disable_wakeup_device(u8 sleep_state)
{
struct list_head * node , * next ;
spin_lock ( & acpi_device_lock ) ;
list_for_each_safe ( node , next , & acpi_wakeup_device_list ) {
struct acpi_device * dev =
container_of ( node , struct acpi_device , wakeup_list ) ;
@ -112,19 +103,16 @@ void acpi_disable_wakeup_device(u8 sleep_state)
if ( ( ! dev - > wakeup . state . enabled & & ! dev - > wakeup . flags . prepared )
| | sleep_state > ( u32 ) dev - > wakeup . sleep_state ) {
if ( dev - > wakeup . flags . run_wake ) {
spin_unlock ( & acpi_device_lock ) ;
acpi_set_gpe_type ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number ,
ACPI_GPE_TYPE_WAKE_RUN ) ;
/* Re-enable it, since set_gpe_type will disable it */
acpi_enable_gpe ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number ) ;
spin_lock ( & acpi_device_lock ) ;
}
continue ;
}
spin_unlock ( & acpi_device_lock ) ;
acpi_disable_wakeup_device_power ( dev ) ;
/* Never disable run-wake GPE */
if ( ! dev - > wakeup . flags . run_wake ) {
@ -133,16 +121,14 @@ void acpi_disable_wakeup_device(u8 sleep_state)
acpi_clear_gpe ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number , ACPI_NOT_ISR ) ;
}
spin_lock ( & acpi_device_lock ) ;
}
spin_unlock ( & acpi_device_lock ) ;
}
int __init acpi_wakeup_device_init ( void )
{
struct list_head * node , * next ;
spin _lock( & acpi_device_lock ) ;
mutex _lock( & acpi_device_lock ) ;
list_for_each_safe ( node , next , & acpi_wakeup_device_list ) {
struct acpi_device * dev = container_of ( node ,
struct acpi_device ,
@ -150,15 +136,13 @@ int __init acpi_wakeup_device_init(void)
/* In case user doesn't load button driver */
if ( ! dev - > wakeup . flags . run_wake | | dev - > wakeup . state . enabled )
continue ;
spin_unlock ( & acpi_device_lock ) ;
acpi_set_gpe_type ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number ,
ACPI_GPE_TYPE_WAKE_RUN ) ;
acpi_enable_gpe ( dev - > wakeup . gpe_device ,
dev - > wakeup . gpe_number ) ;
dev - > wakeup . state . enabled = 1 ;
spin_lock ( & acpi_device_lock ) ;
}
spin _unlock( & acpi_device_lock ) ;
mutex _unlock( & acpi_device_lock ) ;
return 0 ;
}