agree your findings. so it's better move the synchronize_irq() after the spin_unlock_irqrestore(). static int dwc3_suspend_common(struct dwc3 *dwc) { unsigned long flags; switch (dwc->dr_mode) { case USB_DR_MODE_PERIPHERAL: case USB_DR_MODE_OTG: spin_lock_irqsave(&dwc->lock, flags); dwc3_gadget_suspend(dwc); spin_unlock_irqrestore(&dwc->lock, flags); synchronize_irq() -----Original Message----- From: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> Sent: Monday, January 28, 2019 10:53 PM To: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>; Linux USB <linux-usb@xxxxxxxxxxxxxxx> Cc: He, Bo <bo.he@xxxxxxxxx>; Wang, Yu Y <yu.y.wang@xxxxxxxxx>; 'Linux Samsung SOC' <linux-samsung-soc@xxxxxxxxxxxxxxx> Subject: Re: [PATCH] usb: dwc3: gadget: synchronize_irq dwc irq in suspend Hi Felipe, On 2019-01-28 14:30, Felipe Balbi wrote: > Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> writes: >> On 2019-01-14 09:30, Felipe Balbi wrote: >>> From: Bo He <bo.he@xxxxxxxxx> >>> >>> We see dwc3 endpoint stopped by unwanted irq during suspend resume >>> test, which is caused dwc3 ep can't be started with error "No >>> Resource". >>> >>> Here, add synchronize_irq before suspend to sync the pending IRQ >>> handlers complete. >>> >>> Signed-off-by: Bo He <bo.he@xxxxxxxxx> >>> Signed-off-by: Yu Wang <yu.y.wang@xxxxxxxxx> >>> Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> >> This patch causes following kernel BUG on Samsung Exynos based >> platforms during system suspend/resume cycle: > are you calling ->suspend() from ->suspend_noirq() time? Are we not > allowed to call synchronize_irq() during ->suspend()? dwc3_suspend_common() calls dwc3_gadget_suspend() with dwc->lock spinlock held. This is not the proper context for calling sleeping functions like synchronize_irq(). Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland