• Phuong Nguyen's avatar
    dmaengine: usb-dmac: Make DMAC system sleep callbacks explicit · d9140a0d
    Phuong Nguyen authored
    This commit fixes the issue that USB-DMAC hangs silently after system
    resumes on R-Car Gen3 hence renesas_usbhs will not work correctly
    when using USB-DMAC for bulk transfer e.g. ethernet or serial
    gadgets.
    
    The issue can be reproduced by these steps:
     1. modprobe g_serial
     2. Suspend and resume system.
     3. connect a usb cable to host side
     4. Transfer data from Host to Target
     5. cat /dev/ttyGS0 (Target side)
     6. echo "test" > /dev/ttyACM0 (Host side)
    
    The 'cat' will not result anything. However, system still can work
    normally.
    
    Currently, USB-DMAC driver does not have system sleep callbacks hence
    this driver relies on the PM core to force runtime suspend/resume to
    suspend and reinitialize USB-DMAC during system resume. After
    the commit 17218e00 ("PM / genpd: Stop/start devices without
    pm_runtime_force_suspend/resume()"), PM core will not force
    runtime suspend/resume anymore so this issue happens.
    
    To solve this, make system suspend resume explicit by using
    pm_runtime_force_{suspend,resume}() as the system sleep callbacks.
    SET_NOIRQ_SYSTEM_SLEEP_PM_OPS() is used to make sure USB-DMAC
    suspended after and initialized before renesas_usbhs."
    Signed-off-by: default avatarPhuong Nguyen <phuong.nguyen.xw@renesas.com>
    Signed-off-by: default avatarHiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
    Cc: <stable@vger.kernel.org> # v4.16+
    [shimoda: revise the commit log and add Cc tag]
    Signed-off-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
    d9140a0d
usb-dmac.c 23 KB