Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 191804
b: refs/heads/master
c: b9cedda
h: refs/heads/master
v: v3
  • Loading branch information
Russell King committed Apr 29, 2010
1 parent dc73d68 commit fb084da
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ba02a21544b41a65e58506f1d79353203d94b8b6
refs/heads/master: b9cedda230793cbf58eb012ddadedd490cc8e129
1 change: 1 addition & 0 deletions trunk/arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ config ARCH_INTEGRATOR
select HAVE_CLK
select COMMON_CLKDEV
select ICST525
select GENERIC_TIME
help
Support for ARM's Integrator platform.

Expand Down
1 change: 0 additions & 1 deletion trunk/arch/arm/mach-integrator/common.h
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
extern void integrator_time_init(unsigned long, unsigned int);
extern unsigned long integrator_gettimeoffset(void);
62 changes: 30 additions & 32 deletions trunk/arch/arm/mach-integrator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/termios.h>
#include <linux/amba/bus.h>
#include <linux/amba/serial.h>
#include <linux/clocksource.h>
#include <linux/io.h>

#include <asm/clkdev.h>
Expand Down Expand Up @@ -225,7 +226,6 @@ EXPORT_SYMBOL(cm_control);
#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000)
#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100)
#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?
Expand All @@ -241,42 +241,38 @@ EXPORT_SYMBOL(cm_control);

static unsigned long timer_reload;

/*
* Returns number of ms since last clock interrupt. Note that interrupts
* will have been disabled by do_gettimeoffset()
*/
unsigned long integrator_gettimeoffset(void)
static void __iomem * const clksrc_base = (void __iomem *)TIMER2_VA_BASE;

static cycle_t timersp_read(struct clocksource *cs)
{
unsigned long ticks1, ticks2, status;
return ~(readl(clksrc_base + TIMER_VALUE) & 0xffff);
}

/*
* Get the current number of ticks. Note that there is a race
* condition between us reading the timer and checking for
* an interrupt. We get around this by ensuring that the
* counter has not reloaded between our two reads.
*/
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
do {
ticks1 = ticks2;
status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
} while (ticks2 > ticks1);
static struct clocksource clocksource_timersp = {
.name = "timer2",
.rating = 200,
.read = timersp_read,
.mask = CLOCKSOURCE_MASK(16),
.shift = 16,
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
};

/*
* Number of ticks since last interrupt.
*/
ticks1 = timer_reload - ticks2;
static void integrator_clocksource_init(u32 khz)
{
struct clocksource *cs = &clocksource_timersp;
void __iomem *base = clksrc_base;
u32 ctrl = TIMER_CTRL_ENABLE;

/*
* Interrupt pending? If so, we've reloaded once already.
*/
if (status & (1 << IRQ_TIMERINT1))
ticks1 += timer_reload;
if (khz >= 1500) {
khz /= 16;
ctrl = TIMER_CTRL_DIV16;
}

/*
* Convert the ticks to usecs
*/
return TICKS2USECS(ticks1);
writel(ctrl, base + TIMER_CTRL);
writel(0xffff, base + TIMER_LOAD);

cs->mult = clocksource_khz2mult(khz, cs->shift);
clocksource_register(cs);
}

/*
Expand Down Expand Up @@ -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;

integrator_clocksource_init(reload * HZ / 1000);

timer_reload = reload;
timer_ctrl |= ctrl;

Expand Down
1 change: 0 additions & 1 deletion trunk/arch/arm/mach-integrator/integrator_ap.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,6 @@ static void __init ap_init_timer(void)

static struct sys_timer ap_timer = {
.init = ap_init_timer,
.offset = integrator_gettimeoffset,
};

MACHINE_START(INTEGRATOR, "ARM-Integrator")
Expand Down
1 change: 0 additions & 1 deletion trunk/arch/arm/mach-integrator/integrator_cp.c
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,6 @@ static void __init intcp_timer_init(void)

static struct sys_timer cp_timer = {
.init = intcp_timer_init,
.offset = integrator_gettimeoffset,
};

MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
Expand Down

0 comments on commit fb084da

Please sign in to comment.