summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2011-06-15 21:31:01 +0000
committerHauke Mehrtens <hauke@hauke-m.de>2011-06-15 21:31:01 +0000
commit235e3319876d5d1354e2774ec73495fdeb2616ec (patch)
treed776ac5daed14d9e6ee5562e979d388420e8ff08 /target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch
parent0db9c2bd7d3620ba18fa784bda702d971783b4f6 (diff)
downloadmaster-31e0f0ae-235e3319876d5d1354e2774ec73495fdeb2616ec.tar.gz
master-31e0f0ae-235e3319876d5d1354e2774ec73495fdeb2616ec.tar.bz2
master-31e0f0ae-235e3319876d5d1354e2774ec73495fdeb2616ec.zip
linux/generic: Add support for 3.0-rc3
Also make linux identify itself properly as 3.0, not 3.0.0. Signed-off-by: Jonas Gorski <jonas.gorski+openwrt@gmail.com> SVN-Revision: 27191
Diffstat (limited to 'target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch')
-rw-r--r--target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch84
1 files changed, 84 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch b/target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch
new file mode 100644
index 0000000000..3aeda678fc
--- /dev/null
+++ b/target/linux/generic/patches-3.0/820-usb_add_usb_find_device_by_name.patch
@@ -0,0 +1,84 @@
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -651,6 +651,71 @@ int __usb_get_extra_descriptor(char *buf
+ }
+ EXPORT_SYMBOL_GPL(__usb_get_extra_descriptor);
+
++static struct usb_device *match_device_name(struct usb_device *dev,
++ const char *name)
++{
++ struct usb_device *ret_dev = NULL;
++ int child;
++
++ dev_dbg(&dev->dev, "check for name %s ...\n", name);
++
++ /* see if this device matches */
++ if (strcmp(dev_name(&dev->dev), name) == 0 ) {
++ dev_dbg(&dev->dev, "matched this device!\n");
++ ret_dev = usb_get_dev(dev);
++ goto exit;
++ }
++
++ /* look through all of the children of this device */
++ for (child = 0; child < dev->maxchild; ++child) {
++ if (dev->children[child]) {
++ usb_lock_device(dev->children[child]);
++ ret_dev = match_device_name(dev->children[child], name);
++ usb_unlock_device(dev->children[child]);
++ if (ret_dev)
++ goto exit;
++ }
++ }
++exit:
++ return ret_dev;
++}
++
++/**
++ * usb_find_device_by_name - find a specific usb device in the system
++ * @name: the name of the device to find
++ *
++ * Returns a pointer to a struct usb_device if such a specified usb
++ * device is present in the system currently. The usage count of the
++ * device will be incremented if a device is found. Make sure to call
++ * usb_put_dev() when the caller is finished with the device.
++ *
++ * If a device with the specified bus id is not found, NULL is returned.
++ */
++struct usb_device *usb_find_device_by_name(const char *name)
++{
++ struct list_head *buslist;
++ struct usb_bus *bus;
++ struct usb_device *dev = NULL;
++
++ mutex_lock(&usb_bus_list_lock);
++ for (buslist = usb_bus_list.next;
++ buslist != &usb_bus_list;
++ buslist = buslist->next) {
++ bus = container_of(buslist, struct usb_bus, bus_list);
++ if (!bus->root_hub)
++ continue;
++ usb_lock_device(bus->root_hub);
++ dev = match_device_name(bus->root_hub, name);
++ usb_unlock_device(bus->root_hub);
++ if (dev)
++ goto exit;
++ }
++exit:
++ mutex_unlock(&usb_bus_list_lock);
++ return dev;
++}
++EXPORT_SYMBOL_GPL(usb_find_device_by_name);
++
+ /**
+ * usb_alloc_coherent - allocate dma-consistent buffer for URB_NO_xxx_DMA_MAP
+ * @dev: device the buffer will be used with
+--- a/include/linux/usb.h
++++ b/include/linux/usb.h
+@@ -513,6 +513,7 @@ extern int usb_lock_device_for_reset(str
+ extern int usb_reset_device(struct usb_device *dev);
+ extern void usb_queue_reset_device(struct usb_interface *dev);
+
++extern struct usb_device *usb_find_device_by_name(const char *name);
+
+ /* USB autosuspend and autoresume */
+ #ifdef CONFIG_USB_SUSPEND