diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2014-09-11 21:38:09 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2014-09-11 21:38:09 +0000 |
commit | 754171ae60abbbd707ed8d449f07ef38f596bd22 (patch) | |
tree | 67d2b76905535d056ba6911186285d0325dc703f /source/components/events | |
parent | e599b42ef5047e5546af949d87d2cfd2e17062b0 (diff) | |
download | src-754171ae60abbbd707ed8d449f07ef38f596bd22.tar.gz src-754171ae60abbbd707ed8d449f07ef38f596bd22.zip |
Import ACPICA 20140828.vendor/acpica/20140828
Notes
Notes:
svn path=/vendor-sys/acpica/dist/; revision=271440
svn path=/vendor-sys/acpica/20140828/; revision=271441; tag=vendor/acpica/20140828
Diffstat (limited to 'source/components/events')
-rw-r--r-- | source/components/events/evgpe.c | 34 | ||||
-rw-r--r-- | source/components/events/evgpeinit.c | 1 | ||||
-rw-r--r-- | source/components/events/evhandler.c | 1 | ||||
-rw-r--r-- | source/components/events/evregion.c | 1 | ||||
-rw-r--r-- | source/components/events/evrgnini.c | 1 | ||||
-rw-r--r-- | source/components/events/evxface.c | 1 | ||||
-rw-r--r-- | source/components/events/evxfevnt.c | 1 | ||||
-rw-r--r-- | source/components/events/evxfgpe.c | 72 |
8 files changed, 86 insertions, 26 deletions
diff --git a/source/components/events/evgpe.c b/source/components/events/evgpe.c index c31f0b385197..939402559e0b 100644 --- a/source/components/events/evgpe.c +++ b/source/components/events/evgpe.c @@ -761,22 +761,6 @@ AcpiEvGpeDispatch ( } /* - * If edge-triggered, clear the GPE status bit now. Note that - * level-triggered events are cleared after the GPE is serviced. - */ - if ((GpeEventInfo->Flags & ACPI_GPE_XRUPT_TYPE_MASK) == - ACPI_GPE_EDGE_TRIGGERED) - { - Status = AcpiHwClearGpe (GpeEventInfo); - if (ACPI_FAILURE (Status)) - { - ACPI_EXCEPTION ((AE_INFO, Status, - "Unable to clear GPE %02X", GpeNumber)); - return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED); - } - } - - /* * Always disable the GPE so that it does not keep firing before * any asynchronous activity completes (either from the execution * of a GPE method or an asynchronous GPE handler.) @@ -794,6 +778,24 @@ AcpiEvGpeDispatch ( } /* + * If edge-triggered, clear the GPE status bit now. Note that + * level-triggered events are cleared after the GPE is serviced. + */ + if ((GpeEventInfo->Flags & ACPI_GPE_XRUPT_TYPE_MASK) == + ACPI_GPE_EDGE_TRIGGERED) + { + Status = AcpiHwClearGpe (GpeEventInfo); + if (ACPI_FAILURE (Status)) + { + ACPI_EXCEPTION ((AE_INFO, Status, + "Unable to clear GPE %02X", GpeNumber)); + (void) AcpiHwLowSetGpe (GpeEventInfo, + ACPI_GPE_CONDITIONAL_ENABLE); + return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED); + } + } + + /* * Dispatch the GPE to either an installed handler or the control * method associated with this GPE (_Lxx or _Exx). If a handler * exists, we invoke it and do not attempt to run the method. diff --git a/source/components/events/evgpeinit.c b/source/components/events/evgpeinit.c index 6251b36f4d7a..a8aea022f858 100644 --- a/source/components/events/evgpeinit.c +++ b/source/components/events/evgpeinit.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #include "acpi.h" #include "accommon.h" #include "acevents.h" diff --git a/source/components/events/evhandler.c b/source/components/events/evhandler.c index 150f73f77169..0fd1cba30de3 100644 --- a/source/components/events/evhandler.c +++ b/source/components/events/evhandler.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define __EVHANDLER_C__ #include "acpi.h" diff --git a/source/components/events/evregion.c b/source/components/events/evregion.c index 4b5cb9b1ddb0..8531b5ae2a6e 100644 --- a/source/components/events/evregion.c +++ b/source/components/events/evregion.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define __EVREGION_C__ #include "acpi.h" diff --git a/source/components/events/evrgnini.c b/source/components/events/evrgnini.c index 1c3dbbc49df4..cd0ca2eea5f0 100644 --- a/source/components/events/evrgnini.c +++ b/source/components/events/evrgnini.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define __EVRGNINI_C__ #include "acpi.h" diff --git a/source/components/events/evxface.c b/source/components/events/evxface.c index 51437a915b39..bbd88dc370ff 100644 --- a/source/components/events/evxface.c +++ b/source/components/events/evxface.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define __EVXFACE_C__ #define EXPORT_ACPI_INTERFACES diff --git a/source/components/events/evxfevnt.c b/source/components/events/evxfevnt.c index f854145a4915..683c73b56876 100644 --- a/source/components/events/evxfevnt.c +++ b/source/components/events/evxfevnt.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define __EVXFEVNT_C__ #define EXPORT_ACPI_INTERFACES diff --git a/source/components/events/evxfgpe.c b/source/components/events/evxfgpe.c index 73164e1d04b1..79e888ff8053 100644 --- a/source/components/events/evxfgpe.c +++ b/source/components/events/evxfgpe.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define __EVXFGPE_C__ #define EXPORT_ACPI_INTERFACES @@ -141,12 +140,23 @@ AcpiEnableGpe ( Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); - /* Ensure that we have a valid GPE number */ - + /* + * Ensure that we have a valid GPE number and that there is some way + * of handling the GPE (handler or a GPE method). In other words, we + * won't allow a valid GPE to be enabled if there is no way to handle it. + */ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); if (GpeEventInfo) { - Status = AcpiEvAddGpeReference (GpeEventInfo); + if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) != + ACPI_GPE_DISPATCH_NONE) + { + Status = AcpiEvAddGpeReference (GpeEventInfo); + } + else + { + Status = AE_NO_HANDLER; + } } AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); @@ -276,6 +286,60 @@ ACPI_EXPORT_SYMBOL (AcpiSetGpe) /******************************************************************************* * + * FUNCTION: AcpiMarkGpeForWake + * + * PARAMETERS: GpeDevice - Parent GPE Device. NULL for GPE0/GPE1 + * GpeNumber - GPE level within the GPE block + * + * RETURN: Status + * + * DESCRIPTION: Mark a GPE as having the ability to wake the system. Simply + * sets the ACPI_GPE_CAN_WAKE flag. + * + * Some potential callers of AcpiSetupGpeForWake may know in advance that + * there won't be any notify handlers installed for device wake notifications + * from the given GPE (one example is a button GPE in Linux). For these cases, + * AcpiMarkGpeForWake should be used instead of AcpiSetupGpeForWake. + * This will set the ACPI_GPE_CAN_WAKE flag for the GPE without trying to + * setup implicit wake notification for it (since there's no handler method). + * + ******************************************************************************/ + +ACPI_STATUS +AcpiMarkGpeForWake ( + ACPI_HANDLE GpeDevice, + UINT32 GpeNumber) +{ + ACPI_GPE_EVENT_INFO *GpeEventInfo; + ACPI_STATUS Status = AE_BAD_PARAMETER; + ACPI_CPU_FLAGS Flags; + + + ACPI_FUNCTION_TRACE (AcpiMarkGpeForWake); + + + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); + + /* Ensure that we have a valid GPE number */ + + GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); + if (GpeEventInfo) + { + /* Mark the GPE as a possible wake event */ + + GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE; + Status = AE_OK; + } + + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); + return_ACPI_STATUS (Status); +} + +ACPI_EXPORT_SYMBOL (AcpiMarkGpeForWake) + + +/******************************************************************************* + * * FUNCTION: AcpiSetupGpeForWake * * PARAMETERS: WakeDevice - Device associated with the GPE (via _PRW) |