usb: dwc3: gadget: add common endpoint configuration for dwc3 udc driver
authorMarek Szyprowski <m.szyprowski@samsung.com>
Tue, 3 Mar 2015 16:32:11 +0000 (17:32 +0100)
committerMarek Vasut <marex@denx.de>
Tue, 14 Apr 2015 03:48:12 +0000 (05:48 +0200)
This patch adds code to select standard, commonly used usb endpoint
configuration (ep1in-bulk, ep2out-bulk, ep3in-int) to dwc3 driver. This
ensures compatibility with old userspace and windows drivers, which
expects hardcoded endpoint numbers.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
drivers/usb/gadget/epautoconf.c
drivers/usb/gadget/gadget_chips.h

index 0df4b2a103e845953a883f42faac86fe846ee6f4..6ddbe83debaf21874e1643442f1179fcc3a37081 100644 (file)
@@ -220,7 +220,7 @@ struct usb_ep *usb_ep_autoconfig(
        struct usb_endpoint_descriptor  *desc
 )
 {
-       struct usb_ep   *ep;
+       struct usb_ep   *ep = NULL;
        u8              type;
 
        type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
@@ -261,6 +261,28 @@ struct usb_ep *usb_ep_autoconfig(
                ep = find_ep(gadget, "ep1-bulk");
                if (ep && ep_matches(gadget, ep, desc))
                        return ep;
+       } else if (gadget_is_dwc3(gadget)) {
+               const char *name = NULL;
+               /*
+                * First try standard, common configuration: ep1in-bulk,
+                * ep2out-bulk, ep3in-int to match other udc drivers to avoid
+                * confusion in already deployed software (endpoint numbers
+                * hardcoded in userspace software/drivers)
+                */
+               if ((desc->bEndpointAddress & USB_DIR_IN) &&
+                   type == USB_ENDPOINT_XFER_BULK)
+                       name = "ep1in";
+               else if ((desc->bEndpointAddress & USB_DIR_IN) == 0 &&
+                        type == USB_ENDPOINT_XFER_BULK)
+                       name = "ep2out";
+               else if ((desc->bEndpointAddress & USB_DIR_IN) &&
+                        type == USB_ENDPOINT_XFER_INT)
+                       name = "ep3in";
+
+               if (name)
+                       ep = find_ep(gadget, name);
+               if (ep && ep_matches(gadget, ep, desc))
+                       return ep;
        }
 
        /* Second, look at endpoints until an unclaimed one looks usable */
index cc94771e32fc40648b097b6978e229904db20c99..c859df2f7f86c6cd763345a21d289fcd0c4f111e 100644 (file)
 #define gadget_is_fotg210(g)        0
 #endif
 
+#ifdef CONFIG_USB_DWC3_GADGET
+#define gadget_is_dwc3(g)        (!strcmp("dwc3-gadget", (g)->name))
+#else
+#define gadget_is_dwc3(g)        0
+#endif
+
+
+
 /*
  * CONFIG_USB_GADGET_SX2
  * CONFIG_USB_GADGET_AU1X00