aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/power/domain.c4
-rw-r--r--drivers/base/power/main.c8
-rw-r--r--include/linux/pm.h1
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