usb: phy: fsm: update OTG HNP state transition conditions according to OTG and EH...
authorLi Jun <B47624@freescale.com>
Wed, 26 Feb 2014 23:38:19 +0000 (07:38 +0800)
committerFelipe Balbi <balbi@ti.com>
Fri, 7 Mar 2014 16:03:25 +0000 (10:03 -0600)
According to:"On-The-Go and Embedded Host Supplement to the USB Revision 2.0
Specification July 27, 2012 Revision 2.0 version 1.1a"
- From a_host to a_wait_bcon if !b_conn
- Add transition from a_host to a_wait_vfall if id state is high or a_bus_drop
- From a_wait_vfall to a_idle if a_wait_vfall_tmout

Signed-off-by: Li Jun <b47624@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/phy/phy-fsm-usb.c

index 7aa314ef4a8ade13bac4ba73b41645d1b522dd84..c47e5a6edde28a1d35d64d6f375df401a8519709 100644 (file)
@@ -317,10 +317,12 @@ int otg_statemachine(struct otg_fsm *fsm)
                        otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
                break;
        case OTG_STATE_A_HOST:
-               if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) &&
+               if (fsm->id || fsm->a_bus_drop)
+                       otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
+               else if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) &&
                                fsm->otg->host->b_hnp_enable)
                        otg_set_state(fsm, OTG_STATE_A_SUSPEND);
-               else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop)
+               else if (!fsm->b_conn)
                        otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
                else if (!fsm->a_vbus_vld)
                        otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
@@ -346,8 +348,7 @@ int otg_statemachine(struct otg_fsm *fsm)
                        otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
                break;
        case OTG_STATE_A_WAIT_VFALL:
-               if (fsm->a_wait_vfall_tmout || fsm->id || fsm->a_bus_req ||
-                               (!fsm->a_sess_vld && !fsm->b_conn))
+               if (fsm->a_wait_vfall_tmout)
                        otg_set_state(fsm, OTG_STATE_A_IDLE);
                break;
        case OTG_STATE_A_VBUS_ERR: