Indentation fix, cleanup.
[AROS.git] / arch / all-pc / acpica / source / components / hardware / hwgpe.c
blob4f123bc3482b383c4722b92d8c9614c92479214d
1 /******************************************************************************
3 * Module Name: hwgpe - Low level GPE enable/disable/clear functions
5 *****************************************************************************/
7 /*
8 * Copyright (C) 2000 - 2013, Intel Corp.
9 * All rights reserved.
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.
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.
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.
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acevents.h"
48 #define _COMPONENT ACPI_HARDWARE
49 ACPI_MODULE_NAME ("hwgpe")
51 #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
53 /* Local prototypes */
55 static ACPI_STATUS
56 AcpiHwEnableWakeupGpeBlock (
57 ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
58 ACPI_GPE_BLOCK_INFO *GpeBlock,
59 void *Context);
62 /******************************************************************************
64 * FUNCTION: AcpiHwGetGpeRegisterBit
66 * PARAMETERS: GpeEventInfo - Info block for the GPE
68 * RETURN: Register mask with a one in the GPE bit position
70 * DESCRIPTION: Compute the register mask for this GPE. One bit is set in the
71 * correct position for the input GPE.
73 ******************************************************************************/
75 UINT32
76 AcpiHwGetGpeRegisterBit (
77 ACPI_GPE_EVENT_INFO *GpeEventInfo)
80 return ((UINT32) 1 <<
81 (GpeEventInfo->GpeNumber - GpeEventInfo->RegisterInfo->BaseGpeNumber));
85 /******************************************************************************
87 * FUNCTION: AcpiHwLowSetGpe
89 * PARAMETERS: GpeEventInfo - Info block for the GPE to be disabled
90 * Action - Enable or disable
92 * RETURN: Status
94 * DESCRIPTION: Enable or disable a single GPE in the parent enable register.
96 ******************************************************************************/
98 ACPI_STATUS
99 AcpiHwLowSetGpe (
100 ACPI_GPE_EVENT_INFO *GpeEventInfo,
101 UINT32 Action)
103 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
104 ACPI_STATUS Status;
105 UINT32 EnableMask;
106 UINT32 RegisterBit;
109 ACPI_FUNCTION_ENTRY ();
112 /* Get the info block for the entire GPE register */
114 GpeRegisterInfo = GpeEventInfo->RegisterInfo;
115 if (!GpeRegisterInfo)
117 return (AE_NOT_EXIST);
120 /* Get current value of the enable register that contains this GPE */
122 Status = AcpiHwRead (&EnableMask, &GpeRegisterInfo->EnableAddress);
123 if (ACPI_FAILURE (Status))
125 return (Status);
128 /* Set or clear just the bit that corresponds to this GPE */
130 RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
131 switch (Action)
133 case ACPI_GPE_CONDITIONAL_ENABLE:
135 /* Only enable if the EnableForRun bit is set */
137 if (!(RegisterBit & GpeRegisterInfo->EnableForRun))
139 return (AE_BAD_PARAMETER);
142 /*lint -fallthrough */
144 case ACPI_GPE_ENABLE:
146 ACPI_SET_BIT (EnableMask, RegisterBit);
147 break;
149 case ACPI_GPE_DISABLE:
151 ACPI_CLEAR_BIT (EnableMask, RegisterBit);
152 break;
154 default:
156 ACPI_ERROR ((AE_INFO, "Invalid GPE Action, %u", Action));
157 return (AE_BAD_PARAMETER);
160 /* Write the updated enable mask */
162 Status = AcpiHwWrite (EnableMask, &GpeRegisterInfo->EnableAddress);
163 return (Status);
167 /******************************************************************************
169 * FUNCTION: AcpiHwClearGpe
171 * PARAMETERS: GpeEventInfo - Info block for the GPE to be cleared
173 * RETURN: Status
175 * DESCRIPTION: Clear the status bit for a single GPE.
177 ******************************************************************************/
179 ACPI_STATUS
180 AcpiHwClearGpe (
181 ACPI_GPE_EVENT_INFO *GpeEventInfo)
183 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
184 ACPI_STATUS Status;
185 UINT32 RegisterBit;
188 ACPI_FUNCTION_ENTRY ();
190 /* Get the info block for the entire GPE register */
192 GpeRegisterInfo = GpeEventInfo->RegisterInfo;
193 if (!GpeRegisterInfo)
195 return (AE_NOT_EXIST);
199 * Write a one to the appropriate bit in the status register to
200 * clear this GPE.
202 RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
204 Status = AcpiHwWrite (RegisterBit,
205 &GpeRegisterInfo->StatusAddress);
207 return (Status);
211 /******************************************************************************
213 * FUNCTION: AcpiHwGetGpeStatus
215 * PARAMETERS: GpeEventInfo - Info block for the GPE to queried
216 * EventStatus - Where the GPE status is returned
218 * RETURN: Status
220 * DESCRIPTION: Return the status of a single GPE.
222 ******************************************************************************/
224 ACPI_STATUS
225 AcpiHwGetGpeStatus (
226 ACPI_GPE_EVENT_INFO *GpeEventInfo,
227 ACPI_EVENT_STATUS *EventStatus)
229 UINT32 InByte;
230 UINT32 RegisterBit;
231 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
232 ACPI_EVENT_STATUS LocalEventStatus = 0;
233 ACPI_STATUS Status;
236 ACPI_FUNCTION_ENTRY ();
239 if (!EventStatus)
241 return (AE_BAD_PARAMETER);
244 /* Get the info block for the entire GPE register */
246 GpeRegisterInfo = GpeEventInfo->RegisterInfo;
248 /* Get the register bitmask for this GPE */
250 RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
252 /* GPE currently enabled? (enabled for runtime?) */
254 if (RegisterBit & GpeRegisterInfo->EnableForRun)
256 LocalEventStatus |= ACPI_EVENT_FLAG_ENABLED;
259 /* GPE enabled for wake? */
261 if (RegisterBit & GpeRegisterInfo->EnableForWake)
263 LocalEventStatus |= ACPI_EVENT_FLAG_WAKE_ENABLED;
266 /* GPE currently active (status bit == 1)? */
268 Status = AcpiHwRead (&InByte, &GpeRegisterInfo->StatusAddress);
269 if (ACPI_FAILURE (Status))
271 return (Status);
274 if (RegisterBit & InByte)
276 LocalEventStatus |= ACPI_EVENT_FLAG_SET;
279 /* Set return value */
281 (*EventStatus) = LocalEventStatus;
282 return (AE_OK);
286 /******************************************************************************
288 * FUNCTION: AcpiHwDisableGpeBlock
290 * PARAMETERS: GpeXruptInfo - GPE Interrupt info
291 * GpeBlock - Gpe Block info
293 * RETURN: Status
295 * DESCRIPTION: Disable all GPEs within a single GPE block
297 ******************************************************************************/
299 ACPI_STATUS
300 AcpiHwDisableGpeBlock (
301 ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
302 ACPI_GPE_BLOCK_INFO *GpeBlock,
303 void *Context)
305 UINT32 i;
306 ACPI_STATUS Status;
309 /* Examine each GPE Register within the block */
311 for (i = 0; i < GpeBlock->RegisterCount; i++)
313 /* Disable all GPEs in this register */
315 Status = AcpiHwWrite (0x00, &GpeBlock->RegisterInfo[i].EnableAddress);
316 if (ACPI_FAILURE (Status))
318 return (Status);
322 return (AE_OK);
326 /******************************************************************************
328 * FUNCTION: AcpiHwClearGpeBlock
330 * PARAMETERS: GpeXruptInfo - GPE Interrupt info
331 * GpeBlock - Gpe Block info
333 * RETURN: Status
335 * DESCRIPTION: Clear status bits for all GPEs within a single GPE block
337 ******************************************************************************/
339 ACPI_STATUS
340 AcpiHwClearGpeBlock (
341 ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
342 ACPI_GPE_BLOCK_INFO *GpeBlock,
343 void *Context)
345 UINT32 i;
346 ACPI_STATUS Status;
349 /* Examine each GPE Register within the block */
351 for (i = 0; i < GpeBlock->RegisterCount; i++)
353 /* Clear status on all GPEs in this register */
355 Status = AcpiHwWrite (0xFF, &GpeBlock->RegisterInfo[i].StatusAddress);
356 if (ACPI_FAILURE (Status))
358 return (Status);
362 return (AE_OK);
366 /******************************************************************************
368 * FUNCTION: AcpiHwEnableRuntimeGpeBlock
370 * PARAMETERS: GpeXruptInfo - GPE Interrupt info
371 * GpeBlock - Gpe Block info
373 * RETURN: Status
375 * DESCRIPTION: Enable all "runtime" GPEs within a single GPE block. Includes
376 * combination wake/run GPEs.
378 ******************************************************************************/
380 ACPI_STATUS
381 AcpiHwEnableRuntimeGpeBlock (
382 ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
383 ACPI_GPE_BLOCK_INFO *GpeBlock,
384 void *Context)
386 UINT32 i;
387 ACPI_STATUS Status;
390 /* NOTE: assumes that all GPEs are currently disabled */
392 /* Examine each GPE Register within the block */
394 for (i = 0; i < GpeBlock->RegisterCount; i++)
396 if (!GpeBlock->RegisterInfo[i].EnableForRun)
398 continue;
401 /* Enable all "runtime" GPEs in this register */
403 Status = AcpiHwWrite (GpeBlock->RegisterInfo[i].EnableForRun,
404 &GpeBlock->RegisterInfo[i].EnableAddress);
405 if (ACPI_FAILURE (Status))
407 return (Status);
411 return (AE_OK);
415 /******************************************************************************
417 * FUNCTION: AcpiHwEnableWakeupGpeBlock
419 * PARAMETERS: GpeXruptInfo - GPE Interrupt info
420 * GpeBlock - Gpe Block info
422 * RETURN: Status
424 * DESCRIPTION: Enable all "wake" GPEs within a single GPE block. Includes
425 * combination wake/run GPEs.
427 ******************************************************************************/
429 static ACPI_STATUS
430 AcpiHwEnableWakeupGpeBlock (
431 ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
432 ACPI_GPE_BLOCK_INFO *GpeBlock,
433 void *Context)
435 UINT32 i;
436 ACPI_STATUS Status;
439 /* Examine each GPE Register within the block */
441 for (i = 0; i < GpeBlock->RegisterCount; i++)
443 if (!GpeBlock->RegisterInfo[i].EnableForWake)
445 continue;
448 /* Enable all "wake" GPEs in this register */
450 Status = AcpiHwWrite (GpeBlock->RegisterInfo[i].EnableForWake,
451 &GpeBlock->RegisterInfo[i].EnableAddress);
452 if (ACPI_FAILURE (Status))
454 return (Status);
458 return (AE_OK);
462 /******************************************************************************
464 * FUNCTION: AcpiHwDisableAllGpes
466 * PARAMETERS: None
468 * RETURN: Status
470 * DESCRIPTION: Disable and clear all GPEs in all GPE blocks
472 ******************************************************************************/
474 ACPI_STATUS
475 AcpiHwDisableAllGpes (
476 void)
478 ACPI_STATUS Status;
481 ACPI_FUNCTION_TRACE (HwDisableAllGpes);
484 Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock, NULL);
485 Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock, NULL);
486 return_ACPI_STATUS (Status);
490 /******************************************************************************
492 * FUNCTION: AcpiHwEnableAllRuntimeGpes
494 * PARAMETERS: None
496 * RETURN: Status
498 * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
500 ******************************************************************************/
502 ACPI_STATUS
503 AcpiHwEnableAllRuntimeGpes (
504 void)
506 ACPI_STATUS Status;
509 ACPI_FUNCTION_TRACE (HwEnableAllRuntimeGpes);
512 Status = AcpiEvWalkGpeList (AcpiHwEnableRuntimeGpeBlock, NULL);
513 return_ACPI_STATUS (Status);
517 /******************************************************************************
519 * FUNCTION: AcpiHwEnableAllWakeupGpes
521 * PARAMETERS: None
523 * RETURN: Status
525 * DESCRIPTION: Enable all "wakeup" GPEs, in all GPE blocks
527 ******************************************************************************/
529 ACPI_STATUS
530 AcpiHwEnableAllWakeupGpes (
531 void)
533 ACPI_STATUS Status;
536 ACPI_FUNCTION_TRACE (HwEnableAllWakeupGpes);
539 Status = AcpiEvWalkGpeList (AcpiHwEnableWakeupGpeBlock, NULL);
540 return_ACPI_STATUS (Status);
543 #endif /* !ACPI_REDUCED_HARDWARE */