sh: intc - add support for sh7619
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / sh / kernel / cpu / sh2 / setup-sh7619.c
index a979b981e6a38cc85fe93c673432ef23fa264560..ec6adc3f306f081b0b86170d5764520344578a48 100644 (file)
 #include <linux/serial.h>
 #include <asm/sci.h>
 
+enum {
+       UNUSED = 0,
+
+       /* interrupt sources */
+       IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
+       WDT, EDMAC, CMT0, CMT1,
+       SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI,
+       SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI,
+       SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI,
+       HIF_HIFI, HIF_HIFBI,
+       DMAC0, DMAC1, DMAC2, DMAC3,
+       SIOF,
+
+       /* interrupt groups */
+       SCIF0, SCIF1, SCIF2,
+};
+
+static struct intc_vect vectors[] __initdata = {
+       INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),
+       INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),
+       INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81),
+       INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83),
+       INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85),
+       INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87),
+       INTC_IRQ(SCIF0_ERI, 88), INTC_IRQ(SCIF0_RXI, 89),
+       INTC_IRQ(SCIF0_BRI, 90), INTC_IRQ(SCIF0_TXI, 91),
+       INTC_IRQ(SCIF1_ERI, 92), INTC_IRQ(SCIF1_RXI, 93),
+       INTC_IRQ(SCIF1_BRI, 94), INTC_IRQ(SCIF1_TXI, 95),
+       INTC_IRQ(SCIF2_ERI, 96), INTC_IRQ(SCIF2_RXI, 97),
+       INTC_IRQ(SCIF2_BRI, 98), INTC_IRQ(SCIF2_TXI, 99),
+       INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101),
+       INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105),
+       INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107),
+       INTC_IRQ(SIOF, 108),
+};
+
+static struct intc_group groups[] __initdata = {
+       INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
+       INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI),
+       INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI),
+};
+
+static struct intc_prio_reg prio_registers[] __initdata = {
+       { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
+       { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } },
+       { 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } },
+       { 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } },
+       { 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } },
+       { 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } },
+       { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } },
+};
+
+static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, groups,
+                        NULL, NULL, prio_registers, NULL);
+
 static struct plat_sci_port sci_platform_data[] = {
        {
                .mapbase        = 0xf8400000,
@@ -52,43 +107,7 @@ static int __init sh7619_devices_setup(void)
 }
 __initcall(sh7619_devices_setup);
 
-static struct ipr_data ipr_irq_table[] = {
-       { 86, 0,  4, 2 },       /* CMI0 */
-       { 88, 1, 12, 3 },       /* SCIF0_ERI */
-       { 89, 1, 12, 3 },       /* SCIF0_RXI */
-       { 90, 1, 12, 3 },       /* SCIF0_BRI */
-       { 91, 1, 12, 3 },       /* SCIF0_TXI */
-       { 92, 1,  8, 3 },       /* SCIF1_ERI */
-       { 93, 1,  8, 3 },       /* SCIF1_RXI */
-       { 94, 1,  8, 3 },       /* SCIF1_BRI */
-       { 95, 1,  8, 3 },       /* SCIF1_TXI */
-       { 96, 1,  4, 3 },       /* SCIF2_ERI */
-       { 97, 1,  4, 3 },       /* SCIF2_RXI */
-       { 98, 1,  4, 3 },       /* SCIF2_BRI */
-       { 99, 1,  4, 3 },       /* SCIF2_TXI */
-};
-
-static unsigned long ipr_offsets[] = {
-       0xf8080000,     /* IPRC */
-       0xf8080002,     /* IPRD */
-       0xf8080004,     /* IPRE */
-       0xf8080006,     /* IPRF */
-       0xf8080008,     /* IPRG */
-};
-
-static struct ipr_desc ipr_irq_desc = {
-       .ipr_offsets    = ipr_offsets,
-       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
-
-       .ipr_data       = ipr_irq_table,
-       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
-
-       .chip = {
-               .name   = "IPR-sh7619",
-       },
-};
-
 void __init plat_irq_setup(void)
 {
-       register_ipr_controller(&ipr_irq_desc);
+       register_intc_controller(&intc_desc);
 }