diff options
author | Scott Williams <scwilliams@nvidia.com> | 2011-07-22 13:25:52 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:46:51 -0800 |
commit | c420133f5b49b9abbfd825b3fb5095e49c41e38f (patch) | |
tree | eb86b7b717b238363bfe6e2ffe799e3072db17e8 /arch/arm/mach-tegra/cpuidle-t2.c | |
parent | c2c2c2880411ffdbe7f118c5e9cd7255e3ea4472 (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.c | 19 |
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); |