Commit 8c725bf9 authored by Bob Moore's avatar Bob Moore Committed by Len Brown

ACPICA: Simplify and optimize NsGetNextNode function

Reduced parameter count and reduced code for this frequently
used function.
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 474caffd
...@@ -99,10 +99,19 @@ acpi_ns_walk_namespace(acpi_object_type type, ...@@ -99,10 +99,19 @@ acpi_ns_walk_namespace(acpi_object_type type,
acpi_walk_callback user_function, acpi_walk_callback user_function,
void *context, void **return_value); void *context, void **return_value);
struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct acpi_namespace_node struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
*parent, struct acpi_namespace_node *parent,
struct acpi_namespace_node
*child); *child);
struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
struct
acpi_namespace_node
*parent,
struct
acpi_namespace_node
*child);
/* /*
* nsparse - table parsing * nsparse - table parsing
*/ */
......
...@@ -334,9 +334,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node) ...@@ -334,9 +334,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
/* Get the next node in this scope (NULL if none) */ /* Get the next node in this scope (NULL if none) */
child_node = child_node = acpi_ns_get_next_node(parent_node, child_node);
acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
child_node);
if (child_node) { if (child_node) {
/* Found a child node - detach any attached object */ /* Found a child node - detach any attached object */
...@@ -345,8 +343,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node) ...@@ -345,8 +343,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
/* Check if this node has any children */ /* Check if this node has any children */
if (acpi_ns_get_next_node if (child_node->child) {
(ACPI_TYPE_ANY, child_node, NULL)) {
/* /*
* There is at least one child of this node, * There is at least one child of this node,
* visit the node * visit the node
...@@ -432,9 +429,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id) ...@@ -432,9 +429,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
* Get the next child of this parent node. When child_node is NULL, * Get the next child of this parent node. When child_node is NULL,
* the first child of the parent is returned * the first child of the parent is returned
*/ */
child_node = child_node = acpi_ns_get_next_node(parent_node, child_node);
acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
child_node);
if (deletion_node) { if (deletion_node) {
acpi_ns_delete_children(deletion_node); acpi_ns_delete_children(deletion_node);
...@@ -452,8 +447,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id) ...@@ -452,8 +447,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
/* Check if this node has any children */ /* Check if this node has any children */
if (acpi_ns_get_next_node if (child_node->child) {
(ACPI_TYPE_ANY, child_node, NULL)) {
/* /*
* There is at least one child of this node, * There is at least one child of this node,
* visit the node * visit the node
......
...@@ -52,8 +52,7 @@ ACPI_MODULE_NAME("nswalk") ...@@ -52,8 +52,7 @@ ACPI_MODULE_NAME("nswalk")
* *
* FUNCTION: acpi_ns_get_next_node * FUNCTION: acpi_ns_get_next_node
* *
* PARAMETERS: Type - Type of node to be searched for * PARAMETERS: parent_node - Parent node whose children we are
* parent_node - Parent node whose children we are
* getting * getting
* child_node - Previous child that was found. * child_node - Previous child that was found.
* The NEXT child will be returned * The NEXT child will be returned
...@@ -66,27 +65,68 @@ ACPI_MODULE_NAME("nswalk") ...@@ -66,27 +65,68 @@ ACPI_MODULE_NAME("nswalk")
* within Scope is returned. * within Scope is returned.
* *
******************************************************************************/ ******************************************************************************/
struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct acpi_namespace_node struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
*parent_node, struct acpi_namespace_node *parent_node,
struct acpi_namespace_node
*child_node) *child_node)
{ {
struct acpi_namespace_node *next_node = NULL;
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
if (!child_node) { if (!child_node) {
/* It's really the parent's _scope_ that we want */ /* It's really the parent's _scope_ that we want */
next_node = parent_node->child; return parent_node->child;
} }
else { /*
/* Start search at the NEXT node */ * Get the next node.
*
next_node = acpi_ns_get_next_valid_node(child_node); * If we are at the end of this peer list, return NULL
*/
if (child_node->flags & ANOBJ_END_OF_PEER_LIST) {
return NULL;
} }
/* Otherwise just return the next peer */
return child_node->peer;
}
/*******************************************************************************
*
* FUNCTION: acpi_ns_get_next_node_typed
*
* PARAMETERS: Type - Type of node to be searched for
* parent_node - Parent node whose children we are
* getting
* child_node - Previous child that was found.
* The NEXT child will be returned
*
* RETURN: struct acpi_namespace_node - Pointer to the NEXT child or NULL if
* none is found.
*
* DESCRIPTION: Return the next peer node within the namespace. If Handle
* is valid, Scope is ignored. Otherwise, the first node
* within Scope is returned.
*
******************************************************************************/
struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
struct
acpi_namespace_node
*parent_node,
struct
acpi_namespace_node
*child_node)
{
struct acpi_namespace_node *next_node = NULL;
ACPI_FUNCTION_ENTRY();
next_node = acpi_ns_get_next_node(parent_node, child_node);
/* If any type is OK, we are done */ /* If any type is OK, we are done */
if (type == ACPI_TYPE_ANY) { if (type == ACPI_TYPE_ANY) {
...@@ -186,9 +226,7 @@ acpi_ns_walk_namespace(acpi_object_type type, ...@@ -186,9 +226,7 @@ acpi_ns_walk_namespace(acpi_object_type type,
/* Get the next node in this scope. Null if not found */ /* Get the next node in this scope. Null if not found */
status = AE_OK; status = AE_OK;
child_node = child_node = acpi_ns_get_next_node(parent_node, child_node);
acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
child_node);
if (child_node) { if (child_node) {
/* Found next child, get the type if we are not searching for ANY */ /* Found next child, get the type if we are not searching for ANY */
...@@ -269,8 +307,7 @@ acpi_ns_walk_namespace(acpi_object_type type, ...@@ -269,8 +307,7 @@ acpi_ns_walk_namespace(acpi_object_type type,
* function has specified that the maximum depth has been reached. * function has specified that the maximum depth has been reached.
*/ */
if ((level < max_depth) && (status != AE_CTRL_DEPTH)) { if ((level < max_depth) && (status != AE_CTRL_DEPTH)) {
if (acpi_ns_get_next_node if (child_node->child) {
(ACPI_TYPE_ANY, child_node, NULL)) {
/* There is at least one child of this node, visit it */ /* There is at least one child of this node, visit it */
......
...@@ -268,7 +268,7 @@ acpi_get_next_object(acpi_object_type type, ...@@ -268,7 +268,7 @@ acpi_get_next_object(acpi_object_type type,
/* Internal function does the real work */ /* Internal function does the real work */
node = acpi_ns_get_next_node(type, parent_node, child_node); node = acpi_ns_get_next_node_typed(type, parent_node, child_node);
if (!node) { if (!node) {
status = AE_NOT_FOUND; status = AE_NOT_FOUND;
goto unlock_and_exit; goto unlock_and_exit;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment