Skip to content

Commit

Permalink
[MIPS] use generic_handle_irq, handle_level_irq, handle_percpu_irq
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ralf Baechle <[email protected]>
  • Loading branch information
atsushi-nemoto authored and ralfbaechle committed Nov 30, 2006
1 parent 1603b5a commit 1417836
Show file tree
Hide file tree
Showing 28 changed files with 64 additions and 34 deletions.
6 changes: 4 additions & 2 deletions arch/mips/dec/ioasic-irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,11 @@ void __init init_ioasic_irqs(int base)
fast_iob();

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++)
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;
}
2 changes: 1 addition & 1 deletion arch/mips/dec/kn02-irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ void __init init_kn02_irqs(int base)
iob();

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;
}
3 changes: 2 additions & 1 deletion arch/mips/emma2rh/common/irq_emma2rh.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ void emma2rh_irq_init(u32 irq_base)
u32 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;
}
Expand Down
3 changes: 2 additions & 1 deletion arch/mips/emma2rh/markeins/irq_markeins.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ void emma2rh_sw_irq_init(u32 irq_base)
u32 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;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/jazz/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ void __init init_r4030_ints(void)
int 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_read_reg16(JAZZ_IO_IRQ_SOURCE); /* clear pending IRQs */
Expand Down
2 changes: 2 additions & 0 deletions arch/mips/kernel/irq-msc01.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ struct irq_chip msc_levelirq_type = {
.mask = mask_msc_irq,
.mask_ack = level_mask_and_ack_msc_irq,
.unmask = unmask_msc_irq,
.eoi = unmask_msc_irq,
.end = end_msc_irq,
};

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

Expand Down
3 changes: 2 additions & 1 deletion arch/mips/kernel/irq-mv6434x.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,8 @@ void __init mv64340_irq_init(unsigned int base)
int 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;
}
3 changes: 2 additions & 1 deletion arch/mips/kernel/irq-rm7000.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ void __init rm7k_cpu_irq_init(int base)
clear_c0_intcontrol(0x00000f00); /* Mask all */

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;
}
6 changes: 4 additions & 2 deletions arch/mips/kernel/irq-rm9000.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,12 @@ void __init rm9k_cpu_irq_init(int base)
clear_c0_intcontrol(0x0000f000); /* Mask all */

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;
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;
}
5 changes: 4 additions & 1 deletion arch/mips/kernel/irq_cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ static struct irq_chip mips_cpu_irq_controller = {
.mask = mask_mips_irq,
.mask_ack = mask_mips_irq,
.unmask = unmask_mips_irq,
.eoi = unmask_mips_irq,
.end = mips_cpu_irq_end,
};

Expand Down Expand Up @@ -104,6 +105,7 @@ static struct irq_chip mips_mt_cpu_irq_controller = {
.mask = mask_mips_mt_irq,
.mask_ack = mips_mt_cpu_irq_ack,
.unmask = unmask_mips_mt_irq,
.eoi = unmask_mips_mt_irq,
.end = mips_mt_cpu_irq_end,
};

Expand All @@ -124,7 +126,8 @@ void __init mips_cpu_irq_init(int irq_base)
set_irq_chip(i, &mips_mt_cpu_irq_controller);

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;
}
2 changes: 2 additions & 0 deletions arch/mips/kernel/smp-mt.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,9 @@ void __init plat_prepare_cpus(unsigned int max_cpus)

/* need to mark IPI's as 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;
set_irq_handler(cpu_ipi_call_irq, handle_percpu_irq);
}

/*
Expand Down
1 change: 1 addition & 0 deletions arch/mips/kernel/smtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1009,6 +1009,7 @@ void setup_cross_vpe_interrupts(void)
setup_irq_smtc(cpu_ipi_irq, &irq_ipi, (0x100 << MIPS_CPU_IPI_IRQ));

irq_desc[cpu_ipi_irq].status |= IRQ_PER_CPU;
set_irq_handler(cpu_ipi_irq, handle_percpu_irq);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/lasat/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,5 +133,5 @@ void __init arch_init_irq(void)
}

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);
}
3 changes: 2 additions & 1 deletion arch/mips/mips-boards/atlas/atlas_int.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ static struct irq_chip atlas_irq_type = {
.mask = disable_atlas_irq,
.mask_ack = disable_atlas_irq,
.unmask = enable_atlas_irq,
.eoi = enable_atlas_irq,
.end = end_atlas_irq,
};

Expand Down Expand Up @@ -207,7 +208,7 @@ static inline void init_atlas_irqs (int base)
atlas_hw0_icregs->intrsten = 0xffffffff;

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 = {
Expand Down
1 change: 1 addition & 0 deletions arch/mips/mips-boards/generic/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ void __init plat_timer_setup(struct irqaction *irq)
The effect is that the int remains disabled on the second cpu.
Mark the interrupt with IRQ_PER_CPU to avoid any confusion */
irq_desc[mips_cpu_timer_irq].status |= IRQ_PER_CPU;
set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq);
#endif

/* to generate the first timer interrupt */
Expand Down
3 changes: 2 additions & 1 deletion arch/mips/mips-boards/sim/sim_time.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
The effect is that the int remains disabled on the second cpu.
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

/* to generate the first timer interrupt */
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/momentum/ocelot_c/cpci-irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,5 +106,5 @@ void cpci_irq_init(void)
int 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);
}
4 changes: 2 additions & 2 deletions arch/mips/momentum/ocelot_c/uart-irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,6 @@ struct irq_chip uart_irq_type = {

void uart_irq_init(void)
{
set_irq_chip(80, &uart_irq_type);
set_irq_chip(81, &uart_irq_type);
set_irq_chip_and_handler(80, &uart_irq_type, handle_level_irq);
set_irq_chip_and_handler(81, &uart_irq_type, handle_level_irq);
}
12 changes: 7 additions & 5 deletions arch/mips/philips/pnx8550/common/int.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ void __init arch_init_irq(void)
int configPR;

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 */
}

Expand Down Expand Up @@ -229,7 +229,7 @@ void __init arch_init_irq(void)
/* mask/priority is still 0 so we will not get any
* 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 */
Expand All @@ -238,19 +238,21 @@ void __init arch_init_irq(void)
/* Set int vector table address */
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);

/* init of Timer interrupts */
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 */
configPR = read_c0_config7();
configPR |= 0x00000038;
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);
}

Expand Down
2 changes: 1 addition & 1 deletion arch/mips/sgi-ip22/ip22-int.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ void __init arch_init_irq(void)
else
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 */
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/sgi-ip27/ip27-irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ static struct irq_chip bridge_irq_type = {

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)
Expand Down
3 changes: 2 additions & 1 deletion arch/mips/sgi-ip27/ip27-timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ static struct irq_chip rt_irq_type = {
.mask = disable_rt_irq,
.mask_ack = disable_rt_irq,
.unmask = enable_rt_irq,
.eoi = enable_rt_irq,
.end = end_rt_irq,
};

Expand All @@ -207,7 +208,7 @@ void __init plat_timer_setup(struct irqaction *irq)
if (irqno < 0)
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 */
irq->handler = no_action;
Expand Down
6 changes: 4 additions & 2 deletions arch/mips/tx4927/common/tx4927_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,8 @@ static void __init tx4927_irq_cp0_init(void)
TX4927_IRQ_CP0_BEG, TX4927_IRQ_CP0_END);

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)
Expand Down Expand Up @@ -350,7 +351,8 @@ static void __init tx4927_irq_pic_init(void)
TX4927_IRQ_PIC_BEG, TX4927_IRQ_PIC_END);

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);

Expand Down
3 changes: 2 additions & 1 deletion arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,8 @@ static void __init toshiba_rbtx4927_irq_ioc_init(void)

for (i = TOSHIBA_RBTX4927_IRQ_IOC_BEG;
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,
&toshiba_rbtx4927_irq_ioc_action);
Expand Down
6 changes: 4 additions & 2 deletions arch/mips/tx4938/common/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ tx4938_irq_cp0_init(void)
int 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
Expand Down Expand Up @@ -245,7 +246,8 @@ tx4938_irq_pic_init(void)
int 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);

Expand Down
3 changes: 2 additions & 1 deletion arch/mips/tx4938/toshiba_rbtx4938/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,8 @@ toshiba_rbtx4938_irq_ioc_init(void)

for (i = TOSHIBA_RBTX4938_IRQ_IOC_BEG;
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,
&toshiba_rbtx4938_irq_ioc_action);
Expand Down
6 changes: 4 additions & 2 deletions arch/mips/vr41xx/common/icu.c
Original file line number Diff line number Diff line change
Expand Up @@ -701,10 +701,12 @@ static int __init vr41xx_icu_init(void)
icu2_write(MGIUINTHREG, 0xffff);

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++)
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(INT1_IRQ, icu_get_irq);
Expand Down
2 changes: 1 addition & 1 deletion include/asm-mips/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ do { \
do { \
irq_enter(); \
__DO_IRQ_SMTC_HOOK(); \
__do_IRQ((irq)); \
generic_handle_irq(irq); \
irq_exit(); \
} while (0)

Expand Down

0 comments on commit 1417836

Please sign in to comment.