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#include <linux/io.h> 17 18#include <mach/hardware.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 TIMER_EOI = 0; 45 timer_tick(); 46 47 return IRQ_HANDLED; 48} 49 50static struct irqaction lh7a40x_timer_irq = { 51 .name = "LHA740x Timer Tick", 52 .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, 53 .handler = lh7a40x_timer_interrupt, 54}; 55 56static void __init lh7a40x_timer_init (void) 57{ 58 /* Stop/disable all timers */ 59 TIMER_CONTROL1 = 0; 60 TIMER_CONTROL2 = 0; 61 TIMER_CONTROL3 = 0; 62 63 setup_irq (TIMER_IRQ, &lh7a40x_timer_irq); 64 65 TIMER_LOAD = TIMER_CONSTANT; 66 TIMER_CONTROL = TIMER_MODE; 67} 68 69struct sys_timer lh7a40x_timer = { 70 .init = &lh7a40x_timer_init, 71}; 72