• Ulf Hansson's avatar
    PM / Domains: Allow runtime PM during system PM phases · 4d23a5e8
    Ulf Hansson authored
    In cases when a PM domain isn't powered off when genpd's ->prepare()
    callback is invoked, genpd runtime resumes and disables runtime PM for the
    device. This behaviour was needed when genpd managed intermediate states
    during the power off sequence, as to maintain proper low power states of
    devices during system PM suspend/resume.
    
    Commit ba2bbfbf (PM / Domains: Remove intermediate states from the
    power off sequence), enables genpd to improve its behaviour in that
    respect.
    
    The PM core disables runtime PM at __device_suspend_late() before it calls
    a system PM "late" callback for a device. When resuming a device, after a
    corresponding "early" callback has been invoked, the PM core re-enables
    runtime PM.
    
    By changing genpd to allow runtime PM according to the same system PM
    phases as the PM core, devices can be runtime resumed by their
    corresponding subsystem/driver when really needed.
    
    In this way, genpd no longer need to runtime resume the device from its
    ->prepare() callback. In most cases that avoids unnecessary and energy-
    wasting operations of runtime resuming devices that have nothing to do,
    only to runtime suspend them shortly after.
    
    Although, because of changing this behaviour in genpd and due to that
    genpd powers on the PM domain unconditionally in the system PM resume
    "noirq" phase, it could potentially cause a PM domain to stay powered
    on even if it's unused after the system has resumed. To avoid this,
    schedule a power off work when genpd's system PM ->complete() callback
    has been invoked for the last device in the PM domain.
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Reviewed-by: default avatarKevin Hilman <khilman@baylibre.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    4d23a5e8
domain.c 44.5 KB