[MIPS] use generic_handle_irq, handle_level_irq, handle_percpu_irq

Further incorporation of generic irq framework.  Replacing __do_IRQ()
by proper flow handler would make the irq handling path a bit simpler
and faster.

* use generic_handle_irq() instead of __do_IRQ().
* use handle_level_irq for obvious level-type irq chips.
* use handle_percpu_irq for irqs marked as IRQ_PER_CPU.
* setup .eoi routine for irq chips possibly used with handle_percpu_irq.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Atsushi Nemoto 2006-11-14 01:13:18 +09:00 committed by Ralf Baechle
parent 1603b5aca4
commit 1417836e81
28 changed files with 64 additions and 34 deletions

View file

@ -103,9 +103,11 @@ void __init init_ioasic_irqs(int base)
fast_iob(); fast_iob();
for (i = base; i < base + IO_INR_DMA; i++) for (i = base; i < base + IO_INR_DMA; i++)
set_irq_chip(i, &ioasic_irq_type); set_irq_chip_and_handler(i, &ioasic_irq_type,
handle_level_irq);
for (; i < base + IO_IRQ_LINES; i++) for (; i < base + IO_IRQ_LINES; i++)
set_irq_chip(i, &ioasic_dma_irq_type); set_irq_chip_and_handler(i, &ioasic_dma_irq_type,
handle_level_irq);
ioasic_irq_base = base; ioasic_irq_base = base;
} }

View file

@ -85,7 +85,7 @@ void __init init_kn02_irqs(int base)
iob(); iob();
for (i = base; i < base + KN02_IRQ_LINES; i++) for (i = base; i < base + KN02_IRQ_LINES; i++)
set_irq_chip(i, &kn02_irq_type); set_irq_chip_and_handler(i, &kn02_irq_type, handle_level_irq);
kn02_irq_base = base; kn02_irq_base = base;
} }

View file

@ -76,7 +76,8 @@ void emma2rh_irq_init(u32 irq_base)
u32 i; u32 i;
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ; i++) for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ; i++)
set_irq_chip(i, &emma2rh_irq_controller); set_irq_chip_and_handler(i, &emma2rh_irq_controller,
handle_level_irq);
emma2rh_irq_base = irq_base; emma2rh_irq_base = irq_base;
} }

View file

@ -68,7 +68,8 @@ void emma2rh_sw_irq_init(u32 irq_base)
u32 i; u32 i;
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_SW; i++) for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_SW; i++)
set_irq_chip(i, &emma2rh_sw_irq_controller); set_irq_chip_and_handler(i, &emma2rh_sw_irq_controller,
handle_level_irq);
emma2rh_sw_irq_base = irq_base; emma2rh_sw_irq_base = irq_base;
} }

View file

@ -59,7 +59,7 @@ void __init init_r4030_ints(void)
int i; int i;
for (i = JAZZ_PARALLEL_IRQ; i <= JAZZ_TIMER_IRQ; i++) for (i = JAZZ_PARALLEL_IRQ; i <= JAZZ_TIMER_IRQ; i++)
set_irq_chip(i, &r4030_irq_type); set_irq_chip_and_handler(i, &r4030_irq_type, handle_level_irq);
r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, 0); r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, 0);
r4030_read_reg16(JAZZ_IO_IRQ_SOURCE); /* clear pending IRQs */ r4030_read_reg16(JAZZ_IO_IRQ_SOURCE); /* clear pending IRQs */

View file

@ -117,6 +117,7 @@ struct irq_chip msc_levelirq_type = {
.mask = mask_msc_irq, .mask = mask_msc_irq,
.mask_ack = level_mask_and_ack_msc_irq, .mask_ack = level_mask_and_ack_msc_irq,
.unmask = unmask_msc_irq, .unmask = unmask_msc_irq,
.eoi = unmask_msc_irq,
.end = end_msc_irq, .end = end_msc_irq,
}; };
@ -126,6 +127,7 @@ struct irq_chip msc_edgeirq_type = {
.mask = mask_msc_irq, .mask = mask_msc_irq,
.mask_ack = edge_mask_and_ack_msc_irq, .mask_ack = edge_mask_and_ack_msc_irq,
.unmask = unmask_msc_irq, .unmask = unmask_msc_irq,
.eoi = unmask_msc_irq,
.end = end_msc_irq, .end = end_msc_irq,
}; };

View file

@ -114,7 +114,8 @@ void __init mv64340_irq_init(unsigned int base)
int i; int i;
for (i = base; i < base + 64; i++) for (i = base; i < base + 64; i++)
set_irq_chip(i, &mv64340_irq_type); set_irq_chip_and_handler(i, &mv64340_irq_type,
handle_level_irq);
irq_base = base; irq_base = base;
} }

View file

@ -51,7 +51,8 @@ void __init rm7k_cpu_irq_init(int base)
clear_c0_intcontrol(0x00000f00); /* Mask all */ clear_c0_intcontrol(0x00000f00); /* Mask all */
for (i = base; i < base + 4; i++) for (i = base; i < base + 4; i++)
set_irq_chip(i, &rm7k_irq_controller); set_irq_chip_and_handler(i, &rm7k_irq_controller,
handle_level_irq);
irq_base = base; irq_base = base;
} }

View file

@ -117,10 +117,12 @@ void __init rm9k_cpu_irq_init(int base)
clear_c0_intcontrol(0x0000f000); /* Mask all */ clear_c0_intcontrol(0x0000f000); /* Mask all */
for (i = base; i < base + 4; i++) for (i = base; i < base + 4; i++)
set_irq_chip(i, &rm9k_irq_controller); set_irq_chip_and_handler(i, &rm9k_irq_controller,
handle_level_irq);
rm9000_perfcount_irq = base + 1; rm9000_perfcount_irq = base + 1;
set_irq_chip(rm9000_perfcount_irq, &rm9k_perfcounter_irq); set_irq_chip_and_handler(rm9000_perfcount_irq, &rm9k_perfcounter_irq,
handle_level_irq);
irq_base = base; irq_base = base;
} }

View file

@ -62,6 +62,7 @@ static struct irq_chip mips_cpu_irq_controller = {
.mask = mask_mips_irq, .mask = mask_mips_irq,
.mask_ack = mask_mips_irq, .mask_ack = mask_mips_irq,
.unmask = unmask_mips_irq, .unmask = unmask_mips_irq,
.eoi = unmask_mips_irq,
.end = mips_cpu_irq_end, .end = mips_cpu_irq_end,
}; };
@ -104,6 +105,7 @@ static struct irq_chip mips_mt_cpu_irq_controller = {
.mask = mask_mips_mt_irq, .mask = mask_mips_mt_irq,
.mask_ack = mips_mt_cpu_irq_ack, .mask_ack = mips_mt_cpu_irq_ack,
.unmask = unmask_mips_mt_irq, .unmask = unmask_mips_mt_irq,
.eoi = unmask_mips_mt_irq,
.end = mips_mt_cpu_irq_end, .end = mips_mt_cpu_irq_end,
}; };
@ -124,7 +126,8 @@ void __init mips_cpu_irq_init(int irq_base)
set_irq_chip(i, &mips_mt_cpu_irq_controller); set_irq_chip(i, &mips_mt_cpu_irq_controller);
for (i = irq_base + 2; i < irq_base + 8; i++) for (i = irq_base + 2; i < irq_base + 8; i++)
set_irq_chip(i, &mips_cpu_irq_controller); set_irq_chip_and_handler(i, &mips_cpu_irq_controller,
handle_level_irq);
mips_cpu_irq_base = irq_base; mips_cpu_irq_base = irq_base;
} }

View file

@ -278,7 +278,9 @@ void __init plat_prepare_cpus(unsigned int max_cpus)
/* need to mark IPI's as IRQ_PER_CPU */ /* need to mark IPI's as IRQ_PER_CPU */
irq_desc[cpu_ipi_resched_irq].status |= IRQ_PER_CPU; irq_desc[cpu_ipi_resched_irq].status |= IRQ_PER_CPU;
set_irq_handler(cpu_ipi_resched_irq, handle_percpu_irq);
irq_desc[cpu_ipi_call_irq].status |= IRQ_PER_CPU; irq_desc[cpu_ipi_call_irq].status |= IRQ_PER_CPU;
set_irq_handler(cpu_ipi_call_irq, handle_percpu_irq);
} }
/* /*

View file

@ -1009,6 +1009,7 @@ void setup_cross_vpe_interrupts(void)
setup_irq_smtc(cpu_ipi_irq, &irq_ipi, (0x100 << MIPS_CPU_IPI_IRQ)); setup_irq_smtc(cpu_ipi_irq, &irq_ipi, (0x100 << MIPS_CPU_IPI_IRQ));
irq_desc[cpu_ipi_irq].status |= IRQ_PER_CPU; irq_desc[cpu_ipi_irq].status |= IRQ_PER_CPU;
set_irq_handler(cpu_ipi_irq, handle_percpu_irq);
} }
/* /*

View file

@ -133,5 +133,5 @@ void __init arch_init_irq(void)
} }
for (i = 0; i <= LASATINT_END; i++) for (i = 0; i <= LASATINT_END; i++)
set_irq_chip(i, &lasat_irq_type); set_irq_chip_and_handler(i, &lasat_irq_type, handle_level_irq);
} }

View file

@ -74,6 +74,7 @@ static struct irq_chip atlas_irq_type = {
.mask = disable_atlas_irq, .mask = disable_atlas_irq,
.mask_ack = disable_atlas_irq, .mask_ack = disable_atlas_irq,
.unmask = enable_atlas_irq, .unmask = enable_atlas_irq,
.eoi = enable_atlas_irq,
.end = end_atlas_irq, .end = end_atlas_irq,
}; };
@ -207,7 +208,7 @@ static inline void init_atlas_irqs (int base)
atlas_hw0_icregs->intrsten = 0xffffffff; atlas_hw0_icregs->intrsten = 0xffffffff;
for (i = ATLAS_INT_BASE; i <= ATLAS_INT_END; i++) for (i = ATLAS_INT_BASE; i <= ATLAS_INT_END; i++)
set_irq_chip(i, &atlas_irq_type); set_irq_chip_and_handler(i, &atlas_irq_type, handle_level_irq);
} }
static struct irqaction atlasirq = { static struct irqaction atlasirq = {

View file

@ -288,6 +288,7 @@ void __init plat_timer_setup(struct irqaction *irq)
The effect is that the int remains disabled on the second cpu. The effect is that the int remains disabled on the second cpu.
Mark the interrupt with IRQ_PER_CPU to avoid any confusion */ Mark the interrupt with IRQ_PER_CPU to avoid any confusion */
irq_desc[mips_cpu_timer_irq].status |= IRQ_PER_CPU; irq_desc[mips_cpu_timer_irq].status |= IRQ_PER_CPU;
set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq);
#endif #endif
/* to generate the first timer interrupt */ /* to generate the first timer interrupt */

View file

@ -203,7 +203,8 @@ void __init plat_timer_setup(struct irqaction *irq)
on seperate cpu's the first one tries to handle the second interrupt. on seperate cpu's the first one tries to handle the second interrupt.
The effect is that the int remains disabled on the second cpu. The effect is that the int remains disabled on the second cpu.
Mark the interrupt with IRQ_PER_CPU to avoid any confusion */ Mark the interrupt with IRQ_PER_CPU to avoid any confusion */
irq_desc[mips_cpu_timer_irq].status |= IRQ_PER_CPU; irq_desc[mips_cpu_timer_irq].flags |= IRQ_PER_CPU;
set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq);
#endif #endif
/* to generate the first timer interrupt */ /* to generate the first timer interrupt */

View file

@ -106,5 +106,5 @@ void cpci_irq_init(void)
int i; int i;
for (i = CPCI_IRQ_BASE; i < (CPCI_IRQ_BASE + 8); i++) for (i = CPCI_IRQ_BASE; i < (CPCI_IRQ_BASE + 8); i++)
set_irq_chip(i, &cpci_irq_type); set_irq_chip_and_handler(i, &cpci_irq_type, handle_level_irq);
} }

View file

@ -96,6 +96,6 @@ struct irq_chip uart_irq_type = {
void uart_irq_init(void) void uart_irq_init(void)
{ {
set_irq_chip(80, &uart_irq_type); set_irq_chip_and_handler(80, &uart_irq_type, handle_level_irq);
set_irq_chip(81, &uart_irq_type); set_irq_chip_and_handler(81, &uart_irq_type, handle_level_irq);
} }

View file

@ -192,7 +192,7 @@ void __init arch_init_irq(void)
int configPR; int configPR;
for (i = 0; i < PNX8550_INT_CP0_TOTINT; i++) { for (i = 0; i < PNX8550_INT_CP0_TOTINT; i++) {
set_irq_chip(i, &level_irq_type); set_irq_chip_and_handler(i, &level_irq_type, handle_level_irq);
mask_irq(i); /* mask the irq just in case */ mask_irq(i); /* mask the irq just in case */
} }
@ -229,7 +229,7 @@ void __init arch_init_irq(void)
/* mask/priority is still 0 so we will not get any /* mask/priority is still 0 so we will not get any
* interrupts until it is unmasked */ * interrupts until it is unmasked */
set_irq_chip(i, &level_irq_type); set_irq_chip_and_handler(i, &level_irq_type, handle_level_irq);
} }
/* Priority level 0 */ /* Priority level 0 */
@ -238,19 +238,21 @@ void __init arch_init_irq(void)
/* Set int vector table address */ /* Set int vector table address */
PNX8550_GIC_VECTOR_0 = PNX8550_GIC_VECTOR_1 = 0; PNX8550_GIC_VECTOR_0 = PNX8550_GIC_VECTOR_1 = 0;
set_irq_chip(MIPS_CPU_GIC_IRQ, &level_irq_type); set_irq_chip_and_handler(MIPS_CPU_GIC_IRQ, &level_irq_type,
handle_level_irq);
setup_irq(MIPS_CPU_GIC_IRQ, &gic_action); setup_irq(MIPS_CPU_GIC_IRQ, &gic_action);
/* init of Timer interrupts */ /* init of Timer interrupts */
for (i = PNX8550_INT_TIMER_MIN; i <= PNX8550_INT_TIMER_MAX; i++) for (i = PNX8550_INT_TIMER_MIN; i <= PNX8550_INT_TIMER_MAX; i++)
set_irq_chip(i, &level_irq_type); set_irq_chip_and_handler(i, &level_irq_type, handle_level_irq);
/* Stop Timer 1-3 */ /* Stop Timer 1-3 */
configPR = read_c0_config7(); configPR = read_c0_config7();
configPR |= 0x00000038; configPR |= 0x00000038;
write_c0_config7(configPR); write_c0_config7(configPR);
set_irq_chip(MIPS_CPU_TIMER_IRQ, &level_irq_type); set_irq_chip_and_handler(MIPS_CPU_TIMER_IRQ, &level_irq_type,
handle_level_irq);
setup_irq(MIPS_CPU_TIMER_IRQ, &timer_action); setup_irq(MIPS_CPU_TIMER_IRQ, &timer_action);
} }

View file

@ -358,7 +358,7 @@ void __init arch_init_irq(void)
else else
handler = &ip22_local3_irq_type; handler = &ip22_local3_irq_type;
set_irq_chip(i, handler); set_irq_chip_and_handler(i, handler, handle_level_irq);
} }
/* vector handler. this register the IRQ as non-sharable */ /* vector handler. this register the IRQ as non-sharable */

View file

@ -352,7 +352,7 @@ static struct irq_chip bridge_irq_type = {
void __devinit register_bridge_irq(unsigned int irq) void __devinit register_bridge_irq(unsigned int irq)
{ {
set_irq_chip(irq, &bridge_irq_type); set_irq_chip_and_handler(irq, &bridge_irq_type, handle_level_irq);
} }
int __devinit request_bridge_irq(struct bridge_controller *bc) int __devinit request_bridge_irq(struct bridge_controller *bc)

View file

@ -190,6 +190,7 @@ static struct irq_chip rt_irq_type = {
.mask = disable_rt_irq, .mask = disable_rt_irq,
.mask_ack = disable_rt_irq, .mask_ack = disable_rt_irq,
.unmask = enable_rt_irq, .unmask = enable_rt_irq,
.eoi = enable_rt_irq,
.end = end_rt_irq, .end = end_rt_irq,
}; };
@ -207,7 +208,7 @@ void __init plat_timer_setup(struct irqaction *irq)
if (irqno < 0) if (irqno < 0)
panic("Can't allocate interrupt number for timer interrupt"); panic("Can't allocate interrupt number for timer interrupt");
set_irq_chip(irqno, &rt_irq_type); set_irq_chip_and_handler(irqno, &rt_irq_type, handle_percpu_irq);
/* over-write the handler, we use our own way */ /* over-write the handler, we use our own way */
irq->handler = no_action; irq->handler = no_action;

View file

@ -196,7 +196,8 @@ static void __init tx4927_irq_cp0_init(void)
TX4927_IRQ_CP0_BEG, TX4927_IRQ_CP0_END); TX4927_IRQ_CP0_BEG, TX4927_IRQ_CP0_END);
for (i = TX4927_IRQ_CP0_BEG; i <= TX4927_IRQ_CP0_END; i++) for (i = TX4927_IRQ_CP0_BEG; i <= TX4927_IRQ_CP0_END; i++)
set_irq_chip(i, &tx4927_irq_cp0_type); set_irq_chip_and_handler(i, &tx4927_irq_cp0_type,
handle_level_irq);
} }
static void tx4927_irq_cp0_enable(unsigned int irq) static void tx4927_irq_cp0_enable(unsigned int irq)
@ -350,7 +351,8 @@ static void __init tx4927_irq_pic_init(void)
TX4927_IRQ_PIC_BEG, TX4927_IRQ_PIC_END); TX4927_IRQ_PIC_BEG, TX4927_IRQ_PIC_END);
for (i = TX4927_IRQ_PIC_BEG; i <= TX4927_IRQ_PIC_END; i++) for (i = TX4927_IRQ_PIC_BEG; i <= TX4927_IRQ_PIC_END; i++)
set_irq_chip(i, &tx4927_irq_pic_type); set_irq_chip_and_handler(i, &tx4927_irq_pic_type,
handle_level_irq);
setup_irq(TX4927_IRQ_NEST_PIC_ON_CP0, &tx4927_irq_pic_action); setup_irq(TX4927_IRQ_NEST_PIC_ON_CP0, &tx4927_irq_pic_action);

View file

@ -342,7 +342,8 @@ static void __init toshiba_rbtx4927_irq_ioc_init(void)
for (i = TOSHIBA_RBTX4927_IRQ_IOC_BEG; for (i = TOSHIBA_RBTX4927_IRQ_IOC_BEG;
i <= TOSHIBA_RBTX4927_IRQ_IOC_END; i++) i <= TOSHIBA_RBTX4927_IRQ_IOC_END; i++)
set_irq_chip(i, &toshiba_rbtx4927_irq_ioc_type); set_irq_chip_and_handler(i, &toshiba_rbtx4927_irq_ioc_type,
handle_level_irq);
setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_IOC_ON_PIC, setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_IOC_ON_PIC,
&toshiba_rbtx4927_irq_ioc_action); &toshiba_rbtx4927_irq_ioc_action);

View file

@ -88,7 +88,8 @@ tx4938_irq_cp0_init(void)
int i; int i;
for (i = TX4938_IRQ_CP0_BEG; i <= TX4938_IRQ_CP0_END; i++) for (i = TX4938_IRQ_CP0_BEG; i <= TX4938_IRQ_CP0_END; i++)
set_irq_chip(i, &tx4938_irq_cp0_type); set_irq_chip_and_handler(i, &tx4938_irq_cp0_type,
handle_level_irq);
} }
static void static void
@ -245,7 +246,8 @@ tx4938_irq_pic_init(void)
int i; int i;
for (i = TX4938_IRQ_PIC_BEG; i <= TX4938_IRQ_PIC_END; i++) for (i = TX4938_IRQ_PIC_BEG; i <= TX4938_IRQ_PIC_END; i++)
set_irq_chip(i, &tx4938_irq_pic_type); set_irq_chip_and_handler(i, &tx4938_irq_pic_type,
handle_level_irq);
setup_irq(TX4938_IRQ_NEST_PIC_ON_CP0, &tx4938_irq_pic_action); setup_irq(TX4938_IRQ_NEST_PIC_ON_CP0, &tx4938_irq_pic_action);

View file

@ -136,7 +136,8 @@ toshiba_rbtx4938_irq_ioc_init(void)
for (i = TOSHIBA_RBTX4938_IRQ_IOC_BEG; for (i = TOSHIBA_RBTX4938_IRQ_IOC_BEG;
i <= TOSHIBA_RBTX4938_IRQ_IOC_END; i++) i <= TOSHIBA_RBTX4938_IRQ_IOC_END; i++)
set_irq_chip(i, &toshiba_rbtx4938_irq_ioc_type); set_irq_chip_and_handler(i, &toshiba_rbtx4938_irq_ioc_type,
handle_level_irq);
setup_irq(RBTX4938_IRQ_IOCINT, setup_irq(RBTX4938_IRQ_IOCINT,
&toshiba_rbtx4938_irq_ioc_action); &toshiba_rbtx4938_irq_ioc_action);

View file

@ -701,10 +701,12 @@ static int __init vr41xx_icu_init(void)
icu2_write(MGIUINTHREG, 0xffff); icu2_write(MGIUINTHREG, 0xffff);
for (i = SYSINT1_IRQ_BASE; i <= SYSINT1_IRQ_LAST; i++) for (i = SYSINT1_IRQ_BASE; i <= SYSINT1_IRQ_LAST; i++)
set_irq_chip(i, &sysint1_irq_type); set_irq_chip_and_handler(i, &sysint1_irq_type,
handle_level_irq);
for (i = SYSINT2_IRQ_BASE; i <= SYSINT2_IRQ_LAST; i++) for (i = SYSINT2_IRQ_BASE; i <= SYSINT2_IRQ_LAST; i++)
set_irq_chip(i, &sysint2_irq_type); set_irq_chip_and_handler(i, &sysint2_irq_type,
handle_level_irq);
cascade_irq(INT0_IRQ, icu_get_irq); cascade_irq(INT0_IRQ, icu_get_irq);
cascade_irq(INT1_IRQ, icu_get_irq); cascade_irq(INT1_IRQ, icu_get_irq);

View file

@ -57,7 +57,7 @@ do { \
do { \ do { \
irq_enter(); \ irq_enter(); \
__DO_IRQ_SMTC_HOOK(); \ __DO_IRQ_SMTC_HOOK(); \
__do_IRQ((irq)); \ generic_handle_irq(irq); \
irq_exit(); \ irq_exit(); \
} while (0) } while (0)