diff options
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/power/main.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index bf5a59ac1957..06f09bf89cb2 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -58,6 +58,7 @@ static int async_error; | |||
58 | void device_pm_init(struct device *dev) | 58 | void device_pm_init(struct device *dev) |
59 | { | 59 | { |
60 | dev->power.is_prepared = false; | 60 | dev->power.is_prepared = false; |
61 | dev->power.is_suspended = false; | ||
61 | init_completion(&dev->power.completion); | 62 | init_completion(&dev->power.completion); |
62 | complete_all(&dev->power.completion); | 63 | complete_all(&dev->power.completion); |
63 | dev->power.wakeup = NULL; | 64 | dev->power.wakeup = NULL; |
@@ -517,6 +518,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | |||
517 | */ | 518 | */ |
518 | dev->power.is_prepared = false; | 519 | dev->power.is_prepared = false; |
519 | 520 | ||
521 | if (!dev->power.is_suspended) | ||
522 | goto Unlock; | ||
523 | |||
520 | if (dev->pwr_domain) { | 524 | if (dev->pwr_domain) { |
521 | pm_dev_dbg(dev, state, "power domain "); | 525 | pm_dev_dbg(dev, state, "power domain "); |
522 | error = pm_op(dev, &dev->pwr_domain->ops, state); | 526 | error = pm_op(dev, &dev->pwr_domain->ops, state); |
@@ -552,6 +556,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | |||
552 | } | 556 | } |
553 | 557 | ||
554 | End: | 558 | End: |
559 | dev->power.is_suspended = false; | ||
560 | |||
561 | Unlock: | ||
555 | device_unlock(dev); | 562 | device_unlock(dev); |
556 | complete_all(&dev->power.completion); | 563 | complete_all(&dev->power.completion); |
557 | 564 | ||
@@ -839,11 +846,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
839 | device_lock(dev); | 846 | device_lock(dev); |
840 | 847 | ||
841 | if (async_error) | 848 | if (async_error) |
842 | goto End; | 849 | goto Unlock; |
843 | 850 | ||
844 | if (pm_wakeup_pending()) { | 851 | if (pm_wakeup_pending()) { |
845 | async_error = -EBUSY; | 852 | async_error = -EBUSY; |
846 | goto End; | 853 | goto Unlock; |
847 | } | 854 | } |
848 | 855 | ||
849 | if (dev->pwr_domain) { | 856 | if (dev->pwr_domain) { |
@@ -881,6 +888,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
881 | } | 888 | } |
882 | 889 | ||
883 | End: | 890 | End: |
891 | dev->power.is_suspended = !error; | ||
892 | |||
893 | Unlock: | ||
884 | device_unlock(dev); | 894 | device_unlock(dev); |
885 | complete_all(&dev->power.completion); | 895 | complete_all(&dev->power.completion); |
886 | 896 | ||