4,31 → 4,24 |
#include <asm-generic/errno-base.h> |
#include <linux/kernel.h> |
|
#define NIL -1 |
extern void *int_arg_table[16]; |
extern void *int_func_table[16]; |
int intr_count = 0; |
|
static struct { |
void (*func)(int, void *dev_id, struct pt_regs *); |
void *data; |
int flags; |
} handlers[16]; |
|
unsigned long intr_count = 0; |
|
/* |
* Generic Linux interrupt handler. |
*/ |
static void linux_intr(int irq) |
void linux_intr(int irq) |
{ |
struct pt_regs regs; |
|
//printk("linux_intr %d\n", irq); |
|
intr_count++; |
|
(*handlers[irq].func)(irq, handlers[irq].data, ®s); |
|
intr_count--; |
|
struct pt_regs regs; |
|
intr_count++; |
|
if (int_func_table[irq] != NULL) |
(* (void (*)(int, void *dev_id, struct pt_regs *))int_func_table[irq])(irq, int_arg_table[irq], ®s); |
|
intr_count--; |
|
} |
|
/* |
36,17 → 29,7 |
*/ |
int request_irq(unsigned int irq, void (*handler)(int, void *dev_id, struct pt_regs *), unsigned long flags, const char *device, void *dev_id) |
{ |
|
if (handlers[irq].func) { |
return (-EBUSY); |
} |
|
handlers[irq].func = handler; |
handlers[irq].flags = flags; |
handlers[irq].data = dev_id; |
|
shark_handler_set(irq, linux_intr, NIL, TRUE); |
|
shark_handler_set(irq, (void *)(handler), dev_id); |
return 0; |
} |
|
55,6 → 38,7 |
*/ |
void free_irq(unsigned int irq, void *a) |
{ |
|
shark_handler_remove(irq); |
handlers[irq].func = 0; |
|
} |