Loading arch/sh/Kconfig +1 −2 Original line number Diff line number Diff line Loading @@ -730,8 +730,7 @@ config GUSA_RB config SPARSE_IRQ def_bool y depends on SUPERH32 && !SH_DREAMCAST && !SH_HIGHLANDER && \ !SH_RTS7751R2D depends on SUPERH32 && !SH_HIGHLANDER && !SH_RTS7751R2D help This enables support for sparse irqs. This is useful in general as most CPUs have a fairly sparse array of IRQ vectors, which Loading arch/sh/boards/mach-dreamcast/irq.c +27 −0 Original line number Diff line number Diff line Loading @@ -135,3 +135,30 @@ int systemasic_irq_demux(int irq) /* Not reached */ return irq; } void systemasic_irq_init(void) { int i, nid = cpu_to_node(boot_cpu_data); /* Assign all virtual IRQs to the System ASIC int. handler */ for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) { unsigned int irq; irq = create_irq_nr(i, nid); if (unlikely(irq == 0)) { pr_err("%s: failed hooking irq %d for systemasic\n", __func__, i); return; } if (unlikely(irq != i)) { pr_err("%s: got irq %d but wanted %d, bailing.\n", __func__, irq, i); destroy_irq(irq); return; } set_irq_chip_and_handler(i, &systemasic_int, handle_level_irq); } } arch/sh/boards/mach-dreamcast/setup.c +1 −17 Original line number Diff line number Diff line Loading @@ -28,25 +28,8 @@ #include <asm/machvec.h> #include <mach/sysasic.h> extern struct irq_chip systemasic_int; extern void aica_time_init(void); extern int systemasic_irq_demux(int); static void __init dreamcast_setup(char **cmdline_p) { int i; /* Mask all hardware events */ /* XXX */ /* Acknowledge any previous events */ /* XXX */ /* Assign all virtual IRQs to the System ASIC int. handler */ for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) set_irq_chip_and_handler(i, &systemasic_int, handle_level_irq); board_time_init = aica_time_init; } Loading @@ -54,4 +37,5 @@ static struct sh_machine_vector mv_dreamcast __initmv = { .mv_name = "Sega Dreamcast", .mv_setup = dreamcast_setup, .mv_irq_demux = systemasic_irq_demux, .mv_init_irq = systemasic_irq_init, }; arch/sh/include/mach-dreamcast/mach/sysasic.h +5 −0 Original line number Diff line number Diff line Loading @@ -39,5 +39,10 @@ #define HW_EVENT_IRQ_MAX (HW_EVENT_IRQ_BASE + 95) /* arch/sh/boards/mach-dreamcast/irq.c */ extern int systemasic_irq_demux(int); extern void systemasic_irq_init(void); extern void aica_time_init(void); #endif /* __ASM_SH_DREAMCAST_SYSASIC_H */ Loading
arch/sh/Kconfig +1 −2 Original line number Diff line number Diff line Loading @@ -730,8 +730,7 @@ config GUSA_RB config SPARSE_IRQ def_bool y depends on SUPERH32 && !SH_DREAMCAST && !SH_HIGHLANDER && \ !SH_RTS7751R2D depends on SUPERH32 && !SH_HIGHLANDER && !SH_RTS7751R2D help This enables support for sparse irqs. This is useful in general as most CPUs have a fairly sparse array of IRQ vectors, which Loading
arch/sh/boards/mach-dreamcast/irq.c +27 −0 Original line number Diff line number Diff line Loading @@ -135,3 +135,30 @@ int systemasic_irq_demux(int irq) /* Not reached */ return irq; } void systemasic_irq_init(void) { int i, nid = cpu_to_node(boot_cpu_data); /* Assign all virtual IRQs to the System ASIC int. handler */ for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) { unsigned int irq; irq = create_irq_nr(i, nid); if (unlikely(irq == 0)) { pr_err("%s: failed hooking irq %d for systemasic\n", __func__, i); return; } if (unlikely(irq != i)) { pr_err("%s: got irq %d but wanted %d, bailing.\n", __func__, irq, i); destroy_irq(irq); return; } set_irq_chip_and_handler(i, &systemasic_int, handle_level_irq); } }
arch/sh/boards/mach-dreamcast/setup.c +1 −17 Original line number Diff line number Diff line Loading @@ -28,25 +28,8 @@ #include <asm/machvec.h> #include <mach/sysasic.h> extern struct irq_chip systemasic_int; extern void aica_time_init(void); extern int systemasic_irq_demux(int); static void __init dreamcast_setup(char **cmdline_p) { int i; /* Mask all hardware events */ /* XXX */ /* Acknowledge any previous events */ /* XXX */ /* Assign all virtual IRQs to the System ASIC int. handler */ for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) set_irq_chip_and_handler(i, &systemasic_int, handle_level_irq); board_time_init = aica_time_init; } Loading @@ -54,4 +37,5 @@ static struct sh_machine_vector mv_dreamcast __initmv = { .mv_name = "Sega Dreamcast", .mv_setup = dreamcast_setup, .mv_irq_demux = systemasic_irq_demux, .mv_init_irq = systemasic_irq_init, };
arch/sh/include/mach-dreamcast/mach/sysasic.h +5 −0 Original line number Diff line number Diff line Loading @@ -39,5 +39,10 @@ #define HW_EVENT_IRQ_MAX (HW_EVENT_IRQ_BASE + 95) /* arch/sh/boards/mach-dreamcast/irq.c */ extern int systemasic_irq_demux(int); extern void systemasic_irq_init(void); extern void aica_time_init(void); #endif /* __ASM_SH_DREAMCAST_SYSASIC_H */