aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSantosh Shilimkar <santosh.shilimkar@ti.com>2011-01-15 14:12:31 -0500
committerKevin Hilman <khilman@ti.com>2011-12-08 14:29:02 -0500
commit98be0dde1957a1e47d42cf2c220bf52bacf81d6e (patch)
treec1c362a15338079199d3bd68f49c09abf8f818dc
parent98272660970a71e21ad1992f695f75b780de833c (diff)
ARM: OMAP4: cpuidle: Switch to gptimer from twd in deeper C-states.
CPU local timer(TWD) stops when the CPU is transitioning into deeper C-States. Since these timers are not wakeup capable, we need the wakeup capable global timer to program the wakeup time depending on the next timer expiry. It can be handled by registering a global wakeup capable timer along with local timers marked with (mis)feature flag CLOCK_EVT_FEAT_C3STOP. Then notify the clock events layer from idle code using CLOCK_EVT_NOTIFY_BROADCAST_ENTER/EXIT). ARM local timers are already marked with C3STOP feature. Add the notifiers to OMAP4 CPU idle code for the broadcast entry and exit. Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Acked-by: Jean Pihet <j-pihet@ti.com> Acked-by: Kevin Hilman <khilman@ti.com> Tested-by: Vishwanath BS <vishwanath.bs@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
-rw-r--r--arch/arm/mach-omap2/cpuidle44xx.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
index 81386c6256eb..cfdbb86bc84e 100644
--- a/arch/arm/mach-omap2/cpuidle44xx.c
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
@@ -14,6 +14,7 @@
14#include <linux/cpuidle.h> 14#include <linux/cpuidle.h>
15#include <linux/cpu_pm.h> 15#include <linux/cpu_pm.h>
16#include <linux/export.h> 16#include <linux/export.h>
17#include <linux/clockchips.h>
17 18
18#include <asm/proc-fns.h> 19#include <asm/proc-fns.h>
19 20
@@ -65,6 +66,7 @@ static int omap4_enter_idle(struct cpuidle_device *dev,
65 u32 cpu1_state; 66 u32 cpu1_state;
66 int idle_time; 67 int idle_time;
67 int new_state_idx; 68 int new_state_idx;
69 int cpu_id = smp_processor_id();
68 70
69 /* Used to keep track of the total time in idle */ 71 /* Used to keep track of the total time in idle */
70 getnstimeofday(&ts_preidle); 72 getnstimeofday(&ts_preidle);
@@ -86,6 +88,9 @@ static int omap4_enter_idle(struct cpuidle_device *dev,
86 cx = cpuidle_get_statedata(&dev->states_usage[new_state_idx]); 88 cx = cpuidle_get_statedata(&dev->states_usage[new_state_idx]);
87 } 89 }
88 90
91 if (index > 0)
92 clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu_id);
93
89 /* 94 /*
90 * Call idle CPU PM enter notifier chain so that 95 * Call idle CPU PM enter notifier chain so that
91 * VFP and per CPU interrupt context is saved. 96 * VFP and per CPU interrupt context is saved.
@@ -121,6 +126,9 @@ static int omap4_enter_idle(struct cpuidle_device *dev,
121 if (omap4_mpuss_read_prev_context_state()) 126 if (omap4_mpuss_read_prev_context_state())
122 cpu_cluster_pm_exit(); 127 cpu_cluster_pm_exit();
123 128
129 if (index > 0)
130 clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu_id);
131
124 getnstimeofday(&ts_postidle); 132 getnstimeofday(&ts_postidle);
125 ts_idle = timespec_sub(ts_postidle, ts_preidle); 133 ts_idle = timespec_sub(ts_postidle, ts_preidle);
126 134