Skip to content

Commit 079a460

Browse files
abresticralfbaechle
authored andcommitted
MIPS: i8259: Use IRQ domains
Create a legacy IRQ domain for the 16 i8259 interrupts. Signed-off-by: Andrew Bresticker <abrestic@chromium.org> Reviewed-by: Qais Yousef <qais.yousef@imgtec.com> Tested-by: Qais Yousef <qais.yousef@imgtec.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Andrew Bresticker <abrestic@chromium.org> Cc: Jeffrey Deans <jeffrey.deans@imgtec.com> Cc: Markos Chandras <markos.chandras@imgtec.com> Cc: Paul Burton <paul.burton@imgtec.com> Cc: Qais Yousef <qais.yousef@imgtec.com> Cc: Jonas Gorski <jogo@openwrt.org> Cc: John Crispin <blogic@openwrt.org> Cc: David Daney <ddaney.cavm@gmail.com> Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/7804/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
1 parent f64e55d commit 079a460

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

arch/mips/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,7 @@ config SYS_SUPPORTS_HOTPLUG_CPU
975975

976976
config I8259
977977
bool
978+
select IRQ_DOMAIN
978979

979980
config MIPS_BONITO64
980981
bool

arch/mips/kernel/i8259.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <linux/init.h>
1313
#include <linux/ioport.h>
1414
#include <linux/interrupt.h>
15+
#include <linux/irqdomain.h>
1516
#include <linux/kernel.h>
1617
#include <linux/spinlock.h>
1718
#include <linux/syscore_ops.h>
@@ -308,24 +309,37 @@ static struct resource pic2_io_resource = {
308309
.flags = IORESOURCE_BUSY
309310
};
310311

312+
static int i8259A_irq_domain_map(struct irq_domain *d, unsigned int virq,
313+
irq_hw_number_t hw)
314+
{
315+
irq_set_chip_and_handler(virq, &i8259A_chip, handle_level_irq);
316+
irq_set_probe(virq);
317+
return 0;
318+
}
319+
320+
static struct irq_domain_ops i8259A_ops = {
321+
.map = i8259A_irq_domain_map,
322+
.xlate = irq_domain_xlate_onecell,
323+
};
324+
311325
/*
312326
* On systems with i8259-style interrupt controllers we assume for
313327
* driver compatibility reasons interrupts 0 - 15 to be the i8259
314328
* interrupts even if the hardware uses a different interrupt numbering.
315329
*/
316330
void __init init_i8259_irqs(void)
317331
{
318-
int i;
332+
struct irq_domain *domain;
319333

320334
insert_resource(&ioport_resource, &pic1_io_resource);
321335
insert_resource(&ioport_resource, &pic2_io_resource);
322336

323337
init_8259A(0);
324338

325-
for (i = I8259A_IRQ_BASE; i < I8259A_IRQ_BASE + 16; i++) {
326-
irq_set_chip_and_handler(i, &i8259A_chip, handle_level_irq);
327-
irq_set_probe(i);
328-
}
339+
domain = irq_domain_add_legacy(NULL, 16, I8259A_IRQ_BASE, 0,
340+
&i8259A_ops, NULL);
341+
if (!domain)
342+
panic("Failed to add i8259 IRQ domain");
329343

330344
setup_irq(I8259A_IRQ_BASE + PIC_CASCADE_IR, &irq2);
331345
}

0 commit comments

Comments
 (0)