diff options
Diffstat (limited to 'board/MAI/AmigaOneG3SE/interrupts.c')
| -rw-r--r-- | board/MAI/AmigaOneG3SE/interrupts.c | 266 | 
1 files changed, 0 insertions, 266 deletions
| diff --git a/board/MAI/AmigaOneG3SE/interrupts.c b/board/MAI/AmigaOneG3SE/interrupts.c deleted file mode 100644 index de46d6e37..000000000 --- a/board/MAI/AmigaOneG3SE/interrupts.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * (C) Copyright 2002 - * John W. Linville <linville@tuxdriver.com> - * - *    Copied and modified from original code by Josh Huber.  Original - *    copyright notice preserved below. - * - * (C) Copyright 2001 - * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -/* - * interrupts.c - just enough support for the decrementer/timer - */ - -#include <common.h> -#include <asm/processor.h> -#include <command.h> -#include "i8259.h" - -#undef DEBUG -#ifdef  DEBUG -#define PRINTF(fmt,args...)     printf (fmt ,##args) -#else -#define PRINTF(fmt,args...) -#endif -#define NR_IRQS	16 - -void irq_alloc_init(void); -long irq_alloc(long wanted); - -/****************************************************************************/ - -unsigned decrementer_count;	     /* count value for 1e6/HZ microseconds */ - -struct irq_action { -    interrupt_handler_t *handler; -    void *arg; -    ulong count; -}; - -static struct irq_action irq_handlers[NR_IRQS]; - -/****************************************************************************/ - -static __inline__ unsigned long -get_msr(void) -{ -	unsigned long msr; - -	asm volatile("mfmsr %0" : "=r" (msr) :); -	return msr; -} - -static __inline__ void -set_msr(unsigned long msr) -{ -	asm volatile("mtmsr %0" : : "r" (msr)); -} - -static __inline__ unsigned long -get_dec(void) -{ -	unsigned long val; - -	asm volatile("mfdec %0" : "=r" (val) :); -	return val; -} - - -static __inline__ void -set_dec(unsigned long val) -{ -	asm volatile("mtdec %0" : : "r" (val)); -} - - -void -enable_interrupts(void) -{ -    set_msr (get_msr() | MSR_EE); -} - -/* returns flag if MSR_EE was set before */ -int -disable_interrupts(void) -{ -    ulong msr; - -    msr = get_msr(); -    set_msr (msr & ~MSR_EE); -    return ((msr & MSR_EE) != 0); -} - -/****************************************************************************/ - -int interrupt_init (void) -{ -    extern void new_reset(void); -    extern void new_reset_end(void); -#ifdef DEBUG -	puts("interrupt_init: setting decrementer_count\n"); -#endif -	decrementer_count = get_tbclk() / CONFIG_SYS_HZ; - -#ifdef DEBUG -	puts("interrupt_init: setting actual decremter\n"); -#endif -	set_dec (get_tbclk() / CONFIG_SYS_HZ); - -#ifdef DEBUG -	puts("interrupt_init: clearing external interrupt table\n"); -#endif -	/* clear external interrupt table here */ -	memset(irq_handlers, 0, sizeof(irq_handlers)); - -#ifdef DEBUG -	puts("interrupt_init: initializing interrupt controller\n"); -#endif -	i8259_init(); - -#ifdef DEBUG -	puts("Copying reset trampoline\n"); -#endif -	/* WARNING: Assmues that the first megabyte is CACHEINHIBIT! */ -	memcpy((void *)0x100, new_reset, new_reset_end - new_reset); - -#ifdef DEBUG -	PRINTF("interrupt_init: enabling interrupts (msr = %08x)\n", -		get_msr()); -#endif -	set_msr (get_msr() | MSR_EE); - -#ifdef DEBUG -	PRINTF("interrupt_init: done. (msr = %08x)\n", get_msr()); -#endif - -} - -/****************************************************************************/ - -/* - * Handle external interrupts - */ -void -external_interrupt(struct pt_regs *regs) -{ -    extern int i8259_irq(void); - -	int irq, unmask = 1; - -	irq = i8259_irq(); /*i8259_get_irq(regs); */ -/*	printf("irq = %d, handler at %p ack=%d\n", irq, irq_handlers[irq].handler, *(volatile unsigned char *)0xFEF00000); */ -	i8259_mask_and_ack(irq); - -	if (irq_handlers[irq].handler != NULL) -		(*irq_handlers[irq].handler)(irq_handlers[irq].arg); -	else { -		PRINTF ("\nBogus External Interrupt IRQ %d\n", irq); -		/* -		* turn off the bogus interrupt, otherwise it -		* might repeat forever -		*/ -		unmask = 0; -	} - -	if (unmask) i8259_unmask_irq(irq); -} - -volatile ulong timestamp = 0; - -/* - * timer_interrupt - gets called when the decrementer overflows, - * with interrupts disabled. - * Trivial implementation - no need to be really accurate. - */ -void -timer_interrupt(struct pt_regs *regs) -{ -	set_dec(decrementer_count); -	timestamp++; -} - -/****************************************************************************/ - -void -reset_timer(void) -{ -	timestamp = 0; -} - -ulong -get_timer(ulong base) -{ -	return (timestamp - base); -} - -void -set_timer(ulong t) -{ -	timestamp = t; -} - -/****************************************************************************/ - -/* - * Install and free a interrupt handler. - */ - -void -irq_install_handler(int irq, interrupt_handler_t *handler, void *arg) -{ -	if (irq < 0 || irq >= NR_IRQS) { -		PRINTF("irq_install_handler: bad irq number %d\n", irq); -		return; -	} - -	if (irq_handlers[irq].handler != NULL) -		PRINTF("irq_install_handler: 0x%08lx replacing 0x%08lx\n", -		       (ulong)handler, (ulong)irq_handlers[irq].handler); - -	irq_handlers[irq].handler = handler; -	irq_handlers[irq].arg     = arg; - -	i8259_unmask_irq(irq); -} - -void -irq_free_handler(int irq) -{ -	if (irq < 0 || irq >= NR_IRQS) { -		PRINTF("irq_free_handler: bad irq number %d\n", irq); -		return; -	} - -	i8259_mask_irq(irq); - -	irq_handlers[irq].handler = NULL; -	irq_handlers[irq].arg     = NULL; -} - -/****************************************************************************/ - -void -do_irqinfo(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]) -{ -	puts("IRQ related functions are unimplemented currently.\n"); -} |