diff options
Diffstat (limited to 'cpu/ixp/interrupts.c')
| -rw-r--r-- | cpu/ixp/interrupts.c | 55 | 
1 files changed, 10 insertions, 45 deletions
| diff --git a/cpu/ixp/interrupts.c b/cpu/ixp/interrupts.c index ee0129ead..a05e439fd 100644 --- a/cpu/ixp/interrupts.c +++ b/cpu/ixp/interrupts.c @@ -33,14 +33,6 @@  #include <asm/arch/ixp425.h>  #include <asm/proc-armv/ptrace.h> -/* - * When interrupts are enabled, use timer 2 for time/delay generation... - */ - -#define FREQ		66666666 -#define CLOCK_TICK_RATE	(((FREQ / CONFIG_SYS_HZ & ~IXP425_OST_RELOAD_MASK) + 1) * CONFIG_SYS_HZ) -#define LATCH		((CLOCK_TICK_RATE + CONFIG_SYS_HZ/2) / CONFIG_SYS_HZ)	/* For divider */ -  struct _irq_handler {  	void                *m_data;  	void (*m_func)( void *data); @@ -48,8 +40,6 @@ struct _irq_handler {  static struct _irq_handler IRQ_HANDLER[N_IRQS]; -static volatile ulong timestamp; -  static void default_isr(void *data)  {  	printf("default_isr():  called for IRQ %d, Interrupt Status=%x PR=%x\n", @@ -61,33 +51,20 @@ static int next_irq(void)  	return (((*IXP425_ICIH & 0x000000fc) >> 2) - 1);  } -static void timer_isr(void *data) -{ -	unsigned int *pTime = (unsigned int *)data; - -	(*pTime)++; - -	/* -	 * Reset IRQ source -	 */ -	*IXP425_OSST = IXP425_OSST_TIMER_2_PEND; -} - -ulong get_timer (ulong base) +void do_irq (struct pt_regs *pt_regs)  { -	return timestamp - base; -} +	int irq = next_irq(); -void reset_timer (void) -{ -	timestamp = 0; +	IRQ_HANDLER[irq].m_func(IRQ_HANDLER[irq].m_data);  } -void do_irq (struct pt_regs *pt_regs) +void irq_install_handler (int irq, interrupt_handler_t handle_irq, void *data)  { -	int irq = next_irq(); +	if (irq >= N_IRQS || !handle_irq) +		return; -	IRQ_HANDLER[irq].m_func(IRQ_HANDLER[irq].m_data); +	IRQ_HANDLER[irq].m_data = data; +	IRQ_HANDLER[irq].m_func = handle_irq;  }  int interrupt_init (void) @@ -95,23 +72,11 @@ int interrupt_init (void)  	int i;  	/* install default interrupt handlers */ -	for (i = 0; i < N_IRQS; i++) { -		IRQ_HANDLER[i].m_data = (void *)i; -		IRQ_HANDLER[i].m_func = default_isr; -	} - -	/* install interrupt handler for timer */ -	IRQ_HANDLER[IXP425_TIMER_2_IRQ].m_data = (void *)×tamp; -	IRQ_HANDLER[IXP425_TIMER_2_IRQ].m_func = timer_isr; - -	/* setup the Timer counter value */ -	*IXP425_OSRT2 = (LATCH & ~IXP425_OST_RELOAD_MASK) | IXP425_OST_ENABLE; +	for (i = 0; i < N_IRQS; i++) +		irq_install_handler(i, default_isr, (void *)i);  	/* configure interrupts for IRQ mode */  	*IXP425_ICLR = 0x00000000; -	/* enable timer irq */ -	*IXP425_ICMR = (1 << IXP425_TIMER_2_IRQ); -  	return (0);  } |