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 41 static irqreturn_t lh7a40x_timer_interrupt(int irq,void * dev_id)42lh7a40x_timer_interrupt(int irq, void *dev_id) 43 { 44 TIMER_EOI = 0; 45 timer_tick(); 46 47 return IRQ_HANDLED; 48 } 49 50 static 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 lh7a40x_timer_init(void)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 69 struct sys_timer lh7a40x_timer = { 70 .init = &lh7a40x_timer_init, 71 }; 72