diff options
author | Prashant Gaikwad <pgaikwad@nvidia.com> | 2013-10-21 10:29:13 +0530 |
---|---|---|
committer | Bharat Nihalani <bnihalani@nvidia.com> | 2013-10-23 01:43:40 -0700 |
commit | fe0fa6f42e1dadfb3ab00cecdca6155f1105003d (patch) | |
tree | 56ff087fc4ecae3318874d32f20120468e84efb5 /arch/arm/mach-tegra/tegra3_actmon.c | |
parent | 51c129e6c07c71515034749f21af4dcce44eea42 (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.c | 52 |
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) |