[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:
committed by
Linus Torvalds
parent
63245d2cde
commit
2e0cea1dec
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user