[Pommed-commits] r310 - trunk/pommed

Julien Blache jblache at alioth.debian.org
Fri Apr 20 13:46:31 UTC 2007


Author: jblache
Date: 2007-04-20 13:46:31 +0000 (Fri, 20 Apr 2007)
New Revision: 310

Modified:
   trunk/pommed/evdev.c
Log:
Keep track of the event devices we use so we can try (harder) to reopen them after suspend.


Modified: trunk/pommed/evdev.c
===================================================================
--- trunk/pommed/evdev.c	2007-04-15 16:51:36 UTC (rev 309)
+++ trunk/pommed/evdev.c	2007-04-20 13:46:31 UTC (rev 310)
@@ -56,6 +56,19 @@
 #endif
 
 
+#define EVDEV_ADB_KBD       (1 << 0)
+#define EVDEV_ADB_BUTTONS   (1 << 1)
+#define EVDEV_USB_KBD1      (1 << 2)
+#define EVDEV_USB_KBD2      (1 << 3)
+#define EVDEV_APPLEIR       (1 << 5)
+#define EVDEV_MOUSEEMU      (1 << 6)
+#define EVDEV_SW_LID        (1 << 7)
+
+#define EVDEV_NO_EVDEV      0
+
+static unsigned int evdevs;
+
+
 void
 evdev_process_events(int fd)
 {
@@ -200,8 +213,19 @@
   if (id[ID_VENDOR] != 0x0001)
     return 0;
 
-  return ((product == ADB_PRODUCT_ID_KEYBOARD)
-	  || (product == ADB_PRODUCT_ID_PBBUTTONS));
+  if (product == ADB_PRODUCT_ID_KEYBOARD)
+    {
+      evdevs |= EVDEV_ADB_KBD;
+      return 1;
+    }
+
+  if (product == ADB_PRODUCT_ID_PBBUTTONS)
+    {
+      evdevs |= EVDEV_ADB_BUTTONS;
+      return 1;
+    }
+
+  return 0;
 }
 
 /* PowerBook G4 */
@@ -216,9 +240,19 @@
   if (id[ID_VENDOR] != USB_VENDOR_ID_APPLE)
     return 0;
 
-  return ((product == USB_PRODUCT_ID_FOUNTAIN_ANSI)
-	  || (product == USB_PRODUCT_ID_FOUNTAIN_ISO)
-	  || (product == USB_PRODUCT_ID_FOUNTAIN_JIS));
+  if ((product == USB_PRODUCT_ID_FOUNTAIN_ANSI)
+      || (product == USB_PRODUCT_ID_FOUNTAIN_ISO)
+      || (product == USB_PRODUCT_ID_FOUNTAIN_JIS))
+    {
+      if (evdevs & EVDEV_USB_KBD1)
+	evdevs |= EVDEV_USB_KBD2;
+      else
+	evdevs |= EVDEV_USB_KBD1;
+
+      return 1;
+    }
+
+  return 0;
 }
 
 /* PMU Lid switch */
@@ -236,7 +270,13 @@
   if (id[ID_VERSION] != 0x0100)
     return 0;
 
-  return (product == 0x0001);
+  if (product == 0x0001)
+    {
+      evdevs |= EVDEV_SW_LID;
+      return 1;
+    }
+
+  return 0;
 }
 
 #else
@@ -253,9 +293,19 @@
   if (id[ID_VENDOR] != USB_VENDOR_ID_APPLE)
     return 0;
 
-  return ((product == USB_PRODUCT_ID_GEYSER3_ANSI)
-	  || (product == USB_PRODUCT_ID_GEYSER3_ISO)
-	  || (product == USB_PRODUCT_ID_GEYSER3_JIS));
+  if ((product == USB_PRODUCT_ID_GEYSER3_ANSI)
+      || (product == USB_PRODUCT_ID_GEYSER3_ISO)
+      || (product == USB_PRODUCT_ID_GEYSER3_JIS))
+    {
+      if (evdevs & EVDEV_USB_KBD1)
+	evdevs |= EVDEV_USB_KBD2;
+      else
+	evdevs |= EVDEV_USB_KBD1;
+
+      return 1;
+    }
+
+  return 0;
 }
 
 /* Core2 Duo MacBook & MacBook Pro */
@@ -270,9 +320,19 @@
   if (id[ID_VENDOR] != USB_VENDOR_ID_APPLE)
     return 0;
 
-  return ((product == USB_PRODUCT_ID_GEYSER4_ANSI)
-	  || (product == USB_PRODUCT_ID_GEYSER4_ISO)
-	  || (product == USB_PRODUCT_ID_GEYSER4_JIS));
+  if ((product == USB_PRODUCT_ID_GEYSER4_ANSI)
+      || (product == USB_PRODUCT_ID_GEYSER4_ISO)
+      || (product == USB_PRODUCT_ID_GEYSER4_JIS))
+    {
+      if (evdevs & EVDEV_USB_KBD1)
+	evdevs |= EVDEV_USB_KBD2;
+      else
+	evdevs |= EVDEV_USB_KBD1;
+
+      return 1;
+    }
+
+  return 0;
 }
 
 /* Apple Remote IR Receiver */
@@ -287,7 +347,13 @@
   if (id[ID_VENDOR] != USB_VENDOR_ID_APPLE)
     return 0;
 
-  return (product == USB_PRODUCT_ID_APPLEIR);
+  if (product == USB_PRODUCT_ID_APPLEIR)
+    {
+      evdevs |= EVDEV_APPLEIR;
+      return 1;
+    }
+
+  return 0;
 }
 
 /* ACPI Lid switch */
@@ -302,7 +368,13 @@
   if (id[ID_VENDOR] != 0)
     return 0;
 
-  return (product == 0x0005);
+  if (product == 0x0005)
+    {
+      evdevs |= EVDEV_SW_LID;
+      return 1;
+    }
+
+  return 0;
 }
 #endif /* !__powerpc__ */
 
@@ -318,7 +390,13 @@
   if (id[ID_VENDOR] != 0x001f)
     return 0;
 
-  return (product == 0x001f);
+  if (product == 0x001f)
+    {
+      evdevs |= EVDEV_MOUSEEMU;
+      return 1;
+    }
+
+  return 0;
 }
 
 
@@ -336,6 +414,8 @@
   char devname[256];
   char evdev[32];
 
+  evdevs = EVDEV_NO_EVDEV;
+
   for (i = 0; i < EVDEV_MAX; i++)
     {
       ret = snprintf(evdev, 32, "%s%d", EVDEV_BASE, i);
@@ -459,22 +539,32 @@
 evdev_reopen(struct pollfd **fds, int nfds)
 {
   int i;
+  unsigned int prev_evdevs = evdevs;
 
   evdev_close(fds, nfds);
 
+  logdebug("Previous event devices: 0x%04x\n", prev_evdevs);
+
   /* When resuming, we need to reopen event devices which
    * disappear at suspend time. We need to wait for udev to
    * recreate the device nodes.
-   * Wait for up to 12 seconds, 24 * 0.5 seconds
    */
-  for (i = 0; i < 24; i++)
+  for (i = 0; i < 50; i++)
     {
       usleep(500000);
 
       nfds = evdev_open(fds);
 
       if (nfds > 0)
-	break;
+	{
+	  logdebug("Got event devices 0x%04x at iteration %d\n", prev_evdevs, i);
+
+	  if (evdevs == prev_evdevs)
+	    break;
+
+	  /* We haven't got all the event devices we need */
+	  evdev_close(fds, nfds);
+	}
     }
 
   return nfds;




More information about the Pommed-commits mailing list