|
@@ -1751,6 +1751,22 @@ static int ci_udc_start(struct usb_gadget *gadget,
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+static void ci_udc_stop_for_otg_fsm(struct ci_hdrc *ci)
|
|
|
+{
|
|
|
+ if (!ci_otg_is_fsm_mode(ci))
|
|
|
+ return;
|
|
|
+
|
|
|
+ mutex_lock(&ci->fsm.lock);
|
|
|
+ if (ci->fsm.otg->state == OTG_STATE_A_PERIPHERAL) {
|
|
|
+ ci->fsm.a_bidl_adis_tmout = 1;
|
|
|
+ ci_hdrc_otg_fsm_start(ci);
|
|
|
+ } else if (ci->fsm.otg->state == OTG_STATE_B_PERIPHERAL) {
|
|
|
+ ci->fsm.protocol = PROTO_UNDEF;
|
|
|
+ ci->fsm.otg->state = OTG_STATE_UNDEFINED;
|
|
|
+ }
|
|
|
+ mutex_unlock(&ci->fsm.lock);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ci_udc_stop: unregister a gadget driver
|
|
|
*/
|
|
@@ -1775,6 +1791,7 @@ static int ci_udc_stop(struct usb_gadget *gadget)
|
|
|
ci->driver = NULL;
|
|
|
spin_unlock_irqrestore(&ci->lock, flags);
|
|
|
|
|
|
+ ci_udc_stop_for_otg_fsm(ci);
|
|
|
return 0;
|
|
|
}
|
|
|
|