we will need this from StartTransfer to make sure
link is in U0 before starting a transfer.

Signed-off-by: Felipe Balbi <[email protected]>
---
 drivers/usb/dwc3/gadget.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 8b3a676db346..552ebdf972b4 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1363,22 +1363,16 @@ static int dwc3_gadget_get_frame(struct usb_gadget *g)
        return DWC3_DSTS_SOFFN(reg);
 }
 
-static int dwc3_gadget_wakeup(struct usb_gadget *g)
+static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
 {
-       struct dwc3             *dwc = gadget_to_dwc(g);
-
        unsigned long           timeout;
-       unsigned long           flags;
 
+       int                     ret;
        u32                     reg;
 
-       int                     ret = 0;
-
        u8                      link_state;
        u8                      speed;
 
-       spin_lock_irqsave(&dwc->lock, flags);
-
        /*
         * According to the Databook Remote wakeup request should
         * be issued only when the device is in early suspend state.
@@ -1391,8 +1385,7 @@ static int dwc3_gadget_wakeup(struct usb_gadget *g)
        if ((speed == DWC3_DSTS_SUPERSPEED) ||
            (speed == DWC3_DSTS_SUPERSPEED_PLUS)) {
                dwc3_trace(trace_dwc3_gadget, "no wakeup on SuperSpeed\n");
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        link_state = DWC3_DSTS_USBLNKST(reg);
@@ -1405,14 +1398,13 @@ static int dwc3_gadget_wakeup(struct usb_gadget *g)
                dwc3_trace(trace_dwc3_gadget,
                                "can't wakeup from '%s'\n",
                                dwc3_gadget_link_string(link_state));
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV);
        if (ret < 0) {
                dev_err(dwc->dev, "failed to put link in Recovery\n");
-               goto out;
+               return ret;
        }
 
        /* Recent versions do this automatically */
@@ -1436,10 +1428,20 @@ static int dwc3_gadget_wakeup(struct usb_gadget *g)
 
        if (DWC3_DSTS_USBLNKST(reg) != DWC3_LINK_STATE_U0) {
                dev_err(dwc->dev, "failed to send remote wakeup\n");
-               ret = -EINVAL;
+               return -EINVAL;
        }
 
-out:
+       return 0;
+}
+
+static int dwc3_gadget_wakeup(struct usb_gadget *g)
+{
+       struct dwc3             *dwc = gadget_to_dwc(g);
+       unsigned long           flags;
+       int                     ret;
+
+       spin_lock_irqsave(&dwc->lock, flags);
+       ret = __dwc3_gadget_wakeup(dwc);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
        return ret;
-- 
2.8.0.rc2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to