Skip to content

Commit

Permalink
clocksource: convert footbridge to generic i8253 clocksource
Browse files Browse the repository at this point in the history
Convert the footbridge isa-timer code to use generic i8253 clocksource.

Acked-by: John Stultz <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>
Signed-off-by: Russell King <[email protected]>
  • Loading branch information
Russell King committed May 14, 2011
1 parent 89c0b8e commit 8c414ff
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 41 deletions.
15 changes: 15 additions & 0 deletions arch/arm/include/asm/i8253.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef __ASMARM_I8253_H
#define __ASMARM_I8253_H

/* i8253A PIT registers */
#define PIT_MODE 0x43
#define PIT_CH0 0x40

#define PIT_LATCH ((PIT_TICK_RATE + HZ / 2) / HZ)

extern raw_spinlock_t i8253_lock;

#define outb_pit outb_p
#define inb_pit inb_p

#endif
2 changes: 2 additions & 0 deletions arch/arm/mach-footbridge/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ menu "Footbridge Implementations"

config ARCH_CATS
bool "CATS"
select CLKSRC_I8253
select FOOTBRIDGE_HOST
select ISA
select ISA_DMA
Expand Down Expand Up @@ -59,6 +60,7 @@ config ARCH_EBSA285_HOST

config ARCH_NETWINDER
bool "NetWinder"
select CLKSRC_I8253
select FOOTBRIDGE_HOST
select ISA
select ISA_DMA
Expand Down
45 changes: 4 additions & 41 deletions arch/arm/mach-footbridge/isa-timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,53 +10,16 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/spinlock.h>
#include <linux/timex.h>

#include <asm/irq.h>

#include <asm/i8253.h>
#include <asm/mach/time.h>

#include "common.h"

#define PIT_MODE 0x43
#define PIT_CH0 0x40

#define PIT_LATCH ((PIT_TICK_RATE + HZ / 2) / HZ)

static cycle_t pit_read(struct clocksource *cs)
{
unsigned long flags;
static int old_count;
static u32 old_jifs;
int count;
u32 jifs;

raw_local_irq_save(flags);

jifs = jiffies;
outb_p(0x00, PIT_MODE); /* latch the count */
count = inb_p(PIT_CH0); /* read the latched count */
count |= inb_p(PIT_CH0) << 8;

if (count > old_count && jifs == old_jifs)
count = old_count;

old_count = count;
old_jifs = jifs;

raw_local_irq_restore(flags);

count = (PIT_LATCH - 1) - count;

return (cycle_t)(jifs * PIT_LATCH) + count;
}

static struct clocksource pit_cs = {
.name = "pit",
.rating = 110,
.read = pit_read,
.mask = CLOCKSOURCE_MASK(32),
};
DEFINE_RAW_SPINLOCK(i8253_lock);

static void pit_set_mode(enum clock_event_mode mode,
struct clock_event_device *evt)
Expand Down Expand Up @@ -121,7 +84,7 @@ static void __init isa_timer_init(void)
pit_ce.max_delta_ns = clockevent_delta2ns(0x7fff, &pit_ce);
pit_ce.min_delta_ns = clockevent_delta2ns(0x000f, &pit_ce);

clocksource_register_hz(&pit_cs, PIT_TICK_RATE);
clocksource_i8253_init();

setup_irq(pit_ce.irq, &pit_timer_irq);
clockevents_register_device(&pit_ce);
Expand Down
2 changes: 2 additions & 0 deletions include/linux/clocksource.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,4 +341,6 @@ static inline void update_vsyscall_tz(void)

extern void timekeeping_notify(struct clocksource *clock);

extern int clocksource_i8253_init(void);

#endif /* _LINUX_CLOCKSOURCE_H */

0 comments on commit 8c414ff

Please sign in to comment.