Hi Tony, On Mon, Nov 25, 2019 at 07:41:51PM -0800, Tony Lindgren wrote: > When disconnected as USB B-device, we sometimes get a suspend interrupt > after disconnect interrupt. In that case we have devctl set to 99 with > VBUS still valid and musb_pm_runtime_check_session() wrongly things we > have an active session. We have no other interrupts after disconnect > coming in this case at least with the omap2430 glue. So I had been debugging a issue with musb_hrdc driver preventing a suspend on the pinephone, which is Allwinner A64 platform. Namely, if I have USB connected, and I try to suspend, it would hang until USB is disconnected. After enabling tracing, I realized that is hanging after this commit. Reverting it makes device suspend and resume correctly. Some more of debugging notes can be found at, https://gitlab.com/postmarketOS/pmaports/-/issues/839 I wonder what would be right solution here? Disable this quirk somehow for device? Regards > Let's fix the issue by checking the interrupt status again with > delayed work for the devctl 99 case. In the suspend after disconnect > case the devctl session bit has cleared by then and musb can idle. > For a typical USB B-device connect case we just continue with normal > interrupts. > > Cc: Merlijn Wajer <merlijn@xxxxxxxxxx> > Cc: Pavel Machek <pavel@xxxxxx> > Cc: Sebastian Reichel <sre@xxxxxxxxxx> > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > --- > drivers/usb/musb/musb_core.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c > --- a/drivers/usb/musb/musb_core.c > +++ b/drivers/usb/musb/musb_core.c > @@ -1943,6 +1943,9 @@ ATTRIBUTE_GROUPS(musb); > #define MUSB_QUIRK_B_INVALID_VBUS_91 (MUSB_DEVCTL_BDEVICE | \ > (2 << MUSB_DEVCTL_VBUS_SHIFT) | \ > MUSB_DEVCTL_SESSION) > +#define MUSB_QUIRK_B_DISCONNECT_99 (MUSB_DEVCTL_BDEVICE | \ > + (3 << MUSB_DEVCTL_VBUS_SHIFT) | \ > + MUSB_DEVCTL_SESSION) > #define MUSB_QUIRK_A_DISCONNECT_19 ((3 << MUSB_DEVCTL_VBUS_SHIFT) | \ > MUSB_DEVCTL_SESSION) > > @@ -1965,6 +1968,11 @@ static void musb_pm_runtime_check_session(struct musb *musb) > s = MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV | > MUSB_DEVCTL_HR; > switch (devctl & ~s) { > + case MUSB_QUIRK_B_DISCONNECT_99: > + musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n"); > + schedule_delayed_work(&musb->irq_work, > + msecs_to_jiffies(1000)); > + break; > case MUSB_QUIRK_B_INVALID_VBUS_91: > if (musb->quirk_retries && !musb->flush_irq_work) { > musb_dbg(musb, > -- > 2.24.0 -- Bhushan Shah http://blog.bshah.in IRC Nick : bshah on Freenode GPG key fingerprint : 0AAC 775B B643 7A8D 9AF7 A3AC FE07 8411 7FBC E11D
Attachment:
signature.asc
Description: PGP signature