summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorSang-Hun Lee <sanlee@nvidia.com>2014-05-19 14:54:30 -0700
committerRiham Haidar <rhaidar@nvidia.com>2014-05-27 14:22:59 -0700
commit37b02dab58ad9bd04ba4e898929333f72aa9ed4d (patch)
tree49a1359c3ba23b66d7c78f032dc311c945f7f61f /drivers/base
parent211489a88f2f66c3e9a9df349e287008d5558ed2 (diff)
PM/Domain: cancel workqueue upon power off
- If there is any workqueue power_off_delayed_work pending when calling pm_genpd_suspend or its variants, the workqueue will trigger post pm_genpd_suspend operation, causing a double shutdown - This is fixing a bug from 3f4475eade08af799d3e1a100e24e1b418abbba5 Bug 1510778 Change-Id: I7569a8712638a231a6f91199f10a75654bde7bf9 Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com> Reviewed-on: http://git-master/r/411675 Reviewed-by: Mitch Luban <mluban@nvidia.com>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/power/domain.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 631277211438..b3e443d3cbb7 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -1183,6 +1183,8 @@ static int pm_genpd_suspend(struct device *dev)
if (IS_ERR(genpd))
return -EINVAL;
+ cancel_delayed_work_sync(&genpd->power_off_delayed_work);
+
return genpd->suspend_power_off ? 0 : genpd_suspend_dev(genpd, dev);
}
@@ -1204,6 +1206,8 @@ static int pm_genpd_suspend_late(struct device *dev)
if (IS_ERR(genpd))
return -EINVAL;
+ cancel_delayed_work_sync(&genpd->power_off_delayed_work);
+
return genpd->suspend_power_off ? 0 : genpd_suspend_late(genpd, dev);
}
@@ -1234,6 +1238,8 @@ static int pm_genpd_suspend_noirq(struct device *dev)
!to_gpd_data(psd->domain_data)->need_save)
return 0;
+ cancel_delayed_work_sync(&genpd->power_off_delayed_work);
+
genpd_stop_dev(genpd, dev);
/*