summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/cpuidle-t2.c
diff options
context:
space:
mode:
authorScott Williams <scwilliams@nvidia.com>2011-07-22 13:25:52 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:46:51 -0800
commitc420133f5b49b9abbfd825b3fb5095e49c41e38f (patch)
treeeb86b7b717b238363bfe6e2ffe799e3072db17e8 /arch/arm/mach-tegra/cpuidle-t2.c
parentc2c2c2880411ffdbe7f118c5e9cd7255e3ea4472 (diff)
ARM: tegra: LP2: Choose the earliest wakeup request
This will wake up earlier if the other CPU's request is shorter. Change-Id: I0abf20d482e5bd28893b2e014fcf50e6ac557241 Signed-off-by: Scott Williams <scwilliams@nvidia.com> DW: Split into logical changes Signed-off-by: Dan Willemsen <dwillemsen@nvidia.com> Rebase-Id: R65c18d77baf7b49be32bb7eb6825af2d1865d356
Diffstat (limited to 'arch/arm/mach-tegra/cpuidle-t2.c')
-rw-r--r--arch/arm/mach-tegra/cpuidle-t2.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/arch/arm/mach-tegra/cpuidle-t2.c b/arch/arm/mach-tegra/cpuidle-t2.c
index e1517062d9f7..ff2674c35597 100644
--- a/arch/arm/mach-tegra/cpuidle-t2.c
+++ b/arch/arm/mach-tegra/cpuidle-t2.c
@@ -65,6 +65,7 @@ static struct {
static void __iomem *clk_rst = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
static void __iomem *evp_reset = IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) + 0x100;
static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
+static s64 tegra_cpu1_idle_time = LLONG_MAX;
static int tegra2_reset_sleeping_cpu(int cpu)
{
@@ -154,7 +155,6 @@ static int tegra2_idle_lp2_last(struct cpuidle_device *dev,
ktime_t entry_time;
ktime_t exit_time;
bool sleep_completed = false;
- s64 sleep_time;
int i;
while (tegra2_cpu_is_resettable_soon())
@@ -169,14 +169,17 @@ static int tegra2_idle_lp2_last(struct cpuidle_device *dev,
return -EBUSY;
}
+ request = min_t(s64, request, tegra_cpu1_idle_time);
entry_time = ktime_get();
- sleep_time = request - tegra_lp2_exit_latency;
+ if (request > state->target_residency) {
+ s64 sleep_time = request - tegra_lp2_exit_latency;
- if (tegra_idle_lp2_last(sleep_time, 0) == 0)
- sleep_completed = true;
- else
- idle_stats.lp2_int_count[tegra_pending_interrupt()]++;
+ if (tegra_idle_lp2_last(sleep_time, 0) == 0)
+ sleep_completed = true;
+ else
+ idle_stats.lp2_int_count[tegra_pending_interrupt()]++;
+ }
for_each_online_cpu(i) {
if (i != dev->cpu) {
@@ -223,8 +226,10 @@ void tegra2_idle_lp2(struct cpuidle_device *dev,
}
}
}
- } else
+ } else {
+ tegra_cpu1_idle_time = request;
tegra2_sleep_wfi(PLAT_PHYS_OFFSET - PAGE_OFFSET);
+ }
cpu_pm_exit();
tegra_clear_cpu_in_lp2(dev->cpu);