diff options
Diffstat (limited to 'drivers/usb/core/usb.c')
| -rw-r--r-- | drivers/usb/core/usb.c | 54 | 
1 files changed, 49 insertions, 5 deletions
| diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index a566bb494e24..62368c4ed37a 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -398,6 +398,52 @@ int usb_for_each_dev(void *data, int (*fn)(struct usb_device *, void *))  }  EXPORT_SYMBOL_GPL(usb_for_each_dev); +struct each_hub_arg { +	void *data; +	int (*fn)(struct device *, void *); +}; + +static int __each_hub(struct usb_device *hdev, void *data) +{ +	struct each_hub_arg *arg = (struct each_hub_arg *)data; +	struct usb_hub *hub; +	int ret = 0; +	int i; + +	hub = usb_hub_to_struct_hub(hdev); +	if (!hub) +		return 0; + +	mutex_lock(&usb_port_peer_mutex); + +	for (i = 0; i < hdev->maxchild; i++) { +		ret = arg->fn(&hub->ports[i]->dev, arg->data); +		if (ret) +			break; +	} + +	mutex_unlock(&usb_port_peer_mutex); + +	return ret; +} + +/** + * usb_for_each_port - interate over all USB ports in the system + * @data: data pointer that will be handed to the callback function + * @fn: callback function to be called for each USB port + * + * Iterate over all USB ports and call @fn for each, passing it @data. If it + * returns anything other than 0, we break the iteration prematurely and return + * that value. + */ +int usb_for_each_port(void *data, int (*fn)(struct device *, void *)) +{ +	struct each_hub_arg arg = {data, fn}; + +	return usb_for_each_dev(&arg, __each_hub); +} +EXPORT_SYMBOL_GPL(usb_for_each_port); +  /**   * usb_release_dev - free a usb device structure when all users of it are finished.   * @dev: device that's been disconnected @@ -982,17 +1028,15 @@ static struct notifier_block usb_bus_nb = {  	.notifier_call = usb_bus_notify,  }; -static struct dentry *usb_devices_root; -  static void usb_debugfs_init(void)  { -	usb_devices_root = debugfs_create_file("devices", 0444, usb_debug_root, -					       NULL, &usbfs_devices_fops); +	debugfs_create_file("devices", 0444, usb_debug_root, NULL, +			    &usbfs_devices_fops);  }  static void usb_debugfs_cleanup(void)  { -	debugfs_remove(usb_devices_root); +	debugfs_remove(debugfs_lookup("devices", usb_debug_root));  }  /* | 
