diff -Nru /usr/local/cvsup-stable/src/sys/conf/files /usr/src/sys/conf/files
--- /usr/local/cvsup-stable/src/sys/conf/files	Fri Oct 20 23:28:50 2006
+++ /usr/src/sys/conf/files	Tue Jul 24 18:09:41 2007
@@ -997,6 +997,7 @@
 dev/usb/usbdi.c			optional usb
 dev/usb/usbdi_util.c		optional usb
 dev/usb/uscanner.c		optional uscanner
+dev/usb/uberry.c		optional uberry
 dev/usb/uvisor.c		optional uvisor ucom
 dev/usb/uvscom.c		optional uvscom ucom
 dev/utopia/idtphy.c		optional utopia
diff -Nru /usr/local/cvsup-stable/src/sys/dev/usb/uberry.c /usr/src/sys/dev/usb/uberry.c
--- /usr/local/cvsup-stable/src/sys/dev/usb/uberry.c	Wed Dec 31 17:00:00 1969
+++ /usr/src/sys/dev/usb/uberry.c	Mon Jul 30 15:31:29 2007
@@ -0,0 +1,217 @@
+/*	$OpenBSD: uberry.c,v 1.10 2007/06/14 10:11:15 mbalmer Exp $	*/
+
+/*-
+ * Copyright (c) 2006 Theo de Raadt <deraadt@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * 2007/7/30  added support for the new devices 8800 and 8100 Pearl (Kirk Davis)
+ * 2007/7/26  Initial port from OpenBSD to FreeBSD and cleanup (Kirk Davis)
+ */
+
+
+#include <sys/param.h>
+#include <sys/sockio.h>
+#include <sys/sysctl.h>
+#include <sys/mbuf.h>
+#include <sys/kernel.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/timeout.h>
+#endif
+#include <sys/conf.h>
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/device.h>
+
+#include <machine/bus.h>
+#include <machine/endian.h>
+#include <machine/intr.h>
+#elif defined(__FreeBSD__)
+#include <sys/ioccom.h>
+#include <sys/filio.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/endian.h>
+#endif
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <dev/usb/usbdevs.h>
+#elif defined(__FreeBSD__)
+#include "usbdevs.h"
+#endif 
+
+struct uberry_softc {
+#if defined(__FreeBSD__)
+	USBBASEDEVICE 			sc_dev;
+#else
+	struct device			sc_dev;
+#endif
+	usbd_device_handle		sc_udev;
+	usbd_interface_handle		sc_iface;
+#if defined(__FreeBSD__)
+	struct cdev *sc_dev_t;
+#endif
+};
+
+#define UBERRY_CONFIG_NO		1
+
+struct usb_devno const uberry_devices[] = {
+	{ USB_VENDOR_RIM, USB_PRODUCT_RIM_BLACKBERRY },
+	{ USB_VENDOR_RIM, USB_PRODUCT_RIM_PEARL }
+};
+
+#if defined(__OpenBSD__) || defined(__NetBSD__)
+int uberry_activate(struct device *, enum devact); 
+
+struct cfdriver uberry_cd = { 
+	NULL, "uberry", DV_DULL 
+}; 
+
+const struct cfattach uberry_ca = { 
+	sizeof(struct uberry_softc), 
+	uberry_match, 
+	uberry_attach, 
+	uberry_detach, 
+	uberry_activate, 
+};
+#endif 
+
+static void do_charge(struct uberry_softc *sc);
+static void pearl_mode(struct uberry_softc *sc);
+
+USB_DECLARE_DRIVER(uberry);
+
+USB_MATCH(uberry)
+{
+	USB_MATCH_START(uberry, uaa);
+
+	if (uaa->iface != NULL)
+		return UMATCH_NONE;
+
+	return (usb_lookup(uberry_devices, uaa->vendor, uaa->product) != NULL) ?
+	    UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
+}
+
+USB_ATTACH(uberry)
+{
+	USB_ATTACH_START(uberry, sc, uaa);
+	char devinfo[1024];
+
+        sc->sc_udev = uaa->device;
+	usb_device_descriptor_t *dd;
+
+        usbd_devinfo(sc->sc_udev, 0, devinfo);
+
+        USB_ATTACH_SETUP;
+
+	dd = usbd_get_device_descriptor(uaa->device);	
+
+	printf("\n%s: %s\n", USBDEVNAME(sc->sc_dev), devinfo);
+	if ( UGETW(dd->idProduct) == USB_PRODUCT_RIM_PEARL ) {
+		(void) do_charge(sc);
+		printf("%s: Charging enabled\n", USBDEVNAME(sc->sc_dev));
+		pearl_mode(sc);
+	} else {
+
+		(void) do_charge(sc);
+		printf("%s: Charging enabled\n", USBDEVNAME(sc->sc_dev));
+	}
+
+	/* Enable the device, then it cannot idle, and will charge */
+	if (usbd_set_config_no(sc->sc_udev, UBERRY_CONFIG_NO, 1) != 0) {
+		printf("%s: could not set configuration no\n", 
+			USBDEVNAME(sc->sc_dev));
+		USB_ATTACH_ERROR_RETURN;
+	}
+
+	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev,
+	    USBDEV(sc->sc_dev));
+	USB_ATTACH_SUCCESS_RETURN;
+}
+
+
+USB_DETACH(uberry)
+{
+	USB_DETACH_START(uberry, sc);
+
+	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev,
+	    USBDEV(sc->sc_dev));
+
+	return (0);
+}
+
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+int
+uberry_activate(struct device *self, enum devact act)
+{
+	switch (act) {
+	case DVACT_ACTIVATE:
+		break;
+
+	case DVACT_DEACTIVATE:
+		break;
+	}
+	return 0;
+}
+#endif
+
+void
+pearl_mode(struct uberry_softc *sc)
+{
+	usb_device_request_t req;
+	char buffer[256];
+
+	req.bmRequestType = UT_READ_VENDOR_DEVICE;
+	req.bRequest = 0xa9;
+	USETW(req.wValue, 1);
+	USETW(req.wIndex, 1);
+	USETW(req.wLength, 2);
+	(void) usbd_do_request(sc->sc_udev, &req, &buffer);
+
+}
+
+void 
+do_charge(struct uberry_softc *sc)
+{
+	usb_device_request_t req;
+	char buffer[256];
+
+	req.bmRequestType = UT_READ_VENDOR_DEVICE;
+	req.bRequest = 0xa5;
+	USETW(req.wValue, 0);
+	USETW(req.wIndex, 1);
+	USETW(req.wLength, 2);
+	(void) usbd_do_request(sc->sc_udev, &req, &buffer);
+
+	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
+	req.bRequest = 0xa2;
+	USETW(req.wValue, 0);
+	USETW(req.wIndex, 1);
+	USETW(req.wLength, 0);
+	(void) usbd_do_request(sc->sc_udev, &req, &buffer);
+
+}
+
+	
+
+#if defined(__FreeBSD__)
+DRIVER_MODULE(uberry, uhub, uberry_driver, uberry_devclass, usbd_driver_load, 0);
+#endif
+
diff -Nru /usr/local/cvsup-stable/src/sys/dev/usb/usbdevs /usr/src/sys/dev/usb/usbdevs
--- /usr/local/cvsup-stable/src/sys/dev/usb/usbdevs	Tue Nov 14 05:54:38 2006
+++ /usr/src/sys/dev/usb/usbdevs	Tue Jul 24 19:52:12 2007
@@ -487,6 +487,7 @@
 vendor EGALAX		0x0eef	eGalax
 vendor MICROTUNE	0x0f4d	Microtune
 vendor VTECH		0x0f88	VTech
+vendor RIM		0x0fca	Research In Motion
 vendor QUALCOMM2	0x1004	Qualcomm
 vendor GIGABYTE		0x1044	GIGABYTE
 vendor WESTERN		0x1058	Western Digital
@@ -1451,6 +1452,10 @@
 
 /* ReakTek products */
 product REALTEK USBKR100	0x8150	USBKR100 USB Ethernet (GREEN HOUSE)
+
+/* Research In Motion products */
+product RIM BLACKBERRY		0x0001  Blackberry
+product RIM PEARL		0x0006  Blackberry pearl
 
 /* Roland products */
 product ROLAND UM1		0x0009	UM-1 MIDI I/F
diff -Nru /usr/local/cvsup-stable/src/sys/modules/Makefile /usr/src/sys/modules/Makefile
--- /usr/local/cvsup-stable/src/sys/modules/Makefile	Mon Sep  4 00:14:57 2006
+++ /usr/src/sys/modules/Makefile	Tue Jul 24 18:14:25 2007
@@ -272,6 +272,7 @@
 	urio \
 	usb \
 	uscanner \
+	uberry \
 	utopia \
 	uvisor \
 	uvscom \
diff -Nru /usr/local/cvsup-stable/src/sys/modules/uberry/Makefile /usr/src/sys/modules/uberry/Makefile
--- /usr/local/cvsup-stable/src/sys/modules/uberry/Makefile	Wed Dec 31 17:00:00 1969
+++ /usr/src/sys/modules/uberry/Makefile	Tue Jul 24 18:14:54 2007
@@ -0,0 +1,8 @@
+# $FreeBSD: $
+
+.PATH: ${.CURDIR}/../../dev/usb
+
+KMOD=	uberry
+SRCS=	uberry.c opt_usb.h device_if.h bus_if.h usbdevs.h
+
+.include <bsd.kmod.mk>
