1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#include <linux/export.h>
45#include <acpi/acpi.h>
46#include "accommon.h"
47#include "actables.h"
48
49#define _COMPONENT ACPI_EVENTS
50ACPI_MODULE_NAME("evxfevnt")
51
52#if (!ACPI_REDUCED_HARDWARE)
53
54
55
56
57
58
59
60
61
62
63
64
65acpi_status acpi_enable(void)
66{
67 acpi_status status;
68 int retry;
69
70 ACPI_FUNCTION_TRACE(acpi_enable);
71
72
73
74 if (!acpi_tb_tables_loaded()) {
75 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
76 }
77
78
79
80 if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {
81 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
82 "System is already in ACPI mode\n"));
83 return_ACPI_STATUS(AE_OK);
84 }
85
86
87
88 status = acpi_hw_set_mode(ACPI_SYS_MODE_ACPI);
89 if (ACPI_FAILURE(status)) {
90 ACPI_ERROR((AE_INFO,
91 "Could not transition to ACPI mode"));
92 return_ACPI_STATUS(status);
93 }
94
95
96
97 for (retry = 0; retry < 30000; ++retry) {
98 if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {
99 if (retry != 0)
100 ACPI_WARNING((AE_INFO,
101 "Platform took > %d00 usec to enter ACPI mode", retry));
102 return_ACPI_STATUS(AE_OK);
103 }
104 acpi_os_stall(100);
105 }
106
107 ACPI_ERROR((AE_INFO, "Hardware did not enter ACPI mode"));
108 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
109}
110
111ACPI_EXPORT_SYMBOL(acpi_enable)
112
113
114
115
116
117
118
119
120
121
122
123
124acpi_status acpi_disable(void)
125{
126 acpi_status status = AE_OK;
127
128 ACPI_FUNCTION_TRACE(acpi_disable);
129
130 if (acpi_hw_get_mode() == ACPI_SYS_MODE_LEGACY) {
131 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
132 "System is already in legacy (non-ACPI) mode\n"));
133 } else {
134
135
136 status = acpi_hw_set_mode(ACPI_SYS_MODE_LEGACY);
137
138 if (ACPI_FAILURE(status)) {
139 ACPI_ERROR((AE_INFO,
140 "Could not exit ACPI mode to legacy mode"));
141 return_ACPI_STATUS(status);
142 }
143
144 ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI mode disabled\n"));
145 }
146
147 return_ACPI_STATUS(status);
148}
149
150ACPI_EXPORT_SYMBOL(acpi_disable)
151
152
153
154
155
156
157
158
159
160
161
162
163
164acpi_status acpi_enable_event(u32 event, u32 flags)
165{
166 acpi_status status = AE_OK;
167 u32 value;
168
169 ACPI_FUNCTION_TRACE(acpi_enable_event);
170
171
172
173 if (event > ACPI_EVENT_MAX) {
174 return_ACPI_STATUS(AE_BAD_PARAMETER);
175 }
176
177
178
179
180
181 status =
182 acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
183 enable_register_id, ACPI_ENABLE_EVENT);
184 if (ACPI_FAILURE(status)) {
185 return_ACPI_STATUS(status);
186 }
187
188
189
190 status =
191 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
192 enable_register_id, &value);
193 if (ACPI_FAILURE(status)) {
194 return_ACPI_STATUS(status);
195 }
196
197 if (value != 1) {
198 ACPI_ERROR((AE_INFO,
199 "Could not enable %s event",
200 acpi_ut_get_event_name(event)));
201 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
202 }
203
204 return_ACPI_STATUS(status);
205}
206
207ACPI_EXPORT_SYMBOL(acpi_enable_event)
208
209
210
211
212
213
214
215
216
217
218
219
220
221acpi_status acpi_disable_event(u32 event, u32 flags)
222{
223 acpi_status status = AE_OK;
224 u32 value;
225
226 ACPI_FUNCTION_TRACE(acpi_disable_event);
227
228
229
230 if (event > ACPI_EVENT_MAX) {
231 return_ACPI_STATUS(AE_BAD_PARAMETER);
232 }
233
234
235
236
237
238 status =
239 acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
240 enable_register_id, ACPI_DISABLE_EVENT);
241 if (ACPI_FAILURE(status)) {
242 return_ACPI_STATUS(status);
243 }
244
245 status =
246 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
247 enable_register_id, &value);
248 if (ACPI_FAILURE(status)) {
249 return_ACPI_STATUS(status);
250 }
251
252 if (value != 0) {
253 ACPI_ERROR((AE_INFO,
254 "Could not disable %s events",
255 acpi_ut_get_event_name(event)));
256 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
257 }
258
259 return_ACPI_STATUS(status);
260}
261
262ACPI_EXPORT_SYMBOL(acpi_disable_event)
263
264
265
266
267
268
269
270
271
272
273
274
275acpi_status acpi_clear_event(u32 event)
276{
277 acpi_status status = AE_OK;
278
279 ACPI_FUNCTION_TRACE(acpi_clear_event);
280
281
282
283 if (event > ACPI_EVENT_MAX) {
284 return_ACPI_STATUS(AE_BAD_PARAMETER);
285 }
286
287
288
289
290
291 status =
292 acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
293 status_register_id, ACPI_CLEAR_STATUS);
294
295 return_ACPI_STATUS(status);
296}
297
298ACPI_EXPORT_SYMBOL(acpi_clear_event)
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
314{
315 acpi_status status = AE_OK;
316 u32 value;
317
318 ACPI_FUNCTION_TRACE(acpi_get_event_status);
319
320 if (!event_status) {
321 return_ACPI_STATUS(AE_BAD_PARAMETER);
322 }
323
324
325
326 if (event > ACPI_EVENT_MAX) {
327 return_ACPI_STATUS(AE_BAD_PARAMETER);
328 }
329
330
331
332 status =
333 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
334 enable_register_id, &value);
335 if (ACPI_FAILURE(status))
336 return_ACPI_STATUS(status);
337
338 *event_status = value;
339
340 status =
341 acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
342 status_register_id, &value);
343 if (ACPI_FAILURE(status))
344 return_ACPI_STATUS(status);
345
346 if (value)
347 *event_status |= ACPI_EVENT_FLAG_SET;
348
349 if (acpi_gbl_fixed_event_handlers[event].handler)
350 *event_status |= ACPI_EVENT_FLAG_HANDLE;
351
352 return_ACPI_STATUS(status);
353}
354
355ACPI_EXPORT_SYMBOL(acpi_get_event_status)
356#endif
357