1/******************************************************************************
2 *
3 * Module Name: utinit - Common ACPI subsystem initialization
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2007, R. Byron Moore
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include <acpi/acnamesp.h>
46#include <acpi/acevents.h>
47#include <acpi/actables.h>
48
49#define _COMPONENT          ACPI_UTILITIES
50ACPI_MODULE_NAME("utinit")
51
52/* Local prototypes */
53static void acpi_ut_terminate(void);
54
55/******************************************************************************
56 *
57 * FUNCTION:    acpi_ut_terminate
58 *
59 * PARAMETERS:  none
60 *
61 * RETURN:      none
62 *
63 * DESCRIPTION: Free global memory
64 *
65 ******************************************************************************/
66
67static void acpi_ut_terminate(void)
68{
69	struct acpi_gpe_block_info *gpe_block;
70	struct acpi_gpe_block_info *next_gpe_block;
71	struct acpi_gpe_xrupt_info *gpe_xrupt_info;
72	struct acpi_gpe_xrupt_info *next_gpe_xrupt_info;
73
74	ACPI_FUNCTION_TRACE(ut_terminate);
75
76	/* Free global GPE blocks and related info structures */
77
78	gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
79	while (gpe_xrupt_info) {
80		gpe_block = gpe_xrupt_info->gpe_block_list_head;
81		while (gpe_block) {
82			next_gpe_block = gpe_block->next;
83			ACPI_FREE(gpe_block->event_info);
84			ACPI_FREE(gpe_block->register_info);
85			ACPI_FREE(gpe_block);
86
87			gpe_block = next_gpe_block;
88		}
89		next_gpe_xrupt_info = gpe_xrupt_info->next;
90		ACPI_FREE(gpe_xrupt_info);
91		gpe_xrupt_info = next_gpe_xrupt_info;
92	}
93
94	return_VOID;
95}
96
97/*******************************************************************************
98 *
99 * FUNCTION:    acpi_ut_subsystem_shutdown
100 *
101 * PARAMETERS:  none
102 *
103 * RETURN:      none
104 *
105 * DESCRIPTION: Shutdown the various subsystems.  Don't delete the mutex
106 *              objects here -- because the AML debugger may be still running.
107 *
108 ******************************************************************************/
109
110void acpi_ut_subsystem_shutdown(void)
111{
112
113	ACPI_FUNCTION_TRACE(ut_subsystem_shutdown);
114
115	/* Just exit if subsystem is already shutdown */
116
117	if (acpi_gbl_shutdown) {
118		ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
119		return_VOID;
120	}
121
122	/* Subsystem appears active, go ahead and shut it down */
123
124	acpi_gbl_shutdown = TRUE;
125	acpi_gbl_startup_flags = 0;
126	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
127
128	/* Close the acpi_event Handling */
129
130	acpi_ev_terminate();
131
132	/* Close the Namespace */
133
134	acpi_ns_terminate();
135
136	/* Delete the ACPI tables */
137
138	acpi_tb_terminate();
139
140	/* Close the globals */
141
142	acpi_ut_terminate();
143
144	/* Purge the local caches */
145
146	(void)acpi_ut_delete_caches();
147	return_VOID;
148}
149