summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2006-06-17 16:27:59 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2006-06-17 16:27:59 +0000
commita2aeb9f207e15e74bc8f59dfc7c1ac40dcaafb56 (patch)
tree57bf5feb15feb4abe50ef9017110c9dc5ba576b8
parentd182f8bedd433d1d257136760201058f477d599e (diff)
Recent Powerbook systems have their on-board keyboard and mouse devices
also showing up as usb devices, but both devices are tied. To make things less confusing, do not attach the usb phantoms at all.
-rw-r--r--sys/arch/macppc/macppc/ofw_machdep.c27
-rw-r--r--sys/dev/usb/ugen.c18
-rw-r--r--sys/dev/usb/uhidev.c15
3 files changed, 51 insertions, 9 deletions
diff --git a/sys/arch/macppc/macppc/ofw_machdep.c b/sys/arch/macppc/macppc/ofw_machdep.c
index 08849e59c26..35500d8a185 100644
--- a/sys/arch/macppc/macppc/ofw_machdep.c
+++ b/sys/arch/macppc/macppc/ofw_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ofw_machdep.c,v 1.30 2006/02/12 16:50:13 miod Exp $ */
+/* $OpenBSD: ofw_machdep.c,v 1.31 2006/06/17 16:27:55 miod Exp $ */
/* $NetBSD: ofw_machdep.c,v 1.1 1996/09/30 16:34:50 ws Exp $ */
/*
@@ -57,6 +57,7 @@
#include "zstty.h"
#include <dev/usb/ukbdvar.h>
#include <dev/adb/akbdvar.h>
+#include <dev/usb/usbdevs.h>
/* XXX, called from asm */
int save_ofw_mapping(void);
@@ -243,7 +244,6 @@ ofwconprobe()
#define DEVTREE_UNKNOWN 0
#define DEVTREE_USB 1
#define DEVTREE_ADB 2
-#define DEVTREE_HID 3
int ofw_devtree = DEVTREE_UNKNOWN;
#define OFW_HAVE_USBKBD 1
@@ -260,6 +260,7 @@ ofw_recurse_keyboard(int pnode)
int old_devtree;
int len;
int node;
+ int vendor, product;
for (node = OF_child(pnode); node != 0; node = OF_peer(node)) {
@@ -270,7 +271,23 @@ ofw_recurse_keyboard(int pnode)
if (strcmp(name, "keyboard") == 0) {
/* found a keyboard node, where is it? */
if (ofw_devtree == DEVTREE_USB) {
- ofw_have_kbd |= OFW_HAVE_USBKBD;
+ /*
+ * On some machines, such as PowerBook6,8,
+ * the built-in ADB keyboard and mouse also
+ * appears as an USB device, which we will
+ * ignore.
+ * We need to tell these shadow devices apart
+ * from regular external USB keyboards.
+ */
+ if (OF_getprop(pnode, "vendor-id", &vendor,
+ sizeof vendor) != sizeof vendor)
+ vendor = 0;
+ if (OF_getprop(pnode, "product-id", &product,
+ sizeof product) != sizeof product)
+ product = 0;
+ if (vendor != USB_VENDOR_APPLE ||
+ product != USB_PRODUCT_APPLE_ADB)
+ ofw_have_kbd |= OFW_HAVE_USBKBD;
} else if (ofw_devtree == DEVTREE_ADB) {
ofw_have_kbd |= OFW_HAVE_ADBKBD;
} else {
@@ -319,12 +336,12 @@ ofw_find_keyboard()
#endif
}
- if (ofw_have_kbd == (OFW_HAVE_USBKBD|OFW_HAVE_ADBKBD)) {
+ if (ofw_have_kbd == (OFW_HAVE_USBKBD | OFW_HAVE_ADBKBD)) {
#if NUKBD > 0
printf("USB and ADB found, using USB\n");
ukbd_cnattach();
#else
- ofw_have_kbd = OFW_HAVE_ADBKBD; /* ??? */
+ ofw_have_kbd = OFW_HAVE_ADBKBD;
#endif
}
if (ofw_have_kbd == OFW_HAVE_USBKBD) {
diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c
index 9bcc875d770..d0a0df2db9a 100644
--- a/sys/dev/usb/ugen.c
+++ b/sys/dev/usb/ugen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ugen.c,v 1.33 2005/11/21 18:16:43 millert Exp $ */
+/* $OpenBSD: ugen.c,v 1.34 2006/06/17 16:27:58 miod Exp $ */
/* $NetBSD: ugen.c,v 1.63 2002/11/26 18:49:48 christos Exp $ */
/* $FreeBSD: src/sys/dev/usb/ugen.c,v 1.26 1999/11/17 22:33:41 n_hibma Exp $ */
@@ -66,6 +66,7 @@
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
+#include <dev/usb/usbdevs.h>
#ifdef UGEN_DEBUG
#define DPRINTF(x) do { if (ugendebug) logprintf x; } while (0)
@@ -189,9 +190,20 @@ USB_MATCH(ugen)
if (uaa->matchlvl)
return (uaa->matchlvl);
#endif
- if (uaa->usegeneric)
+ if (uaa->usegeneric) {
+#ifdef __macppc__
+ /*
+ * Some Apple laptops have USB phantom devices which match
+ * the ADB devices. We want to ignore them to avoid
+ * confusing users, as the real hardware underneath is adb
+ * and has already attached.
+ */
+ if (uaa->vendor == USB_VENDOR_APPLE &&
+ uaa->product == USB_PRODUCT_APPLE_ADB)
+ return (UMATCH_NONE);
+#endif
return (UMATCH_GENERIC);
- else
+ } else
return (UMATCH_NONE);
}
diff --git a/sys/dev/usb/uhidev.c b/sys/dev/usb/uhidev.c
index ef45c247404..d6ff3465b56 100644
--- a/sys/dev/usb/uhidev.c
+++ b/sys/dev/usb/uhidev.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uhidev.c,v 1.14 2006/05/14 12:00:04 matthieu Exp $ */
+/* $OpenBSD: uhidev.c,v 1.15 2006/06/17 16:27:58 miod Exp $ */
/* $NetBSD: uhidev.c,v 1.14 2003/03/11 16:44:00 augustss Exp $ */
/*
@@ -100,6 +100,19 @@ USB_MATCH(uhidev)
return (UMATCH_NONE);
if (uaa->matchlvl)
return (uaa->matchlvl);
+
+#ifdef __macppc__
+ /*
+ * Some Apple laptops have USB phantom devices which match
+ * the ADB devices. We want to ignore them to avoid
+ * confusing users, as the real hardware underneath is adb
+ * and has already attached.
+ */
+ if (uaa->vendor == USB_VENDOR_APPLE &&
+ uaa->product == USB_PRODUCT_APPLE_ADB)
+ return (UMATCH_NONE);
+#endif
+
return (UMATCH_IFACECLASS_GENERIC);
}