Skip to content

Commit

Permalink
usb: musb: dsps: fix otg state machine
Browse files Browse the repository at this point in the history
Due to lack of ID pin interrupt event on AM335x devices, the musb dsps
driver uses polling to detect usb device attach for dual-role port.

But in the case if a micro-A cable adapter is attached without a USB device
attached to the cable, the musb state machine gets stuck in a_wait_vrise
state waiting for the MUSB_CONNECT interrupt which won't happen due to the
usb device is not attached. The state is stuck in a_wait_vrise even after
the micro-A cable is detached, which could cause VBUS retention if then the
dual-role port is attached to a host port.

To fix the problem, make a_wait_vrise as a transient state, then move the
state to either a_wait_bcon for host port or a_idle state for dual-role
port, if no usb device is attached to the port.

Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Bin Liu authored and Greg Kroah-Hartman committed Dec 18, 2018
1 parent 1d6e81a commit 6010abf
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/usb/musb/musb_dsps.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,13 @@ static int dsps_check_status(struct musb *musb, void *unused)

switch (musb->xceiv->otg->state) {
case OTG_STATE_A_WAIT_VRISE:
dsps_mod_timer_optional(glue);
break;
if (musb->port_mode == MUSB_HOST) {
musb->xceiv->otg->state = OTG_STATE_A_WAIT_BCON;
dsps_mod_timer_optional(glue);
break;
}
/* fall through */

case OTG_STATE_A_WAIT_BCON:
/* keep VBUS on for host-only mode */
if (musb->port_mode == MUSB_HOST) {
Expand Down

0 comments on commit 6010abf

Please sign in to comment.