forked from Minki/linux
8749af6821
This patch adds support for Dynamic Tick Timer for ARM. Dynamic Tick is also known as VST (Variable Scheduling Timeouts). Dynamic Tick has been in use in the OMAP tree since last October. The patch is not intrusive, and does not do anything unless CONFIG_NO_IDLE_HZ is defined. This patch has the following fixed based on comments from RMK: - Time is updated before calling interrupt handlers. - Added new interrupt flag SA_TIMER to avoid duplicate timer interrupts - Moved struct dyn_tick_timer to time.h until we at some point probably have an arch independent dyn-tick.h - Cleaned up testing for DYN_TICK_ENABLED in irq.c I've cleaned up this patch to fix some remaining issues: - Call the timer tick handler with irqs disabled, as it would be from a normal interrupt - if we have a dyn_tick, we better implement all methods. - generic timer_dyn_reprogram() call, to be called before sleeping - added command line option - "dyntick=" to allow boot-time control of this feature -- rmk Signed-off-by: Tony Lindgren Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
76 lines
2.2 KiB
C
76 lines
2.2 KiB
C
/*
|
|
* linux/include/asm-arm/mach/time.h
|
|
*
|
|
* Copyright (C) 2004 MontaVista Software, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#ifndef __ASM_ARM_MACH_TIME_H
|
|
#define __ASM_ARM_MACH_TIME_H
|
|
|
|
#include <linux/sysdev.h>
|
|
|
|
/*
|
|
* This is our kernel timer structure.
|
|
*
|
|
* - init
|
|
* Initialise the kernels jiffy timer source, claim interrupt
|
|
* using setup_irq. This is called early on during initialisation
|
|
* while interrupts are still disabled on the local CPU.
|
|
* - suspend
|
|
* Suspend the kernel jiffy timer source, if necessary. This
|
|
* is called with interrupts disabled, after all normal devices
|
|
* have been suspended. If no action is required, set this to
|
|
* NULL.
|
|
* - resume
|
|
* Resume the kernel jiffy timer source, if necessary. This
|
|
* is called with interrupts disabled before any normal devices
|
|
* are resumed. If no action is required, set this to NULL.
|
|
* - offset
|
|
* Return the timer offset in microseconds since the last timer
|
|
* interrupt. Note: this must take account of any unprocessed
|
|
* timer interrupt which may be pending.
|
|
*/
|
|
struct sys_timer {
|
|
struct sys_device dev;
|
|
void (*init)(void);
|
|
void (*suspend)(void);
|
|
void (*resume)(void);
|
|
unsigned long (*offset)(void);
|
|
|
|
#ifdef CONFIG_NO_IDLE_HZ
|
|
struct dyn_tick_timer *dyn_tick;
|
|
#endif
|
|
};
|
|
|
|
#ifdef CONFIG_NO_IDLE_HZ
|
|
|
|
#define DYN_TICK_SKIPPING (1 << 2)
|
|
#define DYN_TICK_ENABLED (1 << 1)
|
|
#define DYN_TICK_SUITABLE (1 << 0)
|
|
|
|
struct dyn_tick_timer {
|
|
unsigned int state; /* Current state */
|
|
int (*enable)(void); /* Enables dynamic tick */
|
|
int (*disable)(void); /* Disables dynamic tick */
|
|
void (*reprogram)(unsigned long); /* Reprograms the timer */
|
|
int (*handler)(int, void *, struct pt_regs *);
|
|
};
|
|
|
|
void timer_dyn_reprogram(void);
|
|
#endif
|
|
|
|
extern struct sys_timer *system_timer;
|
|
extern void timer_tick(struct pt_regs *);
|
|
|
|
/*
|
|
* Kernel time keeping support.
|
|
*/
|
|
extern int (*set_rtc)(void);
|
|
extern void save_time_delta(struct timespec *delta, struct timespec *rtc);
|
|
extern void restore_time_delta(struct timespec *delta, struct timespec *rtc);
|
|
|
|
#endif
|