diff options
author | Alex Frid <afrid@nvidia.com> | 2011-05-14 00:11:31 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2012-03-22 23:27:47 -0700 |
commit | 8c0f3ee194b42af03440300f07f4ab3a0ce9b866 (patch) | |
tree | 1ac13d78ae283e185a1994583f5b134a8b106ce9 /arch/arm/mach-tegra/pm-t3.c | |
parent | 80dad10d8006775113841691a1542580c4999c7c (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.c | 14 |
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", |