cpuidle: powernv: Populate cpuidle state details by querying the device-tree
[sfrench/cifs-2.6.git] / drivers / acpi / acpica / evxfevnt.c
1 /******************************************************************************
2  *
3  * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2014, Intel Corp.
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 #define EXPORT_ACPI_INTERFACES
45
46 #include <acpi/acpi.h>
47 #include "accommon.h"
48 #include "actables.h"
49
50 #define _COMPONENT          ACPI_EVENTS
51 ACPI_MODULE_NAME("evxfevnt")
52
53 #if (!ACPI_REDUCED_HARDWARE)    /* Entire module */
54 /*******************************************************************************
55  *
56  * FUNCTION:    acpi_enable
57  *
58  * PARAMETERS:  None
59  *
60  * RETURN:      Status
61  *
62  * DESCRIPTION: Transfers the system into ACPI mode.
63  *
64  ******************************************************************************/
65 acpi_status acpi_enable(void)
66 {
67         acpi_status status;
68         int retry;
69
70         ACPI_FUNCTION_TRACE(acpi_enable);
71
72         /* ACPI tables must be present */
73
74         if (!acpi_tb_tables_loaded()) {
75                 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
76         }
77
78         /* If the Hardware Reduced flag is set, machine is always in acpi mode */
79
80         if (acpi_gbl_reduced_hardware) {
81                 return_ACPI_STATUS(AE_OK);
82         }
83
84         /* Check current mode */
85
86         if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {
87                 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
88                                   "System is already in ACPI mode\n"));
89                 return_ACPI_STATUS(AE_OK);
90         }
91
92         /* Transition to ACPI mode */
93
94         status = acpi_hw_set_mode(ACPI_SYS_MODE_ACPI);
95         if (ACPI_FAILURE(status)) {
96                 ACPI_ERROR((AE_INFO,
97                             "Could not transition to ACPI mode"));
98                 return_ACPI_STATUS(status);
99         }
100
101         /* Sanity check that transition succeeded */
102
103         for (retry = 0; retry < 30000; ++retry) {
104                 if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {
105                         if (retry != 0)
106                                 ACPI_WARNING((AE_INFO,
107                                 "Platform took > %d00 usec to enter ACPI mode", retry));
108                         return_ACPI_STATUS(AE_OK);
109                 }
110                 acpi_os_stall(100);     /* 100 usec */
111         }
112
113         ACPI_ERROR((AE_INFO, "Hardware did not enter ACPI mode"));
114         return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
115 }
116
117 ACPI_EXPORT_SYMBOL(acpi_enable)
118
119 /*******************************************************************************
120  *
121  * FUNCTION:    acpi_disable
122  *
123  * PARAMETERS:  None
124  *
125  * RETURN:      Status
126  *
127  * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
128  *
129  ******************************************************************************/
130 acpi_status acpi_disable(void)
131 {
132         acpi_status status = AE_OK;
133
134         ACPI_FUNCTION_TRACE(acpi_disable);
135
136         /* If the Hardware Reduced flag is set, machine is always in acpi mode */
137
138         if (acpi_gbl_reduced_hardware) {
139                 return_ACPI_STATUS(AE_OK);
140         }
141
142         if (acpi_hw_get_mode() == ACPI_SYS_MODE_LEGACY) {
143                 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
144                                   "System is already in legacy (non-ACPI) mode\n"));
145         } else {
146                 /* Transition to LEGACY mode */
147
148                 status = acpi_hw_set_mode(ACPI_SYS_MODE_LEGACY);
149
150                 if (ACPI_FAILURE(status)) {
151                         ACPI_ERROR((AE_INFO,
152                                     "Could not exit ACPI mode to legacy mode"));
153                         return_ACPI_STATUS(status);
154                 }
155
156                 ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI mode disabled\n"));
157         }
158
159         return_ACPI_STATUS(status);
160 }
161
162 ACPI_EXPORT_SYMBOL(acpi_disable)
163
164 /*******************************************************************************
165  *
166  * FUNCTION:    acpi_enable_event
167  *
168  * PARAMETERS:  event           - The fixed eventto be enabled
169  *              flags           - Reserved
170  *
171  * RETURN:      Status
172  *
173  * DESCRIPTION: Enable an ACPI event (fixed)
174  *
175  ******************************************************************************/
176 acpi_status acpi_enable_event(u32 event, u32 flags)
177 {
178         acpi_status status = AE_OK;
179         u32 value;
180
181         ACPI_FUNCTION_TRACE(acpi_enable_event);
182
183         /* Decode the Fixed Event */
184
185         if (event > ACPI_EVENT_MAX) {
186                 return_ACPI_STATUS(AE_BAD_PARAMETER);
187         }
188
189         /*
190          * Enable the requested fixed event (by writing a one to the enable
191          * register bit)
192          */
193         status =
194             acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
195                                     enable_register_id, ACPI_ENABLE_EVENT);
196         if (ACPI_FAILURE(status)) {
197                 return_ACPI_STATUS(status);
198         }
199
200         /* Make sure that the hardware responded */
201
202         status =
203             acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
204                                    enable_register_id, &value);
205         if (ACPI_FAILURE(status)) {
206                 return_ACPI_STATUS(status);
207         }
208
209         if (value != 1) {
210                 ACPI_ERROR((AE_INFO,
211                             "Could not enable %s event",
212                             acpi_ut_get_event_name(event)));
213                 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
214         }
215
216         return_ACPI_STATUS(status);
217 }
218
219 ACPI_EXPORT_SYMBOL(acpi_enable_event)
220
221 /*******************************************************************************
222  *
223  * FUNCTION:    acpi_disable_event
224  *
225  * PARAMETERS:  event           - The fixed event to be disabled
226  *              flags           - Reserved
227  *
228  * RETURN:      Status
229  *
230  * DESCRIPTION: Disable an ACPI event (fixed)
231  *
232  ******************************************************************************/
233 acpi_status acpi_disable_event(u32 event, u32 flags)
234 {
235         acpi_status status = AE_OK;
236         u32 value;
237
238         ACPI_FUNCTION_TRACE(acpi_disable_event);
239
240         /* Decode the Fixed Event */
241
242         if (event > ACPI_EVENT_MAX) {
243                 return_ACPI_STATUS(AE_BAD_PARAMETER);
244         }
245
246         /*
247          * Disable the requested fixed event (by writing a zero to the enable
248          * register bit)
249          */
250         status =
251             acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
252                                     enable_register_id, ACPI_DISABLE_EVENT);
253         if (ACPI_FAILURE(status)) {
254                 return_ACPI_STATUS(status);
255         }
256
257         status =
258             acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
259                                    enable_register_id, &value);
260         if (ACPI_FAILURE(status)) {
261                 return_ACPI_STATUS(status);
262         }
263
264         if (value != 0) {
265                 ACPI_ERROR((AE_INFO,
266                             "Could not disable %s events",
267                             acpi_ut_get_event_name(event)));
268                 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
269         }
270
271         return_ACPI_STATUS(status);
272 }
273
274 ACPI_EXPORT_SYMBOL(acpi_disable_event)
275
276 /*******************************************************************************
277  *
278  * FUNCTION:    acpi_clear_event
279  *
280  * PARAMETERS:  event           - The fixed event to be cleared
281  *
282  * RETURN:      Status
283  *
284  * DESCRIPTION: Clear an ACPI event (fixed)
285  *
286  ******************************************************************************/
287 acpi_status acpi_clear_event(u32 event)
288 {
289         acpi_status status = AE_OK;
290
291         ACPI_FUNCTION_TRACE(acpi_clear_event);
292
293         /* Decode the Fixed Event */
294
295         if (event > ACPI_EVENT_MAX) {
296                 return_ACPI_STATUS(AE_BAD_PARAMETER);
297         }
298
299         /*
300          * Clear the requested fixed event (By writing a one to the status
301          * register bit)
302          */
303         status =
304             acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
305                                     status_register_id, ACPI_CLEAR_STATUS);
306
307         return_ACPI_STATUS(status);
308 }
309
310 ACPI_EXPORT_SYMBOL(acpi_clear_event)
311
312 /*******************************************************************************
313  *
314  * FUNCTION:    acpi_get_event_status
315  *
316  * PARAMETERS:  event           - The fixed event
317  *              event_status    - Where the current status of the event will
318  *                                be returned
319  *
320  * RETURN:      Status
321  *
322  * DESCRIPTION: Obtains and returns the current status of the event
323  *
324  ******************************************************************************/
325 acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
326 {
327         acpi_status status = AE_OK;
328         u32 value;
329
330         ACPI_FUNCTION_TRACE(acpi_get_event_status);
331
332         if (!event_status) {
333                 return_ACPI_STATUS(AE_BAD_PARAMETER);
334         }
335
336         /* Decode the Fixed Event */
337
338         if (event > ACPI_EVENT_MAX) {
339                 return_ACPI_STATUS(AE_BAD_PARAMETER);
340         }
341
342         /* Get the status of the requested fixed event */
343
344         status =
345             acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
346                               enable_register_id, &value);
347         if (ACPI_FAILURE(status))
348                 return_ACPI_STATUS(status);
349
350         *event_status = value;
351
352         status =
353             acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
354                               status_register_id, &value);
355         if (ACPI_FAILURE(status))
356                 return_ACPI_STATUS(status);
357
358         if (value)
359                 *event_status |= ACPI_EVENT_FLAG_SET;
360
361         if (acpi_gbl_fixed_event_handlers[event].handler)
362                 *event_status |= ACPI_EVENT_FLAG_HANDLE;
363
364         return_ACPI_STATUS(status);
365 }
366
367 ACPI_EXPORT_SYMBOL(acpi_get_event_status)
368 #endif                          /* !ACPI_REDUCED_HARDWARE */