aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/power/main.c
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2017-11-13 10:46:41 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-12-04 19:59:58 -0500
commit1172ee31259b51a9b2d83b05f01161fd5938b15d (patch)
tree4294d385cc7b25f4c968fd14bc7058a6ff1e9975 /drivers/base/power/main.c
parent47acbd77e6e481abf2f41d3a99cb3762f296b2e6 (diff)
PM / core: Re-factor some code dealing with parents in __device_suspend()
Let's make the code a bit more readable by moving some of the code, which deals with adjustments for parent devices in __device_suspend(), into its own function. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base/power/main.c')
-rw-r--r--drivers/base/power/main.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 73ec6796d9e1..c0d5f4a3611d 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1479,6 +1479,22 @@ static int legacy_suspend(struct device *dev, pm_message_t state,
1479 return error; 1479 return error;
1480} 1480}
1481 1481
1482static void dpm_propagate_to_parent(struct device *dev)
1483{
1484 struct device *parent = dev->parent;
1485
1486 if (!parent)
1487 return;
1488
1489 spin_lock_irq(&parent->power.lock);
1490
1491 parent->power.direct_complete = false;
1492 if (dev->power.wakeup_path && !parent->power.ignore_children)
1493 parent->power.wakeup_path = true;
1494
1495 spin_unlock_irq(&parent->power.lock);
1496}
1497
1482static void dpm_clear_suppliers_direct_complete(struct device *dev) 1498static void dpm_clear_suppliers_direct_complete(struct device *dev)
1483{ 1499{
1484 struct device_link *link; 1500 struct device_link *link;
@@ -1590,19 +1606,8 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
1590 1606
1591 End: 1607 End:
1592 if (!error) { 1608 if (!error) {
1593 struct device *parent = dev->parent;
1594
1595 dev->power.is_suspended = true; 1609 dev->power.is_suspended = true;
1596 if (parent) { 1610 dpm_propagate_to_parent(dev);
1597 spin_lock_irq(&parent->power.lock);
1598
1599 dev->parent->power.direct_complete = false;
1600 if (dev->power.wakeup_path
1601 && !dev->parent->power.ignore_children)
1602 dev->parent->power.wakeup_path = true;
1603
1604 spin_unlock_irq(&parent->power.lock);
1605 }
1606 dpm_clear_suppliers_direct_complete(dev); 1611 dpm_clear_suppliers_direct_complete(dev);
1607 } 1612 }
1608 1613