From: Benoit Goby <benoit@android.com>
Date: Wed, 29 Sep 2010 23:04:25 +0000 (-0700)
Subject: usb: gadget: fsl_udc: Unlock the spinlock before calling clk_enable
X-Git-Tag: firefly_0821_release~9833^2~193
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=2973ae6586d2abe28d45e35a47c8fe05ed7c43d6;p=firefly-linux-kernel-4.4.55.git

usb: gadget: fsl_udc: Unlock the spinlock before calling clk_enable

On suspend, dr_controller_stop disable interrupts and on resume, interrupts
are disabled until dr_controller_run is called, so it is safe to call
fsl_udc_clk_suspend/resume with interrupts and the spinlock unlocked.

Change-Id: I33618295ea096a4bfd796d1a07dfc9722e7786b0
Signed-off-by: Benoit Goby <benoit@android.com>
---

diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
index fa37f529ae53..1242c1a57e43 100644
--- a/drivers/usb/gadget/fsl_udc_core.c
+++ b/drivers/usb/gadget/fsl_udc_core.c
@@ -1162,24 +1162,25 @@ static int fsl_vbus_session(struct usb_gadget *gadget, int is_active)
 			/* stop the controller and turn off the clocks */
 			dr_controller_stop(udc);
 			dr_controller_reset(udc);
+			spin_unlock_irqrestore(&udc->lock, flags);
 			fsl_udc_clk_suspend();
 			udc->vbus_active = 0;
 			udc->usb_state = USB_STATE_DEFAULT;
 		} else if (!udc->vbus_active && is_active) {
+			spin_unlock_irqrestore(&udc->lock, flags);
 			fsl_udc_clk_resume();
 			/* setup the controller in the device mode */
 			dr_controller_setup(udc);
 			/* setup EP0 for setup packet */
 			ep0_setup(udc);
-			/* start the controller */
-			dr_controller_run(udc);
 			/* initialize the USB and EP states */
 			udc->usb_state = USB_STATE_ATTACHED;
 			udc->ep0_state = WAIT_FOR_SETUP;
 			udc->ep0_dir = 0;
 			udc->vbus_active = 1;
+			/* start the controller */
+			dr_controller_run(udc);
 		}
-		spin_unlock_irqrestore(&udc->lock, flags);
 		return 0;
 	}