usb: dwc3: gadget: start core on Rx.Detect
authorFelipe Balbi <balbi@ti.com>
Wed, 18 Jan 2012 16:32:29 +0000 (18:32 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 6 Feb 2012 09:48:36 +0000 (11:48 +0200)
When we set Run/Stop bit, we also move the
core to Rx.Detect state so that USB3 handshake
can start from a known location.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c

index 123c3aa..71d958a 100644 (file)
 
 #define DWC3_DCTL_APPL1RES     (1 << 23)
 
+#define DWC3_DCTL_TRGTULST_MASK        (0x0f << 17)
+#define DWC3_DCTL_TRGTULST(n)  ((n) << 17)
+
+#define DWC3_DCTL_TRGTULST_U2  (DWC3_DCTL_TRGTULST(2))
+#define DWC3_DCTL_TRGTULST_U3  (DWC3_DCTL_TRGTULST(3))
+#define DWC3_DCTL_TRGTULST_SS_DIS (DWC3_DCTL_TRGTULST(4))
+#define DWC3_DCTL_TRGTULST_RX_DET (DWC3_DCTL_TRGTULST(5))
+#define DWC3_DCTL_TRGTULST_SS_INACT (DWC3_DCTL_TRGTULST(6))
+
 #define DWC3_DCTL_INITU2ENA    (1 << 12)
 #define DWC3_DCTL_ACCEPTU2ENA  (1 << 11)
 #define DWC3_DCTL_INITU1ENA    (1 << 10)
index 7913d1b..2c4482f 100644 (file)
@@ -1313,10 +1313,13 @@ static void dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on)
        u32                     timeout = 500;
 
        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
-       if (is_on)
-               reg |= DWC3_DCTL_RUN_STOP;
-       else
+       if (is_on) {
+               reg &= ~DWC3_DCTL_TRGTULST_MASK;
+               reg |= (DWC3_DCTL_RUN_STOP
+                               | DWC3_DCTL_TRGTULST_RX_DET);
+       } else {
                reg &= ~DWC3_DCTL_RUN_STOP;
+       }
 
        dwc3_writel(dwc->regs, DWC3_DCTL, reg);