forked from Minki/linux
b4f173752a
Tegra20 HW appears to have a bug such that PCIe device interrupts, whether they are legacy IRQs or MSI, are lost when LP2 is enabled. To work around this, simply disable LP2 if any PCIe devices with interrupts are present. Detect this via the IRQ domain map operation. This is slightly over-conservative; if a device with an interrupt is present but the driver does not actually use them, LP2 will still be disabled. However, this is a reasonable trade-off which enables a simpler workaround. Signed-off-by: Stephen Warren <swarren@nvidia.com> Tested-by: Thierry Reding <treding@nvidia.com> Acked-by: Thierry Reding <treding@nvidia.com>
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
/*
|
|
* arch/arm/mach-tegra/cpuidle.c
|
|
*
|
|
* CPU idle driver for Tegra CPUs
|
|
*
|
|
* Copyright (c) 2010-2012, NVIDIA Corporation.
|
|
* Copyright (c) 2011 Google, Inc.
|
|
* Author: Colin Cross <ccross@android.com>
|
|
* Gary King <gking@nvidia.com>
|
|
*
|
|
* Rework for 3.3 by Peter De Schrijver <pdeschrijver@nvidia.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
|
|
#include "fuse.h"
|
|
#include "cpuidle.h"
|
|
|
|
void __init tegra_cpuidle_init(void)
|
|
{
|
|
switch (tegra_chip_id) {
|
|
case TEGRA20:
|
|
if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
|
|
tegra20_cpuidle_init();
|
|
break;
|
|
case TEGRA30:
|
|
if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC))
|
|
tegra30_cpuidle_init();
|
|
break;
|
|
case TEGRA114:
|
|
if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
|
|
tegra114_cpuidle_init();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void tegra_cpuidle_pcie_irqs_in_use(void)
|
|
{
|
|
switch (tegra_chip_id) {
|
|
case TEGRA20:
|
|
if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
|
|
tegra20_cpuidle_pcie_irqs_in_use();
|
|
break;
|
|
}
|
|
}
|