diff options
Diffstat (limited to 'arch/arm/mach-tegra/cpuidle-tegra20.c')
-rw-r--r-- | arch/arm/mach-tegra/cpuidle-tegra20.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c index 706aa4215c36..b82dcaee2ef4 100644 --- a/arch/arm/mach-tegra/cpuidle-tegra20.c +++ b/arch/arm/mach-tegra/cpuidle-tegra20.c | |||
@@ -211,6 +211,18 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev, | |||
211 | } | 211 | } |
212 | #endif | 212 | #endif |
213 | 213 | ||
214 | /* | ||
215 | * Tegra20 HW appears to have a bug such that PCIe device interrupts, whether | ||
216 | * they are legacy IRQs or MSI, are lost when LP2 is enabled. To work around | ||
217 | * this, simply disable LP2 if the PCI driver and DT node are both enabled. | ||
218 | */ | ||
219 | void tegra20_cpuidle_pcie_irqs_in_use(void) | ||
220 | { | ||
221 | pr_info_once( | ||
222 | "Disabling cpuidle LP2 state, since PCIe IRQs are in use\n"); | ||
223 | tegra_idle_driver.states[1].disabled = true; | ||
224 | } | ||
225 | |||
214 | int __init tegra20_cpuidle_init(void) | 226 | int __init tegra20_cpuidle_init(void) |
215 | { | 227 | { |
216 | return cpuidle_register(&tegra_idle_driver, cpu_possible_mask); | 228 | return cpuidle_register(&tegra_idle_driver, cpu_possible_mask); |