aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/chipidea/udc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/chipidea/udc.c')
-rw-r--r--drivers/usb/chipidea/udc.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 829e947cabf5..6a5ee8e6da10 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1622,6 +1622,25 @@ static int ci_udc_pullup(struct usb_gadget *_gadget, int is_on)
1622static int ci_udc_start(struct usb_gadget *gadget, 1622static int ci_udc_start(struct usb_gadget *gadget,
1623 struct usb_gadget_driver *driver); 1623 struct usb_gadget_driver *driver);
1624static int ci_udc_stop(struct usb_gadget *gadget); 1624static int ci_udc_stop(struct usb_gadget *gadget);
1625
1626/* Match ISOC IN from the highest endpoint */
1627static struct usb_ep *ci_udc_match_ep(struct usb_gadget *gadget,
1628 struct usb_endpoint_descriptor *desc,
1629 struct usb_ss_ep_comp_descriptor *comp_desc)
1630{
1631 struct ci_hdrc *ci = container_of(gadget, struct ci_hdrc, gadget);
1632 struct usb_ep *ep;
1633
1634 if (usb_endpoint_xfer_isoc(desc) && usb_endpoint_dir_in(desc)) {
1635 list_for_each_entry_reverse(ep, &ci->gadget.ep_list, ep_list) {
1636 if (ep->caps.dir_in && !ep->claimed)
1637 return ep;
1638 }
1639 }
1640
1641 return NULL;
1642}
1643
1625/** 1644/**
1626 * Device operations part of the API to the USB controller hardware, 1645 * Device operations part of the API to the USB controller hardware,
1627 * which don't involve endpoints (or i/o) 1646 * which don't involve endpoints (or i/o)
@@ -1635,6 +1654,7 @@ static const struct usb_gadget_ops usb_gadget_ops = {
1635 .vbus_draw = ci_udc_vbus_draw, 1654 .vbus_draw = ci_udc_vbus_draw,
1636 .udc_start = ci_udc_start, 1655 .udc_start = ci_udc_start,
1637 .udc_stop = ci_udc_stop, 1656 .udc_stop = ci_udc_stop,
1657 .match_ep = ci_udc_match_ep,
1638}; 1658};
1639 1659
1640static int init_eps(struct ci_hdrc *ci) 1660static int init_eps(struct ci_hdrc *ci)