summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/pm-t3.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-05-14 00:11:31 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:13 -0800
commit3b624f87f34f554fddaf1977cf3b0c75b0ddfa29 (patch)
tree3e4c43262cb193cf7532d93f819b9753f55f8042 /arch/arm/mach-tegra/pm-t3.c
parent188b7b80bb150669f0437755daa4ea9c42a4371a (diff)
ARM: tegra: power: Overlap Tegra3 cpu off delay
Overlap cpu off delay during G-to-LP mode switch with LP mode residency. Original-Change-Id: I8e93a5af3983e7daad46ae026fc510ce6c2fef99 Reviewed-on: http://git-master/r/31641 Reviewed-by: Aleksandr Frid <afrid@nvidia.com> Tested-by: Aleksandr Frid <afrid@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com> Tested-by: Diwakar Tundlam <dtundlam@nvidia.com> Rebase-Id: R9260cc70b0fd5cf5266c7331a7b37d045f87fbfd
Diffstat (limited to 'arch/arm/mach-tegra/pm-t3.c')
-rw-r--r--arch/arm/mach-tegra/pm-t3.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/pm-t3.c b/arch/arm/mach-tegra/pm-t3.c
index ad129a49d59f..0bf4a7d30495 100644
--- a/arch/arm/mach-tegra/pm-t3.c
+++ b/arch/arm/mach-tegra/pm-t3.c
@@ -22,6 +22,7 @@
#include <linux/smp.h>
#include <linux/interrupt.h>
#include <linux/clk.h>
+#include <linux/delay.h>
#include <mach/gpio.h>
#include <mach/iomap.h>
@@ -275,6 +276,8 @@ void tegra_cluster_switch_epilog(unsigned int flags)
int tegra_cluster_control(unsigned int us, unsigned int flags)
{
#ifdef CONFIG_PM_SLEEP
+ static ktime_t last_g2lp;
+
unsigned int target_cluster = flags & TEGRA_POWER_CLUSTER_MASK;
unsigned int current_cluster = is_lp_cluster()
? TEGRA_POWER_CLUSTER_LP
@@ -298,6 +301,17 @@ int tegra_cluster_control(unsigned int us, unsigned int flags)
if (flags & TEGRA_POWER_CLUSTER_IMMEDIATE)
us = 0;
+ if (current_cluster != target_cluster) {
+ if (target_cluster == TEGRA_POWER_CLUSTER_G) {
+ s64 t = ktime_to_us(ktime_sub(ktime_get(), last_g2lp));
+ s64 t_off = tegra_cpu_power_off_time();
+ if (t_off > t)
+ udelay((unsigned int)(t_off - t));
+ }
+ else
+ last_g2lp = ktime_get();
+ }
+
DEBUG_CLUSTER(("%s(LP%d): %s->%s %s %s %d\r\n", __func__,
(flags & TEGRA_POWER_SDRAM_SELFREFRESH) ? 1 : 2,
is_lp_cluster() ? "LP" : "G",