patch-2.4.0-test11 linux/drivers/char/joystick/iforce.c

Next file: linux/drivers/char/joystick/ns558.c
Previous file: linux/drivers/char/joystick/analog.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test10/linux/drivers/char/joystick/iforce.c linux/drivers/char/joystick/iforce.c
@@ -54,6 +54,7 @@
 
 struct iforce {
 	signed char data[IFORCE_MAX_LENGTH];
+	struct usb_device *usbdev;
 	struct input_dev dev;
 	struct urb irq;
 	int open;
@@ -113,9 +114,11 @@
 {
 	struct iforce *iforce = dev->private;
 
-	if (dev->idbus == BUS_USB && !iforce->open++)
+	if (dev->idbus == BUS_USB && !iforce->open++) {
+		iforce->irq.dev = iforce->usbdev;
 		if (usb_submit_urb(&iforce->irq))
 			return -EIO;
+	}
 
 	return 0;
 }
@@ -177,15 +180,12 @@
 	iforce_process_packet(&iforce->dev, iforce->data[0], 8, iforce->data + 1);
 }
 
-static void *iforce_usb_probe(struct usb_device *dev, unsigned int ifnum)
+static void *iforce_usb_probe(struct usb_device *dev, unsigned int ifnum,
+			      const struct usb_device_id *id)
 {
 	struct usb_endpoint_descriptor *endpoint;
 	struct iforce *iforce;
 
-	if (dev->descriptor.idVendor != USB_VENDOR_ID_LOGITECH ||
-	    dev->descriptor.idProduct != USB_DEVICE_ID_LOGITECH_WMFORCE)
-		return NULL;
-
 	endpoint = dev->config[0].interface[ifnum].altsetting[0].endpoint + 0;
 
 	if (!(iforce = kmalloc(sizeof(struct iforce), GFP_KERNEL))) return NULL;
@@ -216,10 +216,21 @@
 	kfree(iforce);
 }
 
+static struct usb_device_id iforce_usb_ids [] = {
+    {
+	idVendor: USB_VENDOR_ID_LOGITECH,
+	idProduct: USB_DEVICE_ID_LOGITECH_WMFORCE
+    },
+    { }						/* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE (usb, iforce_usb_ids);
+
 static struct usb_driver iforce_usb_driver = {
 	name:		"iforce",
 	probe:		iforce_usb_probe,
 	disconnect:	iforce_usb_disconnect,
+	id_table:	iforce_usb_ids,
 };
 
 #endif

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)