summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/suspend.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-02-17 00:05:59 -0800
committerDan Willemsen <dwillemsen@nvidia.com>2011-04-26 15:51:59 -0700
commit61e9c07d871b22f6d0be6799b5620f4da948edea (patch)
tree0efad50c70cba6ffdcea1d6af9bf77da965c0e69 /arch/arm/mach-tegra/suspend.c
parent340f06641944b951874b18d3618fd8be62588826 (diff)
ARM: tegra: Do not propagate legacy IRQs on LPx entry
Tegra3 enters LPx states via combination of core WFI and flow controller power gating mechanism. If any interrupt is pending, or fired while LPx entry procedure is executed CPU would fall through WFI, but flow controller may still initiate power down sequence. This is dangerous as CPU would be taken down while executing code. To eliminate this scenario, do not propagate legacy IRQs to CPU core on entry to LPx. Since GIC-to-CPU interrupt path is disabled in the distributer, WFI is always entered, and flow controller properly shut down CPU. The wake path: legacy IRQ-to-flow controller is kept enabled, and provide LPx exit mechanism. Bug 791458 Bug 791093 Original-Change-Id: I4f34e68335500f096790197c61f1acf83a7fc424 Reviewed-on: http://git-master/r/19971 Tested-by: Aleksandr Frid <afrid@nvidia.com> Reviewed-by: Narendra Damahe <ndamahe@nvidia.com> Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com> Change-Id: I293d5e7569b154f46945e8ea4097e3c5387a504d
Diffstat (limited to 'arch/arm/mach-tegra/suspend.c')
-rw-r--r--arch/arm/mach-tegra/suspend.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/suspend.c b/arch/arm/mach-tegra/suspend.c
index 76a1a7e11a84..68940dfcaa30 100644
--- a/arch/arm/mach-tegra/suspend.c
+++ b/arch/arm/mach-tegra/suspend.c
@@ -434,6 +434,12 @@ static noinline void suspend_cpu_complex(void)
gic_cpu_exit(0);
gic_dist_save(0);
+#ifndef CONFIG_ARCH_TEGRA_2x_SOC
+ /* tegra3 enters lpx states via WFI - do not propagate legacy IRQs
+ to CPU core to avoid fall through WFI (IRQ-to-flow controller wake
+ path is not affected) */
+ tegra_irq_pass_through_disable();
+#endif
}
unsigned int tegra_suspend_lp2(unsigned int us, unsigned int flags)