linux_dsm_epyc7002/drivers/usb/musb
Sebastian Andrzej Siewior 0f901c9801 usb: musb: dsps: redo the otg timer
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: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
2013-10-17 09:55:08 -05:00
..
am35x.c usb: musb: am35x: use SIMPLE_DEV_PM_OPS 2013-10-02 08:21:23 -05:00
blackfin.c usb: musb: blackfin: use SIMPLE_DEV_PM_OPS 2013-10-02 08:21:55 -05:00
blackfin.h usb: musb: drop a gigantic amount of ifdeferry 2011-07-01 14:31:10 -07:00
cppi_dma.c usb: musb: dma: merge ->start/stop into create/destroy 2013-07-29 13:53:18 +03:00
cppi_dma.h headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
da8xx.c usb: musb: use platform_device_register_full() to avoid directly messing with dma masks 2013-10-01 09:31:19 -05:00
davinci.c usb: musb: davinci: fix resources passed to MUSB driver for DM6467 2013-10-01 09:44:01 -05:00
davinci.h usb: musb: davinci: Fix build breakage 2012-06-04 18:29:42 +03:00
Kconfig usb: musb: name ux500 platforms more broadly 2013-10-01 09:31:12 -05:00
Makefile usb: musb dma: add cppi41 dma driver 2013-08-09 17:40:16 +03:00
musb_am335x.c usb: musb_am335x: Remove redundant of_match_ptr 2013-10-04 09:25:11 -05:00
musb_core.c usb: musb: cancel work on removal 2013-10-10 11:29:40 -05:00
musb_core.h usb: musb: get rid of unused proc_dir_entry 2013-07-29 13:56:50 +03:00
musb_cppi41.c usb: musb: cppi41: fix missing unlock on error in cppi41_dma_callback() 2013-08-27 14:16:51 -05:00
musb_debug.h usb: musb: remove extern qualifier from musb_debug.h header 2011-12-21 13:21:02 +02:00
musb_debugfs.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
musb_dma.h usb: musb dma: add cppi41 dma driver 2013-08-09 17:40:16 +03:00
musb_dsps.c usb: musb: dsps: redo the otg timer 2013-10-17 09:55:08 -05:00
musb_gadget_ep0.c usb: musb: gadget: read ep0 fifo only if rxcount is non zero 2013-04-02 11:42:50 +03:00
musb_gadget.c usb: musb: only remove host/udc if it has been added 2013-08-27 14:18:14 -05:00
musb_gadget.h usb: musb: add Kconfig options for HOST, GAGDET or DUAL_ROLE modes 2013-05-28 19:22:23 +03:00
musb_host.c usb: musb: only remove host/udc if it has been added 2013-08-27 14:18:14 -05:00
musb_host.h usb: patches for v3.11 merge window 2013-06-12 14:44:13 -07:00
musb_io.h usb: musb: use io{read,write}*_rep accessors 2012-12-17 17:15:13 -08:00
musb_regs.h usb: musb: tusb6010: fix compilation 2011-08-12 11:52:50 +03:00
musb_virthub.c usb: musb: call musb_start() only once in OTG mode 2013-10-17 09:55:03 -05:00
musbhsdma.c usb: musb: dma: merge ->start/stop into create/destroy 2013-07-29 13:53:18 +03:00
musbhsdma.h usb: musb: remove generic_interrupt 2012-11-06 15:32:13 +02:00
omap2430.c usb: musb: Call atomic_notifier_call_chain when status is changed 2013-10-01 09:31:14 -05:00
omap2430.h usb: start using the control module driver 2013-01-25 12:27:24 +02:00
tusb6010_omap.c usb: musb: dma: merge ->start/stop into create/destroy 2013-07-29 13:53:18 +03:00
tusb6010.c usb: musb: use platform_device_register_full() to avoid directly messing with dma masks 2013-10-01 09:31:19 -05:00
tusb6010.h USB: musb: Remove my email address from few musb related drivers 2009-04-23 14:15:27 -07:00
ux500_dma.c usb: musb: ux500: Add check for NULL board data 2013-08-27 15:05:39 -05:00
ux500.c usb: musb: ux500: use SIMPLE_DEV_PM_OPS 2013-10-02 08:22:19 -05:00