Path: blob/master/arch/arm/mach-footbridge/isa-timer.c
10817 views
/*1* linux/arch/arm/mach-footbridge/isa-timer.c2*3* Copyright (C) 1998 Russell King.4* Copyright (C) 1998 Phil Blundell5*/6#include <linux/clockchips.h>7#include <linux/clocksource.h>8#include <linux/init.h>9#include <linux/interrupt.h>10#include <linux/irq.h>11#include <linux/io.h>12#include <linux/spinlock.h>13#include <linux/timex.h>1415#include <asm/irq.h>16#include <asm/i8253.h>17#include <asm/mach/time.h>1819#include "common.h"2021DEFINE_RAW_SPINLOCK(i8253_lock);2223static void pit_set_mode(enum clock_event_mode mode,24struct clock_event_device *evt)25{26unsigned long flags;2728raw_local_irq_save(flags);2930switch (mode) {31case CLOCK_EVT_MODE_PERIODIC:32outb_p(0x34, PIT_MODE);33outb_p(PIT_LATCH & 0xff, PIT_CH0);34outb_p(PIT_LATCH >> 8, PIT_CH0);35break;3637case CLOCK_EVT_MODE_SHUTDOWN:38case CLOCK_EVT_MODE_UNUSED:39outb_p(0x30, PIT_MODE);40outb_p(0, PIT_CH0);41outb_p(0, PIT_CH0);42break;4344case CLOCK_EVT_MODE_ONESHOT:45case CLOCK_EVT_MODE_RESUME:46break;47}48local_irq_restore(flags);49}5051static int pit_set_next_event(unsigned long delta,52struct clock_event_device *evt)53{54return 0;55}5657static struct clock_event_device pit_ce = {58.name = "pit",59.features = CLOCK_EVT_FEAT_PERIODIC,60.set_mode = pit_set_mode,61.set_next_event = pit_set_next_event,62.shift = 32,63};6465static irqreturn_t pit_timer_interrupt(int irq, void *dev_id)66{67struct clock_event_device *ce = dev_id;68ce->event_handler(ce);69return IRQ_HANDLED;70}7172static struct irqaction pit_timer_irq = {73.name = "pit",74.handler = pit_timer_interrupt,75.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,76.dev_id = &pit_ce,77};7879static void __init isa_timer_init(void)80{81pit_ce.cpumask = cpumask_of(smp_processor_id());82pit_ce.mult = div_sc(PIT_TICK_RATE, NSEC_PER_SEC, pit_ce.shift);83pit_ce.max_delta_ns = clockevent_delta2ns(0x7fff, &pit_ce);84pit_ce.min_delta_ns = clockevent_delta2ns(0x000f, &pit_ce);8586clocksource_i8253_init();8788setup_irq(pit_ce.irq, &pit_timer_irq);89clockevents_register_device(&pit_ce);90}9192struct sys_timer isa_timer = {93.init = isa_timer_init,94};959697