• S
    usb: musb: dsps: redo the otg timer · 0f901c98
    Sebastian Andrzej Siewior 提交于
    According to the comments, we rely on the OTG timer because the core
    does not expose some important OTG details. So far this is all I
    know. After playing with OTG I stumbled over a problem:
    musb is recognized as a B-device without a problem. Whenever a cable is
    plugged, the VBUS rises, musb recognizes this as a starting session,
    sets the MUSB_DEVCTL_SESSION bit by itself and a RESET interrupt occurs,
    the session starts. Good.
    After a disconnect, the timer is started and re-starts itself because
    it remains in B_IDLE with the BDEVICE set. I didn't figure the the
    reason or the need for it. Nothing changes here except for OTG state
    from B to A device if the BDEVICE bit disappears. This doesn't make much
    sense to me because nothing happens after this. _IF_ we receive an
    interrupt before the state change then we may act on wrong condition.
    Plugging a B-device (and letting MUSB act as host) doesn't work here.
    The reason seems to be that the MUSB tries to start a session, it fails
    and then it removes the bit. So we never start as a host.
    
    This patch sets the MUSB_DEVCTL_SESSION bit in the IDLE state so musb
    can try to establish a session as host. After the bit is set, musb tries
    to start a session and if it fails it clears the bit. Therefore it will
    try over and over again until a session either as host or as device is
    established.
    
    The readout of the MUSB_DEVCTL register after the removal the
    MUSB_DEVCTL_SESSION (in A_WAIT_BCON) has been removed because it did not
    contain the BDEVICE bit set (in the second read) leading to A_IDLE. After
    plugging a host musb assumed that it is also a host and complained about
    a missing reset. However a third read of the register has has the BDEVICE
    bit set so it seems that it is not stable.
    This mostly what da8xx.c is doing except that we set the timer also
    after A_WAIT_BCON so the session bit can be triggered.
    
    Whit this change I was able to keep am335x-evm in OTG mode and plug in
    either a HOST or a DEVICE and in a random order and the device was
    recognized.
    
    Cc: stable@vger.kernel.org # v3.11
    Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: NFelipe Balbi <balbi@ti.com>
    0f901c98
musb_dsps.c 17.0 KB