Introduce function returning address of given endpoint within the function. This value can be useful during preparation of class or vendor specific descriptors in prep_vendor_descs() callback. It can be also necessary to handle some class or vendor specific setup requests. Signed-off-by: Robert Baldyga <r.baldyga@xxxxxxxxxxx> --- drivers/usb/gadget/composite.c | 20 ++++++++++++++++++++ include/linux/usb/composite.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 7e3721d..417e2f9 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -688,6 +688,26 @@ int usb_get_interface_id(struct usb_function *f, int i) } EXPORT_SYMBOL_GPL(usb_get_interface_id); +int usb_get_endpoint_address(struct usb_function *f, int i, int a, int e) +{ + struct usb_composite_ep *ep; + + if (!f->descs) + return -ENODEV; + if (f->descs->intfs_num <= i) + return -ENODEV; + if (f->descs->intfs[i]->altsets_num <= a) + return -ENODEV; + if (f->descs->intfs[i]->altsets[a]->eps_num <= e) + return -ENODEV; + ep = f->descs->intfs[i]->altsets[a]->eps[e]; + if (!ep->ep) + return -ENODEV; + + return ep->ep->address; +} +EXPORT_SYMBOL_GPL(usb_get_endpoint_address); + /** * usb_function_get_ep - obtains endpoint of given index from active * altsetting of given interface diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index b2fb260..b6f1e0cc 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -427,6 +427,8 @@ int usb_ep_add_vendor_desc(struct usb_function *f, int i, int a, int e, int usb_get_interface_id(struct usb_function *f, int i); +int usb_get_endpoint_address(struct usb_function *f, int i, int a, int e); + struct usb_ep *usb_function_get_ep(struct usb_function *f, int intf, int ep); int usb_interface_id(struct usb_configuration *, struct usb_function *); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html