summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorPrashant Gaikwad <pgaikwad@nvidia.com>2013-11-14 23:34:54 +0530
committerBharat Nihalani <bnihalani@nvidia.com>2013-11-19 08:14:47 -0800
commite5ba238c8af4c5cf03de98d7f1f37e2fa69a41fa (patch)
tree7b14f6d1816b995f89caf008d2d58a26aeb17966 /drivers/base
parent679774ae298728114da3dd26aef34c5b5148f816 (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.c25
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.