2005-04-16 15:20:36 -07:00
/*
* linux / arch / arm / mach - footbridge / dc21285 - timer . c
*
* Copyright ( C ) 1998 Russell King .
* Copyright ( C ) 1998 Phil Blundell
*/
# include <linux/init.h>
# include <linux/interrupt.h>
2006-07-01 22:32:17 +01:00
# include <linux/irq.h>
2008-12-06 08:25:16 +00:00
# include <linux/spinlock.h>
2005-04-16 15:20:36 -07:00
# include <asm/irq.h>
# include <asm/hardware/dec21285.h>
# include <asm/mach/time.h>
# include "common.h"
/*
* Footbridge timer 1 support .
*/
static unsigned long timer1_latch ;
static unsigned long timer1_gettimeoffset ( void )
{
unsigned long value = timer1_latch - * CSR_TIMER1_VALUE ;
return ( ( tick_nsec / 1000 ) * value ) / timer1_latch ;
}
static irqreturn_t
2006-10-06 10:53:39 -07:00
timer1_interrupt ( int irq , void * dev_id )
2005-04-16 15:20:36 -07:00
{
* CSR_TIMER1_CLR = 0 ;
2006-10-06 10:53:39 -07:00
timer_tick ( ) ;
2005-04-16 15:20:36 -07:00
return IRQ_HANDLED ;
}
static struct irqaction footbridge_timer_irq = {
. name = " Timer1 timer tick " ,
. handler = timer1_interrupt ,
2007-05-08 00:35:39 -07:00
. flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL ,
2005-04-16 15:20:36 -07:00
} ;
/*
* Set up timer interrupt .
*/
static void __init footbridge_timer_init ( void )
{
timer1_latch = ( mem_fclk_21285 + 8 * HZ ) / ( 16 * HZ ) ;
* CSR_TIMER1_CLR = 0 ;
* CSR_TIMER1_LOAD = timer1_latch ;
* CSR_TIMER1_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD | TIMER_CNTL_DIV16 ;
setup_irq ( IRQ_TIMER1 , & footbridge_timer_irq ) ;
2005-04-17 15:36:55 +01:00
isa_rtc_init ( ) ;
2005-04-16 15:20:36 -07:00
}
struct sys_timer footbridge_timer = {
. init = footbridge_timer_init ,
. offset = timer1_gettimeoffset ,
} ;