Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / acpi / events / evevent.c
index 2a21360..c9ac05c 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <acpi/acevents.h>
 
 #define _COMPONENT          ACPI_EVENTS
-        ACPI_MODULE_NAME    ("evevent")
+ACPI_MODULE_NAME("evevent")
 
+/* Local prototypes */
+static acpi_status acpi_ev_fixed_event_initialize(void);
+
+static u32 acpi_ev_fixed_event_dispatch(u32 event);
 
 /*******************************************************************************
  *
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Initialize global data structures for events.
+ * DESCRIPTION: Initialize global data structures for ACPI events (Fixed, GPE)
  *
  ******************************************************************************/
 
-acpi_status
-acpi_ev_initialize_events (
-       void)
+acpi_status acpi_ev_initialize_events(void)
 {
-       acpi_status                     status;
-
-
-       ACPI_FUNCTION_TRACE ("ev_initialize_events");
+       acpi_status status;
 
+       ACPI_FUNCTION_TRACE("ev_initialize_events");
 
        /* Make sure we have ACPI tables */
 
        if (!acpi_gbl_DSDT) {
-               ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "No ACPI tables present!\n"));
-               return_ACPI_STATUS (AE_NO_ACPI_TABLES);
+               ACPI_WARNING((AE_INFO, "No ACPI tables present!"));
+               return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
        /*
-        * Initialize the Fixed and General Purpose Events. This is
-        * done prior to enabling SCIs to prevent interrupts from
-        * occurring before handers are installed.
+        * Initialize the Fixed and General Purpose Events. This is done prior to
+        * enabling SCIs to prevent interrupts from occurring before the handlers are
+        * installed.
         */
-       status = acpi_ev_fixed_event_initialize ();
-       if (ACPI_FAILURE (status)) {
-               ACPI_REPORT_ERROR ((
-                               "Unable to initialize fixed events, %s\n",
-                               acpi_format_exception (status)));
-               return_ACPI_STATUS (status);
+       status = acpi_ev_fixed_event_initialize();
+       if (ACPI_FAILURE(status)) {
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to initialize fixed events"));
+               return_ACPI_STATUS(status);
        }
 
-       status = acpi_ev_gpe_initialize ();
-       if (ACPI_FAILURE (status)) {
-               ACPI_REPORT_ERROR ((
-                               "Unable to initialize general purpose events, %s\n",
-                               acpi_format_exception (status)));
-               return_ACPI_STATUS (status);
+       status = acpi_ev_gpe_initialize();
+       if (ACPI_FAILURE(status)) {
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to initialize general purpose events"));
+               return_ACPI_STATUS(status);
        }
 
-       return_ACPI_STATUS (status);
+       return_ACPI_STATUS(status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ev_install_fadt_gpes
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Completes initialization of the FADT-defined GPE blocks
+ *              (0 and 1). This causes the _PRW methods to be run, so the HW
+ *              must be fully initialized at this point, including global lock
+ *              support.
+ *
+ ******************************************************************************/
+
+acpi_status acpi_ev_install_fadt_gpes(void)
+{
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE("ev_install_fadt_gpes");
+
+       /* Namespace must be locked */
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       /* FADT GPE Block 0 */
+
+       (void)acpi_ev_initialize_gpe_block(acpi_gbl_fadt_gpe_device,
+                                          acpi_gbl_gpe_fadt_blocks[0]);
+
+       /* FADT GPE Block 1 */
+
+       (void)acpi_ev_initialize_gpe_block(acpi_gbl_fadt_gpe_device,
+                                          acpi_gbl_gpe_fadt_blocks[1]);
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+       return_ACPI_STATUS(AE_OK);
+}
 
 /*******************************************************************************
  *
@@ -114,41 +153,34 @@ acpi_ev_initialize_events (
  *
  ******************************************************************************/
 
-acpi_status
-acpi_ev_install_xrupt_handlers (
-       void)
+acpi_status acpi_ev_install_xrupt_handlers(void)
 {
-       acpi_status                     status;
-
-
-       ACPI_FUNCTION_TRACE ("ev_install_xrupt_handlers");
+       acpi_status status;
 
+       ACPI_FUNCTION_TRACE("ev_install_xrupt_handlers");
 
        /* Install the SCI handler */
 
-       status = acpi_ev_install_sci_handler ();
-       if (ACPI_FAILURE (status)) {
-               ACPI_REPORT_ERROR ((
-                               "Unable to install System Control Interrupt Handler, %s\n",
-                               acpi_format_exception (status)));
-               return_ACPI_STATUS (status);
+       status = acpi_ev_install_sci_handler();
+       if (ACPI_FAILURE(status)) {
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to install System Control Interrupt handler"));
+               return_ACPI_STATUS(status);
        }
 
        /* Install the handler for the Global Lock */
 
-       status = acpi_ev_init_global_lock_handler ();
-       if (ACPI_FAILURE (status)) {
-               ACPI_REPORT_ERROR ((
-                               "Unable to initialize Global Lock handler, %s\n",
-                               acpi_format_exception (status)));
-               return_ACPI_STATUS (status);
+       status = acpi_ev_init_global_lock_handler();
+       if (ACPI_FAILURE(status)) {
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to initialize Global Lock handler"));
+               return_ACPI_STATUS(status);
        }
 
        acpi_gbl_events_initialized = TRUE;
-       return_ACPI_STATUS (status);
+       return_ACPI_STATUS(status);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ev_fixed_event_initialize
@@ -161,13 +193,10 @@ acpi_ev_install_xrupt_handlers (
  *
  ******************************************************************************/
 
-acpi_status
-acpi_ev_fixed_event_initialize (
-       void)
+static acpi_status acpi_ev_fixed_event_initialize(void)
 {
-       acpi_native_uint                i;
-       acpi_status                     status;
-
+       acpi_native_uint i;
+       acpi_status status;
 
        /*
         * Initialize the structure that keeps track of fixed event handlers
@@ -180,9 +209,11 @@ acpi_ev_fixed_event_initialize (
                /* Enable the fixed event */
 
                if (acpi_gbl_fixed_event_info[i].enable_register_id != 0xFF) {
-                       status = acpi_set_register (acpi_gbl_fixed_event_info[i].enable_register_id,
-                                        0, ACPI_MTX_LOCK);
-                       if (ACPI_FAILURE (status)) {
+                       status =
+                           acpi_set_register(acpi_gbl_fixed_event_info[i].
+                                             enable_register_id, 0,
+                                             ACPI_MTX_LOCK);
+                       if (ACPI_FAILURE(status)) {
                                return (status);
                        }
                }
@@ -191,7 +222,6 @@ acpi_ev_fixed_event_initialize (
        return (AE_OK);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ev_fixed_event_detect
@@ -200,33 +230,31 @@ acpi_ev_fixed_event_initialize (
  *
  * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
  *
- * DESCRIPTION: Checks the PM status register for fixed events
+ * DESCRIPTION: Checks the PM status register for active fixed events
  *
  ******************************************************************************/
 
-u32
-acpi_ev_fixed_event_detect (
-       void)
+u32 acpi_ev_fixed_event_detect(void)
 {
-       u32                             int_status = ACPI_INTERRUPT_NOT_HANDLED;
-       u32                             fixed_status;
-       u32                             fixed_enable;
-       acpi_native_uint                i;
-
-
-       ACPI_FUNCTION_NAME ("ev_fixed_event_detect");
+       u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
+       u32 fixed_status;
+       u32 fixed_enable;
+       acpi_native_uint i;
 
+       ACPI_FUNCTION_NAME("ev_fixed_event_detect");
 
        /*
         * Read the fixed feature status and enable registers, as all the cases
         * depend on their values.  Ignore errors here.
         */
-       (void) acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, &fixed_status);
-       (void) acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
+       (void)acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK,
+                                   ACPI_REGISTER_PM1_STATUS, &fixed_status);
+       (void)acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK,
+                                   ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
 
-       ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
-               "Fixed Event Block: Enable %08X Status %08X\n",
-               fixed_enable, fixed_status));
+       ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
+                         "Fixed Event Block: Enable %08X Status %08X\n",
+                         fixed_enable, fixed_status));
 
        /*
         * Check for all possible Fixed Events and dispatch those that are active
@@ -234,18 +262,19 @@ acpi_ev_fixed_event_detect (
        for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
                /* Both the status and enable bits must be on for this event */
 
-               if ((fixed_status & acpi_gbl_fixed_event_info[i].status_bit_mask) &&
-                       (fixed_enable & acpi_gbl_fixed_event_info[i].enable_bit_mask)) {
+               if ((fixed_status & acpi_gbl_fixed_event_info[i].
+                    status_bit_mask)
+                   && (fixed_enable & acpi_gbl_fixed_event_info[i].
+                       enable_bit_mask)) {
                        /* Found an active (signalled) event */
 
-                       int_status |= acpi_ev_fixed_event_dispatch ((u32) i);
+                       int_status |= acpi_ev_fixed_event_dispatch((u32) i);
                }
        }
 
        return (int_status);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ev_fixed_event_dispatch
@@ -259,39 +288,34 @@ acpi_ev_fixed_event_detect (
  *
  ******************************************************************************/
 
-u32
-acpi_ev_fixed_event_dispatch (
-       u32                             event)
+static u32 acpi_ev_fixed_event_dispatch(u32 event)
 {
 
-
-       ACPI_FUNCTION_ENTRY ();
-
+       ACPI_FUNCTION_ENTRY();
 
        /* Clear the status bit */
 
-       (void) acpi_set_register (acpi_gbl_fixed_event_info[event].status_register_id,
-                        1, ACPI_MTX_DO_NOT_LOCK);
+       (void)acpi_set_register(acpi_gbl_fixed_event_info[event].
+                               status_register_id, 1, ACPI_MTX_DO_NOT_LOCK);
 
        /*
         * Make sure we've got a handler.  If not, report an error.
         * The event is disabled to prevent further interrupts.
         */
        if (NULL == acpi_gbl_fixed_event_handlers[event].handler) {
-               (void) acpi_set_register (acpi_gbl_fixed_event_info[event].enable_register_id,
-                               0, ACPI_MTX_DO_NOT_LOCK);
+               (void)acpi_set_register(acpi_gbl_fixed_event_info[event].
+                                       enable_register_id, 0,
+                                       ACPI_MTX_DO_NOT_LOCK);
 
-               ACPI_REPORT_ERROR (
-                       ("No installed handler for fixed event [%08X]\n",
-                       event));
+               ACPI_ERROR((AE_INFO,
+                           "No installed handler for fixed event [%08X]",
+                           event));
 
                return (ACPI_INTERRUPT_NOT_HANDLED);
        }
 
        /* Invoke the Fixed Event handler */
 
-       return ((acpi_gbl_fixed_event_handlers[event].handler)(
-                         acpi_gbl_fixed_event_handlers[event].context));
+       return ((acpi_gbl_fixed_event_handlers[event].
+                handler) (acpi_gbl_fixed_event_handlers[event].context));
 }
-
-