Re: [PATCH 3/7] usb: musb: omap2430: Handle multiple ID ground interrupts

2019-10-13 Thread Pavel Machek
On Wed 2019-10-09 14:21:40, Tony Lindgren wrote:
> We currently get "unhandled DISCONNECT transition" warnings from musb core
> on device disconnect as things are wrongly set to OTG_STATE_A_IDLE in
> host mode when enumerating devices. We can also get "Failed to write reg
> index" errors after enumerating.
> 
> This is happening at least with cpcap phy where we get multiple ID ground
> interrupts. Looks like it's VBUS keeps timing out and needs to be kicked
> when the phy sends multiple ID ground interrupts during host mode.

1-3: Acked-by: Pavel Machek 

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html


signature.asc
Description: Digital signature


[PATCH 3/7] usb: musb: omap2430: Handle multiple ID ground interrupts

2019-10-09 Thread Tony Lindgren
We currently get "unhandled DISCONNECT transition" warnings from musb core
on device disconnect as things are wrongly set to OTG_STATE_A_IDLE in
host mode when enumerating devices. We can also get "Failed to write reg
index" errors after enumerating.

This is happening at least with cpcap phy where we get multiple ID ground
interrupts. Looks like it's VBUS keeps timing out and needs to be kicked
when the phy sends multiple ID ground interrupts during host mode.

Cc: Jacopo Mondi 
Cc: Marcel Partap 
Cc: Merlijn Wajer 
Cc: Michael Scott 
Cc: NeKit 
Cc: Pavel Machek 
Cc: Sebastian Reichel 
Signed-off-by: Tony Lindgren 
---
 drivers/usb/musb/omap2430.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -151,13 +151,26 @@ static void omap_musb_set_mailbox(struct omap2430_glue 
*glue)
switch (glue->status) {
case MUSB_ID_GROUND:
dev_dbg(musb->controller, "ID GND\n");
-
-   musb->xceiv->otg->state = OTG_STATE_A_IDLE;
-   musb->xceiv->last_event = USB_EVENT_ID;
-   if (musb->gadget_driver) {
-   omap_control_usb_set_mode(glue->control_otghs,
-   USB_MODE_HOST);
+   switch (musb->xceiv->otg->state) {
+   case OTG_STATE_A_WAIT_VRISE:
+   case OTG_STATE_A_WAIT_BCON:
+   case OTG_STATE_A_HOST:
+   case OTG_STATE_A_IDLE:
+   /*
+* On multiple ID ground interrupts just keep enabling
+* VBUS. At least cpcap VBUS shuts down otherwise.
+*/
omap2430_musb_set_vbus(musb, 1);
+   break;
+   default:
+   musb->xceiv->otg->state = OTG_STATE_A_IDLE;
+   musb->xceiv->last_event = USB_EVENT_ID;
+   if (musb->gadget_driver) {
+   omap_control_usb_set_mode(glue->control_otghs,
+ USB_MODE_HOST);
+   omap2430_musb_set_vbus(musb, 1);
+   }
+   break;
}
break;
 
-- 
2.23.0