diff options
author | Li Jun <B47624@freescale.com> | 2014-02-26 18:38:19 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-03-07 11:03:25 -0500 |
commit | 8bebbe8dc6145303db05964fb09657aac2a7e909 (patch) | |
tree | 9c47b026a82c8a2a01900ef38c81009f9f77d7de | |
parent | 716fb91dfe1777bd6d5e598f3d3572214b3ed296 (diff) |
usb: phy: fsm: update OTG HNP state transition conditions according to OTG and EH 2.0 spec.
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>
-rw-r--r-- | drivers/usb/phy/phy-fsm-usb.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/usb/phy/phy-fsm-usb.c b/drivers/usb/phy/phy-fsm-usb.c index 7aa314ef4a8a..c47e5a6edde2 100644 --- a/drivers/usb/phy/phy-fsm-usb.c +++ b/drivers/usb/phy/phy-fsm-usb.c | |||
@@ -317,10 +317,12 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
317 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); | 317 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); |
318 | break; | 318 | break; |
319 | case OTG_STATE_A_HOST: | 319 | case OTG_STATE_A_HOST: |
320 | if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) && | 320 | if (fsm->id || fsm->a_bus_drop) |
321 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); | ||
322 | else if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) && | ||
321 | fsm->otg->host->b_hnp_enable) | 323 | fsm->otg->host->b_hnp_enable) |
322 | otg_set_state(fsm, OTG_STATE_A_SUSPEND); | 324 | otg_set_state(fsm, OTG_STATE_A_SUSPEND); |
323 | else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop) | 325 | else if (!fsm->b_conn) |
324 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | 326 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); |
325 | else if (!fsm->a_vbus_vld) | 327 | else if (!fsm->a_vbus_vld) |
326 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | 328 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); |
@@ -346,8 +348,7 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
346 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | 348 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); |
347 | break; | 349 | break; |
348 | case OTG_STATE_A_WAIT_VFALL: | 350 | case OTG_STATE_A_WAIT_VFALL: |
349 | if (fsm->a_wait_vfall_tmout || fsm->id || fsm->a_bus_req || | 351 | if (fsm->a_wait_vfall_tmout) |
350 | (!fsm->a_sess_vld && !fsm->b_conn)) | ||
351 | otg_set_state(fsm, OTG_STATE_A_IDLE); | 352 | otg_set_state(fsm, OTG_STATE_A_IDLE); |
352 | break; | 353 | break; |
353 | case OTG_STATE_A_VBUS_ERR: | 354 | case OTG_STATE_A_VBUS_ERR: |