diff options
Diffstat (limited to 'drivers/usb/chipidea/udc.c')
-rw-r--r-- | drivers/usb/chipidea/udc.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 8223fe73ea85..391a1225b0ba 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
@@ -1751,6 +1751,22 @@ static int ci_udc_start(struct usb_gadget *gadget, | |||
1751 | return retval; | 1751 | return retval; |
1752 | } | 1752 | } |
1753 | 1753 | ||
1754 | static void ci_udc_stop_for_otg_fsm(struct ci_hdrc *ci) | ||
1755 | { | ||
1756 | if (!ci_otg_is_fsm_mode(ci)) | ||
1757 | return; | ||
1758 | |||
1759 | mutex_lock(&ci->fsm.lock); | ||
1760 | if (ci->fsm.otg->state == OTG_STATE_A_PERIPHERAL) { | ||
1761 | ci->fsm.a_bidl_adis_tmout = 1; | ||
1762 | ci_hdrc_otg_fsm_start(ci); | ||
1763 | } else if (ci->fsm.otg->state == OTG_STATE_B_PERIPHERAL) { | ||
1764 | ci->fsm.protocol = PROTO_UNDEF; | ||
1765 | ci->fsm.otg->state = OTG_STATE_UNDEFINED; | ||
1766 | } | ||
1767 | mutex_unlock(&ci->fsm.lock); | ||
1768 | } | ||
1769 | |||
1754 | /** | 1770 | /** |
1755 | * ci_udc_stop: unregister a gadget driver | 1771 | * ci_udc_stop: unregister a gadget driver |
1756 | */ | 1772 | */ |
@@ -1775,6 +1791,7 @@ static int ci_udc_stop(struct usb_gadget *gadget) | |||
1775 | ci->driver = NULL; | 1791 | ci->driver = NULL; |
1776 | spin_unlock_irqrestore(&ci->lock, flags); | 1792 | spin_unlock_irqrestore(&ci->lock, flags); |
1777 | 1793 | ||
1794 | ci_udc_stop_for_otg_fsm(ci); | ||
1778 | return 0; | 1795 | return 0; |
1779 | } | 1796 | } |
1780 | 1797 | ||