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