Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Module Name: nsload - namespace loading/expanding/contracting procedures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include "acnamesp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "acdispat.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include "actables.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include "acinterp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define _COMPONENT          ACPI_NAMESPACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) ACPI_MODULE_NAME("nsload")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #ifdef ACPI_FUTURE_IMPLEMENTATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) acpi_status acpi_ns_unload_namespace(acpi_handle handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static acpi_status acpi_ns_delete_subtree(acpi_handle start_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * FUNCTION:    acpi_ns_load_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * PARAMETERS:  table_index     - Index for table to be loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  *              node            - Owning NS node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * DESCRIPTION: Load one ACPI table into the namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	ACPI_FUNCTION_TRACE(ns_load_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	/* If table already loaded into namespace, just return */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	if (acpi_tb_is_table_loaded(table_index)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		status = AE_ALREADY_EXISTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 			  "**** Loading table into namespace ****\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	status = acpi_tb_allocate_owner_id(table_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	 * Parse the table and load the namespace with all named
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	 * objects found within. Control methods are NOT parsed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	 * at this time. In fact, the control methods cannot be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	 * parsed until the entire namespace is loaded, because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	 * if a control method makes a forward reference (call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	 * to another control method, we can't continue parsing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	 * because we don't know how many arguments to parse next!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	status = acpi_ns_parse_table(table_index, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	if (ACPI_SUCCESS(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		acpi_tb_set_table_loaded_flag(table_index, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		 * On error, delete any namespace objects created by this table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		 * We cannot initialize these objects, so delete them. There are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		 * a couple of especially bad cases:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		 * AE_ALREADY_EXISTS - namespace collision.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		 * AE_NOT_FOUND - the target of a Scope operator does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		 * exist. This target of Scope must already exist in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		 * namespace, as per the ACPI specification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		acpi_ns_delete_namespace_by_owner(acpi_gbl_root_table_list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 						  tables[table_index].owner_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		acpi_tb_release_owner_id(table_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	 * Now we can parse the control methods. We always parse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	 * them here for a sanity check, and if configured for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	 * just-in-time parsing, we delete the control method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	 * parse trees.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 			  "**** Begin Table Object Initialization\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	acpi_ex_enter_interpreter();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	status = acpi_ds_initialize_objects(table_index, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	acpi_ex_exit_interpreter();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			  "**** Completed Table Object Initialization\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #ifdef ACPI_OBSOLETE_FUNCTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)  * FUNCTION:    acpi_load_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)  * PARAMETERS:  None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)  * DESCRIPTION: Load the name space from what ever is pointed to by DSDT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)  *              (DSDT points to either the BIOS or a buffer.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) acpi_status acpi_ns_load_namespace(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	ACPI_FUNCTION_TRACE(acpi_load_name_space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	/* There must be at least a DSDT installed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	if (acpi_gbl_DSDT == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 		ACPI_ERROR((AE_INFO, "DSDT is not in memory"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		return_ACPI_STATUS(AE_NO_ACPI_TABLES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	 * Load the namespace. The DSDT is required,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	 * but the SSDT and PSDT tables are optional.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	status = acpi_ns_load_table_by_type(ACPI_TABLE_ID_DSDT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	/* Ignore exceptions from these */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	(void)acpi_ns_load_table_by_type(ACPI_TABLE_ID_SSDT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	(void)acpi_ns_load_table_by_type(ACPI_TABLE_ID_PSDT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 			      "ACPI Namespace successfully loaded at root %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 			      acpi_gbl_root_node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #ifdef ACPI_FUTURE_IMPLEMENTATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  * FUNCTION:    acpi_ns_delete_subtree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)  * PARAMETERS:  start_handle        - Handle in namespace where search begins
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)  * RETURNS      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)  * DESCRIPTION: Walks the namespace starting at the given handle and deletes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)  *              all objects, entries, and scopes in the entire subtree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)  *              Namespace/Interpreter should be locked or the subsystem should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)  *              be in shutdown before this routine is called.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static acpi_status acpi_ns_delete_subtree(acpi_handle start_handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	acpi_handle child_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	acpi_handle parent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	acpi_handle next_child_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	acpi_handle dummy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	u32 level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	ACPI_FUNCTION_TRACE(ns_delete_subtree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	parent_handle = start_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	child_handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	level = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	 * Traverse the tree of objects until we bubble back up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	 * to where we started.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	while (level > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		/* Attempt to get the next object in this scope */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		status = acpi_get_next_object(ACPI_TYPE_ANY, parent_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 					      child_handle, &next_child_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 		child_handle = next_child_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		/* Did we get a new object? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		if (ACPI_SUCCESS(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 			/* Check if this object has any children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 			if (ACPI_SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 			    (acpi_get_next_object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 			     (ACPI_TYPE_ANY, child_handle, NULL, &dummy))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 				/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 				 * There is at least one child of this object,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 				 * visit the object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 				level++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 				parent_handle = child_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 				child_handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 			 * No more children in this object, go back up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 			 * the object's parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 			level--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 			/* Delete all children now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 			acpi_ns_delete_children(child_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 			child_handle = parent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 			status = acpi_get_parent(parent_handle, &parent_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 			if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 				return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	/* Now delete the starting object, and we are done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	acpi_ns_remove_node(child_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)  *  FUNCTION:       acpi_ns_unload_name_space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)  *  PARAMETERS:     handle          - Root of namespace subtree to be deleted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)  *  RETURN:         Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)  *  DESCRIPTION:    Shrinks the namespace, typically in response to an undocking
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)  *                  event. Deletes an entire subtree starting from (and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)  *                  including) the given handle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) acpi_status acpi_ns_unload_namespace(acpi_handle handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	ACPI_FUNCTION_TRACE(ns_unload_name_space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	/* Parameter validation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	if (!acpi_gbl_root_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		return_ACPI_STATUS(AE_NO_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	if (!handle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		return_ACPI_STATUS(AE_BAD_PARAMETER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	/* This function does the real work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	status = acpi_ns_delete_subtree(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) #endif