|
@@ -406,3 +406,61 @@ static void pint_demux(void __iomem *rr, void __iomem *er, int base_irq)
|
|
|
generic_handle_irq(base_irq + k);
|
|
|
iowrite32(~(1 << (31 - k)), rr);
|
|
|
}
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static irqreturn_t sh73a0_pint0_demux(int irq, void *dev_id)
|
|
|
+{
|
|
|
+ pint_demux(PINTRR0, PINTER0_VIRT, SH73A0_PINT0_IRQ(0));
|
|
|
+ return IRQ_HANDLED;
|
|
|
+}
|
|
|
+
|
|
|
+static irqreturn_t sh73a0_pint1_demux(int irq, void *dev_id)
|
|
|
+{
|
|
|
+ pint_demux(PINTRR1, PINTER1_VIRT, SH73A0_PINT1_IRQ(0));
|
|
|
+ return IRQ_HANDLED;
|
|
|
+}
|
|
|
+
|
|
|
+void __init sh73a0_init_irq(void)
|
|
|
+{
|
|
|
+ void __iomem *gic_dist_base = IOMEM(0xf0001000);
|
|
|
+ void __iomem *gic_cpu_base = IOMEM(0xf0000100);
|
|
|
+ void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
|
|
|
+ int k, n;
|
|
|
+
|
|
|
+ gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
|
|
+ gic_arch_extn.irq_set_wake = sh73a0_set_wake;
|
|
|
+
|
|
|
+ register_intc_controller(&intcs_desc);
|
|
|
+ register_intc_controller(&intca_irq_pins_desc);
|
|
|
+ register_intc_controller(&intc_pint0_desc);
|
|
|
+ register_intc_controller(&intc_pint1_desc);
|
|
|
+
|
|
|
+ /* demux using INTEVTSA */
|
|
|
+ sh73a0_intcs_cascade.name = "INTCS cascade";
|
|
|
+ sh73a0_intcs_cascade.handler = sh73a0_intcs_demux;
|
|
|
+ sh73a0_intcs_cascade.dev_id = intevtsa;
|
|
|
+ setup_irq(gic_spi(50), &sh73a0_intcs_cascade);
|
|
|
+
|
|
|
+ /* IRQ pins require special handling through INTCA and GIC */
|
|
|
+ for (k = 0; k < 32; k++) {
|
|
|
+ sh73a0_irq_pin_cascade[k].name = "INTCA-GIC cascade";
|
|
|
+ sh73a0_irq_pin_cascade[k].handler = sh73a0_irq_pin_demux;
|
|
|
+ setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]);
|
|
|
+
|
|
|
+ n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k)));
|
|
|
+ WARN_ON(irq_alloc_desc_at(n, numa_node_id()) != n);
|
|
|
+ irq_set_chip_and_handler_name(n, &intca_gic_irq_chip,
|
|
|
+ handle_level_irq, "level");
|
|
|
+ set_irq_flags(n, IRQF_VALID); /* yuck */
|
|
|
+ }
|
|
|
+
|
|
|
+ /* PINT pins are sanely tied to the GIC as SPI */
|
|
|
+ sh73a0_pint0_cascade.name = "PINT0 cascade";
|
|
|
+ sh73a0_pint0_cascade.handler = sh73a0_pint0_demux;
|
|
|
+ setup_irq(gic_spi(33), &sh73a0_pint0_cascade);
|
|
|
+
|
|
|
+ sh73a0_pint1_cascade.name = "PINT1 cascade";
|
|
|
+ sh73a0_pint1_cascade.handler = sh73a0_pint1_demux;
|
|
|
+ setup_irq(gic_spi(34), &sh73a0_pint1_cascade);
|
|
|
+}
|