diff options
author | Sang-Hun Lee <sanlee@nvidia.com> | 2014-05-19 14:54:30 -0700 |
---|---|---|
committer | Riham Haidar <rhaidar@nvidia.com> | 2014-05-27 14:22:59 -0700 |
commit | 37b02dab58ad9bd04ba4e898929333f72aa9ed4d (patch) | |
tree | 49a1359c3ba23b66d7c78f032dc311c945f7f61f /drivers/base | |
parent | 211489a88f2f66c3e9a9df349e287008d5558ed2 (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.c | 6 |
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); /* |