Skip to content

Commit

Permalink
ARM: OMAP4: cpuidle: Switch to gptimer from twd in deeper C-states.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Santosh Shilimkar authored and Kevin Hilman committed Dec 8, 2011
1 parent 9827266 commit 98be0dd
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions arch/arm/mach-omap2/cpuidle44xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/cpuidle.h>
#include <linux/cpu_pm.h>
#include <linux/export.h>
#include <linux/clockchips.h>

#include <asm/proc-fns.h>

Expand Down Expand Up @@ -65,6 +66,7 @@ static int omap4_enter_idle(struct cpuidle_device *dev,
u32 cpu1_state;
int idle_time;
int new_state_idx;
int cpu_id = smp_processor_id();

/* Used to keep track of the total time in idle */
getnstimeofday(&ts_preidle);
Expand All @@ -86,6 +88,9 @@ static int omap4_enter_idle(struct cpuidle_device *dev,
cx = cpuidle_get_statedata(&dev->states_usage[new_state_idx]);
}

if (index > 0)
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu_id);

/*
* Call idle CPU PM enter notifier chain so that
* VFP and per CPU interrupt context is saved.
Expand Down Expand Up @@ -121,6 +126,9 @@ static int omap4_enter_idle(struct cpuidle_device *dev,
if (omap4_mpuss_read_prev_context_state())
cpu_cluster_pm_exit();

if (index > 0)
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu_id);

getnstimeofday(&ts_postidle);
ts_idle = timespec_sub(ts_postidle, ts_preidle);

Expand Down

0 comments on commit 98be0dd

Please sign in to comment.