Skip to content

Commit

Permalink
[PATCH] ARM: Add VST idle loop call
Browse files Browse the repository at this point in the history
This call allows the dynamic tick support to reprogram the timer
immediately before the CPU idles.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King authored and Russell King committed Jun 27, 2005
1 parent 99bcc05 commit 2ea8339
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 4 deletions.
5 changes: 4 additions & 1 deletion arch/arm/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <asm/leds.h>
#include <asm/processor.h>
#include <asm/uaccess.h>
#include <asm/mach/time.h>

extern const char *processor_modes[];
extern void setup_mm_for_reboot(char mode);
Expand Down Expand Up @@ -85,8 +86,10 @@ EXPORT_SYMBOL(pm_power_off);
void default_idle(void)
{
local_irq_disable();
if (!need_resched() && !hlt_counter)
if (!need_resched() && !hlt_counter) {
timer_dyn_reprogram();
arch_idle();
}
local_irq_enable();
}

Expand Down
10 changes: 7 additions & 3 deletions arch/arm/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -424,15 +424,19 @@ static int timer_dyn_tick_disable(void)
return ret;
}

/*
* Reprogram the system timer for at least the calculated time interval.
* This function should be called from the idle thread with IRQs disabled,
* immediately before sleeping.
*/
void timer_dyn_reprogram(void)
{
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
unsigned long flags;

write_seqlock_irqsave(&xtime_lock, flags);
write_seqlock(&xtime_lock);
if (dyn_tick->state & DYN_TICK_ENABLED)
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
write_sequnlock_irqrestore(&xtime_lock, flags);
write_sequnlock(&xtime_lock);
}

static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
Expand Down
2 changes: 2 additions & 0 deletions include/asm-arm/mach/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ struct dyn_tick_timer {
};

void timer_dyn_reprogram(void);
#else
#define timer_dyn_reprogram() do { } while (0)
#endif

extern struct sys_timer *system_timer;
Expand Down

0 comments on commit 2ea8339

Please sign in to comment.