• Grygorii Strashko's avatar
    usb: dwc3: omap: fix race of pm runtime with irq handler in probe · 12a7f17f
    Grygorii Strashko authored
    Now races can happen between interrupt handler execution and PM runtime in
    error handling code path in probe and in dwc3_omap_remove() which will lead
    to system crash:
    
    in probe:
    ...
     err1:
    	pm_runtime_put_sync(dev);
    ^^ PM runtime can race with IRQ handler when deferred probing happening
       due to extcon
    	pm_runtime_disable(dev);
    
    	return ret;
    
    in dwc3_omap_remove:
    ...
    	dwc3_omap_disable_irqs(omap);
    ^^ IRQs are disabled in HW, but handler may still run
    	of_platform_depopulate(omap->dev);
    	pm_runtime_put_sync(&pdev->dev);
    ^^ PM runtime can race with IRQ handler
    	pm_runtime_disable(&pdev->dev);
    
    	return 0;
    
    So, OMAP DWC3 IRQ need to be disabled before calling
    pm_runtime_put() in probe and in dwc3_omap_remove().
    Acked-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    12a7f17f
dwc3-omap.c 15.8 KB