On 11/29/2016 06:56 PM, Bin Liu wrote: > On Tue, Nov 29, 2016 at 06:41:04PM +0100, Alexandre Bailon wrote: >> On 11/29/2016 05:16 PM, Bin Liu wrote: >>> Hi, >>> >>> On Mon, Nov 28, 2016 at 05:26:20PM +0100, Alexandre Bailon wrote: >>>> On da8xx, VBUS is not maintained during suspend when musb is in host mode. >>>> On resume, all the connected devices will be disconnected and then will >>>> be enumerated again. >>>> This happens because MUSB_DEVCTL is cleared during suspend. >>>> Add a quirk to preserve MUSB_DEVCTL during a suspend. >>> >>> Will preserving MUSB_DEVCTL prevent the device getting disconnected? >> Yes. Preserving MUSB_DEVCTL keeps VBUS on though the PHY is off during >> suspend. > > VBUS will be on, but does it prevent disconnecting the usb device on > resume? I don't have a DA8xx to test, but I doubt it, since the PHY is > off. Actually, the PHY is not really off. The name is probably confusing but the PHY off only put the PHY in the lowest power state (chapter 10.11.1 of omapl138 TRM). I have tried with the TI kernel and it was able to suspend and resume the omapl138-lcdk without without getting a disconnect. That why I wrote this series.
Regards, Alexandre > >> Note that in device mode, the disconnect still happen but I think it's >> the expected behavior. > > Right, the PHY off disables the pullup. > >>> This doesn't happen on am335x. The PHY is off during suspend, during >>> resume, PHY gets on, MUSB generates MUSB_CONNECT interrupt, then >>> re-enumeration happens. >> I haven't been able to try on the BBB. I don't know if my config is >> incorrect or if some patches are missing but I was not able to >> suspend it. > > I heard the mainline kernel currently is broken on am335x PM, so > suspend/resume doesn't work. I had to test it on TI kernel. > > Regards, > -Bin. > >> >> Regards, >> Alexandre >>> >>> Regards, >>> -Bin. >>> >>>> >>>> Signed-off-by: Alexandre Bailon <abai...@baylibre.com> >>>> --- >>>> drivers/usb/musb/musb_core.c | 13 +++++++------ >>>> drivers/usb/musb/musb_core.h | 1 + >>>> 2 files changed, 8 insertions(+), 6 deletions(-) >>>> >>>> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c >>>> index 9e22646..7e2cd98 100644 >>>> --- a/drivers/usb/musb/musb_core.c >>>> +++ b/drivers/usb/musb/musb_core.c >>>> @@ -1040,14 +1040,15 @@ static void musb_enable_interrupts(struct musb >>>> *musb) >>>> >>>> } >>>> >>>> -static void musb_generic_disable(struct musb *musb) >>>> +static void musb_generic_disable(struct musb *musb, bool suspend) >>>> { >>>> void __iomem *mbase = musb->mregs; >>>> >>>> musb_disable_interrupts(musb); >>>> >>>> /* off */ >>>> - musb_writeb(mbase, MUSB_DEVCTL, 0); >>>> + if (!suspend || !(musb->io.quirks & MUSB_PRESERVE_DEVCTL)) >>>> + musb_writeb(mbase, MUSB_DEVCTL, 0); >>>> } >>>> >>>> /* >>>> @@ -1106,7 +1107,7 @@ void musb_stop(struct musb *musb) >>>> { >>>> /* stop IRQs, timers, ... */ >>>> musb_platform_disable(musb); >>>> - musb_generic_disable(musb); >>>> + musb_generic_disable(musb, false); >>>> musb_dbg(musb, "HDRC disabled"); >>>> >>>> /* FIXME >>>> @@ -2310,7 +2311,7 @@ musb_init_controller(struct device *dev, int nIrq, >>>> void __iomem *ctrl) >>>> >>>> /* be sure interrupts are disabled before connecting ISR */ >>>> musb_platform_disable(musb); >>>> - musb_generic_disable(musb); >>>> + musb_generic_disable(musb, false); >>>> >>>> /* Init IRQ workqueue before request_irq */ >>>> INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work); >>>> @@ -2486,7 +2487,7 @@ static int musb_remove(struct platform_device *pdev) >>>> musb_gadget_cleanup(musb); >>>> spin_lock_irqsave(&musb->lock, flags); >>>> musb_platform_disable(musb); >>>> - musb_generic_disable(musb); >>>> + musb_generic_disable(musb, false); >>>> spin_unlock_irqrestore(&musb->lock, flags); >>>> musb_writeb(musb->mregs, MUSB_DEVCTL, 0); >>>> pm_runtime_dont_use_autosuspend(musb->controller); >>>> @@ -2663,7 +2664,7 @@ static int musb_suspend(struct device *dev) >>>> unsigned long flags; >>>> >>>> musb_platform_disable(musb); >>>> - musb_generic_disable(musb); >>>> + musb_generic_disable(musb, true); >>>> WARN_ON(!list_empty(&musb->pending_list)); >>>> >>>> spin_lock_irqsave(&musb->lock, flags); >>>> diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h >>>> index a611e2f..22961ef 100644 >>>> --- a/drivers/usb/musb/musb_core.h >>>> +++ b/drivers/usb/musb/musb_core.h >>>> @@ -172,6 +172,7 @@ struct musb_io; >>>> */ >>>> struct musb_platform_ops { >>>> >>>> +#define MUSB_PRESERVE_DEVCTL BIT(7) >>>> #define MUSB_DMA_UX500 BIT(6) >>>> #define MUSB_DMA_CPPI41 BIT(5) >>>> #define MUSB_DMA_CPPI BIT(4) >>>> -- >>>> 2.7.3 >>>> >> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html