These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / usb / gadget / udc / goku_udc.c
index 9e8d842..1fdfec1 100644 (file)
@@ -990,6 +990,35 @@ static int goku_get_frame(struct usb_gadget *_gadget)
        return -EOPNOTSUPP;
 }
 
+static struct usb_ep *goku_match_ep(struct usb_gadget *g,
+               struct usb_endpoint_descriptor *desc,
+               struct usb_ss_ep_comp_descriptor *ep_comp)
+{
+       struct goku_udc *dev = to_goku_udc(g);
+       struct usb_ep *ep;
+
+       switch (usb_endpoint_type(desc)) {
+       case USB_ENDPOINT_XFER_INT:
+               /* single buffering is enough */
+               ep = &dev->ep[3].ep;
+               if (usb_gadget_ep_match_desc(g, ep, desc, ep_comp))
+                       return ep;
+               break;
+       case USB_ENDPOINT_XFER_BULK:
+               if (usb_endpoint_dir_in(desc)) {
+                       /* DMA may be available */
+                       ep = &dev->ep[2].ep;
+                       if (usb_gadget_ep_match_desc(g, ep, desc, ep_comp))
+                               return ep;
+               }
+               break;
+       default:
+               /* nothing */ ;
+       }
+
+       return NULL;
+}
+
 static int goku_udc_start(struct usb_gadget *g,
                struct usb_gadget_driver *driver);
 static int goku_udc_stop(struct usb_gadget *g);
@@ -998,6 +1027,7 @@ static const struct usb_gadget_ops goku_ops = {
        .get_frame      = goku_get_frame,
        .udc_start      = goku_udc_start,
        .udc_stop       = goku_udc_stop,
+       .match_ep       = goku_match_ep,
        // no remote wakeup
        // not selfpowered
 };
@@ -1257,6 +1287,14 @@ static void udc_reinit (struct goku_udc *dev)
                INIT_LIST_HEAD (&ep->queue);
 
                ep_reset(NULL, ep);
+
+               if (i == 0)
+                       ep->ep.caps.type_control = true;
+               else
+                       ep->ep.caps.type_bulk = true;
+
+               ep->ep.caps.dir_in = true;
+               ep->ep.caps.dir_out = true;
        }
 
        dev->ep[0].reg_mode = NULL;