diff options
Diffstat (limited to 'drivers/usb/chipidea/udc.c')
| -rw-r--r-- | drivers/usb/chipidea/udc.c | 56 | 
1 files changed, 11 insertions, 45 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 9333083dd111..b34c81969cba 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -20,7 +20,6 @@  #include <linux/pm_runtime.h>  #include <linux/usb/ch9.h>  #include <linux/usb/gadget.h> -#include <linux/usb/otg.h>  #include <linux/usb/chipidea.h>  #include "ci.h" @@ -686,9 +685,6 @@ static int _gadget_stop_activity(struct usb_gadget *gadget)  	usb_ep_fifo_flush(&ci->ep0out->ep);  	usb_ep_fifo_flush(&ci->ep0in->ep); -	if (ci->driver) -		ci->driver->disconnect(gadget); -  	/* make sure to disable all endpoints */  	gadget_for_each_ep(ep, gadget) {  		usb_ep_disable(ep); @@ -718,6 +714,11 @@ __acquires(ci->lock)  	int retval;  	spin_unlock(&ci->lock); +	if (ci->gadget.speed != USB_SPEED_UNKNOWN) { +		if (ci->driver) +			ci->driver->disconnect(&ci->gadget); +	} +  	retval = _gadget_stop_activity(&ci->gadget);  	if (retval)  		goto done; @@ -1461,6 +1462,8 @@ static int ci_udc_vbus_session(struct usb_gadget *_gadget, int is_active)  			hw_device_state(ci, ci->ep0out->qh.dma);  			dev_dbg(ci->dev, "Connected to host\n");  		} else { +			if (ci->driver) +				ci->driver->disconnect(&ci->gadget);  			hw_device_state(ci, 0);  			if (ci->platdata->notify_event)  				ci->platdata->notify_event(ci, @@ -1633,23 +1636,22 @@ static int ci_udc_start(struct usb_gadget *gadget,  	retval = usb_ep_enable(&ci->ep0in->ep);  	if (retval)  		return retval; -	spin_lock_irqsave(&ci->lock, flags);  	ci->driver = driver;  	pm_runtime_get_sync(&ci->gadget.dev);  	if (ci->vbus_active) { +		spin_lock_irqsave(&ci->lock, flags);  		hw_device_reset(ci, USBMODE_CM_DC);  	} else {  		pm_runtime_put_sync(&ci->gadget.dev); -		goto done; +		return retval;  	}  	retval = hw_device_state(ci, ci->ep0out->qh.dma); +	spin_unlock_irqrestore(&ci->lock, flags);  	if (retval)  		pm_runtime_put_sync(&ci->gadget.dev); - done: -	spin_unlock_irqrestore(&ci->lock, flags);  	return retval;  } @@ -1786,34 +1788,9 @@ static int udc_start(struct ci_hdrc *ci)  	ci->gadget.ep0 = &ci->ep0in->ep; -	if (ci->global_phy) { -		ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); -		if (IS_ERR(ci->transceiver)) -			ci->transceiver = NULL; -	} - -	if (ci->platdata->flags & CI_HDRC_REQUIRE_TRANSCEIVER) { -		if (ci->transceiver == NULL) { -			retval = -ENODEV; -			goto destroy_eps; -		} -	} - -	if (ci->transceiver) { -		retval = otg_set_peripheral(ci->transceiver->otg, -						&ci->gadget); -		/* -		 * If we implement all USB functions using chipidea drivers, -		 * it doesn't need to call above API, meanwhile, if we only -		 * use gadget function, calling above API is useless. -		 */ -		if (retval && retval != -ENOTSUPP) -			goto put_transceiver; -	} -  	retval = usb_add_gadget_udc(dev, &ci->gadget);  	if (retval) -		goto remove_trans; +		goto destroy_eps;  	pm_runtime_no_callbacks(&ci->gadget.dev);  	pm_runtime_enable(&ci->gadget.dev); @@ -1823,17 +1800,6 @@ static int udc_start(struct ci_hdrc *ci)  	return retval; -remove_trans: -	if (ci->transceiver) { -		otg_set_peripheral(ci->transceiver->otg, NULL); -		if (ci->global_phy) -			usb_put_phy(ci->transceiver); -	} - -	dev_err(dev, "error = %i\n", retval); -put_transceiver: -	if (ci->transceiver && ci->global_phy) -		usb_put_phy(ci->transceiver);  destroy_eps:  	destroy_eps(ci);  free_pools:  | 
