|
@@ -327,3 +327,46 @@ void omap_intc_restore_context(void)
|
|
|
bank, INTC_SYSCONFIG);
|
|
|
intc_bank_write_reg(intc_context[ind].sysconfig,
|
|
|
bank, INTC_SYSCONFIG);
|
|
|
+ intc_bank_write_reg(intc_context[ind].protection,
|
|
|
+ bank, INTC_PROTECTION);
|
|
|
+ intc_bank_write_reg(intc_context[ind].idle,
|
|
|
+ bank, INTC_IDLE);
|
|
|
+ intc_bank_write_reg(intc_context[ind].threshold,
|
|
|
+ bank, INTC_THRESHOLD);
|
|
|
+ for (i = 0; i < INTCPS_NR_IRQS; i++)
|
|
|
+ intc_bank_write_reg(intc_context[ind].ilr[i],
|
|
|
+ bank, (0x100 + 0x4*i));
|
|
|
+ for (i = 0; i < INTCPS_NR_MIR_REGS; i++)
|
|
|
+ intc_bank_write_reg(intc_context[ind].mir[i],
|
|
|
+ &irq_banks[0], INTC_MIR0 + (0x20 * i));
|
|
|
+ }
|
|
|
+ /* MIRs are saved and restore with other PRCM registers */
|
|
|
+}
|
|
|
+
|
|
|
+void omap3_intc_suspend(void)
|
|
|
+{
|
|
|
+ /* A pending interrupt would prevent OMAP from entering suspend */
|
|
|
+ omap_ack_irq(NULL);
|
|
|
+}
|
|
|
+
|
|
|
+void omap3_intc_prepare_idle(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Disable autoidle as it can stall interrupt controller,
|
|
|
+ * cf. errata ID i540 for 3430 (all revisions up to 3.1.x)
|
|
|
+ */
|
|
|
+ intc_bank_write_reg(0, &irq_banks[0], INTC_SYSCONFIG);
|
|
|
+}
|
|
|
+
|
|
|
+void omap3_intc_resume_idle(void)
|
|
|
+{
|
|
|
+ /* Re-enable autoidle */
|
|
|
+ intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG);
|
|
|
+}
|
|
|
+
|
|
|
+asmlinkage void __exception_irq_entry omap3_intc_handle_irq(struct pt_regs *regs)
|
|
|
+{
|
|
|
+ void __iomem *base_addr = OMAP3_IRQ_BASE;
|
|
|
+ omap_intc_handle_irq(base_addr, regs);
|
|
|
+}
|
|
|
+#endif /* CONFIG_ARCH_OMAP3 */
|