X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=arch%2Fmips%2Fsgi-ip27%2Fip27-irq.c;h=1bb692a3b31948d2a9abb4a13e7f5049ae38886a;hb=f11fda6a9173e8e6b152ba5cb26fa20095a4c60f;hp=60ade7690e09861aafcfa0ca3f09da1eef8230a5;hpb=0670afdf0e69e5e73c8358da9c39bf3a8807b03e;p=linux-2.6-omap-h63xx.git diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c index 60ade7690e0..1bb692a3b31 100644 --- a/arch/mips/sgi-ip27/ip27-irq.c +++ b/arch/mips/sgi-ip27/ip27-irq.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -208,11 +207,9 @@ static int intr_connect_level(int cpu, int bit) { nasid_t nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); struct slice_data *si = cpu_data[cpu].data; - unsigned long flags; set_bit(bit, si->irq_enable_mask); - local_irq_save(flags); if (!cputoslice(cpu)) { REMOTE_HUB_S(nasid, PI_INT_MASK0_A, si->irq_enable_mask[0]); REMOTE_HUB_S(nasid, PI_INT_MASK1_A, si->irq_enable_mask[1]); @@ -220,7 +217,6 @@ static int intr_connect_level(int cpu, int bit) REMOTE_HUB_S(nasid, PI_INT_MASK0_B, si->irq_enable_mask[0]); REMOTE_HUB_S(nasid, PI_INT_MASK1_B, si->irq_enable_mask[1]); } - local_irq_restore(flags); return 0; } @@ -286,6 +282,8 @@ static unsigned int startup_bridge_irq(unsigned int irq) bridge->b_wid_tflush; + intr_connect_level(cpu, swlevel); + return 0; /* Never anything pending. */ } @@ -293,7 +291,6 @@ static unsigned int startup_bridge_irq(unsigned int irq) static void shutdown_bridge_irq(unsigned int irq) { struct bridge_controller *bc = IRQ_TO_BRIDGE(irq); - struct hub_data *hub = hub_data(cpu_to_node(bc->irq_cpu)); bridge_t *bridge = bc->base; int pin, swlevel; cpuid_t cpu; @@ -308,8 +305,6 @@ static void shutdown_bridge_irq(unsigned int irq) swlevel = find_level(&cpu, irq); intr_disconnect_level(cpu, swlevel); - __clear_bit(swlevel, hub->irq_alloc_mask); - bridge->b_int_enable &= ~(1 << pin); bridge->b_wid_tflush; } @@ -379,14 +374,13 @@ int __devinit request_bridge_irq(struct bridge_controller *bc) return irq; } -extern void ip27_rt_timer_interrupt(void); - asmlinkage void plat_irq_dispatch(void) { unsigned long pending = read_c0_cause() & read_c0_status(); + extern unsigned int rt_timer_irq; if (pending & CAUSEF_IP4) - ip27_rt_timer_interrupt(); + do_IRQ(rt_timer_irq); else if (pending & CAUSEF_IP2) /* PI_INT_PEND_0 or CC_PEND_{A|B} */ ip27_do_irq_mask0(); else if (pending & CAUSEF_IP3) /* PI_INT_PEND_1 */