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