2008-12-30 06:04:48 +03:00
/******************************************************************************
*
* Module Name : hwxface - Public ACPICA hardware interfaces
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2012-01-12 09:27:23 +04:00
* Copyright ( C ) 2000 - 2012 , Intel Corp .
2008-12-30 06:04:48 +03:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions , and the following disclaimer ,
* without modification .
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the " NO WARRANTY " disclaimer below
* ( " Disclaimer " ) and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution .
* 3. Neither the names of the above - listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* Alternatively , this software may be distributed under the terms of the
* GNU General Public License ( " GPL " ) version 2 as published by the Free
* Software Foundation .
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT ,
* STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES .
*/
2011-10-27 00:22:14 +04:00
# include <linux/export.h>
2008-12-30 06:04:48 +03:00
# include <acpi/acpi.h>
2009-01-09 08:30:03 +03:00
# include "accommon.h"
# include "acnamesp.h"
2008-12-30 06:04:48 +03:00
# define _COMPONENT ACPI_HARDWARE
ACPI_MODULE_NAME ( " hwxface " )
2008-12-30 06:11:57 +03:00
/******************************************************************************
*
* FUNCTION : acpi_reset
*
* PARAMETERS : None
*
* RETURN : Status
*
* DESCRIPTION : Set reset register in memory or IO space . Note : Does not
* support reset register in PCI config space , this must be
* handled separately .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status acpi_reset ( void )
{
struct acpi_generic_address * reset_reg ;
acpi_status status ;
ACPI_FUNCTION_TRACE ( acpi_reset ) ;
reset_reg = & acpi_gbl_FADT . reset_register ;
/* Check if the reset register is supported */
2012-04-20 22:19:35 +04:00
if ( ! ( acpi_gbl_FADT . flags & ACPI_FADT_RESET_REGISTER ) | |
! reset_reg - > address ) {
2008-12-30 06:11:57 +03:00
return_ACPI_STATUS ( AE_NOT_EXIST ) ;
}
2009-08-13 09:42:19 +04:00
if ( reset_reg - > space_id = = ACPI_ADR_SPACE_SYSTEM_IO ) {
/*
2011-03-12 00:12:18 +03:00
* For I / O space , write directly to the OSL . This
* bypasses the port validation mechanism , which may
* block a valid write to the reset register . Spec
* section 4.7 .3 .6 requires register width to be 8.
2009-08-13 09:42:19 +04:00
*/
status =
acpi_os_write_port ( ( acpi_io_address ) reset_reg - > address ,
2011-03-12 00:12:18 +03:00
acpi_gbl_FADT . reset_value , 8 ) ;
2009-08-13 09:42:19 +04:00
} else {
/* Write the reset value to the reset register */
status = acpi_hw_write ( acpi_gbl_FADT . reset_value , reset_reg ) ;
}
2008-12-30 06:11:57 +03:00
return_ACPI_STATUS ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_reset )
2008-12-30 06:04:48 +03:00
/******************************************************************************
*
* FUNCTION : acpi_read
*
* PARAMETERS : Value - Where the value is returned
* Reg - GAS register structure
*
* RETURN : Status
*
* DESCRIPTION : Read from either memory or IO space .
*
2009-06-24 05:44:06 +04:00
* LIMITATIONS : < These limitations also apply to acpi_write >
* bit_width must be exactly 8 , 16 , 32 , or 64.
* space_iD must be system_memory or system_iO .
* bit_offset and access_width are currently ignored , as there has
* not been a need to implement these .
*
2008-12-30 06:04:48 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-06-24 05:44:06 +04:00
acpi_status acpi_read ( u64 * return_value , struct acpi_generic_address * reg )
2008-12-30 06:04:48 +03:00
{
2009-06-24 05:44:06 +04:00
u32 value ;
2008-12-30 06:04:48 +03:00
u32 width ;
u64 address ;
acpi_status status ;
ACPI_FUNCTION_NAME ( acpi_read ) ;
2009-06-24 05:44:06 +04:00
if ( ! return_value ) {
2009-02-18 09:28:02 +03:00
return ( AE_BAD_PARAMETER ) ;
2008-12-30 06:04:48 +03:00
}
2009-06-24 05:44:06 +04:00
/* Validate contents of the GAS register. Allow 64-bit transfers */
2008-12-30 06:04:48 +03:00
2009-06-24 05:44:06 +04:00
status = acpi_hw_validate_register ( reg , 64 , & address ) ;
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
2008-12-30 06:04:48 +03:00
}
2009-06-24 05:44:06 +04:00
/* Initialize entire 64-bit return value to zero */
2008-12-30 06:04:48 +03:00
2009-06-24 05:44:06 +04:00
* return_value = 0 ;
value = 0 ;
2008-12-30 06:04:48 +03:00
/*
2009-02-18 11:01:04 +03:00
* Two address spaces supported : Memory or IO . PCI_Config is
* not supported here because the GAS structure is insufficient
2008-12-30 06:04:48 +03:00
*/
2009-06-24 05:44:06 +04:00
if ( reg - > space_id = = ACPI_ADR_SPACE_SYSTEM_MEMORY ) {
status = acpi_os_read_memory ( ( acpi_physical_address )
2012-02-14 14:29:55 +04:00
address , return_value ,
reg - > bit_width ) ;
2009-06-24 05:44:06 +04:00
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
2012-02-14 14:29:55 +04:00
} else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
2009-06-24 05:44:06 +04:00
2012-02-14 14:29:55 +04:00
width = reg - > bit_width ;
if ( width = = 64 ) {
width = 32 ; /* Break into two 32-bit transfers */
2009-06-24 05:44:06 +04:00
}
status = acpi_hw_read_port ( ( acpi_io_address )
address , & value , width ) ;
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
* return_value = value ;
if ( reg - > bit_width = = 64 ) {
/* Read the top 32 bits */
status = acpi_hw_read_port ( ( acpi_io_address )
( address + 4 ) , & value , 32 ) ;
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
* return_value | = ( ( u64 ) value < < 32 ) ;
}
2008-12-30 06:04:48 +03:00
}
ACPI_DEBUG_PRINT ( ( ACPI_DB_IO ,
2009-06-24 05:44:06 +04:00
" Read: %8.8X%8.8X width %2d from %8.8X%8.8X (%s) \n " ,
ACPI_FORMAT_UINT64 ( * return_value ) , reg - > bit_width ,
ACPI_FORMAT_UINT64 ( address ) ,
2008-12-30 06:04:48 +03:00
acpi_ut_get_region_name ( reg - > space_id ) ) ) ;
return ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_read )
/******************************************************************************
*
* FUNCTION : acpi_write
*
2009-06-24 05:44:06 +04:00
* PARAMETERS : Value - Value to be written
2008-12-30 06:04:48 +03:00
* Reg - GAS register structure
*
* RETURN : Status
*
* DESCRIPTION : Write to either memory or IO space .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-06-24 05:44:06 +04:00
acpi_status acpi_write ( u64 value , struct acpi_generic_address * reg )
2008-12-30 06:04:48 +03:00
{
u32 width ;
u64 address ;
acpi_status status ;
ACPI_FUNCTION_NAME ( acpi_write ) ;
2009-06-24 05:44:06 +04:00
/* Validate contents of the GAS register. Allow 64-bit transfers */
2008-12-30 06:04:48 +03:00
2009-06-24 05:44:06 +04:00
status = acpi_hw_validate_register ( reg , 64 , & address ) ;
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
2008-12-30 06:04:48 +03:00
}
/*
2009-06-24 05:44:06 +04:00
* Two address spaces supported : Memory or IO . PCI_Config is
* not supported here because the GAS structure is insufficient
2008-12-30 06:04:48 +03:00
*/
2009-06-24 05:44:06 +04:00
if ( reg - > space_id = = ACPI_ADR_SPACE_SYSTEM_MEMORY ) {
status = acpi_os_write_memory ( ( acpi_physical_address )
2012-02-14 14:29:55 +04:00
address , value , reg - > bit_width ) ;
2009-06-24 05:44:06 +04:00
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
2012-02-14 14:29:55 +04:00
} else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
2009-06-24 05:44:06 +04:00
2012-02-14 14:29:55 +04:00
width = reg - > bit_width ;
if ( width = = 64 ) {
width = 32 ; /* Break into two 32-bit transfers */
2009-06-24 05:44:06 +04:00
}
status = acpi_hw_write_port ( ( acpi_io_address )
address , ACPI_LODWORD ( value ) ,
2008-12-30 06:04:48 +03:00
width ) ;
2009-06-24 05:44:06 +04:00
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
if ( reg - > bit_width = = 64 ) {
status = acpi_hw_write_port ( ( acpi_io_address )
( address + 4 ) ,
ACPI_HIDWORD ( value ) , 32 ) ;
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
}
2008-12-30 06:04:48 +03:00
}
ACPI_DEBUG_PRINT ( ( ACPI_DB_IO ,
2009-06-24 05:44:06 +04:00
" Wrote: %8.8X%8.8X width %2d to %8.8X%8.8X (%s) \n " ,
ACPI_FORMAT_UINT64 ( value ) , reg - > bit_width ,
ACPI_FORMAT_UINT64 ( address ) ,
2008-12-30 06:04:48 +03:00
acpi_ut_get_region_name ( reg - > space_id ) ) ) ;
return ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_write )
2012-02-14 14:14:27 +04:00
# if (!ACPI_REDUCED_HARDWARE)
2008-12-30 06:04:48 +03:00
/*******************************************************************************
*
2009-02-23 10:02:07 +03:00
* FUNCTION : acpi_read_bit_register
2008-12-30 06:04:48 +03:00
*
2009-02-18 10:10:07 +03:00
* PARAMETERS : register_id - ID of ACPI Bit Register to access
* return_value - Value that was read from the register ,
* normalized to bit position zero .
2008-12-30 06:04:48 +03:00
*
2009-02-18 10:10:07 +03:00
* RETURN : Status and the value read from the specified Register . Value
2008-12-30 06:04:48 +03:00
* returned is normalized to bit0 ( is shifted all the way right )
*
* DESCRIPTION : ACPI bit_register read function . Does not acquire the HW lock .
*
2009-02-18 10:10:07 +03:00
* SUPPORTS : Bit fields in PM1 Status , PM1 Enable , PM1 Control , and
* PM2 Control .
*
* Note : The hardware lock is not required when reading the ACPI bit registers
* since almost all of them are single bit and it does not matter that
* the parent hardware register can be split across two physical
* registers . The only multi - bit field is SLP_TYP in the PM1 control
* register , but this field does not cross an 8 - bit boundary ( nor does
* it make much sense to actually read this field . )
*
2008-12-30 06:04:48 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-23 10:02:07 +03:00
acpi_status acpi_read_bit_register ( u32 register_id , u32 * return_value )
2008-12-30 06:04:48 +03:00
{
struct acpi_bit_register_info * bit_reg_info ;
2009-02-18 11:01:04 +03:00
u32 register_value ;
u32 value ;
2008-12-30 06:04:48 +03:00
acpi_status status ;
2009-02-18 11:01:04 +03:00
ACPI_FUNCTION_TRACE_U32 ( acpi_read_bit_register , register_id ) ;
2008-12-30 06:04:48 +03:00
/* Get the info structure corresponding to the requested ACPI Register */
bit_reg_info = acpi_hw_get_bit_register_info ( register_id ) ;
if ( ! bit_reg_info ) {
return_ACPI_STATUS ( AE_BAD_PARAMETER ) ;
}
2009-02-18 10:10:07 +03:00
/* Read the entire parent register */
2008-12-30 06:04:48 +03:00
status = acpi_hw_register_read ( bit_reg_info - > parent_register ,
& register_value ) ;
2009-02-18 11:01:04 +03:00
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
}
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
/* Normalize the value that was read, mask off other bits */
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
value = ( ( register_value & bit_reg_info - > access_bit_mask )
> > bit_reg_info - > bit_position ) ;
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_IO ,
" BitReg %X, ParentReg %X, Actual %8.8X, ReturnValue %8.8X \n " ,
register_id , bit_reg_info - > parent_register ,
register_value , value ) ) ;
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
* return_value = value ;
return_ACPI_STATUS ( AE_OK ) ;
2008-12-30 06:04:48 +03:00
}
2009-02-23 10:02:07 +03:00
ACPI_EXPORT_SYMBOL ( acpi_read_bit_register )
2008-12-30 06:04:48 +03:00
/*******************************************************************************
*
2009-02-23 10:02:07 +03:00
* FUNCTION : acpi_write_bit_register
2008-12-30 06:04:48 +03:00
*
2009-02-18 10:10:07 +03:00
* PARAMETERS : register_id - ID of ACPI Bit Register to access
* Value - Value to write to the register , in bit
2011-11-29 08:31:00 +04:00
* position zero . The bit is automatically
2009-02-18 10:10:07 +03:00
* shifted to the correct position .
2008-12-30 06:04:48 +03:00
*
* RETURN : Status
*
2009-02-18 10:10:07 +03:00
* DESCRIPTION : ACPI Bit Register write function . Acquires the hardware lock
* since most operations require a read / modify / write sequence .
*
* SUPPORTS : Bit fields in PM1 Status , PM1 Enable , PM1 Control , and
* PM2 Control .
2008-12-30 06:04:48 +03:00
*
2009-02-18 11:01:04 +03:00
* Note that at this level , the fact that there may be actually two
* hardware registers ( A and B - and B may not exist ) is abstracted .
*
2008-12-30 06:04:48 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-23 10:02:07 +03:00
acpi_status acpi_write_bit_register ( u32 register_id , u32 value )
2008-12-30 06:04:48 +03:00
{
struct acpi_bit_register_info * bit_reg_info ;
acpi_cpu_flags lock_flags ;
2009-02-18 11:01:04 +03:00
u32 register_value ;
acpi_status status = AE_OK ;
2008-12-30 06:04:48 +03:00
2009-02-23 10:02:07 +03:00
ACPI_FUNCTION_TRACE_U32 ( acpi_write_bit_register , register_id ) ;
2008-12-30 06:04:48 +03:00
/* Get the info structure corresponding to the requested ACPI Register */
bit_reg_info = acpi_hw_get_bit_register_info ( register_id ) ;
if ( ! bit_reg_info ) {
return_ACPI_STATUS ( AE_BAD_PARAMETER ) ;
}
lock_flags = acpi_os_acquire_lock ( acpi_gbl_hardware_lock ) ;
/*
2009-02-18 11:01:04 +03:00
* At this point , we know that the parent register is one of the
* following : PM1 Status , PM1 Enable , PM1 Control , or PM2 Control
2008-12-30 06:04:48 +03:00
*/
2009-02-18 11:01:04 +03:00
if ( bit_reg_info - > parent_register ! = ACPI_REGISTER_PM1_STATUS ) {
2008-12-30 06:04:48 +03:00
/*
2009-02-18 11:01:04 +03:00
* 1 ) Case for PM1 Enable , PM1 Control , and PM2 Control
*
* Perform a register read to preserve the bits that we are not
* interested in
2008-12-30 06:04:48 +03:00
*/
2009-02-18 11:01:04 +03:00
status = acpi_hw_register_read ( bit_reg_info - > parent_register ,
2008-12-30 06:04:48 +03:00
& register_value ) ;
if ( ACPI_FAILURE ( status ) ) {
goto unlock_and_exit ;
}
2009-02-18 11:01:04 +03:00
/*
* Insert the input bit into the value that was just read
* and write the register
*/
2008-12-30 06:04:48 +03:00
ACPI_REGISTER_INSERT_VALUE ( register_value ,
bit_reg_info - > bit_position ,
bit_reg_info - > access_bit_mask ,
value ) ;
2009-02-18 11:01:04 +03:00
status = acpi_hw_register_write ( bit_reg_info - > parent_register ,
register_value ) ;
} else {
/*
* 2 ) Case for PM1 Status
*
* The Status register is different from the rest . Clear an event
* by writing 1 , writing 0 has no effect . So , the only relevant
* information is the single bit we ' re interested in , all others
* should be written as 0 so they will be left unchanged .
*/
register_value = ACPI_REGISTER_PREPARE_BITS ( value ,
bit_reg_info - >
bit_position ,
bit_reg_info - >
access_bit_mask ) ;
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
/* No need to write the register if value is all zeros */
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
if ( register_value ) {
status =
acpi_hw_register_write ( ACPI_REGISTER_PM1_STATUS ,
register_value ) ;
}
2008-12-30 06:04:48 +03:00
}
2009-02-18 11:01:04 +03:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_IO ,
" BitReg %X, ParentReg %X, Value %8.8X, Actual %8.8X \n " ,
register_id , bit_reg_info - > parent_register , value ,
register_value ) ) ;
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
unlock_and_exit :
2008-12-30 06:04:48 +03:00
2009-02-18 11:01:04 +03:00
acpi_os_release_lock ( acpi_gbl_hardware_lock , lock_flags ) ;
2008-12-30 06:04:48 +03:00
return_ACPI_STATUS ( status ) ;
}
2009-02-23 10:02:07 +03:00
ACPI_EXPORT_SYMBOL ( acpi_write_bit_register )
2012-02-14 14:14:27 +04:00
# endif /* !ACPI_REDUCED_HARDWARE */
2008-12-30 06:04:48 +03:00
/*******************************************************************************
*
* FUNCTION : acpi_get_sleep_type_data
*
* PARAMETERS : sleep_state - Numeric sleep state
* * sleep_type_a - Where SLP_TYPa is returned
* * sleep_type_b - Where SLP_TYPb is returned
*
* RETURN : Status - ACPI status
*
* DESCRIPTION : Obtain the SLP_TYPa and SLP_TYPb values for the requested sleep
* state .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
acpi_get_sleep_type_data ( u8 sleep_state , u8 * sleep_type_a , u8 * sleep_type_b )
{
acpi_status status = AE_OK ;
struct acpi_evaluate_info * info ;
ACPI_FUNCTION_TRACE ( acpi_get_sleep_type_data ) ;
/* Validate parameters */
if ( ( sleep_state > ACPI_S_STATES_MAX ) | | ! sleep_type_a | | ! sleep_type_b ) {
return_ACPI_STATUS ( AE_BAD_PARAMETER ) ;
}
/* Allocate the evaluation information block */
info = ACPI_ALLOCATE_ZEROED ( sizeof ( struct acpi_evaluate_info ) ) ;
if ( ! info ) {
return_ACPI_STATUS ( AE_NO_MEMORY ) ;
}
info - > pathname =
ACPI_CAST_PTR ( char , acpi_gbl_sleep_state_names [ sleep_state ] ) ;
/* Evaluate the namespace object containing the values for this state */
status = acpi_ns_evaluate ( info ) ;
if ( ACPI_FAILURE ( status ) ) {
ACPI_DEBUG_PRINT ( ( ACPI_DB_EXEC ,
" %s while evaluating SleepState [%s] \n " ,
acpi_format_exception ( status ) ,
info - > pathname ) ) ;
goto cleanup ;
}
/* Must have a return object */
if ( ! info - > return_object ) {
ACPI_ERROR ( ( AE_INFO , " No Sleep State object returned from [%s] " ,
info - > pathname ) ) ;
status = AE_NOT_EXIST ;
}
/* It must be of type Package */
2009-02-18 09:44:03 +03:00
else if ( info - > return_object - > common . type ! = ACPI_TYPE_PACKAGE ) {
2008-12-30 06:04:48 +03:00
ACPI_ERROR ( ( AE_INFO ,
" Sleep State return object is not a Package " ) ) ;
status = AE_AML_OPERAND_TYPE ;
}
/*
* The package must have at least two elements . NOTE ( March 2005 ) : This
* goes against the current ACPI spec which defines this object as a
* package with one encoded DWORD element . However , existing practice
* by BIOS vendors seems to be to have 2 or more elements , at least
* one per sleep type ( A / B ) .
*/
else if ( info - > return_object - > package . count < 2 ) {
ACPI_ERROR ( ( AE_INFO ,
" Sleep State return package does not have at least two elements " ) ) ;
status = AE_AML_NO_OPERAND ;
}
/* The first two elements must both be of type Integer */
2009-02-18 09:44:03 +03:00
else if ( ( ( info - > return_object - > package . elements [ 0 ] ) - > common . type
2008-12-30 06:04:48 +03:00
! = ACPI_TYPE_INTEGER ) | |
2009-02-18 09:44:03 +03:00
( ( info - > return_object - > package . elements [ 1 ] ) - > common . type
2008-12-30 06:04:48 +03:00
! = ACPI_TYPE_INTEGER ) ) {
ACPI_ERROR ( ( AE_INFO ,
2009-03-06 05:05:18 +03:00
" Sleep State return package elements are not both Integers "
" (%s, %s) " ,
2008-12-30 06:04:48 +03:00
acpi_ut_get_object_type_name ( info - > return_object - >
package . elements [ 0 ] ) ,
acpi_ut_get_object_type_name ( info - > return_object - >
package . elements [ 1 ] ) ) ) ;
status = AE_AML_OPERAND_TYPE ;
} else {
/* Valid _Sx_ package size, type, and value */
* sleep_type_a = ( u8 )
( info - > return_object - > package . elements [ 0 ] ) - > integer . value ;
* sleep_type_b = ( u8 )
( info - > return_object - > package . elements [ 1 ] ) - > integer . value ;
}
if ( ACPI_FAILURE ( status ) ) {
ACPI_EXCEPTION ( ( AE_INFO , status ,
" While evaluating SleepState [%s], bad Sleep object %p type %s " ,
info - > pathname , info - > return_object ,
acpi_ut_get_object_type_name ( info - >
return_object ) ) ) ;
}
acpi_ut_remove_reference ( info - > return_object ) ;
cleanup :
ACPI_FREE ( info ) ;
return_ACPI_STATUS ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_get_sleep_type_data )