ARM: set arch_gettimeoffset directly
remove ARM's struct sys_timer .offset function pointer, and instead directly set the arch_gettimeoffset function pointer when the timer driver is initialized. This requires multiplying all function results by 1000, since the removed arm_gettimeoffset() did this. Also, s/unsigned long/u32/ just to make the function prototypes exactly match that of arch_gettimeoffset. Cc: Russell King <linux@arm.linux.org.uk> Cc: Andrew Victor <linux@maxim.org.za> Cc: Nicolas Ferre <nicolas.ferre@atmel.com> Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> Cc: Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ryan Mallon <rmallon@gmail.com> Cc: Ben Dooks <ben-linux@fluff.org> Cc: Kukjin Kim <kgene.kim@samsung.com> Signed-off-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
parent
c8d5ba1891
commit
23c197b77f
11 changed files with 42 additions and 46 deletions
|
@ -35,9 +35,6 @@ struct sys_timer {
|
||||||
void (*init)(void);
|
void (*init)(void);
|
||||||
void (*suspend)(void);
|
void (*suspend)(void);
|
||||||
void (*resume)(void);
|
void (*resume)(void);
|
||||||
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
|
|
||||||
unsigned long (*offset)(void);
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void timer_tick(void);
|
extern void timer_tick(void);
|
||||||
|
|
|
@ -69,16 +69,6 @@ unsigned long profile_pc(struct pt_regs *regs)
|
||||||
EXPORT_SYMBOL(profile_pc);
|
EXPORT_SYMBOL(profile_pc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
|
|
||||||
static u32 arm_gettimeoffset(void)
|
|
||||||
{
|
|
||||||
if (system_timer->offset != NULL)
|
|
||||||
return system_timer->offset() * 1000;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
|
|
||||||
|
|
||||||
#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
||||||
/*
|
/*
|
||||||
* Kernel system timer support.
|
* Kernel system timer support.
|
||||||
|
@ -164,10 +154,6 @@ device_initcall(timer_init_syscore_ops);
|
||||||
|
|
||||||
void __init time_init(void)
|
void __init time_init(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
|
|
||||||
arch_gettimeoffset = arm_gettimeoffset;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
system_timer = machine_desc->timer;
|
system_timer = machine_desc->timer;
|
||||||
system_timer->init();
|
system_timer->init();
|
||||||
sched_clock_postinit();
|
sched_clock_postinit();
|
||||||
|
|
|
@ -42,9 +42,10 @@
|
||||||
#define AT91_TC_CLK1BASE 0x40
|
#define AT91_TC_CLK1BASE 0x40
|
||||||
#define AT91_TC_CLK2BASE 0x80
|
#define AT91_TC_CLK2BASE 0x80
|
||||||
|
|
||||||
static unsigned long at91x40_gettimeoffset(void)
|
static u32 at91x40_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
return (at91_tc_read(AT91_TC_CLK1BASE + AT91_TC_CV) * 1000000 / (AT91X40_MASTER_CLOCK / 128));
|
return (at91_tc_read(AT91_TC_CLK1BASE + AT91_TC_CV) * 1000000 /
|
||||||
|
(AT91X40_MASTER_CLOCK / 128)) * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t at91x40_timer_interrupt(int irq, void *dev_id)
|
static irqreturn_t at91x40_timer_interrupt(int irq, void *dev_id)
|
||||||
|
@ -64,6 +65,8 @@ void __init at91x40_timer_init(void)
|
||||||
{
|
{
|
||||||
unsigned int v;
|
unsigned int v;
|
||||||
|
|
||||||
|
arch_gettimeoffset = at91x40_gettimeoffset;
|
||||||
|
|
||||||
at91_tc_write(AT91_TC_BCR, 0);
|
at91_tc_write(AT91_TC_BCR, 0);
|
||||||
v = at91_tc_read(AT91_TC_BMR);
|
v = at91_tc_read(AT91_TC_BMR);
|
||||||
v = (v & ~AT91_TC_TC1XC1S) | AT91_TC_TC1XC1S_NONE;
|
v = (v & ~AT91_TC_TC1XC1S) | AT91_TC_TC1XC1S_NONE;
|
||||||
|
@ -82,6 +85,5 @@ void __init at91x40_timer_init(void)
|
||||||
|
|
||||||
struct sys_timer at91x40_timer = {
|
struct sys_timer at91x40_timer = {
|
||||||
.init = at91x40_timer_init,
|
.init = at91x40_timer_init,
|
||||||
.offset = at91x40_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ static void __init ebsa110_init_early(void)
|
||||||
* interrupt, then the PIT counter will roll over (ie, be negative).
|
* interrupt, then the PIT counter will roll over (ie, be negative).
|
||||||
* This actually works out to be convenient.
|
* This actually works out to be convenient.
|
||||||
*/
|
*/
|
||||||
static unsigned long ebsa110_gettimeoffset(void)
|
static u32 ebsa110_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
unsigned long offset, count;
|
unsigned long offset, count;
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ static unsigned long ebsa110_gettimeoffset(void)
|
||||||
*/
|
*/
|
||||||
offset = offset * (1000000 / HZ) / COUNT;
|
offset = offset * (1000000 / HZ) / COUNT;
|
||||||
|
|
||||||
return offset;
|
return offset * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t
|
static irqreturn_t
|
||||||
|
@ -215,6 +215,8 @@ static struct irqaction ebsa110_timer_irq = {
|
||||||
*/
|
*/
|
||||||
static void __init ebsa110_timer_init(void)
|
static void __init ebsa110_timer_init(void)
|
||||||
{
|
{
|
||||||
|
arch_gettimeoffset = ebsa110_gettimeoffset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timer 1, mode 2, LSB/MSB
|
* Timer 1, mode 2, LSB/MSB
|
||||||
*/
|
*/
|
||||||
|
@ -227,7 +229,6 @@ static void __init ebsa110_timer_init(void)
|
||||||
|
|
||||||
static struct sys_timer ebsa110_timer = {
|
static struct sys_timer ebsa110_timer = {
|
||||||
.init = ebsa110_timer_init,
|
.init = ebsa110_timer_init,
|
||||||
.offset = ebsa110_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct plat_serial8250_port serial_platform_data[] = {
|
static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
|
|
|
@ -140,11 +140,29 @@ static struct irqaction ep93xx_timer_irq = {
|
||||||
.handler = ep93xx_timer_interrupt,
|
.handler = ep93xx_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u32 ep93xx_gettimeoffset(void)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
offset = __raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Timer 4 is based on a 983.04 kHz reference clock,
|
||||||
|
* so dividing by 983040 gives the fraction of a second,
|
||||||
|
* so dividing by 0.983040 converts to uS.
|
||||||
|
* Refactor the calculation to avoid overflow.
|
||||||
|
* Finally, multiply by 1000 to give nS.
|
||||||
|
*/
|
||||||
|
return (offset + (53 * offset / 3072)) * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
static void __init ep93xx_timer_init(void)
|
static void __init ep93xx_timer_init(void)
|
||||||
{
|
{
|
||||||
u32 tmode = EP93XX_TIMER123_CONTROL_MODE |
|
u32 tmode = EP93XX_TIMER123_CONTROL_MODE |
|
||||||
EP93XX_TIMER123_CONTROL_CLKSEL;
|
EP93XX_TIMER123_CONTROL_CLKSEL;
|
||||||
|
|
||||||
|
arch_gettimeoffset = ep93xx_gettimeoffset;
|
||||||
|
|
||||||
/* Enable periodic HZ timer. */
|
/* Enable periodic HZ timer. */
|
||||||
__raw_writel(tmode, EP93XX_TIMER1_CONTROL);
|
__raw_writel(tmode, EP93XX_TIMER1_CONTROL);
|
||||||
__raw_writel(TIMER1_RELOAD, EP93XX_TIMER1_LOAD);
|
__raw_writel(TIMER1_RELOAD, EP93XX_TIMER1_LOAD);
|
||||||
|
@ -158,19 +176,8 @@ static void __init ep93xx_timer_init(void)
|
||||||
setup_irq(IRQ_EP93XX_TIMER1, &ep93xx_timer_irq);
|
setup_irq(IRQ_EP93XX_TIMER1, &ep93xx_timer_irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long ep93xx_gettimeoffset(void)
|
|
||||||
{
|
|
||||||
int offset;
|
|
||||||
|
|
||||||
offset = __raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time;
|
|
||||||
|
|
||||||
/* Calculate (1000000 / 983040) * offset. */
|
|
||||||
return offset + (53 * offset / 3072);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sys_timer ep93xx_timer = {
|
struct sys_timer ep93xx_timer = {
|
||||||
.init = ep93xx_timer_init,
|
.init = ep93xx_timer_init,
|
||||||
.offset = ep93xx_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -42,12 +42,12 @@ void __init arch_dma_init(dma_t *dma)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return usecs since last timer reload
|
* Return nsecs since last timer reload
|
||||||
* (timercount * (usecs perjiffie)) / (ticks per jiffie)
|
* (timercount * (usecs perjiffie)) / (ticks per jiffie)
|
||||||
*/
|
*/
|
||||||
unsigned long h720x_gettimeoffset(void)
|
u32 h720x_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
return (CPU_REG (TIMER_VIRT, TM0_COUNT) * tick_usec) / LATCH;
|
return ((CPU_REG(TIMER_VIRT, TM0_COUNT) * tick_usec) / LATCH) * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern unsigned long h720x_gettimeoffset(void);
|
extern u32 h720x_gettimeoffset(void);
|
||||||
extern void __init h720x_init_irq(void);
|
extern void __init h720x_init_irq(void);
|
||||||
extern void __init h720x_map_io(void);
|
extern void __init h720x_map_io(void);
|
||||||
extern void h720x_restart(char, const char *);
|
extern void h720x_restart(char, const char *);
|
||||||
|
|
|
@ -46,6 +46,8 @@ static struct irqaction h7201_timer_irq = {
|
||||||
*/
|
*/
|
||||||
void __init h7201_init_time(void)
|
void __init h7201_init_time(void)
|
||||||
{
|
{
|
||||||
|
arch_gettimeoffset = h720x_gettimeoffset;
|
||||||
|
|
||||||
CPU_REG (TIMER_VIRT, TM0_PERIOD) = LATCH;
|
CPU_REG (TIMER_VIRT, TM0_PERIOD) = LATCH;
|
||||||
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_RESET;
|
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_RESET;
|
||||||
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_REPEAT | TM_START;
|
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_REPEAT | TM_START;
|
||||||
|
@ -56,5 +58,4 @@ void __init h7201_init_time(void)
|
||||||
|
|
||||||
struct sys_timer h7201_timer = {
|
struct sys_timer h7201_timer = {
|
||||||
.init = h7201_init_time,
|
.init = h7201_init_time,
|
||||||
.offset = h720x_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -180,6 +180,8 @@ static struct irqaction h7202_timer_irq = {
|
||||||
*/
|
*/
|
||||||
void __init h7202_init_time(void)
|
void __init h7202_init_time(void)
|
||||||
{
|
{
|
||||||
|
arch_gettimeoffset = h720x_gettimeoffset;
|
||||||
|
|
||||||
CPU_REG (TIMER_VIRT, TM0_PERIOD) = LATCH;
|
CPU_REG (TIMER_VIRT, TM0_PERIOD) = LATCH;
|
||||||
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_RESET;
|
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_RESET;
|
||||||
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_REPEAT | TM_START;
|
CPU_REG (TIMER_VIRT, TM0_CTRL) = TM_REPEAT | TM_START;
|
||||||
|
@ -190,7 +192,6 @@ void __init h7202_init_time(void)
|
||||||
|
|
||||||
struct sys_timer h7202_timer = {
|
struct sys_timer h7202_timer = {
|
||||||
.init = h7202_init_time,
|
.init = h7202_init_time,
|
||||||
.offset = h720x_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init h7202_init_irq (void)
|
void __init h7202_init_irq (void)
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
unsigned long ioc_timer_gettimeoffset(void)
|
static u32 ioc_timer_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
unsigned int count1, count2, status;
|
unsigned int count1, count2, status;
|
||||||
long offset;
|
long offset;
|
||||||
|
@ -56,7 +56,7 @@ unsigned long ioc_timer_gettimeoffset(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = (LATCH - offset) * (tick_nsec / 1000);
|
offset = (LATCH - offset) * (tick_nsec / 1000);
|
||||||
return (offset + LATCH/2) / LATCH;
|
return ((offset + LATCH/2) / LATCH) * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init ioctime_init(void)
|
void __init ioctime_init(void)
|
||||||
|
@ -84,12 +84,12 @@ static struct irqaction ioc_timer_irq = {
|
||||||
*/
|
*/
|
||||||
static void __init ioc_timer_init(void)
|
static void __init ioc_timer_init(void)
|
||||||
{
|
{
|
||||||
|
arch_gettimeoffset = ioc_timer_gettimeoffset;
|
||||||
ioctime_init();
|
ioctime_init();
|
||||||
setup_irq(IRQ_TIMER0, &ioc_timer_irq);
|
setup_irq(IRQ_TIMER0, &ioc_timer_irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sys_timer ioc_timer = {
|
struct sys_timer ioc_timer = {
|
||||||
.init = ioc_timer_init,
|
.init = ioc_timer_init,
|
||||||
.offset = ioc_timer_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ static inline unsigned long timer_ticks_to_usec(unsigned long ticks)
|
||||||
* IRQs are disabled before entering here from do_gettimeofday()
|
* IRQs are disabled before entering here from do_gettimeofday()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static unsigned long s3c2410_gettimeoffset (void)
|
static u32 s3c2410_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
unsigned long tdone;
|
unsigned long tdone;
|
||||||
unsigned long tval;
|
unsigned long tval;
|
||||||
|
@ -120,7 +120,7 @@ static unsigned long s3c2410_gettimeoffset (void)
|
||||||
tdone += timer_startval;
|
tdone += timer_startval;
|
||||||
}
|
}
|
||||||
|
|
||||||
return timer_ticks_to_usec(tdone);
|
return timer_ticks_to_usec(tdone) * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -273,6 +273,8 @@ static void __init s3c2410_timer_resources(void)
|
||||||
|
|
||||||
static void __init s3c2410_timer_init(void)
|
static void __init s3c2410_timer_init(void)
|
||||||
{
|
{
|
||||||
|
arch_gettimeoffset = s3c2410_gettimeoffset;
|
||||||
|
|
||||||
s3c2410_timer_resources();
|
s3c2410_timer_resources();
|
||||||
s3c2410_timer_setup();
|
s3c2410_timer_setup();
|
||||||
setup_irq(IRQ_TIMER4, &s3c2410_timer_irq);
|
setup_irq(IRQ_TIMER4, &s3c2410_timer_irq);
|
||||||
|
@ -280,6 +282,5 @@ static void __init s3c2410_timer_init(void)
|
||||||
|
|
||||||
struct sys_timer s3c24xx_timer = {
|
struct sys_timer s3c24xx_timer = {
|
||||||
.init = s3c2410_timer_init,
|
.init = s3c2410_timer_init,
|
||||||
.offset = s3c2410_gettimeoffset,
|
|
||||||
.resume = s3c2410_timer_setup
|
.resume = s3c2410_timer_setup
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue