#include <linux/random.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
+#include <linux/bitops.h>
-#include <asm/bitops.h>
#include <asm/io.h>
#include <asm/mipsregs.h>
#include <asm/system.h>
6, 6, 6 /* TMR */
};
-static inline void mask_irq(unsigned int irq_nr)
-{
- struct tb_irq_space* sp;
- for (sp = tb_irq_spaces; sp; sp = sp->next) {
- if (sp->start_irqno <= irq_nr &&
- irq_nr < sp->start_irqno + sp->nr_irqs) {
- if (sp->mask_func)
- sp->mask_func(irq_nr - sp->start_irqno,
- sp->space_id);
- break;
- }
- }
-}
-
-static inline void unmask_irq(unsigned int irq_nr)
-{
- struct tb_irq_space* sp;
- for (sp = tb_irq_spaces; sp; sp = sp->next) {
- if (sp->start_irqno <= irq_nr &&
- irq_nr < sp->start_irqno + sp->nr_irqs) {
- if (sp->unmask_func)
- sp->unmask_func(irq_nr - sp->start_irqno,
- sp->space_id);
- break;
- }
- }
-}
-
static void jmr3927_irq_disable(unsigned int irq_nr);
static void jmr3927_irq_enable(unsigned int irq_nr);
-static spinlock_t jmr3927_irq_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(jmr3927_irq_lock);
static unsigned int jmr3927_irq_startup(unsigned int irq)
{
static void jmr3927_irq_ack(unsigned int irq)
{
- if (irq == JMR3927_IRQ_IRC_TMR0) {
+ if (irq == JMR3927_IRQ_IRC_TMR0)
jmr3927_tmrptr->tisr = 0; /* ack interrupt */
- }
jmr3927_irq_disable(irq);
}
static void jmr3927_irq_end(unsigned int irq)
{
- jmr3927_irq_enable(irq);
+ if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
+ jmr3927_irq_enable(irq);
}
static void jmr3927_irq_disable(unsigned int irq_nr)
{
+ struct tb_irq_space* sp;
unsigned long flags;
- spinlock_irqsave(&jmr3927_irq_lock, flags);
- mask_irq(irq_nr);
- spinlock_irqrestore(&jmr3927_irq_lock, flags);
+ spin_lock_irqsave(&jmr3927_irq_lock, flags);
+ for (sp = tb_irq_spaces; sp; sp = sp->next) {
+ if (sp->start_irqno <= irq_nr &&
+ irq_nr < sp->start_irqno + sp->nr_irqs) {
+ if (sp->mask_func)
+ sp->mask_func(irq_nr - sp->start_irqno,
+ sp->space_id);
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&jmr3927_irq_lock, flags);
}
static void jmr3927_irq_enable(unsigned int irq_nr)
{
+ struct tb_irq_space* sp;
unsigned long flags;
- spinlock_irqsave(&jmr3927_irq_lock, flags);
- unmask_irq(irq_nr);
- spinlock_irqrestore(&jmr3927_irq_lock, flags);
+ spin_lock_irqsave(&jmr3927_irq_lock, flags);
+ for (sp = tb_irq_spaces; sp; sp = sp->next) {
+ if (sp->start_irqno <= irq_nr &&
+ irq_nr < sp->start_irqno + sp->nr_irqs) {
+ if (sp->unmask_func)
+ sp->unmask_func(irq_nr - sp->start_irqno,
+ sp->space_id);
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&jmr3927_irq_lock, flags);
}
/*
/* update IRCSR */
tx3927_ircptr->imr = 0;
tx3927_ircptr->imr = irc_elevel;
+ /* flush write buffer */
+ (void)tx3927_ircptr->ssr;
}
+
static void unmask_irq_irc(int irq_nr, int space_id)
{
volatile unsigned long *ilrp = &tx3927_ircptr->ilr[irq_nr / 2];
do_IRQ(irq + JMR3927_IRQ_IRC, regs);
}
-static void jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned char istat = jmr3927_ioc_reg_in(JMR3927_IOC_INTS2_ADDR);
int i;
do_IRQ(irq, regs);
}
}
+ return IRQ_HANDLED;
}
static struct irqaction ioc_action = {
jmr3927_ioc_interrupt, 0, CPU_MASK_NONE, "IOC", NULL, NULL,
};
-static void jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned char istat = jmr3927_isac_reg_in(JMR3927_ISAC_INTS2_ADDR);
int i;
do_IRQ(irq, regs);
}
}
+ return IRQ_HANDLED;
}
static struct irqaction isac_action = {
};
-static void jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
+static irqreturn_t jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
{
printk(KERN_WARNING "ISA error interrupt (irq 0x%x).\n", irq);
+
+ return IRQ_HANDLED;
}
static struct irqaction isaerr_action = {
jmr3927_isaerr_interrupt, 0, CPU_MASK_NONE, "ISA error", NULL, NULL,
};
-static void jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
+static irqreturn_t jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs)
{
printk(KERN_WARNING "PCI error interrupt (irq 0x%x).\n", irq);
printk(KERN_WARNING "pcistat:%02x, lbstat:%04lx\n",
tx3927_pcicptr->pcistat, tx3927_pcicptr->lbstat);
+
+ return IRQ_HANDLED;
}
static struct irqaction pcierr_action = {
jmr3927_pcierr_interrupt, 0, CPU_MASK_NONE, "PCI error", NULL, NULL,
int jmr3927_ether1_irq = 0;
void jmr3927_irq_init(u32 irq_base);
-void jmr3927_irq_setup(void)
+
+void __init arch_init_irq(void)
{
/* look for io board's presence */
int have_isac = jmr3927_have_isac();
set_c0_status(ST0_IM); /* IE bit is still 0. */
}
-void (*irq_setup)(void);
-
-void __init init_IRQ(void)
-{
-
-#ifdef CONFIG_KGDB
- extern void breakpoint(void);
- extern void set_debug_traps(void);
-
- puts("Wait for gdb client connection ...\n");
- set_debug_traps();
- breakpoint();
-#endif
-
- /* invoke board-specific irq setup */
- irq_setup();
-}
-
static hw_irq_controller jmr3927_irq_controller = {
- "jmr3927_irq",
- jmr3927_irq_startup,
- jmr3927_irq_shutdown,
- jmr3927_irq_enable,
- jmr3927_irq_disable,
- jmr3927_irq_ack,
- jmr3927_irq_end,
+ .typename = "jmr3927_irq",
+ .startup = jmr3927_irq_startup,
+ .shutdown = jmr3927_irq_shutdown,
+ .enable = jmr3927_irq_enable,
+ .disable = jmr3927_irq_disable,
+ .ack = jmr3927_irq_ack,
+ .end = jmr3927_irq_end,
};
void jmr3927_irq_init(u32 irq_base)
{
u32 i;
- init_generic_irq();
for (i= irq_base; i< irq_base + JMR3927_NR_IRQ_IRC + JMR3927_NR_IRQ_IOC; i++) {
irq_desc[i].status = IRQ_DISABLED;
irq_desc[i].action = NULL;