|
@@ -2889,6 +2889,7 @@ static int s3c_hsotg_udc_start(struct usb_gadget *gadget,
|
|
|
spin_lock_irqsave(&hsotg->lock, flags);
|
|
|
s3c_hsotg_init(hsotg);
|
|
|
s3c_hsotg_core_init_disconnected(hsotg);
|
|
|
+ hsotg->enabled = 0;
|
|
|
spin_unlock_irqrestore(&hsotg->lock, flags);
|
|
|
|
|
|
dev_info(hsotg->dev, "bound driver %s\n", driver->driver.name);
|
|
@@ -2929,6 +2930,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget)
|
|
|
|
|
|
hsotg->driver = NULL;
|
|
|
hsotg->gadget.speed = USB_SPEED_UNKNOWN;
|
|
|
+ hsotg->enabled = 0;
|
|
|
|
|
|
spin_unlock_irqrestore(&hsotg->lock, flags);
|
|
|
|
|
@@ -2972,9 +2974,11 @@ static int s3c_hsotg_pullup(struct usb_gadget *gadget, int is_on)
|
|
|
spin_lock_irqsave(&hsotg->lock, flags);
|
|
|
if (is_on) {
|
|
|
clk_enable(hsotg->clk);
|
|
|
+ hsotg->enabled = 1;
|
|
|
s3c_hsotg_core_connect(hsotg);
|
|
|
} else {
|
|
|
s3c_hsotg_core_disconnect(hsotg);
|
|
|
+ hsotg->enabled = 0;
|
|
|
clk_disable(hsotg->clk);
|
|
|
}
|
|
|
|
|
@@ -3585,20 +3589,21 @@ int s3c_hsotg_suspend(struct dwc2_hsotg *hsotg)
|
|
|
|
|
|
mutex_lock(&hsotg->init_mutex);
|
|
|
|
|
|
- if (hsotg->driver)
|
|
|
+ if (hsotg->driver) {
|
|
|
+ int ep;
|
|
|
+
|
|
|
dev_info(hsotg->dev, "suspending usb gadget %s\n",
|
|
|
hsotg->driver->driver.name);
|
|
|
|
|
|
- spin_lock_irqsave(&hsotg->lock, flags);
|
|
|
- s3c_hsotg_core_disconnect(hsotg);
|
|
|
- s3c_hsotg_disconnect(hsotg);
|
|
|
- hsotg->gadget.speed = USB_SPEED_UNKNOWN;
|
|
|
- spin_unlock_irqrestore(&hsotg->lock, flags);
|
|
|
+ spin_lock_irqsave(&hsotg->lock, flags);
|
|
|
+ if (hsotg->enabled)
|
|
|
+ s3c_hsotg_core_disconnect(hsotg);
|
|
|
+ s3c_hsotg_disconnect(hsotg);
|
|
|
+ hsotg->gadget.speed = USB_SPEED_UNKNOWN;
|
|
|
+ spin_unlock_irqrestore(&hsotg->lock, flags);
|
|
|
|
|
|
- s3c_hsotg_phy_disable(hsotg);
|
|
|
+ s3c_hsotg_phy_disable(hsotg);
|
|
|
|
|
|
- if (hsotg->driver) {
|
|
|
- int ep;
|
|
|
for (ep = 0; ep < hsotg->num_of_eps; ep++)
|
|
|
s3c_hsotg_ep_disable(&hsotg->eps[ep].ep);
|
|
|
|
|
@@ -3626,16 +3631,16 @@ int s3c_hsotg_resume(struct dwc2_hsotg *hsotg)
|
|
|
|
|
|
clk_enable(hsotg->clk);
|
|
|
ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
|
|
|
- hsotg->supplies);
|
|
|
- }
|
|
|
-
|
|
|
- s3c_hsotg_phy_enable(hsotg);
|
|
|
+ hsotg->supplies);
|
|
|
|
|
|
- spin_lock_irqsave(&hsotg->lock, flags);
|
|
|
- s3c_hsotg_core_init_disconnected(hsotg);
|
|
|
- s3c_hsotg_core_connect(hsotg);
|
|
|
- spin_unlock_irqrestore(&hsotg->lock, flags);
|
|
|
+ s3c_hsotg_phy_enable(hsotg);
|
|
|
|
|
|
+ spin_lock_irqsave(&hsotg->lock, flags);
|
|
|
+ s3c_hsotg_core_init_disconnected(hsotg);
|
|
|
+ if (hsotg->enabled)
|
|
|
+ s3c_hsotg_core_connect(hsotg);
|
|
|
+ spin_unlock_irqrestore(&hsotg->lock, flags);
|
|
|
+ }
|
|
|
mutex_unlock(&hsotg->init_mutex);
|
|
|
|
|
|
return ret;
|