diff options
author | Alex Frid <afrid@nvidia.com> | 2011-02-17 00:05:59 -0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-04-26 15:51:59 -0700 |
commit | 61e9c07d871b22f6d0be6799b5620f4da948edea (patch) | |
tree | 0efad50c70cba6ffdcea1d6af9bf77da965c0e69 /arch/arm/mach-tegra/suspend.c | |
parent | 340f06641944b951874b18d3618fd8be62588826 (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.c | 6 |
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) |