sh: mach-dreamcast: Convert to sparseirq.
authorPaul Mundt <lethal@linux-sh.org>
Tue, 2 Feb 2010 09:01:55 +0000 (18:01 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Tue, 2 Feb 2010 09:01:55 +0000 (18:01 +0900)
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/Kconfig
arch/sh/boards/mach-dreamcast/irq.c
arch/sh/boards/mach-dreamcast/setup.c
arch/sh/include/mach-dreamcast/mach/sysasic.h

index 9e565d9..3b3c036 100644 (file)
@@ -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
index f55fc8e..d932667 100644 (file)
@@ -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);
+       }
+}
index a4b7402..ad1a4db 100644 (file)
 #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;
 }
 
@@ -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,
 };
index f334266..58f710e 100644 (file)
 
 #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 */