UPSTREAM: usb: dwc3: gadget: extract unlocked dwc3_gadget_wakeup()
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 4 Apr 2016 08:24:04 +0000 (11:24 +0300)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 16 Aug 2016 12:48:19 +0000 (20:48 +0800)
we will need this from StartTransfer to make sure
link is in U0 before starting a transfer.

Change-Id: Id6c9497969e2a65b4fae725a0ecf6ff6c369815b
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Wu Liang feng <wulf@rock-chips.com>
(cherry picked from commit 218ef7b647e3367c9f81e18f63fbb0066f10b9a5)

drivers/usb/dwc3/gadget.c

index bc750569083c3fa6458251f64d04903c1652f117..83a97cac395257c1813e4ceff0497cb7cffb7ac1 100644 (file)
@@ -1372,22 +1372,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.
@@ -1399,8 +1393,7 @@ static int dwc3_gadget_wakeup(struct usb_gadget *g)
        speed = reg & DWC3_DSTS_CONNECTSPD;
        if (speed == DWC3_DSTS_SUPERSPEED) {
                dwc3_trace(trace_dwc3_gadget, "no wakeup on SuperSpeed\n");
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        link_state = DWC3_DSTS_USBLNKST(reg);
@@ -1413,14 +1406,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 */
@@ -1444,10 +1436,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;