diff options
-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 | ||