2 #ifdef HAVE_XORG_CONFIG_H
3 #include <xorg-config.h>
11 #include "xf86_OSproc.h"
14 extern PMClose lnxACPIOpen(void);
19 #include <linux/apm_bios.h>
21 #include <sys/ioctl.h>
22 #include <sys/types.h>
27 #define APM_PROC "/proc/apm"
28 #define APM_DEVICE "/dev/apm_bios"
30 #ifndef APM_STANDBY_FAILED
31 #define APM_STANDBY_FAILED 0xf000
33 #ifndef APM_SUSPEND_FAILED
34 #define APM_SUSPEND_FAILED 0xf001
37 static PMClose lnxAPMOpen(void);
38 static void lnxCloseAPM(void);
39 static void *APMihPtr = NULL;
45 {APM_SYS_STANDBY, XF86_APM_SYS_STANDBY},
46 {APM_SYS_SUSPEND, XF86_APM_SYS_SUSPEND},
47 {APM_NORMAL_RESUME, XF86_APM_NORMAL_RESUME},
48 {APM_CRITICAL_RESUME, XF86_APM_CRITICAL_RESUME},
49 {APM_LOW_BATTERY, XF86_APM_LOW_BATTERY},
50 {APM_POWER_STATUS_CHANGE, XF86_APM_POWER_STATUS_CHANGE},
51 {APM_UPDATE_TIME, XF86_APM_UPDATE_TIME},
52 {APM_CRITICAL_SUSPEND, XF86_APM_CRITICAL_SUSPEND},
53 {APM_USER_STANDBY, XF86_APM_USER_STANDBY},
54 {APM_USER_SUSPEND, XF86_APM_USER_SUSPEND},
55 {APM_STANDBY_RESUME, XF86_APM_STANDBY_RESUME},
56 #if defined(APM_CAPABILITY_CHANGED)
57 {APM_CAPABILITY_CHANGED, XF86_CAPABILITY_CHANGED},
60 {APM_STANDBY_FAILED, XF86_APM_STANDBY_FAILED},
61 {APM_SUSPEND_FAILED, XF86_APM_SUSPEND_FAILED}
65 #define numApmEvents (sizeof(LinuxToXF86) / sizeof(LinuxToXF86[0]))
68 * APM is still under construction.
69 * I'm not sure if the places where I initialize/deinitialize
70 * apm is correct. Also I don't know what to do in SETUP state.
71 * This depends if wakeup gets called in this situation, too.
72 * Also we need to check if the action that is taken on an
73 * event is reasonable.
76 lnxPMGetEventFromOs(int fd, pmEvent * events, int num)
79 apm_event_t linuxEvents[8];
81 if ((n = read(fd, linuxEvents, num * sizeof(apm_event_t))) == -1)
83 n /= sizeof(apm_event_t);
86 for (i = 0; i < n; i++) {
87 for (j = 0; j < numApmEvents; j++)
88 if (LinuxToXF86[j].apmLinux == linuxEvents[i]) {
89 events[i] = LinuxToXF86[j].xf86;
92 if (j == numApmEvents)
93 events[i] = XF86_APM_UNKNOWN;
99 lnxPMConfirmEventToOs(int fd, pmEvent event)
102 case XF86_APM_SYS_STANDBY:
103 case XF86_APM_USER_STANDBY:
104 if (ioctl(fd, APM_IOC_STANDBY, NULL))
107 case XF86_APM_SYS_SUSPEND:
108 case XF86_APM_CRITICAL_SUSPEND:
109 case XF86_APM_USER_SUSPEND:
110 if (ioctl(fd, APM_IOC_SUSPEND, NULL)) {
111 /* I believe this is wrong (EE)
112 EBUSY is sent when a device refuses to be suspended.
113 In this case we still need to undo everything we have
114 done to suspend ourselves or we will stay in suspended
122 case XF86_APM_STANDBY_RESUME:
123 case XF86_APM_NORMAL_RESUME:
124 case XF86_APM_CRITICAL_RESUME:
125 case XF86_APM_STANDBY_FAILED:
126 case XF86_APM_SUSPEND_FAILED:
141 /* Favour ACPI over APM, but only when enabled */
143 if (!xf86acpiDisableFlag)
162 DebugF("APM: OSPMOpen called\n");
163 if (APMihPtr || !xf86Info.pmFlag)
166 DebugF("APM: Opening device\n");
167 if ((fd = open(APM_DEVICE, O_RDWR)) > -1) {
168 if (access(APM_PROC, R_OK) || ((pfd = open(APM_PROC, O_RDONLY)) == -1)) {
169 xf86MsgVerb(X_WARNING, 3, "Cannot open APM (%s) (%s)\n",
170 APM_PROC, strerror(errno));
176 xf86PMGetEventFromOs = lnxPMGetEventFromOs;
177 xf86PMConfirmEventToOs = lnxPMConfirmEventToOs;
178 APMihPtr = xf86AddGeneralHandler(fd, xf86HandlePMEvents, NULL);
179 xf86MsgVerb(X_INFO, 3, "Open APM successful\n");
190 DebugF("APM: Closing device\n");
192 fd = xf86RemoveGeneralHandler(APMihPtr);