diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2017-11-13 10:46:41 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-12-04 19:59:58 -0500 |
commit | 1172ee31259b51a9b2d83b05f01161fd5938b15d (patch) | |
tree | 4294d385cc7b25f4c968fd14bc7058a6ff1e9975 /drivers/base/power/main.c | |
parent | 47acbd77e6e481abf2f41d3a99cb3762f296b2e6 (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.c | 29 |
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 | ||
1482 | static 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 | |||
1482 | static void dpm_clear_suppliers_direct_complete(struct device *dev) | 1498 | static 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 | ||