diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2018-01-09 04:03:39 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-01-10 07:13:56 -0500 |
commit | c23bd3877bc21d830fa650570fc1a88bea82ecd2 (patch) | |
tree | f076c4ae68cca001db0402078dc6cc1db4eba01a | |
parent | 02e45646d53bdb38bfb47b83765778d3ecb4d3b3 (diff) |
PM / core: Re-structure code for clearing the direct_complete flag
To make the code more consistent, let's clear the parent's direct_complete
flag along with clearing it for suppliers, instead of as currently, when
propagating the wakeup_path flag to parents.
While changing this, let's take the opportunity to rename the affected
internal functions, to make them self-explanatory. Like this:
dpm_clear_suppliers_direct_complete -> dpm_clear_superiors_direct_complete
dpm_propagate_to_parent -> dpm_propagate_wakeup_to_parent
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/base/power/main.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index ebcec7e677ba..720e36ec84ac 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -1660,7 +1660,7 @@ static int legacy_suspend(struct device *dev, pm_message_t state, | |||
1660 | return error; | 1660 | return error; |
1661 | } | 1661 | } |
1662 | 1662 | ||
1663 | static void dpm_propagate_to_parent(struct device *dev) | 1663 | static void dpm_propagate_wakeup_to_parent(struct device *dev) |
1664 | { | 1664 | { |
1665 | struct device *parent = dev->parent; | 1665 | struct device *parent = dev->parent; |
1666 | 1666 | ||
@@ -1669,18 +1669,23 @@ static void dpm_propagate_to_parent(struct device *dev) | |||
1669 | 1669 | ||
1670 | spin_lock_irq(&parent->power.lock); | 1670 | spin_lock_irq(&parent->power.lock); |
1671 | 1671 | ||
1672 | parent->power.direct_complete = false; | ||
1673 | if (dev->power.wakeup_path && !parent->power.ignore_children) | 1672 | if (dev->power.wakeup_path && !parent->power.ignore_children) |
1674 | parent->power.wakeup_path = true; | 1673 | parent->power.wakeup_path = true; |
1675 | 1674 | ||
1676 | spin_unlock_irq(&parent->power.lock); | 1675 | spin_unlock_irq(&parent->power.lock); |
1677 | } | 1676 | } |
1678 | 1677 | ||
1679 | static void dpm_clear_suppliers_direct_complete(struct device *dev) | 1678 | static void dpm_clear_superiors_direct_complete(struct device *dev) |
1680 | { | 1679 | { |
1681 | struct device_link *link; | 1680 | struct device_link *link; |
1682 | int idx; | 1681 | int idx; |
1683 | 1682 | ||
1683 | if (dev->parent) { | ||
1684 | spin_lock_irq(&dev->parent->power.lock); | ||
1685 | dev->parent->power.direct_complete = false; | ||
1686 | spin_unlock_irq(&dev->parent->power.lock); | ||
1687 | } | ||
1688 | |||
1684 | idx = device_links_read_lock(); | 1689 | idx = device_links_read_lock(); |
1685 | 1690 | ||
1686 | list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { | 1691 | list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { |
@@ -1791,8 +1796,8 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
1791 | if (device_may_wakeup(dev)) | 1796 | if (device_may_wakeup(dev)) |
1792 | dev->power.wakeup_path = true; | 1797 | dev->power.wakeup_path = true; |
1793 | 1798 | ||
1794 | dpm_propagate_to_parent(dev); | 1799 | dpm_propagate_wakeup_to_parent(dev); |
1795 | dpm_clear_suppliers_direct_complete(dev); | 1800 | dpm_clear_superiors_direct_complete(dev); |
1796 | } | 1801 | } |
1797 | 1802 | ||
1798 | device_unlock(dev); | 1803 | device_unlock(dev); |