• Rafael J. Wysocki's avatar
    sh-sci / PM: Avoid deadlocking runtime PM · 048be431
    Rafael J. Wysocki authored
    The runtime PM of sh-sci devices is enabled when sci_probe() returns,
    so the pm_runtime_put_sync() executed by driver_probe_device()
    attempts to suspend the device.  Then, in some situations, a
    diagnostic message is printed to the console by one of the runtime
    suspend routines handling the sh-sci device, which causes synchronous
    runtime resume to be started from the device's own runtime suspend
    callback.  This causes rpm_resume() to be run eventually, which sees
    the RPM_SUSPENDING status set by rpm_suspend() and waits for it to
    change.  However, the device's runtime PM status cannot change at
    that point, because the routine that has set it waits for the
    rpm_suspend() to return.  A deadlock occurs as a result.
    
    To avoid that make sci_init_single() increment the device's
    runtime PM usage counter, so that it cannot be suspended by
    driver_probe_device().  That counter has to be decremented
    eventually, so make sci_startup() do that before starting to
    actually use the device and make sci_shutdown() increment it
    again before returning to balance the incrementation carried out by
    sci_startup().
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Tested-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
    048be431
sh-sci.c 56.3 KB