diff options
author | Prashant Gaikwad <pgaikwad@nvidia.com> | 2013-11-14 23:34:54 +0530 |
---|---|---|
committer | Bharat Nihalani <bnihalani@nvidia.com> | 2013-11-19 08:14:47 -0800 |
commit | e5ba238c8af4c5cf03de98d7f1f37e2fa69a41fa (patch) | |
tree | 7b14f6d1816b995f89caf008d2d58a26aeb17966 /drivers/base | |
parent | 679774ae298728114da3dd26aef34c5b5148f816 (diff) |
PM / Domains: add flag to indicate if device need to save
Some devices are part of PM domain but do not need to
save state when turning off power domain. If this flag
is not used then it unnecessarily starts and stops device
when turning off power domain.
Bug 1401451
Change-Id: I05b2a0c3decb6396ac59e6d81b55fa43fce9c1dd
Signed-off-by: Prashant Gaikwad <pgaikwad@nvidia.com>
Reviewed-on: http://git-master/r/331190
Reviewed-by: Shridhar Rasal <srasal@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/power/domain.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 1740bee9eddd..b42dafcb1b6a 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -516,6 +516,9 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd, if (gpd_data->need_restore) return 0; + if (!gpd_data->need_save) + goto out; + mutex_unlock(&genpd->lock); genpd_start_dev(genpd, dev); @@ -524,6 +527,7 @@ static int __pm_genpd_save_device(struct pm_domain_data *pdd, mutex_lock(&genpd->lock); +out: if (!ret) gpd_data->need_restore = true; @@ -1637,6 +1641,7 @@ int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, gpd_data->base.dev = dev; list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); gpd_data->need_restore = genpd->status == GPD_STATE_POWER_OFF; + gpd_data->need_save = true; gpd_data->td.constraint_changed = true; gpd_data->td.effective_constraint_ns = -1; mutex_unlock(&gpd_data->lock); @@ -1757,6 +1762,26 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd, } /** + * pm_genpd_dev_needsave - Set/unset the device's "need save" flag. + * @dev: Device to set/unset the flag for. + * @val: The new value of the device's "need save" flag. + */ +void pm_genpd_dev_need_save(struct device *dev, bool val) +{ + struct pm_subsys_data *psd; + unsigned long flags; + + spin_lock_irqsave(&dev->power.lock, flags); + + psd = dev_to_psd(dev); + if (psd && psd->domain_data) + to_gpd_data(psd->domain_data)->need_save = val; + + spin_unlock_irqrestore(&dev->power.lock, flags); +} +EXPORT_SYMBOL_GPL(pm_genpd_dev_need_save); + +/** * pm_genpd_dev_need_restore - Set/unset the device's "need restore" flag. * @dev: Device to set/unset the flag for. * @val: The new value of the device's "need restore" flag. |