|
@@ -462,6 +462,25 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static int __find_interface(struct device * dev, void * data)
|
|
|
+{
|
|
|
+ struct usb_interface ** ret = (struct usb_interface **)data;
|
|
|
+ struct usb_interface * intf = *ret;
|
|
|
+ int *minor = (int *)data;
|
|
|
+
|
|
|
+ /* can't look at usb devices, only interfaces */
|
|
|
+ if (dev->driver == &usb_generic_driver)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ intf = to_usb_interface(dev);
|
|
|
+ if (intf->minor != -1 && intf->minor == *minor) {
|
|
|
+ *ret = intf;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* usb_find_interface - find usb_interface pointer for driver and device
|
|
|
* @drv: the driver whose current configuration is considered
|
|
@@ -473,26 +492,12 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
|
|
|
*/
|
|
|
struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
|
|
|
{
|
|
|
- struct list_head *entry;
|
|
|
- struct device *dev;
|
|
|
- struct usb_interface *intf;
|
|
|
-
|
|
|
- list_for_each(entry, &drv->driver.devices) {
|
|
|
- dev = container_of(entry, struct device, driver_list);
|
|
|
+ struct usb_interface *intf = (struct usb_interface *)minor;
|
|
|
+ int ret;
|
|
|
|
|
|
- /* can't look at usb devices, only interfaces */
|
|
|
- if (dev->driver == &usb_generic_driver)
|
|
|
- continue;
|
|
|
-
|
|
|
- intf = to_usb_interface(dev);
|
|
|
- if (intf->minor == -1)
|
|
|
- continue;
|
|
|
- if (intf->minor == minor)
|
|
|
- return intf;
|
|
|
- }
|
|
|
+ ret = driver_for_each_device(&drv->driver, NULL, &intf, __find_interface);
|
|
|
|
|
|
- /* no device found that matches */
|
|
|
- return NULL;
|
|
|
+ return ret ? intf : NULL;
|
|
|
}
|
|
|
|
|
|
static int usb_device_match (struct device *dev, struct device_driver *drv)
|