• Ulf Hansson's avatar
    PM / Domains: Introduce dev_pm_domain_start() · ca765a8c
    Ulf Hansson authored
    For a subsystem/driver that either doesn't support runtime PM or makes use
    of pm_runtime_set_active() during ->probe(), may try to access its device
    when probing, even if it may not be fully powered on from the PM domain's
    point of view. This may be the case when the used PM domain is a genpd
    provider, that implements genpd's ->start|stop() device callbacks.
    
    There are cases where the subsystem/driver managed to avoid the above
    problem, simply by calling pm_runtime_enable() and pm_runtime_get_sync()
    during ->probe(). However, this approach comes with a drawback, especially
    if the subsystem/driver implements a ->runtime_resume() callback.
    
    More precisely, the subsystem/driver then needs to use a device flag, which
    is checked in its ->runtime_resume() callback, as to avoid powering on its
    resources the first time the callback is invoked. This is needed because
    the subsystem/driver has already powered on the resources for the device,
    during ->probe() and before it called pm_runtime_get_sync().
    
    In a way to avoid this boilerplate code and the inefficient check for "if
    (first_time_suspend)" in the ->runtime_resume() callback for these
    subsystems/drivers, let's introduce and export a dev_pm_domain_start()
    function, that may be called during ->probe() instead.
    
    Moreover, let the dev_pm_domain_start() invoke an optional ->start()
    callback, added to the struct dev_pm_domain, as to allow a PM domain
    specific implementation.
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    ca765a8c
common.c 6.93 KB