Merge tag 'md-3.5' of git://neil.brown.name/md
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-shmobile / intc-sh7372.c
index 6447e0af52d412123b222ea94978cc84969c4778..2587a22842f2fbd5b001781dad4e1ecce4a67f23 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/io.h>
 #include <linux/sh_intc.h>
@@ -305,14 +306,16 @@ static DECLARE_INTC_DESC(intca_desc, "sh7372-intca",
                         intca_mask_registers, intca_prio_registers,
                         NULL);
 
-INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000,
-                INTC_VECT, "sh7372-intca-irq-pins");
+INTC_IRQ_PINS_16(intca_irq_pins_lo, 0xe6900000,
+                INTC_VECT, "sh7372-intca-irq-lo");
+
+INTC_IRQ_PINS_16H(intca_irq_pins_hi, 0xe6900000,
+                INTC_VECT, "sh7372-intca-irq-hi");
+
 enum {
        UNUSED_INTCS = 0,
        ENABLED_INTCS,
 
-       INTCS,
-
        /* interrupt sources INTCS */
 
        /* IRQ0S - IRQ31S */
@@ -426,8 +429,6 @@ static struct intc_vect intcs_vectors[] = {
        INTCS_VECT(CPORTS2R, 0x1a20),
        /* CEC */
        INTCS_VECT(JPU6E, 0x1a80),
-
-       INTC_VECT(INTCS, 0xf80),
 };
 
 static struct intc_group intcs_groups[] __initdata = {
@@ -490,9 +491,6 @@ static struct intc_mask_reg intcs_mask_registers[] = {
        { 0xffd5019c, 0xffd501dc, 8, /* IMR7SA3 / IMCR7SA3 */
          { MFIS2_INTCS, CPORTS2R, 0, 0,
            JPU6E, 0, 0, 0 } },
-       { 0xffd20104, 0, 16, /* INTAMASK */
-         { 0, 0, 0, 0, 0, 0, 0, 0,
-           0, 0, 0, 0, 0, 0, 0, INTCS } },
 };
 
 /* Priority is needed for INTCA to receive the INTCS interrupt */
@@ -557,18 +555,30 @@ static void __iomem *intcs_ffd5;
 void __init sh7372_init_irq(void)
 {
        void __iomem *intevtsa;
+       int n;
 
        intcs_ffd2 = ioremap_nocache(0xffd20000, PAGE_SIZE);
        intevtsa = intcs_ffd2 + 0x100;
        intcs_ffd5 = ioremap_nocache(0xffd50000, PAGE_SIZE);
 
        register_intc_controller(&intca_desc);
-       register_intc_controller(&intca_irq_pins_desc);
+       register_intc_controller(&intca_irq_pins_lo_desc);
+       register_intc_controller(&intca_irq_pins_hi_desc);
        register_intc_controller(&intcs_desc);
 
+       /* setup dummy cascade chip for INTCS */
+       n = evt2irq(0xf80);
+       irq_alloc_desc_at(n, numa_node_id());
+       irq_set_chip_and_handler_name(n, &dummy_irq_chip,
+                                     handle_level_irq, "level");
+       set_irq_flags(n, IRQF_VALID); /* yuck */
+
        /* demux using INTEVTSA */
-       irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa);
-       irq_set_chained_handler(evt2irq(0xf80), intcs_demux);
+       irq_set_handler_data(n, (void *)intevtsa);
+       irq_set_chained_handler(n, intcs_demux);
+
+       /* unmask INTCS in INTAMASK */
+       iowrite16(0, intcs_ffd2 + 0x104);
 }
 
 static unsigned short ffd2[0x200];