• Tony Lindgren's avatar
    bus: ti-sysc: Fix am335x resume hang for usb otg module · 4d7b324e
    Tony Lindgren authored
    On am335x, suspend and resume only works once, and the system hangs if
    suspend is attempted again. However, turns out suspend and resume works
    fine multiple times if the USB OTG driver for musb controller is loaded.
    
    The issue is caused my the interconnect target module losing context
    during suspend, and it needs a restore on resume to be reconfigure again
    as debugged earlier by Dave Gerlach <d-gerlach@ti.com>.
    
    There are also other modules that need a restore on resume, like gpmc as
    noted by Dave. So let's add a common way to restore an interconnect
    target module based on a quirk flag. For now, let's enable the quirk for
    am335x otg only to fix the suspend and resume issue.
    
    As gpmc is not causing hangs based on tests with BeagleBone, let's patch
    gpmc separately. For gpmc, we also need a hardware reset done before
    restore according to Dave.
    
    To reinit the modules, we decouple system suspend from PM runtime. We
    replace calls to pm_runtime_force_suspend() and pm_runtime_force_resume()
    with direct calls to internal functions and rely on the driver internal
    state. There no point trying to handle complex system suspend and resume
    quirks via PM runtime.
    
    This is issue should have already been noticed with commit 1819ef2e
    ("bus: ti-sysc: Use swsup quirks also for am335x musb") when quirk
    handling was added for am335x otg for swsup. But the issue went unnoticed
    as having musb driver loaded hides the issue, and suspend and resume works
    once without the driver loaded.
    
    Fixes: 1819ef2e ("bus: ti-sysc: Use swsup quirks also for am335x musb")
    Suggested-by: default avatarDave Gerlach <d-gerlach@ti.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    4d7b324e
ti-sysc.c 80.4 KB