2005-04-17 02:20:36 +04:00
/*******************************************************************************
*
* Module Name : nsxfobj - Public interfaces to the ACPI subsystem
* ACPI Object oriented interfaces
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2008-04-24 07:00:13 +04:00
* Copyright ( C ) 2000 - 2008 , Intel Corp .
2005-04-17 02:20:36 +04: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 .
*/
# include <acpi/acpi.h>
2009-01-09 08:30:03 +03:00
# include "accommon.h"
# include "acnamesp.h"
2005-04-17 02:20:36 +04:00
# define _COMPONENT ACPI_NAMESPACE
2005-08-05 08:44:28 +04:00
ACPI_MODULE_NAME ( " nsxfobj " )
2005-04-17 02:20:36 +04:00
2006-12-19 23:56:19 +03:00
/*******************************************************************************
*
* FUNCTION : acpi_get_id
*
* PARAMETERS : Handle - Handle of object whose id is desired
* ret_id - Where the id will be placed
*
* RETURN : Status
*
* DESCRIPTION : This routine returns the owner id associated with a handle
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status acpi_get_id ( acpi_handle handle , acpi_owner_id * ret_id )
{
struct acpi_namespace_node * node ;
acpi_status status ;
/* Parameter Validation */
if ( ! ret_id ) {
return ( AE_BAD_PARAMETER ) ;
}
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
return ( status ) ;
}
/* Convert and validate the handle */
node = acpi_ns_map_handle_to_node ( handle ) ;
if ( ! node ) {
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
return ( AE_BAD_PARAMETER ) ;
}
* ret_id = node - > owner_id ;
status = acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
return ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_get_id )
2005-04-17 02:20:36 +04:00
/*******************************************************************************
*
* FUNCTION : acpi_get_type
*
* PARAMETERS : Handle - Handle of object whose type is desired
2005-04-19 06:49:35 +04:00
* ret_type - Where the type will be placed
2005-04-17 02:20:36 +04:00
*
* RETURN : Status
*
* DESCRIPTION : This routine returns the type associatd with a particular handle
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 08:44:28 +04:00
acpi_status acpi_get_type ( acpi_handle handle , acpi_object_type * ret_type )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
struct acpi_namespace_node * node ;
acpi_status status ;
2005-04-17 02:20:36 +04:00
/* Parameter Validation */
if ( ! ret_type ) {
return ( AE_BAD_PARAMETER ) ;
}
/*
* Special case for the predefined Root Node
* ( return type ANY )
*/
if ( handle = = ACPI_ROOT_OBJECT ) {
* ret_type = ACPI_TYPE_ANY ;
return ( AE_OK ) ;
}
2005-08-05 08:44:28 +04:00
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 02:20:36 +04:00
return ( status ) ;
}
/* Convert and validate the handle */
2005-08-05 08:44:28 +04:00
node = acpi_ns_map_handle_to_node ( handle ) ;
2005-04-17 02:20:36 +04:00
if ( ! node ) {
2005-08-05 08:44:28 +04:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-17 02:20:36 +04:00
return ( AE_BAD_PARAMETER ) ;
}
* ret_type = node - > type ;
2005-08-05 08:44:28 +04:00
status = acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-17 02:20:36 +04:00
return ( status ) ;
}
2006-10-03 08:00:00 +04:00
ACPI_EXPORT_SYMBOL ( acpi_get_type )
2005-04-17 02:20:36 +04:00
/*******************************************************************************
*
* FUNCTION : acpi_get_parent
*
* PARAMETERS : Handle - Handle of object whose parent is desired
* ret_handle - Where the parent handle will be placed
*
* RETURN : Status
*
* DESCRIPTION : Returns a handle to the parent of the object represented by
* Handle .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 08:44:28 +04:00
acpi_status acpi_get_parent ( acpi_handle handle , acpi_handle * ret_handle )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
struct acpi_namespace_node * node ;
acpi_status status ;
2005-04-17 02:20:36 +04:00
if ( ! ret_handle ) {
return ( AE_BAD_PARAMETER ) ;
}
/* Special case for the predefined Root Node (no parent) */
if ( handle = = ACPI_ROOT_OBJECT ) {
return ( AE_NULL_ENTRY ) ;
}
2005-08-05 08:44:28 +04:00
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 02:20:36 +04:00
return ( status ) ;
}
/* Convert and validate the handle */
2005-08-05 08:44:28 +04:00
node = acpi_ns_map_handle_to_node ( handle ) ;
2005-04-17 02:20:36 +04:00
if ( ! node ) {
status = AE_BAD_PARAMETER ;
goto unlock_and_exit ;
}
/* Get the parent entry */
* ret_handle =
2005-08-05 08:44:28 +04:00
acpi_ns_convert_entry_to_handle ( acpi_ns_get_parent_node ( node ) ) ;
2005-04-17 02:20:36 +04:00
/* Return exception if parent is null */
2005-08-05 08:44:28 +04:00
if ( ! acpi_ns_get_parent_node ( node ) ) {
2005-04-17 02:20:36 +04:00
status = AE_NULL_ENTRY ;
}
2005-08-05 08:44:28 +04:00
unlock_and_exit :
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-17 02:20:36 +04:00
return ( status ) ;
}
2006-10-03 08:00:00 +04:00
ACPI_EXPORT_SYMBOL ( acpi_get_parent )
2005-04-17 02:20:36 +04:00
/*******************************************************************************
*
* FUNCTION : acpi_get_next_object
*
* PARAMETERS : Type - Type of object to be searched for
* Parent - Parent object whose children we are getting
* last_child - Previous child that was found .
* The NEXT child will be returned
* ret_handle - Where handle to the next object is placed
*
* RETURN : Status
*
* DESCRIPTION : Return the next peer object within the namespace . If Handle is
* valid , Scope is ignored . Otherwise , the first object within
* Scope is returned .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 08:44:28 +04:00
acpi_get_next_object ( acpi_object_type type ,
acpi_handle parent ,
acpi_handle child , acpi_handle * ret_handle )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
acpi_status status ;
struct acpi_namespace_node * node ;
struct acpi_namespace_node * parent_node = NULL ;
struct acpi_namespace_node * child_node = NULL ;
2005-04-17 02:20:36 +04:00
/* Parameter validation */
if ( type > ACPI_TYPE_EXTERNAL_MAX ) {
return ( AE_BAD_PARAMETER ) ;
}
2005-08-05 08:44:28 +04:00
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 02:20:36 +04:00
return ( status ) ;
}
/* If null handle, use the parent */
if ( ! child ) {
2006-10-02 08:00:00 +04:00
2005-04-17 02:20:36 +04:00
/* Start search at the beginning of the specified scope */
2005-08-05 08:44:28 +04:00
parent_node = acpi_ns_map_handle_to_node ( parent ) ;
2005-04-17 02:20:36 +04:00
if ( ! parent_node ) {
status = AE_BAD_PARAMETER ;
goto unlock_and_exit ;
}
2005-08-05 08:44:28 +04:00
} else {
2005-04-17 02:20:36 +04:00
/* Non-null handle, ignore the parent */
/* Convert and validate the handle */
2005-08-05 08:44:28 +04:00
child_node = acpi_ns_map_handle_to_node ( child ) ;
2005-04-17 02:20:36 +04:00
if ( ! child_node ) {
status = AE_BAD_PARAMETER ;
goto unlock_and_exit ;
}
}
/* Internal function does the real work */
2005-08-05 08:44:28 +04:00
node = acpi_ns_get_next_node ( type , parent_node , child_node ) ;
2005-04-17 02:20:36 +04:00
if ( ! node ) {
status = AE_NOT_FOUND ;
goto unlock_and_exit ;
}
if ( ret_handle ) {
2005-08-05 08:44:28 +04:00
* ret_handle = acpi_ns_convert_entry_to_handle ( node ) ;
2005-04-17 02:20:36 +04:00
}
2005-08-05 08:44:28 +04:00
unlock_and_exit :
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-17 02:20:36 +04:00
return ( status ) ;
}
2006-10-03 08:00:00 +04:00
ACPI_EXPORT_SYMBOL ( acpi_get_next_object )