|
@@ -235,3 +235,102 @@ void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask)
|
|
|
OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET);
|
|
|
|
|
|
omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST,
|
|
|
+ OMAP4_PRM_IRQENABLE_MPU_OFFSET);
|
|
|
+ omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST,
|
|
|
+ OMAP4_PRM_IRQENABLE_MPU_2_OFFSET);
|
|
|
+
|
|
|
+ /* OCP barrier */
|
|
|
+ omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
|
|
|
+ OMAP4_REVISION_PRM_OFFSET);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap44xx_prm_restore_irqen - set PRM_IRQENABLE_MPU* registers from args
|
|
|
+ * @saved_mask: ptr to a u32 array of IRQENABLE bits saved previously
|
|
|
+ *
|
|
|
+ * Restore the PRM_IRQENABLE_MPU and PRM_IRQENABLE_MPU_2 registers from
|
|
|
+ * @saved_mask. Intended to be used in the PRM interrupt handler resume
|
|
|
+ * callback to restore values saved by omap44xx_prm_save_and_clear_irqen().
|
|
|
+ * No OCP barrier should be needed here; any pending PRM interrupts will fire
|
|
|
+ * once the writes reach the PRM. No return value.
|
|
|
+ */
|
|
|
+void omap44xx_prm_restore_irqen(u32 *saved_mask)
|
|
|
+{
|
|
|
+ omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_OCP_SOCKET_INST,
|
|
|
+ OMAP4_PRM_IRQENABLE_MPU_OFFSET);
|
|
|
+ omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_OCP_SOCKET_INST,
|
|
|
+ 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);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap44xx_prm_read_reset_sources - return the last SoC reset source
|
|
|
+ *
|
|
|
+ * Return a u32 representing the last reset sources of the SoC. The
|
|
|
+ * returned reset source bits are standardized across OMAP SoCs.
|
|
|
+ */
|
|
|
+static u32 omap44xx_prm_read_reset_sources(void)
|
|
|
+{
|
|
|
+ struct prm_reset_src_map *p;
|
|
|
+ u32 r = 0;
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
|