UPSTREAM: usb: dwc3: gadget: release spin lock during gadget resume
authorJiebing Li <jiebing.li@intel.com>
Thu, 11 Dec 2014 05:26:29 +0000 (13:26 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 16 Aug 2016 12:48:19 +0000 (20:48 +0800)
It's a requirement that we release controller's lock
while calling gadget API function pointers. This
patch just fixes that long standing bug.

Change-Id: I19c2cd36fa48a6c27d59305ef2d6cb4c35512433
Signed-off-by: Jiebing Li <jiebing.li@intel.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Wu Liang feng <wulf@rock-chips.com>
(cherry picked from commit ad14d4e0308afda06a60036020a15025571604af)

drivers/usb/dwc3/gadget.c

index 2d981e1b869ceb49549b58a795504ea5206efc84..f6d90fb121d995af460770de8bcceffca3286e3e 100644 (file)
@@ -2484,7 +2484,11 @@ static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc)
         * implemented.
         */
 
-       dwc->gadget_driver->resume(&dwc->gadget);
+       if (dwc->gadget_driver && dwc->gadget_driver->resume) {
+               spin_unlock(&dwc->lock);
+               dwc->gadget_driver->resume(&dwc->gadget);
+               spin_lock(&dwc->lock);
+       }
 }
 
 static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,