diff options
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/usb.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 25cf7e9eccfa..4453cce7eb24 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -462,6 +462,25 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id) | |||
462 | return NULL; | 462 | return NULL; |
463 | } | 463 | } |
464 | 464 | ||
465 | |||
466 | static int __find_interface(struct device * dev, void * data) | ||
467 | { | ||
468 | struct usb_interface ** ret = (struct usb_interface **)data; | ||
469 | struct usb_interface * intf = *ret; | ||
470 | int *minor = (int *)data; | ||
471 | |||
472 | /* can't look at usb devices, only interfaces */ | ||
473 | if (dev->driver == &usb_generic_driver) | ||
474 | return 0; | ||
475 | |||
476 | intf = to_usb_interface(dev); | ||
477 | if (intf->minor != -1 && intf->minor == *minor) { | ||
478 | *ret = intf; | ||
479 | return 1; | ||
480 | } | ||
481 | return 0; | ||
482 | } | ||
483 | |||
465 | /** | 484 | /** |
466 | * usb_find_interface - find usb_interface pointer for driver and device | 485 | * usb_find_interface - find usb_interface pointer for driver and device |
467 | * @drv: the driver whose current configuration is considered | 486 | * @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) | |||
473 | */ | 492 | */ |
474 | struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor) | 493 | struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor) |
475 | { | 494 | { |
476 | struct list_head *entry; | 495 | struct usb_interface *intf = (struct usb_interface *)minor; |
477 | struct device *dev; | 496 | int ret; |
478 | struct usb_interface *intf; | ||
479 | |||
480 | list_for_each(entry, &drv->driver.devices) { | ||
481 | dev = container_of(entry, struct device, driver_list); | ||
482 | 497 | ||
483 | /* can't look at usb devices, only interfaces */ | 498 | ret = driver_for_each_device(&drv->driver, NULL, &intf, __find_interface); |
484 | if (dev->driver == &usb_generic_driver) | ||
485 | continue; | ||
486 | |||
487 | intf = to_usb_interface(dev); | ||
488 | if (intf->minor == -1) | ||
489 | continue; | ||
490 | if (intf->minor == minor) | ||
491 | return intf; | ||
492 | } | ||
493 | 499 | ||
494 | /* no device found that matches */ | 500 | return ret ? intf : NULL; |
495 | return NULL; | ||
496 | } | 501 | } |
497 | 502 | ||
498 | static int usb_device_match (struct device *dev, struct device_driver *drv) | 503 | static int usb_device_match (struct device *dev, struct device_driver *drv) |