[PATCH] CRIS update: IRQ

Use the generic IRQ framework

Signed-off-by: Mikael Starvik <starvik@axis.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Mikael Starvik
2005-07-27 11:44:36 -07:00
committed by Linus Torvalds
parent 63245d2cde
commit 2e0cea1dec
6 changed files with 100 additions and 298 deletions
+3 -24
View File
@@ -74,12 +74,9 @@ struct etrax_interrupt_vector {
};
extern struct etrax_interrupt_vector *etrax_irv;
void set_int_vector(int n, irqvectptr addr, irqvectptr saddr);
void set_int_vector(int n, irqvectptr addr);
void set_break_vector(int n, irqvectptr addr);
#define mask_irq(irq_nr) (*R_VECT_MASK_CLR = 1 << (irq_nr));
#define unmask_irq(irq_nr) (*R_VECT_MASK_SET = 1 << (irq_nr));
#define __STR(x) #x
#define STR(x) __STR(x)
@@ -121,26 +118,17 @@ void set_break_vector(int n, irqvectptr addr);
#define BUILD_IRQ(nr,mask) \
void IRQ_NAME(nr); \
void sIRQ_NAME(nr); \
void BAD_IRQ_NAME(nr); \
__asm__ ( \
".text\n\t" \
"IRQ" #nr "_interrupt:\n\t" \
SAVE_ALL \
"sIRQ" #nr "_interrupt:\n\t" /* shortcut for the multiple irq handler */ \
BLOCK_IRQ(mask,nr) /* this must be done to prevent irq loops when we ei later */ \
"moveq "#nr",$r10\n\t" \
"move.d $sp,$r11\n\t" \
"jsr do_IRQ\n\t" /* irq.c, r10 and r11 are arguments */ \
UNBLOCK_IRQ(mask) \
"moveq 0,$r9\n\t" /* make ret_from_intr realise we came from an irq */ \
"jump ret_from_intr\n\t" \
"bad_IRQ" #nr "_interrupt:\n\t" \
"push $r0\n\t" \
BLOCK_IRQ(mask,nr) \
"pop $r0\n\t" \
"reti\n\t" \
"nop\n");
"jump ret_from_intr\n\t");
/* This is subtle. The timer interrupt is crucial and it should not be disabled for
* too long. However, if it had been a normal interrupt as per BUILD_IRQ, it would
@@ -159,23 +147,14 @@ __asm__ ( \
#define BUILD_TIMER_IRQ(nr,mask) \
void IRQ_NAME(nr); \
void sIRQ_NAME(nr); \
void BAD_IRQ_NAME(nr); \
__asm__ ( \
".text\n\t" \
"IRQ" #nr "_interrupt:\n\t" \
SAVE_ALL \
"sIRQ" #nr "_interrupt:\n\t" /* shortcut for the multiple irq handler */ \
"moveq "#nr",$r10\n\t" \
"move.d $sp,$r11\n\t" \
"jsr do_IRQ\n\t" /* irq.c, r10 and r11 are arguments */ \
"moveq 0,$r9\n\t" /* make ret_from_intr realise we came from an irq */ \
"jump ret_from_intr\n\t" \
"bad_IRQ" #nr "_interrupt:\n\t" \
"push $r0\n\t" \
BLOCK_IRQ(mask,nr) \
"pop $r0\n\t" \
"reti\n\t" \
"nop\n");
"jump ret_from_intr\n\t");
#endif
+2 -3
View File
@@ -1,18 +1,17 @@
#ifndef __ASM_HARDIRQ_H
#define __ASM_HARDIRQ_H
/* only non-SMP supported */
#include <linux/threads.h>
#include <linux/cache.h>
/* entry.S is sensitive to the offsets of these fields */
typedef struct {
unsigned int __softirq_pending;
} ____cacheline_aligned irq_cpustat_t;
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
void ack_bad_irq(unsigned int irq);
#define HARDIRQ_BITS 8
/*
+7
View File
@@ -0,0 +1,7 @@
#ifndef _ASM_HW_IRQ_H
#define _ASM_HW_IRQ_H
static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {}
#endif
-10
View File
@@ -8,16 +8,6 @@ extern __inline__ int irq_canonicalize(int irq)
return irq;
}
extern void disable_irq(unsigned int);
extern void enable_irq(unsigned int);
#define disable_irq_nosync disable_irq
#define enable_irq_nosync enable_irq
struct irqaction;
struct pt_regs;
int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
#endif /* _ASM_IRQ_H */