|
@@ -564,3 +564,114 @@ void __init sh7372_init_irq(void)
|
|
|
register_intc_controller(&intca_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(n, (void *)intevtsa);
|
|
|
+ irq_set_chained_handler(n, intcs_demux);
|
|
|
+
|
|
|
+ /* unmask INTCS in INTAMASK */
|
|
|
+ iowrite16(0, intcs_ffd2 + 0x104);
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned short ffd2[0x200];
|
|
|
+static unsigned short ffd5[0x100];
|
|
|
+
|
|
|
+void sh7372_intcs_suspend(void)
|
|
|
+{
|
|
|
+ int k;
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x30; k += 4)
|
|
|
+ ffd2[k] = __raw_readw(intcs_ffd2 + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0xb0; k += 4)
|
|
|
+ ffd2[k] = __raw_readb(intcs_ffd2 + k);
|
|
|
+
|
|
|
+ for (k = 0x180; k <= 0x188; k += 4)
|
|
|
+ ffd2[k] = __raw_readb(intcs_ffd2 + k);
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x3c; k += 4)
|
|
|
+ ffd5[k] = __raw_readw(intcs_ffd5 + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0x9c; k += 4)
|
|
|
+ ffd5[k] = __raw_readb(intcs_ffd5 + k);
|
|
|
+}
|
|
|
+
|
|
|
+void sh7372_intcs_resume(void)
|
|
|
+{
|
|
|
+ int k;
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x30; k += 4)
|
|
|
+ __raw_writew(ffd2[k], intcs_ffd2 + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0xb0; k += 4)
|
|
|
+ __raw_writeb(ffd2[k], intcs_ffd2 + k);
|
|
|
+
|
|
|
+ for (k = 0x180; k <= 0x188; k += 4)
|
|
|
+ __raw_writeb(ffd2[k], intcs_ffd2 + k);
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x3c; k += 4)
|
|
|
+ __raw_writew(ffd5[k], intcs_ffd5 + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0x9c; k += 4)
|
|
|
+ __raw_writeb(ffd5[k], intcs_ffd5 + k);
|
|
|
+}
|
|
|
+
|
|
|
+#define E694_BASE IOMEM(0xe6940000)
|
|
|
+#define E695_BASE IOMEM(0xe6950000)
|
|
|
+
|
|
|
+static unsigned short e694[0x200];
|
|
|
+static unsigned short e695[0x200];
|
|
|
+
|
|
|
+void sh7372_intca_suspend(void)
|
|
|
+{
|
|
|
+ int k;
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x38; k += 4)
|
|
|
+ e694[k] = __raw_readw(E694_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0xb4; k += 4)
|
|
|
+ e694[k] = __raw_readb(E694_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x180; k <= 0x1b4; k += 4)
|
|
|
+ e694[k] = __raw_readb(E694_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x50; k += 4)
|
|
|
+ e695[k] = __raw_readw(E695_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0xa8; k += 4)
|
|
|
+ e695[k] = __raw_readb(E695_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x180; k <= 0x1a8; k += 4)
|
|
|
+ e695[k] = __raw_readb(E695_BASE + k);
|
|
|
+}
|
|
|
+
|
|
|
+void sh7372_intca_resume(void)
|
|
|
+{
|
|
|
+ int k;
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x38; k += 4)
|
|
|
+ __raw_writew(e694[k], E694_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0xb4; k += 4)
|
|
|
+ __raw_writeb(e694[k], E694_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x180; k <= 0x1b4; k += 4)
|
|
|
+ __raw_writeb(e694[k], E694_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x00; k <= 0x50; k += 4)
|
|
|
+ __raw_writew(e695[k], E695_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x80; k <= 0xa8; k += 4)
|
|
|
+ __raw_writeb(e695[k], E695_BASE + k);
|
|
|
+
|
|
|
+ for (k = 0x180; k <= 0x1a8; k += 4)
|
|
|
+ __raw_writeb(e695[k], E695_BASE + k);
|
|
|
+}
|