diff options
| -rw-r--r-- | drivers/base/power/domain.c | 4 | ||||
| -rw-r--r-- | drivers/base/power/main.c | 8 | ||||
| -rw-r--r-- | include/linux/pm.h | 1 |
3 files changed, 10 insertions, 3 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 22fe029ca212..6790cf7eba5a 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
| @@ -714,7 +714,7 @@ static int pm_genpd_suspend_noirq(struct device *dev) | |||
| 714 | if (ret) | 714 | if (ret) |
| 715 | return ret; | 715 | return ret; |
| 716 | 716 | ||
| 717 | if (device_may_wakeup(dev) | 717 | if (dev->power.wakeup_path |
| 718 | && genpd->active_wakeup && genpd->active_wakeup(dev)) | 718 | && genpd->active_wakeup && genpd->active_wakeup(dev)) |
| 719 | return 0; | 719 | return 0; |
| 720 | 720 | ||
| @@ -938,7 +938,7 @@ static int pm_genpd_dev_poweroff_noirq(struct device *dev) | |||
| 938 | if (ret) | 938 | if (ret) |
| 939 | return ret; | 939 | return ret; |
| 940 | 940 | ||
| 941 | if (device_may_wakeup(dev) | 941 | if (dev->power.wakeup_path |
| 942 | && genpd->active_wakeup && genpd->active_wakeup(dev)) | 942 | && genpd->active_wakeup && genpd->active_wakeup(dev)) |
| 943 | return 0; | 943 | return 0; |
| 944 | 944 | ||
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index a85459126bc6..1e15732c12c4 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -902,7 +902,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
| 902 | } | 902 | } |
| 903 | 903 | ||
| 904 | End: | 904 | End: |
| 905 | dev->power.is_suspended = !error; | 905 | if (!error) { |
| 906 | dev->power.is_suspended = true; | ||
| 907 | if (dev->power.wakeup_path && dev->parent) | ||
| 908 | dev->parent->power.wakeup_path = true; | ||
| 909 | } | ||
| 906 | 910 | ||
| 907 | device_unlock(dev); | 911 | device_unlock(dev); |
| 908 | complete_all(&dev->power.completion); | 912 | complete_all(&dev->power.completion); |
| @@ -999,6 +1003,8 @@ static int device_prepare(struct device *dev, pm_message_t state) | |||
| 999 | 1003 | ||
| 1000 | device_lock(dev); | 1004 | device_lock(dev); |
| 1001 | 1005 | ||
| 1006 | dev->power.wakeup_path = device_may_wakeup(dev); | ||
| 1007 | |||
| 1002 | if (dev->pm_domain) { | 1008 | if (dev->pm_domain) { |
| 1003 | pm_dev_dbg(dev, state, "preparing power domain "); | 1009 | pm_dev_dbg(dev, state, "preparing power domain "); |
| 1004 | if (dev->pm_domain->ops.prepare) | 1010 | if (dev->pm_domain->ops.prepare) |
diff --git a/include/linux/pm.h b/include/linux/pm.h index f25682477f08..74711a9c2f69 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
| @@ -448,6 +448,7 @@ struct dev_pm_info { | |||
| 448 | struct list_head entry; | 448 | struct list_head entry; |
| 449 | struct completion completion; | 449 | struct completion completion; |
| 450 | struct wakeup_source *wakeup; | 450 | struct wakeup_source *wakeup; |
| 451 | bool wakeup_path:1; | ||
| 451 | #else | 452 | #else |
| 452 | unsigned int should_wakeup:1; | 453 | unsigned int should_wakeup:1; |
| 453 | #endif | 454 | #endif |
