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/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to