|
@@ -233,10 +233,71 @@ void omap44xx_prm_restore_irqen(u32 *saved_mask)
|
|
|
OMAP4_PRM_IRQENABLE_MPU_2_OFFSET);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * omap44xx_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain
|
|
|
+ *
|
|
|
+ * Clear any previously-latched I/O wakeup events and ensure that the
|
|
|
+ * I/O wakeup gates are aligned with the current mux settings. Works
|
|
|
+ * by asserting WUCLKIN, waiting for WUCLKOUT to be asserted, and then
|
|
|
+ * deasserting WUCLKIN and waiting for WUCLKOUT to be deasserted.
|
|
|
+ * No return value. XXX Are the final two steps necessary?
|
|
|
+ */
|
|
|
+void omap44xx_prm_reconfigure_io_chain(void)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+ /* Trigger WUCLKIN enable */
|
|
|
+ omap4_prm_rmw_inst_reg_bits(OMAP4430_WUCLK_CTRL_MASK,
|
|
|
+ OMAP4430_WUCLK_CTRL_MASK,
|
|
|
+ OMAP4430_PRM_DEVICE_INST,
|
|
|
+ OMAP4_PRM_IO_PMCTRL_OFFSET);
|
|
|
+ omap_test_timeout(
|
|
|
+ (((omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
|
|
|
+ OMAP4_PRM_IO_PMCTRL_OFFSET) &
|
|
|
+ OMAP4430_WUCLK_STATUS_MASK) >>
|
|
|
+ OMAP4430_WUCLK_STATUS_SHIFT) == 1),
|
|
|
+ MAX_IOPAD_LATCH_TIME, i);
|
|
|
+ if (i == MAX_IOPAD_LATCH_TIME)
|
|
|
+ pr_warn("PRM: I/O chain clock line assertion timed out\n");
|
|
|
+
|
|
|
+ /* Trigger WUCLKIN disable */
|
|
|
+ omap4_prm_rmw_inst_reg_bits(OMAP4430_WUCLK_CTRL_MASK, 0x0,
|
|
|
+ OMAP4430_PRM_DEVICE_INST,
|
|
|
+ OMAP4_PRM_IO_PMCTRL_OFFSET);
|
|
|
+ omap_test_timeout(
|
|
|
+ (((omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
|
|
|
+ OMAP4_PRM_IO_PMCTRL_OFFSET) &
|
|
|
+ OMAP4430_WUCLK_STATUS_MASK) >>
|
|
|
+ OMAP4430_WUCLK_STATUS_SHIFT) == 0),
|
|
|
+ MAX_IOPAD_LATCH_TIME, i);
|
|
|
+ if (i == MAX_IOPAD_LATCH_TIME)
|
|
|
+ pr_warn("PRM: I/O chain clock line deassertion timed out\n");
|
|
|
+
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap44xx_prm_enable_io_wakeup - enable wakeup events from I/O wakeup latches
|
|
|
+ *
|
|
|
+ * Activates the I/O wakeup event latches and allows events logged by
|
|
|
+ * those latches to signal a wakeup event to the PRCM. For I/O wakeups
|
|
|
+ * to occur, WAKEUPENABLE bits must be set in the pad mux registers, and
|
|
|
+ * omap44xx_prm_reconfigure_io_chain() must be called. No return value.
|
|
|
+ */
|
|
|
+static void __init omap44xx_prm_enable_io_wakeup(void)
|
|
|
+{
|
|
|
+ omap4_prm_rmw_inst_reg_bits(OMAP4430_GLOBAL_WUEN_MASK,
|
|
|
+ OMAP4430_GLOBAL_WUEN_MASK,
|
|
|
+ OMAP4430_PRM_DEVICE_INST,
|
|
|
+ OMAP4_PRM_IO_PMCTRL_OFFSET);
|
|
|
+}
|
|
|
+
|
|
|
static int __init omap4xxx_prcm_init(void)
|
|
|
{
|
|
|
- if (cpu_is_omap44xx())
|
|
|
+ if (cpu_is_omap44xx()) {
|
|
|
+ omap44xx_prm_enable_io_wakeup();
|
|
|
return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup);
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
subsys_initcall(omap4xxx_prcm_init);
|