aboutsummaryrefslogtreecommitdiff
path: root/source/components/events
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2014-09-11 21:38:09 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2014-09-11 21:38:09 +0000
commit754171ae60abbbd707ed8d449f07ef38f596bd22 (patch)
tree67d2b76905535d056ba6911186285d0325dc703f /source/components/events
parente599b42ef5047e5546af949d87d2cfd2e17062b0 (diff)
downloadsrc-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.c34
-rw-r--r--source/components/events/evgpeinit.c1
-rw-r--r--source/components/events/evhandler.c1
-rw-r--r--source/components/events/evregion.c1
-rw-r--r--source/components/events/evrgnini.c1
-rw-r--r--source/components/events/evxface.c1
-rw-r--r--source/components/events/evxfevnt.c1
-rw-r--r--source/components/events/evxfgpe.c72
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)