Index: acpica/OsdInterrupt.c
===================================================================
RCS file: /usr/cvs/thinit/src/sys/dev.acpi/acpica/OsdInterrupt.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- acpica/OsdInterrupt.c       19 Mar 2010 16:48:13 -0000      1.1
+++ acpica/OsdInterrupt.c       19 Mar 2010 16:53:58 -0000      1.2
@@ -69,9 +69,12 @@
       LIST_ENTRY(acpi_interrupt_handler) aih_list;
       UINT32 aih_intrnum;
       ACPI_OSD_HANDLER aih_func;
+       void *aih_context;
       void *aih_ih;
+       int aih_deferred;
};

+static int pre_acpi_md_callback = 1;
static LIST_HEAD(, acpi_interrupt_handler) acpi_interrupt_list =
    LIST_HEAD_INITIALIZER(&acpi_interrupt_list);

@@ -102,6 +105,15 @@

       aih->aih_intrnum = InterruptNumber;
       aih->aih_func = ServiceRoutine;
+       aih->aih_context = Context;
+       aih->aih_deferred = pre_acpi_md_callback;
+
+       if (pre_acpi_md_callback) {
+               mutex_enter(&acpi_interrupt_list_mtx);
+               LIST_INSERT_HEAD(&acpi_interrupt_list, aih, aih_list);
+               mutex_exit(&acpi_interrupt_list_mtx);
+               return AE_OK;
+       }

       rv = acpi_md_OsInstallInterruptHandler(InterruptNumber,
           ServiceRoutine, Context, &aih->aih_ih);
@@ -115,6 +127,27 @@
       return_ACPI_STATUS(rv);
}

+void
+acpi_mi_callback(void)
+{
+       struct acpi_interrupt_handler *aih;
+       ACPI_STATUS rv;
+
+       mutex_enter(&acpi_interrupt_list_mtx);
+
+       LIST_FOREACH(aih, &acpi_interrupt_list, aih_list) {
+               rv = acpi_md_OsInstallInterruptHandler(aih->aih_intrnum,
+                   aih->aih_func, aih->aih_context, &aih->aih_ih);
+               if (rv != AE_OK)
+                       panic("Unable to setup deferred ACPI interrupt");
+               aih->aih_deferred = 0;
+       }
+
+       pre_acpi_md_callback = 0;
+
+       mutex_exit(&acpi_interrupt_list_mtx);
+}
+
/*
 * AcpiOsRemoveInterruptHandler:
 *
@@ -139,7 +172,8 @@
                   aih->aih_func == ServiceRoutine) {
                       LIST_REMOVE(aih, aih_list);
                       mutex_exit(&acpi_interrupt_list_mtx);
-                       acpi_md_OsRemoveInterruptHandler(aih->aih_ih);
+                       if (aih->aih_deferred == 0)
+                               acpi_md_OsRemoveInterruptHandler(aih->aih_ih);
                       free(aih, M_ACPI);
                       return_ACPI_STATUS(AE_OK);
               }
Index: acpi.c
===================================================================
RCS file: /usr/cvs/thinit/src/sys/dev.acpi/acpi.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- acpi.c      19 Mar 2010 16:53:34 -0000      1.4
+++ acpi.c      19 Mar 2010 16:53:58 -0000      1.5
@@ -456,22 +456,7 @@
               acpi_osd_debugger();
#endif

-#define ACPI_ENABLE_PHASE1 \
-    (ACPI_NO_HANDLER_INIT | ACPI_NO_EVENT_INIT)
-#define ACPI_ENABLE_PHASE2 \
-    (ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE | \
-     ACPI_NO_ADDRESS_SPACE_INIT)
-
-       rv = AcpiEnableSubsystem(ACPI_ENABLE_PHASE1);
-       if (ACPI_FAILURE(rv)) {
-               aprint_error_dev(self, "unable to enable ACPI: %s\n",
-                   AcpiFormatException(rv));
-               return;
-       }
-
-       acpi_md_callback();
-
-       rv = AcpiEnableSubsystem(ACPI_ENABLE_PHASE2);
+       rv = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
       if (ACPI_FAILURE(rv)) {
               aprint_error_dev(self, "unable to enable ACPI: %s\n",
                   AcpiFormatException(rv));
@@ -488,6 +473,10 @@
                   AcpiFormatException(rv));
               return;
       }
+
+       acpi_md_callback();
+       acpi_mi_callback();
+
       acpi_active = 1;

       /* Our current state is "awake". */