# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.586   -> 1.587  
#	drivers/media/video/cpia_usb.c	1.8     -> 1.9    
#	drivers/input/joystick/iforce/iforce-usb.c	1.3     -> 1.4    
#	drivers/bluetooth/hci_usb.c	1.8     -> 1.9    
#	drivers/isdn/hisax/st5481_init.c	1.4     -> 1.5    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/16	greg@kroah.com	1.587
# USB: convert the USB drivers that live outside of drivers/usb to the new USB driver model.
# --------------------------------------------
#
diff -Nru a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c
--- a/drivers/bluetooth/hci_usb.c	Mon Sep 16 15:00:14 2002
+++ b/drivers/bluetooth/hci_usb.c	Mon Sep 16 15:00:14 2002
@@ -656,8 +656,9 @@
 
 #endif /* CONFIG_BLUEZ_USB_FW_LOAD */
 
-static void * hci_usb_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id)
+static int hci_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
+	struct usb_device *udev = interface_to_usbdev(intf);
 	struct usb_endpoint_descriptor *bulk_out_ep[HCI_MAX_IFACE_NUM];
 	struct usb_endpoint_descriptor *isoc_out_ep[HCI_MAX_IFACE_NUM];
 	struct usb_endpoint_descriptor *bulk_in_ep[HCI_MAX_IFACE_NUM];
@@ -670,11 +671,11 @@
 	struct hci_dev *hdev;
 	int i, a, e, size, ifn, isoc_ifnum, isoc_alts;
 
-	BT_DBG("udev %p ifnum %d", udev, ifnum);
+	BT_DBG("intf %p", intf);
 
 	/* Check number of endpoints */
-	if (udev->actconfig->interface[ifnum].altsetting[0].bNumEndpoints < 3)
-		return NULL;
+	if (intf->altsetting[0].bNumEndpoints < 3)
+		return -ENODEV;
 
 	MOD_INC_USE_COUNT;
 
@@ -794,24 +795,27 @@
 		goto probe_error;
 	}
 
-	return husb;
+	dev_set_drvdata(&intf->dev, husb);
+	return 0;
 
 probe_error:
 	kfree(husb);
 
 done:
 	MOD_DEC_USE_COUNT;
-	return NULL;
+	return -EIO;
 }
 
-static void hci_usb_disconnect(struct usb_device *udev, void *ptr)
+static void hci_usb_disconnect(struct usb_interface *intf)
 {
-	struct hci_usb *husb = (struct hci_usb *) ptr;
-	struct hci_dev *hdev = &husb->hdev;
+	struct hci_usb *husb = dev_get_drvdata(&intf->dev);
+	struct hci_dev *hdev;
 
+	dev_set_drvdata(&intf->dev, NULL);
 	if (!husb)
 		return;
 
+	hdev = &husb->hdev;
 	BT_DBG("%s", hdev->name);
 
 	hci_usb_close(hdev);
diff -Nru a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c
--- a/drivers/input/joystick/iforce/iforce-usb.c	Mon Sep 16 15:00:14 2002
+++ b/drivers/input/joystick/iforce/iforce-usb.c	Mon Sep 16 15:00:14 2002
@@ -106,14 +106,15 @@
 		wake_up(&iforce->wait);
 }
 
-static void *iforce_usb_probe(struct usb_device *dev, unsigned int ifnum,
+static int iforce_usb_probe(struct usb_interface *intf,
 				const struct usb_device_id *id)
 {
+	struct usb_device *dev = interface_to_usbdev(intf);
 	struct usb_endpoint_descriptor *epirq, *epout;
 	struct iforce *iforce;
 
-	epirq = dev->config[0].interface[ifnum].altsetting[0].endpoint + 0;
-	epout = dev->config[0].interface[ifnum].altsetting[0].endpoint + 1;
+	epirq = intf->altsetting[0].endpoint + 0;
+	epout = intf->altsetting[0].endpoint + 1;
 
 	if (!(iforce = kmalloc(sizeof(struct iforce) + 32, GFP_KERNEL)))
 		goto fail;
@@ -150,7 +151,8 @@
 
 	if (iforce_init_device(iforce)) goto fail;
 
-	return iforce;
+	dev_set_drvdata (&intf->dev, iforce);
+	return 0;
 
 fail:
 	if (iforce) {
@@ -160,7 +162,7 @@
 		kfree(iforce);
 	}
 
-	return NULL;
+	return -ENODEV;
 }
 
 /* Called by iforce_delete() */
@@ -176,17 +178,20 @@
 	usb_free_urb(iforce->ctrl);
 }
 
-static void iforce_usb_disconnect(struct usb_device *dev, void *ptr)
+static void iforce_usb_disconnect(struct usb_interface *intf)
 {
-	struct iforce *iforce = ptr;
+	struct iforce *iforce = dev_get_drvdata (&intf->dev);
 	int open = 0; /* FIXME! iforce->dev.handle->open; */
 
-	iforce->usbdev = NULL;
-	input_unregister_device(&iforce->dev);
+	dev_set_drvdata (&intf->dev, NULL);
+	if (iforce) {
+		iforce->usbdev = NULL;
+		input_unregister_device(&iforce->dev);
 
-	if (!open) {
-		iforce_delete_device(iforce);
-		kfree(iforce);
+		if (!open) {
+			iforce_delete_device(iforce);
+			kfree(iforce);
+		}
 	}
 }
 
diff -Nru a/drivers/isdn/hisax/st5481_init.c b/drivers/isdn/hisax/st5481_init.c
--- a/drivers/isdn/hisax/st5481_init.c	Mon Sep 16 15:00:14 2002
+++ b/drivers/isdn/hisax/st5481_init.c	Mon Sep 16 15:00:14 2002
@@ -59,10 +59,10 @@
  * This function will be called when the adapter is plugged
  * into the USB bus.
  */
-static void * __devinit probe_st5481(struct usb_device *dev,
-				     unsigned int ifnum,
-				     const struct usb_device_id *id)
+static int probe_st5481(struct usb_interface *intf
+			const struct usb_device_id *id)
 {
+	struct usb_device *dev = interface_to_usbdev(intf);
 	struct st5481_adapter *adapter;
 	struct hisax_b_if *b_if[2];
 	int retval, i;
@@ -73,7 +73,7 @@
 
 	adapter = kmalloc(sizeof(struct st5481_adapter), GFP_KERNEL);
 	if (!adapter)
-		return NULL;
+		return -ENOMEM;
 
 	memset(adapter, 0, sizeof(struct st5481_adapter));
 
@@ -114,6 +114,7 @@
 	hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb", protocol);
 	st5481_start(adapter);
 
+	dev_set_drvdata(&intf->dev, adapter);
 	return adapter;
 
  err_b:
@@ -123,19 +124,23 @@
  err_usb:
 	st5481_release_usb(adapter);
  err:
-	return NULL;
+	return -EIO;
 }
 
 /*
  * This function will be called when the adapter is removed
  * from the USB bus.
  */
-static void __devexit disconnect_st5481(struct usb_device *dev, void *arg)
+static void disconnect_st5481(struct usb_interface *intf)
 {
-	struct st5481_adapter *adapter = arg;
+	struct st5481_adapter *adapter = dev_get_drvdata(&intf->dev);
 
 	DBG(1,"");
 
+	dev_set_drvdata(&intf->dev, NULL);
+	if (!adapter)
+		return;
+
 	list_del(&adapter->list);
 
 	st5481_stop(adapter);
@@ -176,10 +181,10 @@
 MODULE_DEVICE_TABLE (usb, st5481_ids);
 
 static struct usb_driver st5481_usb_driver = {
-	.name = "st5481_usb",
-	.probe = probe_st5481,
-	.disconnect = __devexit_p(disconnect_st5481),
-	.id_table = st5481_ids,
+	.name =		"st5481_usb",
+	.probe =	probe_st5481,
+	.disconnect =	disconnect_st5481,
+	.id_table =	st5481_ids,
 };
 
 static int __init st5481_usb_init(void)
diff -Nru a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c
--- a/drivers/media/video/cpia_usb.c	Mon Sep 16 15:00:14 2002
+++ b/drivers/media/video/cpia_usb.c	Mon Sep 16 15:00:14 2002
@@ -479,9 +479,10 @@
 
 /* Probing and initializing */
 
-static void *cpia_probe(struct usb_device *udev, unsigned int ifnum,
-			const struct usb_device_id *id)
+static int cpia_probe(struct usb_interface *intf,
+		      const struct usb_device_id *id)
 {
+	struct usb_device *udev = interface_to_usbdev(intf);
 	struct usb_interface_descriptor *interface;
 	struct usb_cpia *ucpia;
 	struct cam_data *cam;
@@ -489,16 +490,16 @@
   
 	/* A multi-config CPiA camera? */
 	if (udev->descriptor.bNumConfigurations != 1)
-		return NULL;
+		return -ENODEV;
 
-	interface = &udev->actconfig->interface[ifnum].altsetting[0];
+	interface = &intf->altsetting[0];
 
 	printk(KERN_INFO "USB CPiA camera found\n");
 
 	ucpia = kmalloc(sizeof(*ucpia), GFP_KERNEL);
 	if (!ucpia) {
 		printk(KERN_ERR "couldn't kmalloc cpia struct\n");
-		return NULL;
+		return -ENOMEM;
 	}
 
 	memset(ucpia, 0, sizeof(*ucpia));
@@ -548,7 +549,8 @@
 	cpia_add_to_list(cam_list, cam);
 	spin_unlock( &cam_list_lock_usb );
 
-	return cam;
+	dev_set_drvdata(&intf->dev, cam);
+	return 0;
 
 fail_all:
 	vfree(ucpia->buffers[2]);
@@ -561,10 +563,10 @@
 	ucpia->buffers[0] = NULL;
 fail_alloc_0:
 
-	return NULL;
+	return -EIO;
 }
 
-static void cpia_disconnect(struct usb_device *dev, void *ptr);
+static void cpia_disconnect(struct usb_interface *intf);
 
 static struct usb_device_id cpia_id_table [] = {
 	{ USB_DEVICE(0x0553, 0x0002) },
@@ -586,11 +588,17 @@
 /* don't use dev, it may be NULL! (see usb_cpia_cleanup) */
 /* _disconnect from usb_cpia_cleanup is not necessary since usb_deregister */
 /* will do it for us as well as passing a udev structure - jerdfelt */
-static void cpia_disconnect(struct usb_device *udev, void *ptr)
+static void cpia_disconnect(struct usb_interface *intf)
 {
-	struct cam_data *cam = (struct cam_data *) ptr;
-	struct usb_cpia *ucpia = (struct usb_cpia *) cam->lowlevel_data;
+	struct cam_data *cam = dev_get_drvdata(&intf->dev);
+	struct usb_cpia *ucpia;
+	struct usb_device *udev;
   
+	dev_set_drvdata(&intf->dev, NULL);
+	if (!cam)
+		return;
+
+	ucpia = (struct usb_cpia *) cam->lowlevel_data;
 	spin_lock( &cam_list_lock_usb );
 	cpia_remove_from_list(cam);
 	spin_unlock( &cam_list_lock_usb );
@@ -607,6 +615,7 @@
 	if (waitqueue_active(&ucpia->wq_stream))
 		wake_up_interruptible(&ucpia->wq_stream);
 
+	udev = interface_to_usbdev(intf);
 	usb_driver_release_interface(&cpia_driver,
 				     &udev->actconfig->interface[0]);