[PATCH 3/5]:hidbus prototype 070409:usbhid core

"Li Yu" <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
diff -Naurp linux-2.6.21-rc6-mm1.orig/drivers/hid/usbhid/hid-core.c linux-2.6.21-rc6-mm1.new/drivers/hid/usbhid/hid-core.c
--- linux-2.6.21-rc6-mm1.orig/drivers/hid/usbhid/hid-core.c	2007-04-10 09:16:46.000000000 +0800
+++ linux-2.6.21-rc6-mm1.new/drivers/hid/usbhid/hid-core.c	2007-04-15 21:29:31.000000000 +0800
@@ -29,10 +29,6 @@
 
 #include <linux/usb.h>
 
-#include <linux/hid.h>
-#include <linux/hiddev.h>
-#include <linux/hid-debug.h>
-#include <linux/hidraw.h>
 #include "usbhid.h"
 
 /*
@@ -299,6 +295,39 @@ static const struct hid_blacklist {
 	__u32 quirks;
 } hid_blacklist[] = {
 
+	/* the hid-zpff.c will these two devices */
+	{ 0x46d, 0x0005, HID_QUIRK_SKIP },
+	{ 0xc12, 0x0030, HID_QUIRK_SKIP },
+
+	/* the hid-tmff.c will handle this */
+	{ 0x044f, 0xb304, HID_QUIRK_SKIP },
+	
+	/* the hid-plff.c will handle this */
+	{ 0x0810, 0x0001, HID_QUIRK_SKIP },
+
+	/* the hid-lgff.c will handle follow these five devices */
+	{ USB_VENDOR_ID_LOGITECH, 0xc221, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_LOGITECH, 0xc219, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_LOGITECH, 0xc283, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_LOGITECH, 0xc294, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_LOGITECH, 0xc295, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_LOGITECH, 0xca03, HID_QUIRK_SKIP },
+
+	/* the hid-pb.c will handle these thirteen devices */
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_SKIP },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_SKIP },
+
 	{ USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
 	{ USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
 
@@ -306,7 +335,6 @@ static const struct hid_blacklist {
 
 	{ USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
 
-
 	{ USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
 	{ USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
 	{ USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
@@ -462,25 +490,28 @@ static const struct hid_blacklist {
 	{ USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 	{ USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-
 	{ USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
 
 	{ 0, 0 }
 };
 
+static void usbhid_update_busid(struct hid_device *dev)
+{
+	static atomic_t usb_hiddev_idx = ATOMIC_INIT(-1);
+
+	snprintf(dev->device.bus_id, BUS_ID_SIZE, "U:%04x:%04x:%d",
+					le16_to_cpu(dev->vendor),
+					le16_to_cpu(dev->product),
+				atomic_add_return(1, &usb_hiddev_idx));
+}
+
+static inline void usbhid_wake_up(struct hid_device *hid)
+{
+	struct usbhid_device *usbhid = (struct usbhid_device*)hid->tl_data;
+
+	wake_up(&usbhid->wait);
+}
+
 /*
  * Input submission and I/O error handler.
  */
@@ -492,7 +523,7 @@ static int hid_start_in(struct hid_devic
 {
 	unsigned long flags;
 	int rc = 0;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	spin_lock_irqsave(&usbhid->inlock, flags);
 	if (hid->open > 0 && !test_bit(HID_SUSPENDED, &usbhid->iofl) &&
@@ -509,7 +540,9 @@ static int hid_start_in(struct hid_devic
 static void hid_retry_timeout(unsigned long _hid)
 {
 	struct hid_device *hid = (struct hid_device *) _hid;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
+
+	BUG_ON(!usbhid);
 
 	dev_dbg(&usbhid->intf->dev, "retrying intr urb\n");
 	if (hid_start_in(hid))
@@ -564,7 +597,9 @@ static void hid_reset(struct work_struct
 static void hid_io_error(struct hid_device *hid)
 {
 	unsigned long flags;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
+
+	BUG_ON(!usbhid);
 
 	spin_lock_irqsave(&usbhid->inlock, flags);
 
@@ -606,7 +641,7 @@ done:
 static void hid_irq_in(struct urb *urb)
 {
 	struct hid_device	*hid = urb->context;
-	struct usbhid_device 	*usbhid = hid->driver_data;
+	struct usbhid_device 	*usbhid = hid->tl_data;
 	int			status;
 
 	switch (urb->status) {
@@ -653,7 +688,7 @@ static void hid_irq_in(struct urb *urb)
 static int hid_submit_out(struct hid_device *hid)
 {
 	struct hid_report *report;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	report = usbhid->out[usbhid->outtail];
 
@@ -676,7 +711,7 @@ static int hid_submit_ctrl(struct hid_de
 	struct hid_report *report;
 	unsigned char dir;
 	int len;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	report = usbhid->ctrl[usbhid->ctrltail].report;
 	dir = usbhid->ctrl[usbhid->ctrltail].dir;
@@ -727,10 +762,12 @@ static int hid_submit_ctrl(struct hid_de
 static void hid_irq_out(struct urb *urb)
 {
 	struct hid_device *hid = urb->context;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 	unsigned long flags;
 	int unplug = 0;
 
+	BUG_ON(!usbhid);
+
 	switch (urb->status) {
 		case 0:			/* success */
 			break;
@@ -755,7 +792,7 @@ static void hid_irq_out(struct urb *urb)
 	if (usbhid->outhead != usbhid->outtail) {
 		if (hid_submit_out(hid)) {
 			clear_bit(HID_OUT_RUNNING, &usbhid->iofl);
-			wake_up(&hid->wait);
+			usbhid_wake_up(hid);
 		}
 		spin_unlock_irqrestore(&usbhid->outlock, flags);
 		return;
@@ -763,7 +800,7 @@ static void hid_irq_out(struct urb *urb)
 
 	clear_bit(HID_OUT_RUNNING, &usbhid->iofl);
 	spin_unlock_irqrestore(&usbhid->outlock, flags);
-	wake_up(&hid->wait);
+	usbhid_wake_up(hid);
 }
 
 #define USB_VENDOR_ID_BELKIN		0x050d
@@ -776,10 +813,11 @@ static void hid_irq_out(struct urb *urb)
 static void hid_ctrl(struct urb *urb)
 {
 	struct hid_device *hid = urb->context;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 	unsigned long flags;
 	int unplug = 0;
 
+		
 	spin_lock_irqsave(&usbhid->ctrllock, flags);
 
 	switch (urb->status) {
@@ -808,7 +846,7 @@ static void hid_ctrl(struct urb *urb)
 	if (usbhid->ctrlhead != usbhid->ctrltail) {
 		if (hid_submit_ctrl(hid)) {
 			clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
-			wake_up(&hid->wait);
+			usbhid_wake_up(hid);
 		}
 		spin_unlock_irqrestore(&usbhid->ctrllock, flags);
 		return;
@@ -816,14 +854,16 @@ static void hid_ctrl(struct urb *urb)
 
 	clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
 	spin_unlock_irqrestore(&usbhid->ctrllock, flags);
-	wake_up(&hid->wait);
+	usbhid_wake_up(hid);
 }
 
 void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char dir)
 {
 	int head;
 	unsigned long flags;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
+
+	BUG_ON(!usbhid);
 
 	if ((hid->quirks & HID_QUIRK_NOGET) && dir == USB_DIR_IN)
 		return;
@@ -867,6 +907,7 @@ void usbhid_submit_report(struct hid_dev
 
 	spin_unlock_irqrestore(&usbhid->ctrllock, flags);
 }
+EXPORT_SYMBOL_GPL(usbhid_submit_report);
 
 static int usb_hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
 {
@@ -893,9 +934,9 @@ static int usb_hidinput_input_event(stru
 
 int usbhid_wait_io(struct hid_device *hid)
 {
-	struct usbhid_device *usbhid = hid->driver_data;
-
-	if (!wait_event_timeout(hid->wait, (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl) &&
+	struct usbhid_device *usbhid = hid->tl_data;
+	
+	if (!wait_event_timeout(usbhid->wait, (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl) &&
 					!test_bit(HID_OUT_RUNNING, &usbhid->iofl)),
 					10*HZ)) {
 		dbg("timeout waiting for ctrl or out queue to clear");
@@ -904,6 +945,7 @@ int usbhid_wait_io(struct hid_device *hi
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(usbhid_wait_io);
 
 static int hid_set_idle(struct usb_device *dev, int ifnum, int report, int idle)
 {
@@ -935,23 +977,24 @@ int usbhid_open(struct hid_device *hid)
 		hid_io_error(hid);
 	return 0;
 }
+EXPORT_SYMBOL_GPL(usbhid_open);
 
 void usbhid_close(struct hid_device *hid)
 {
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	if (!--hid->open)
 		usb_kill_urb(usbhid->urbin);
 }
+EXPORT_SYMBOL_GPL(usbhid_close);
 
 /*
  * Initialize all reports
  */
-
 void usbhid_init_reports(struct hid_device *hid)
 {
 	struct hid_report *report;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 	int err, ret;
 
 	list_for_each_entry(report, &hid->report_enum[HID_INPUT_REPORT].report_list, list)
@@ -974,6 +1017,7 @@ void usbhid_init_reports(struct hid_devi
 	if (err)
 		warn("timeout initializing reports");
 }
+EXPORT_SYMBOL_GPL(usbhid_init_reports);
 
 /*
  * Reset LEDs which BIOS might have left on. For now, just NumLock (0x01).
@@ -1032,7 +1076,7 @@ static void hid_find_max_report(struct h
 
 static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
 {
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	if (!(usbhid->inbuf = usb_buffer_alloc(dev, usbhid->bufsize, GFP_ATOMIC, &usbhid->inbuf_dma)))
 		return -1;
@@ -1046,9 +1090,9 @@ static int hid_alloc_buffers(struct usb_
 	return 0;
 }
 
-static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t count)
+static int usbhid_raw_report(struct hid_device *hid, __u8 *buf, size_t count)
 {
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 	struct usb_device *dev = hid_to_usb_dev(hid);
 	struct usb_interface *intf = usbhid->intf;
 	struct usb_host_interface *interface = intf->cur_altsetting;
@@ -1070,7 +1114,7 @@ static int usbhid_output_raw_report(stru
 
 static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid)
 {
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	if (usbhid->inbuf)
 		usb_buffer_free(dev, usbhid->bufsize, usbhid->inbuf, usbhid->inbuf_dma);
@@ -1179,7 +1223,6 @@ static struct hid_device *usb_hid_config
 		(interface->desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE))
 			return NULL;
 
-
 	if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) &&
 	    (!interface->desc.bNumEndpoints ||
 	     usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
@@ -1234,8 +1277,9 @@ static struct hid_device *usb_hid_config
 	if (!(usbhid = kzalloc(sizeof(struct usbhid_device), GFP_KERNEL)))
 		goto fail;
 
-	hid->driver_data = usbhid;
+	hid->tl_data = usbhid;
 	usbhid->hid = hid;
+	init_waitqueue_head(&usbhid->wait);
 
 	usbhid->bufsize = HID_MIN_BUFFER_SIZE;
 	hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize);
@@ -1299,8 +1343,6 @@ static struct hid_device *usb_hid_config
 		goto fail;
 	}
 
-	init_waitqueue_head(&hid->wait);
-
 	INIT_WORK(&usbhid->reset_work, hid_reset);
 	setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
 
@@ -1353,14 +1395,6 @@ static struct hid_device *usb_hid_config
 	usbhid->urbctrl->setup_dma = usbhid->cr_dma;
 	usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
 	usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
-	hid->hidinput_input_event = usb_hidinput_input_event;
-	hid->hid_open = usbhid_open;
-	hid->hid_close = usbhid_close;
-#ifdef CONFIG_USB_HIDDEV
-	hid->hiddev_hid_event = hiddev_hid_event;
-	hid->hiddev_report_event = hiddev_report_event;
-#endif
-	hid->hid_output_raw_report = usbhid_output_raw_report;
 	return hid;
 
 fail:
@@ -1373,18 +1407,17 @@ fail:
 	return NULL;
 }
 
-static void hid_disconnect(struct usb_interface *intf)
+static void hid_clean(struct hid_device *hid)
 {
-	struct hid_device *hid = usb_get_intfdata (intf);
 	struct usbhid_device *usbhid;
 
 	if (!hid)
 		return;
 
-	usbhid = hid->driver_data;
+	usbhid = hid->tl_data;
 
 	spin_lock_irq(&usbhid->inlock);	/* Sync with error handler */
-	usb_set_intfdata(intf, NULL);
+	usb_set_intfdata(usbhid->intf, NULL);
 	spin_unlock_irq(&usbhid->inlock);
 	usb_kill_urb(usbhid->urbin);
 	usb_kill_urb(usbhid->urbout);
@@ -1393,13 +1426,6 @@ static void hid_disconnect(struct usb_in
 	del_timer_sync(&usbhid->io_retry);
 	flush_scheduled_work();
 
-	if (hid->claimed & HID_CLAIMED_INPUT)
-		hidinput_disconnect(hid);
-	if (hid->claimed & HID_CLAIMED_HIDDEV)
-		hiddev_disconnect(hid);
-	if (hid->claimed & HID_CLAIMED_HIDRAW)
-		hidraw_disconnect(hid);
-
 	usb_free_urb(usbhid->urbin);
 	usb_free_urb(usbhid->urbctrl);
 	usb_free_urb(usbhid->urbout);
@@ -1408,6 +1434,16 @@ static void hid_disconnect(struct usb_in
 	hid_free_device(hid);
 }
 
+static void hid_disconnect(struct usb_interface *intf)
+{
+	struct hid_device *hid = usb_get_intfdata (intf);
+
+	if (!hid)
+		return;
+	hid_unregister_device(hid);
+	hid_clean(hid);
+}
+
 static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
 	struct hid_device *hid;
@@ -1426,43 +1462,12 @@ static int hid_probe(struct usb_interfac
 	if (hid->quirks & HID_QUIRK_RESET_LEDS)
 		usbhid_set_leds(hid);
 
-	if (!hidinput_connect(hid))
-		hid->claimed |= HID_CLAIMED_INPUT;
-	if (!hiddev_connect(hid))
-		hid->claimed |= HID_CLAIMED_HIDDEV;
-	if (!hidraw_connect(hid))
-		hid->claimed |= HID_CLAIMED_HIDRAW;
-
 	usb_set_intfdata(intf, hid);
 
-	if (!hid->claimed) {
-		printk ("HID device claimed by neither input, hiddev nor hidraw\n");
-		hid_disconnect(intf);
-		return -ENODEV;
-	}
-
-	if ((hid->claimed & HID_CLAIMED_INPUT))
-		hid_ff_init(hid);
-
 	if (hid->quirks & HID_QUIRK_SONY_PS3_CONTROLLER)
 		hid_fixup_sony_ps3_controller(interface_to_usbdev(intf),
 			intf->cur_altsetting->desc.bInterfaceNumber);
 
-	printk(KERN_INFO);
-
-	if (hid->claimed & HID_CLAIMED_INPUT)
-		printk("input");
-	if ((hid->claimed & HID_CLAIMED_INPUT) && ((hid->claimed & HID_CLAIMED_HIDDEV) ||
-				hid->claimed & HID_CLAIMED_HIDRAW))
-		printk(",");
-	if (hid->claimed & HID_CLAIMED_HIDDEV)
-		printk("hiddev%d", hid->minor);
-	if ((hid->claimed & HID_CLAIMED_INPUT) && (hid->claimed & HID_CLAIMED_HIDDEV) &&
-			(hid->claimed & HID_CLAIMED_HIDRAW))
-		printk(",");
-	if (hid->claimed & HID_CLAIMED_HIDRAW)
-		printk("hidraw%d", ((struct hidraw*)hid->hidraw)->minor);
-
 	c = "Device";
 	for (i = 0; i < hid->maxcollection; i++) {
 		if (hid->collection[i].type == HID_COLLECTION_APPLICATION &&
@@ -1475,16 +1480,21 @@ static int hid_probe(struct usb_interfac
 
 	usb_make_path(interface_to_usbdev(intf), path, 63);
 
-	printk(": USB HID v%x.%02x %s [%s] on %s\n",
+	printk(KERN_INFO"USB HID v%x.%02x %s [%s] on %s\n",
 		hid->version >> 8, hid->version & 0xff, c, hid->name, path);
 
+	hid->module = THIS_MODULE;
+	if (hid_register_device(hid)) {
+		hid_clean(hid);
+		return -ENODEV;
+	}
 	return 0;
 }
 
 static int hid_suspend(struct usb_interface *intf, pm_message_t message)
 {
 	struct hid_device *hid = usb_get_intfdata (intf);
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 
 	spin_lock_irq(&usbhid->inlock);	/* Sync with error handler */
 	set_bit(HID_SUSPENDED, &usbhid->iofl);
@@ -1498,7 +1508,7 @@ static int hid_suspend(struct usb_interf
 static int hid_resume(struct usb_interface *intf)
 {
 	struct hid_device *hid = usb_get_intfdata (intf);
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = hid->tl_data;
 	int status;
 
 	clear_bit(HID_SUSPENDED, &usbhid->iofl);
@@ -1525,6 +1535,18 @@ static void hid_post_reset(struct usb_in
 	hid_resume(intf);
 }
 
+static int usbhid_probe(struct hid_device *hid)
+{
+	int n;
+
+	for (n = 0; hid_blacklist[n].idVendor; n++)
+		if ((hid_blacklist[n].idVendor == hid->vendor) &&
+			(hid_blacklist[n].idProduct == hid->product) &&
+			hid_blacklist[n].quirks == HID_QUIRK_SKIP)
+			return -ENODEV;
+	return hidinput_connect(hid);
+}
+
 static struct usb_device_id hid_usb_ids [] = {
 	{ .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
 		.bInterfaceClass = USB_INTERFACE_CLASS_HID },
@@ -1533,7 +1555,7 @@ static struct usb_device_id hid_usb_ids 
 
 MODULE_DEVICE_TABLE (usb, hid_usb_ids);
 
-static struct usb_driver hid_driver = {
+static struct usb_driver usb_hid_driver = {
 	.name =		"usbhid",
 	.probe =	hid_probe,
 	.disconnect =	hid_disconnect,
@@ -1544,28 +1566,53 @@ static struct usb_driver hid_driver = {
 	.id_table =	hid_usb_ids,
 };
 
+static struct hid_driver hid_usb_driver = {
+	.name = "hidusb",
+	.version = DRIVER_VERSION,
+	.bus = BUS_USB,
+	.module = THIS_MODULE,
+	.probe = usbhid_probe
+};
+
+static struct hid_transport hid_usb_transport = {
+	.bus = BUS_USB,
+	.module = THIS_MODULE,
+	.event = usb_hidinput_input_event,
+	.open = usbhid_open,
+	.close = usbhid_close,
+	.update_busid = usbhid_update_busid,
+	.raw_report = usbhid_raw_report,
+};
+
 static int __init hid_init(void)
 {
 	int retval;
-	retval = hiddev_init();
+
+	retval = hid_register_transport(&hid_usb_transport);
+	if (retval)
+		goto hidtl_register_fail;
+	retval = hid_register_driver(&hid_usb_driver);
 	if (retval)
-		goto hiddev_init_fail;
-	retval = usb_register(&hid_driver);
+		goto hiddrv_register_fail;
+	retval = usb_register(&usb_hid_driver);
 	if (retval)
 		goto usb_register_fail;
 	info(DRIVER_VERSION ":" DRIVER_DESC);
 
 	return 0;
 usb_register_fail:
-	hiddev_exit();
-hiddev_init_fail:
+	hid_unregister_driver(&hid_usb_driver);
+hiddrv_register_fail:
+	hid_unregister_transport(&hid_usb_transport);
+hidtl_register_fail:
 	return retval;
 }
 
 static void __exit hid_exit(void)
 {
-	usb_deregister(&hid_driver);
-	hiddev_exit();
+	hid_unregister_driver(&hid_usb_driver);
+	hid_unregister_transport(&hid_usb_transport);
+	usb_deregister(&usb_hid_driver);
 }
 
 module_init(hid_init);

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.