summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/epautoconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/epautoconf.c')
-rw-r--r--drivers/usb/gadget/epautoconf.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 30fdab0ae383..16ee4714d38c 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -209,3 +209,42 @@ void usb_ep_autoconfig_reset (struct usb_gadget *gadget)
gadget->out_epnum = 0;
}
EXPORT_SYMBOL_GPL(usb_ep_autoconfig_reset);
+
+/**
+ * usb_ep_autoconfig_by_name - Used to pick the endpoint by name. eg ep1in-gsi
+ * @gadget: The device to which the endpoint must belong.
+ * @desc: Endpoint descriptor, with endpoint direction and transfer mode
+ * initialized.
+ * @ep_name: EP name that is to be searched.
+ *
+ */
+struct usb_ep *usb_ep_autoconfig_by_name(
+ struct usb_gadget *gadget,
+ struct usb_endpoint_descriptor *desc,
+ const char *ep_name
+)
+{
+ struct usb_ep *ep;
+ bool ep_found = false;
+
+ list_for_each_entry(ep, &gadget->ep_list, ep_list)
+ if (0 == strcmp(ep->name, ep_name) &&
+ !ep->driver_data) {
+ ep_found = true;
+ break;
+ }
+
+ if (ep_found) {
+ desc->bEndpointAddress &= USB_DIR_IN;
+ desc->bEndpointAddress |= ep->ep_num;
+ ep->address = desc->bEndpointAddress;
+ pr_debug("Allocating ep address:%x\n", ep->address);
+ ep->desc = NULL;
+ ep->comp_desc = NULL;
+ return ep;
+ }
+
+ pr_err("%s:error finding ep %s\n", __func__, ep_name);
+ return NULL;
+}
+EXPORT_SYMBOL(usb_ep_autoconfig_by_name);