ARM: Integrator: convert to generic time support
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
@@ -241,6 +241,7 @@ config ARCH_INTEGRATOR
|
|||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select COMMON_CLKDEV
|
select COMMON_CLKDEV
|
||||||
select ICST525
|
select ICST525
|
||||||
|
select GENERIC_TIME
|
||||||
help
|
help
|
||||||
Support for ARM's Integrator platform.
|
Support for ARM's Integrator platform.
|
||||||
|
|
||||||
|
@@ -1,2 +1 @@
|
|||||||
extern void integrator_time_init(unsigned long, unsigned int);
|
extern void integrator_time_init(unsigned long, unsigned int);
|
||||||
extern unsigned long integrator_gettimeoffset(void);
|
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
#include <linux/termios.h>
|
#include <linux/termios.h>
|
||||||
#include <linux/amba/bus.h>
|
#include <linux/amba/bus.h>
|
||||||
#include <linux/amba/serial.h>
|
#include <linux/amba/serial.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <asm/clkdev.h>
|
#include <asm/clkdev.h>
|
||||||
@@ -225,7 +226,6 @@ EXPORT_SYMBOL(cm_control);
|
|||||||
#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000)
|
#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000)
|
||||||
#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100)
|
#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100)
|
||||||
#define TIMER2_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000200)
|
#define TIMER2_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000200)
|
||||||
#define VA_IC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* How long is the timer interval?
|
* How long is the timer interval?
|
||||||
@@ -241,42 +241,38 @@ EXPORT_SYMBOL(cm_control);
|
|||||||
|
|
||||||
static unsigned long timer_reload;
|
static unsigned long timer_reload;
|
||||||
|
|
||||||
/*
|
static void __iomem * const clksrc_base = (void __iomem *)TIMER2_VA_BASE;
|
||||||
* Returns number of ms since last clock interrupt. Note that interrupts
|
|
||||||
* will have been disabled by do_gettimeoffset()
|
static cycle_t timersp_read(struct clocksource *cs)
|
||||||
*/
|
|
||||||
unsigned long integrator_gettimeoffset(void)
|
|
||||||
{
|
{
|
||||||
unsigned long ticks1, ticks2, status;
|
return ~(readl(clksrc_base + TIMER_VALUE) & 0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
static struct clocksource clocksource_timersp = {
|
||||||
* Get the current number of ticks. Note that there is a race
|
.name = "timer2",
|
||||||
* condition between us reading the timer and checking for
|
.rating = 200,
|
||||||
* an interrupt. We get around this by ensuring that the
|
.read = timersp_read,
|
||||||
* counter has not reloaded between our two reads.
|
.mask = CLOCKSOURCE_MASK(16),
|
||||||
*/
|
.shift = 16,
|
||||||
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
|
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||||
do {
|
};
|
||||||
ticks1 = ticks2;
|
|
||||||
status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
|
|
||||||
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
|
|
||||||
} while (ticks2 > ticks1);
|
|
||||||
|
|
||||||
/*
|
static void integrator_clocksource_init(u32 khz)
|
||||||
* Number of ticks since last interrupt.
|
{
|
||||||
*/
|
struct clocksource *cs = &clocksource_timersp;
|
||||||
ticks1 = timer_reload - ticks2;
|
void __iomem *base = clksrc_base;
|
||||||
|
u32 ctrl = TIMER_CTRL_ENABLE;
|
||||||
|
|
||||||
/*
|
if (khz >= 1500) {
|
||||||
* Interrupt pending? If so, we've reloaded once already.
|
khz /= 16;
|
||||||
*/
|
ctrl = TIMER_CTRL_DIV16;
|
||||||
if (status & (1 << IRQ_TIMERINT1))
|
}
|
||||||
ticks1 += timer_reload;
|
|
||||||
|
|
||||||
/*
|
writel(ctrl, base + TIMER_CTRL);
|
||||||
* Convert the ticks to usecs
|
writel(0xffff, base + TIMER_LOAD);
|
||||||
*/
|
|
||||||
return TICKS2USECS(ticks1);
|
cs->mult = clocksource_khz2mult(khz, cs->shift);
|
||||||
|
clocksource_register(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -308,6 +304,8 @@ void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
|||||||
{
|
{
|
||||||
unsigned int timer_ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
|
unsigned int timer_ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
|
||||||
|
|
||||||
|
integrator_clocksource_init(reload * HZ / 1000);
|
||||||
|
|
||||||
timer_reload = reload;
|
timer_reload = reload;
|
||||||
timer_ctrl |= ctrl;
|
timer_ctrl |= ctrl;
|
||||||
|
|
||||||
|
@@ -342,7 +342,6 @@ static void __init ap_init_timer(void)
|
|||||||
|
|
||||||
static struct sys_timer ap_timer = {
|
static struct sys_timer ap_timer = {
|
||||||
.init = ap_init_timer,
|
.init = ap_init_timer,
|
||||||
.offset = integrator_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MACHINE_START(INTEGRATOR, "ARM-Integrator")
|
MACHINE_START(INTEGRATOR, "ARM-Integrator")
|
||||||
|
@@ -577,7 +577,6 @@ static void __init intcp_timer_init(void)
|
|||||||
|
|
||||||
static struct sys_timer cp_timer = {
|
static struct sys_timer cp_timer = {
|
||||||
.init = intcp_timer_init,
|
.init = intcp_timer_init,
|
||||||
.offset = integrator_gettimeoffset,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
|
MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
|
||||||
|
Reference in New Issue
Block a user