@ -479,6 +479,9 @@ static void acpi_free_power_resources_lists(struct acpi_device *device)
{
int i ;
if ( device - > wakeup . flags . valid )
acpi_power_resources_list_free ( & device - > wakeup . resources ) ;
if ( ! device - > flags . power_manageable )
return ;
@ -902,6 +905,8 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
if ( ! wakeup )
return AE_BAD_PARAMETER ;
INIT_LIST_HEAD ( & wakeup - > resources ) ;
/* _PRW */
status = acpi_evaluate_object ( handle , " _PRW " , NULL , & buffer ) ;
if ( ACPI_FAILURE ( status ) ) {
@ -948,19 +953,17 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
}
wakeup - > sleep_state = element - > integer . value ;
if ( ( package - > package . count - 2 ) > ACPI_MAX_HANDLES ) {
status = AE_NO_MEMORY ;
goto out ;
}
wakeup - > resources . count = package - > package . count - 2 ;
for ( i = 0 ; i < wakeup - > resources . count ; i + + ) {
element = & ( package - > package . elements [ i + 2 ] ) ;
for ( i = 2 ; i < package - > package . count ; i + + ) {
acpi_handle rhandle ;
element = & ( package - > package . elements [ i ] ) ;
if ( element - > type ! = ACPI_TYPE_LOCAL_REFERENCE ) {
status = AE_BAD_DATA ;
goto out ;
}
wakeup - > resources . handles [ i ] = element - > reference . handle ;
rhandle = element - > reference . handle ;
acpi_add_power_resource ( rhandle ) ;
acpi_power_resources_list_add ( rhandle , & wakeup - > resources ) ;
}
acpi_setup_gpe_for_wake ( handle , wakeup - > gpe_device , wakeup - > gpe_number ) ;
@ -1018,6 +1021,7 @@ static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
status = acpi_bus_extract_wakeup_device_power_package ( device - > handle ,
& device - > wakeup ) ;
if ( ACPI_FAILURE ( status ) ) {
acpi_power_resources_list_free ( & device - > wakeup . resources ) ;
ACPI_EXCEPTION ( ( AE_INFO , status , " Extracting _PRW package " ) ) ;
return ;
}
@ -1491,9 +1495,11 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
acpi_handle temp ;
status = acpi_get_handle ( handle , " _PRW " , & temp ) ;
if ( ACPI_SUCCESS ( status ) )
if ( ACPI_SUCCESS ( status ) ) {
acpi_bus_extract_wakeup_device_power_package ( handle ,
& wakeup ) ;
acpi_power_resources_list_free ( & wakeup . resources ) ;
}
return AE_CTRL_DEPTH ;
}