summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra3_actmon.c
diff options
context:
space:
mode:
authorPrashant Gaikwad <pgaikwad@nvidia.com>2013-10-21 10:29:13 +0530
committerBharat Nihalani <bnihalani@nvidia.com>2013-10-23 01:43:40 -0700
commitfe0fa6f42e1dadfb3ab00cecdca6155f1105003d (patch)
tree56ff087fc4ecae3318874d32f20120468e84efb5 /arch/arm/mach-tegra/tegra3_actmon.c
parent51c129e6c07c71515034749f21af4dcce44eea42 (diff)
arm: tegra: save and restore actmon context
Save actmon context before entering LP0 from cpuidle and restore after exit. Bug 1254633 Change-Id: I4e96cd1465aa57a032d4f782f00deb0af620f660 Signed-off-by: Prashant Gaikwad <pgaikwad@nvidia.com> Reviewed-on: http://git-master/r/299472 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra3_actmon.c')
-rw-r--r--arch/arm/mach-tegra/tegra3_actmon.c52
1 files changed, 44 insertions, 8 deletions
diff --git a/arch/arm/mach-tegra/tegra3_actmon.c b/arch/arm/mach-tegra/tegra3_actmon.c
index da66e53f547c..b7afa32ef6e7 100644
--- a/arch/arm/mach-tegra/tegra3_actmon.c
+++ b/arch/arm/mach-tegra/tegra3_actmon.c
@@ -416,12 +416,9 @@ static void actmon_dev_disable(struct actmon_dev *dev)
spin_unlock_irqrestore(&dev->lock, flags);
}
-static void actmon_dev_suspend(struct actmon_dev *dev)
+static void actmon_dev_save(struct actmon_dev *dev)
{
u32 val;
- unsigned long flags;
-
- spin_lock_irqsave(&dev->lock, flags);
if ((dev->state == ACTMON_ON) || (dev->state == ACTMON_OFF)){
dev->saved_state = dev->state;
@@ -433,20 +430,27 @@ static void actmon_dev_suspend(struct actmon_dev *dev)
actmon_writel(0xffffffff, offs(ACTMON_DEV_INTR_STATUS));
actmon_wmb();
}
+}
+
+static void actmon_dev_suspend(struct actmon_dev *dev)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&dev->lock, flags);
+
+ actmon_dev_save(dev);
+
spin_unlock_irqrestore(&dev->lock, flags);
if (dev->suspend_freq)
clk_set_rate(dev->clk, dev->suspend_freq * 1000);
}
-static void actmon_dev_resume(struct actmon_dev *dev)
+static void actmon_dev_restore(struct actmon_dev *dev)
{
u32 val;
- unsigned long flags;
unsigned long freq = clk_get_rate(dev->clk) / 1000;
- spin_lock_irqsave(&dev->lock, flags);
-
if (dev->state == ACTMON_SUSPENDED) {
actmon_dev_configure(dev, freq);
dev->state = dev->saved_state;
@@ -457,6 +461,16 @@ static void actmon_dev_resume(struct actmon_dev *dev)
actmon_wmb();
}
}
+}
+
+static void actmon_dev_resume(struct actmon_dev *dev)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&dev->lock, flags);
+
+ actmon_dev_restore(dev);
+
spin_unlock_irqrestore(&dev->lock, flags);
}
@@ -630,6 +644,28 @@ static struct actmon_dev *actmon_devices[] = {
&actmon_dev_cpu_emc,
};
+int tegra_actmon_save(void)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(actmon_devices); i++)
+ actmon_dev_save(actmon_devices[i]);
+
+ return 0;
+}
+
+int tegra_actmon_restore(void)
+{
+ int i;
+
+ actmon_writel(actmon_sampling_period - 1,
+ ACTMON_GLB_PERIOD_CTRL);
+ for (i = 0; i < ARRAY_SIZE(actmon_devices); i++)
+ actmon_dev_restore(actmon_devices[i]);
+
+ return 0;
+}
+
/* Activity monitor suspend/resume */
static int actmon_pm_notify(struct notifier_block *nb,
unsigned long event, void *data)