aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/power/domain.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 7b20801d19da..b6e29ffbb70d 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -482,6 +482,33 @@ static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd)
482} 482}
483 483
484/** 484/**
485 * resume_needed - Check whether to resume a device before system suspend.
486 * @dev: Device to check.
487 * @genpd: PM domain the device belongs to.
488 *
489 * There are two cases in which a device that can wake up the system from sleep
490 * states should be resumed by pm_genpd_prepare(): (1) if the device is enabled
491 * to wake up the system and it has to remain active for this purpose while the
492 * system is in the sleep state and (2) if the device is not enabled to wake up
493 * the system from sleep states and it generally doesn't generate wakeup signals
494 * by itself (those signals are generated on its behalf by other parts of the
495 * system). In the latter case it may be necessary to reconfigure the device's
496 * wakeup settings during system suspend, because it may have been set up to
497 * signal remote wakeup from the system's working state as needed by runtime PM.
498 * Return 'true' in either of the above cases.
499 */
500static bool resume_needed(struct device *dev, struct generic_pm_domain *genpd)
501{
502 bool active_wakeup;
503
504 if (!device_can_wakeup(dev))
505 return false;
506
507 active_wakeup = genpd->active_wakeup && genpd->active_wakeup(dev);
508 return device_may_wakeup(dev) ? active_wakeup : !active_wakeup;
509}
510
511/**
485 * pm_genpd_prepare - Start power transition of a device in a PM domain. 512 * pm_genpd_prepare - Start power transition of a device in a PM domain.
486 * @dev: Device to start the transition of. 513 * @dev: Device to start the transition of.
487 * 514 *
@@ -515,6 +542,9 @@ static int pm_genpd_prepare(struct device *dev)
515 return -EBUSY; 542 return -EBUSY;
516 } 543 }
517 544
545 if (resume_needed(dev, genpd))
546 pm_runtime_resume(dev);
547
518 genpd_acquire_lock(genpd); 548 genpd_acquire_lock(genpd);
519 549
520 if (genpd->prepared_count++ == 0) 550 if (genpd->prepared_count++ == 0)