diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2013-08-20 16:35:49 (GMT) |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2013-08-27 19:18:41 (GMT) |
commit | 781f17983015dae33324e34d1bb831e715fa04d4 (patch) | |
tree | 3325350ea933ed6bc1c4797116646f14055f8e22 /drivers/usb/musb/musb_dsps.c | |
parent | 9dfa36218dadf1821da5823773dd689b4e650e00 (diff) | |
download | linux-781f17983015dae33324e34d1bb831e715fa04d4.tar.xz |
usb: musb: am335x-evm: Do not remove the session bit HOST-only mode
This is what I observe:
On the first connect, the musb starts with DEVCTL.Session set. On
disconnect, musb_core calls try_idle. That functions removes the Session
bit signalizing that the session is over (something that only in OTG is
required). A new device, that is plugged, is no longer recognized.
I've setup a timer and checked the DEVCTL register and I haven't seen a
change in VBus and I saw the B-Device bit set. After setting the IDDIG
into A mode and forcing the device to behave like a A device, I didn't
see a change.
Neither VBUS goes to 0b11 nor does a session start request comes.
In the TI-v3.2 kernel they skip to call musb_platform_try_idle() in the
OTG_STATE_A_WAIT_BCON state while not in OTG mode.
Since the second port hast a standard A plug the patch changes the port
to run in host mode only and skips the timer which would remove
DEVCTL.Session so we can reconnect to another device later.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb/musb_dsps.c')
-rw-r--r-- | drivers/usb/musb/musb_dsps.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 392406d..4047cbb 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c @@ -231,6 +231,8 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout) glue->last_timer = jiffies; return; } + if (musb->port_mode == MUSB_PORT_MODE_HOST) + return; if (time_after(glue->last_timer, timeout) && timer_pending(&glue->timer)) { |