summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jun <jun.li@freescale.com>2015-04-28 19:56:35 +0800
committerPeter Chen <peter.chen@freescale.com>2015-05-13 13:50:34 +0800
commit70512f43380d883d8c452435662cd875ab177463 (patch)
treef8ea9c99a3010b372771aaa42726bad9d52eb2c4
parent04cb927116e1e6d29e42bccd52472d6925972d4e (diff)
MLK-10750 usb: chipidea: otg: remove otg fsm before destory gdaget and host
If unload ci_hdrc driver while otg fsm is running as A-device, we should firstly clean otg fsm and stop all otg fsm timers before destroy gadget and host. Signed-off-by: Li Jun <jun.li@freescale.com>
-rw-r--r--drivers/usb/chipidea/core.c4
-rw-r--r--drivers/usb/chipidea/otg_fsm.c7
2 files changed, 9 insertions, 2 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index db558402add9..b096946fcbe6 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -716,10 +716,10 @@ EXPORT_SYMBOL_GPL(ci_hdrc_query_available_role);
static inline void ci_role_destroy(struct ci_hdrc *ci)
{
- ci_hdrc_gadget_destroy(ci);
- ci_hdrc_host_destroy(ci);
if (ci->is_otg)
ci_hdrc_otg_destroy(ci);
+ ci_hdrc_gadget_destroy(ci);
+ ci_hdrc_host_destroy(ci);
}
static void ci_get_otg_capable(struct ci_hdrc *ci)
diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
index 0f29f63026f2..ec8f75f6a977 100644
--- a/drivers/usb/chipidea/otg_fsm.c
+++ b/drivers/usb/chipidea/otg_fsm.c
@@ -934,6 +934,13 @@ int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
void ci_hdrc_otg_fsm_remove(struct ci_hdrc *ci)
{
+ enum otg_fsm_timer i;
+
+ for (i = 0; i < NUM_OTG_FSM_TIMERS; i++)
+ otg_del_timer(&ci->fsm, i);
+
+ ci->enabled_otg_timer_bits = 0;
+
/* Turn off vbus if vbus is on */
if (ci->fsm.a_vbus_vld)
otg_drv_vbus(&ci->fsm, 0);