File p_xorg_acpi.diff of Package xorg-x11-server
Index: hw/xfree86/os-support/linux/lnx_acpi.c
===================================================================
--- hw/xfree86/os-support/linux/lnx_acpi.c.orig
+++ 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 @@ lnxACPIReopen(OsTimerPtr timer, CARD32 t
#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,16 +145,13 @@ lnxACPIConfirmEventToOs(int fd, pmEvent
}
}
-PMClose
-lnxACPIOpen(void)
+static PMClose
+doLnxACPIOpen(void)
{
int fd;
struct sockaddr_un addr;
int r = -1;
-#ifdef DEBUG
- ErrorF("ACPI: OSPMOpen called\n");
-#endif
if (ACPIihPtr || !xf86Info.pmFlag)
return NULL;
@@ -164,6 +179,27 @@ lnxACPIOpen(void)
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)
{
@@ -177,5 +213,11 @@ lnxCloseACPI(void)
shutdown(fd, 2);
close(fd);
ACPIihPtr = NULL;
+ xf86PMGetEventFromOs = NULL;
+ xf86PMConfirmEventToOs = NULL;
+ if (acpiTimer) {
+ TimerCancel(acpiTimer);
+ acpiTimer = NULL;
+ }
}
}
Index: hw/xfree86/os-support/linux/lnx_apm.c
===================================================================
--- hw/xfree86/os-support/linux/lnx_apm.c.orig
+++ 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
@@ -150,6 +151,14 @@ xf86OSPMOpen(void)
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;
}