1/* 2 * arch/arm/mach-lh7a40x/time.c 3 * 4 * Copyright (C) 2004 Logic Product Development 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * version 2 as published by the Free Software Foundation. 9 * 10 */ 11#include <linux/module.h> 12#include <linux/kernel.h> 13#include <linux/interrupt.h> 14#include <linux/irq.h> 15#include <linux/time.h> 16 17#include <asm/hardware.h> 18#include <asm/io.h> 19#include <asm/irq.h> 20#include <asm/leds.h> 21 22#include <asm/mach/time.h> 23#include "common.h" 24 25#if HZ < 100 26# define TIMER_CONTROL TIMER_CONTROL2 27# define TIMER_LOAD TIMER_LOAD2 28# define TIMER_CONSTANT (508469/HZ) 29# define TIMER_MODE (TIMER_C_ENABLE | TIMER_C_PERIODIC | TIMER_C_508KHZ) 30# define TIMER_EOI TIMER_EOI2 31# define TIMER_IRQ IRQ_T2UI 32#else 33# define TIMER_CONTROL TIMER_CONTROL3 34# define TIMER_LOAD TIMER_LOAD3 35# define TIMER_CONSTANT (3686400/HZ) 36# define TIMER_MODE (TIMER_C_ENABLE | TIMER_C_PERIODIC) 37# define TIMER_EOI TIMER_EOI3 38# define TIMER_IRQ IRQ_T3UI 39#endif 40 41static irqreturn_t 42lh7a40x_timer_interrupt(int irq, void *dev_id) 43{ 44 write_seqlock(&xtime_lock); 45 46 TIMER_EOI = 0; 47 timer_tick(); 48 49 write_sequnlock(&xtime_lock); 50 51 return IRQ_HANDLED; 52} 53 54static struct irqaction lh7a40x_timer_irq = { 55 .name = "LHA740x Timer Tick", 56 .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, 57 .handler = lh7a40x_timer_interrupt, 58}; 59 60static void __init lh7a40x_timer_init (void) 61{ 62 /* Stop/disable all timers */ 63 TIMER_CONTROL1 = 0; 64 TIMER_CONTROL2 = 0; 65 TIMER_CONTROL3 = 0; 66 67 setup_irq (TIMER_IRQ, &lh7a40x_timer_irq); 68 69 TIMER_LOAD = TIMER_CONSTANT; 70 TIMER_CONTROL = TIMER_MODE; 71} 72 73struct sys_timer lh7a40x_timer = { 74 .init = &lh7a40x_timer_init, 75}; 76