patch-2.4.0-test11 linux/drivers/usb/usbkbd.c

Next file: linux/drivers/usb/usbmouse.c
Previous file: linux/drivers/usb/usb.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test10/linux/drivers/usb/usbkbd.c linux/drivers/usb/usbkbd.c
@@ -59,6 +59,7 @@
 
 struct usb_kbd {
 	struct input_dev dev;
+	struct usb_device *usbdev;
 	unsigned char new[8];
 	unsigned char old[8];
 	struct urb irq, led;
@@ -116,6 +117,7 @@
 		return 0;
 
 	kbd->leds = kbd->newleds;
+	kbd->led.dev = kbd->usbdev;
 	if (usb_submit_urb(&kbd->led))
 		err("usb_submit_urb(leds) failed");
 
@@ -133,6 +135,7 @@
 		return;
 
 	kbd->leds = kbd->newleds;
+	kbd->led.dev = kbd->usbdev;
 	if (usb_submit_urb(&kbd->led))
 		err("usb_submit_urb(leds) failed");
 }
@@ -144,6 +147,7 @@
 	if (kbd->open++)
 		return 0;
 
+	kbd->irq.dev = kbd->usbdev;
 	if (usb_submit_urb(&kbd->irq))
 		return -EIO;
 
@@ -158,20 +162,19 @@
 		usb_unlink_urb(&kbd->irq);
 }
 
-static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
+static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum,
+			   const struct usb_device_id *id)
 {
+	struct usb_interface *iface;
 	struct usb_interface_descriptor *interface;
 	struct usb_endpoint_descriptor *endpoint;
 	struct usb_kbd *kbd;
 	int i, pipe, maxp;
 	char *buf;
 
-	if (dev->descriptor.bNumConfigurations != 1) return NULL;
-	interface = dev->config[0].interface[ifnum].altsetting + 0;
+	iface = &dev->actconfig->interface[ifnum];
+	interface = &iface->altsetting[iface->act_altsetting];
 
-	if (interface->bInterfaceClass != 3) return NULL;
-	if (interface->bInterfaceSubClass != 1) return NULL;
-	if (interface->bInterfaceProtocol != 1) return NULL;
 	if (interface->bNumEndpoints != 1) return NULL;
 
 	endpoint = interface->endpoint + 0;
@@ -187,6 +190,8 @@
 	if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) return NULL;
 	memset(kbd, 0, sizeof(struct usb_kbd));
 
+	kbd->usbdev = dev;
+
 	kbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
 	kbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
 
@@ -251,10 +256,18 @@
 	kfree(kbd);
 }
 
+static struct usb_device_id usb_kbd_id_table [] = {
+    { bInterfaceClass: 3, bInterfaceSubClass: 1, bInterfaceProtocol: 1},
+    { }						/* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE (usb, usb_kbd_id_table);
+
 static struct usb_driver usb_kbd_driver = {
 	name:		"keyboard",
 	probe:		usb_kbd_probe,
-	disconnect:	usb_kbd_disconnect
+	disconnect:	usb_kbd_disconnect,
+	id_table:	usb_kbd_id_table,
 };
 
 static int __init usb_kbd_init(void)

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