Index: hw/xfree86/os-support/linux/lnx_acpi.c ================================================================================ --- hw/xfree86/os-support/linux/lnx_acpi.c +++ hw/xfree86/os-support/linux/lnx_acpi.c @@ -32,8 +32,10 @@ #define ACPI_VIDEO_HEAD_INVALID (~0u - 1) #define ACPI_VIDEO_HEAD_END (~0u) +static PMClose doLnxACPIOpen(void); static void lnxCloseACPI(void); static pointer ACPIihPtr = NULL; +static OsTimerPtr acpiTimer = NULL; PMClose lnxACPIOpen(void); /* in milliseconds */ @@ -52,6 +54,22 @@ #define LINE_LENGTH 80 +static CARD32 +lnxACPICheckTimer(OsTimerPtr timer, CARD32 now, pointer arg) +{ +#if DEBUG + ErrorF("ACPI: trying to reopen\n"); +#endif + if (doLnxACPIOpen()) { +#if DEBUG + ErrorF("ACPI: successfully reopened\n"); +#endif + acpiTimer = NULL; + return 0; + } + return 5000; +} + static int lnxACPIGetEventFromOs(int fd, pmEvent *events, int num) { @@ -127,15 +145,14 @@ } } -PMClose -lnxACPIOpen(void) +static PMClose +doLnxACPIOpen(void) { int fd; struct sockaddr_un addr; int r = -1; static int warned = 0; - DebugF("ACPI: OSPMOpen called\n"); if (ACPIihPtr || !xf86Info.pmFlag) return NULL; @@ -164,6 +181,27 @@ return lnxCloseACPI; } +PMClose +lnxACPIPoll(void) +{ + TimerSet(NULL, 0, 5000, lnxACPICheckTimer, NULL); + return lnxCloseACPI; +} + +PMClose +lnxACPIOpen(void) +{ + PMClose ret; +#ifdef DEBUG + ErrorF("ACPI: OSPMOpen called\n"); +#endif + if (!(ret = doLnxACPIOpen())) + xf86MsgVerb(X_WARNING,3,"Open ACPI failed (%s) (%s)\n", ACPI_SOCKET, + strerror(errno)); + + return ret; +} + static void lnxCloseACPI(void) { @@ -175,5 +213,11 @@ shutdown(fd, 2); close(fd); ACPIihPtr = NULL; + xf86PMGetEventFromOs = NULL; + xf86PMConfirmEventToOs = NULL; + if (acpiTimer) { + TimerCancel(acpiTimer); + acpiTimer = NULL; + } } } --- hw/xfree86/os-support/linux/lnx_apm.c +++ hw/xfree86/os-support/linux/lnx_apm.c @@ -12,6 +12,7 @@ #ifdef HAVE_ACPI extern PMClose lnxACPIOpen(void); +extern PMClose lnxACPIPoll(void); #endif #ifdef HAVE_APM @@ -149,6 +150,14 @@ ret = lnxAPMOpen(); #endif +#ifdef HAVE_ACPI + /* if we can neither open ACPI nor APM poll for an ACPI service to + become available */ + + if (!ret && !xf86acpiDisableFlag) + ret = lnxACPIPoll(); +#endif + return ret; }