From b35bd9c58baace7f9357cd7b341cf8ae4342ccf7 Mon Sep 17 00:00:00 2001 From: Mayank Rana Date: Mon, 4 Apr 2016 13:24:57 -0700 Subject: [PATCH] dwc3: gadget: Resume controller when udc_stop is called Wehn adbd is closing eps, it is trying to unregister gadget and UDC. When VBUS is not present and cotroller is into low power mode. ffs_func_disable() also invokes controller's PM idle as well. This results into unclock register access when dwc3_gadget_stop() is called by unregister_gadget_item(). Fix this issue by resuming controller from dwc3_gadget_stop(). Change-Id: I469e8609bf23bee97b3f9c612401aaf92bc72a30 Signed-off-by: Mayank Rana --- drivers/usb/dwc3/gadget.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 3da70925d565..448cbdf6fa40 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2094,6 +2094,9 @@ static int dwc3_gadget_stop(struct usb_gadget *g) unsigned long flags; int irq; + pm_runtime_get_sync(dwc->dev); + dbg_event(0xFF, "Stop gsync", + atomic_read(&dwc->dev->power.usage_count)); dwc3_gadget_disable_irq(dwc); tasklet_kill(&dwc->bh); @@ -2107,6 +2110,10 @@ static int dwc3_gadget_stop(struct usb_gadget *g) spin_unlock_irqrestore(&dwc->lock, flags); + pm_runtime_mark_last_busy(dwc->dev); + pm_runtime_put_autosuspend(dwc->dev); + dbg_event(0xFF, "Auto_susgsync", 0); + irq = platform_get_irq(to_platform_device(dwc->dev), 0); free_irq(irq, dwc);