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". */
