ARM: OMAP4: PRM: Add IO Daisychain support
authorRajendra Nayak <rnayak@ti.com>
Fri, 22 Jun 2012 14:40:03 +0000 (08:40 -0600)
committerPaul Walmsley <paul@pwsan.com>
Fri, 22 Jun 2012 14:40:03 +0000 (08:40 -0600)
IO daisychain is a mechanism that allows individual IO pads to generate
wakeup events on their own based on a switch of an input signal level.
This allows the hardware module behind the pad to be powered down, but
still have device level capability to detect IO events, and once this
happens the module can be powered back up to resume IO. See section
3.9.4 in OMAP4430 Public TRM for details.

Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Vishwanath BS <vishwanath.bs@ti.com>
Signed-off-by: Tero Kristo <t-kristo@ti.com>
[paul@pwsan.com: use the shared MAX_IOPAD_LATCH_TIME declaration; renamed
 omap4_trigger_io_chain() to conform to other PRM function names;
 added kerneldoc; resolved checkpatch warnings]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prm44xx.h

index f106d21ff581a3af4894fd45f58fe53aaebc6dd2..28ffbc55f8d617b2b2d2375ada9946d25ca2bb6d 100644 (file)
@@ -233,6 +233,60 @@ 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;
+       u32 v;
+
+       v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
+                                   OMAP4_PRM_IO_PMCTRL_OFFSET);
+
+       /* Enable GLOBAL_WUEN */
+       if (!(v & OMAP4430_GLOBAL_WUEN_MASK))
+               omap4_prm_rmw_inst_reg_bits(OMAP4430_GLOBAL_WUEN_MASK,
+                                           OMAP4430_GLOBAL_WUEN_MASK,
+                                           OMAP4430_PRM_DEVICE_INST,
+                                           OMAP4_PRM_IO_PMCTRL_OFFSET);
+
+       /* 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;
+}
+
 static int __init omap4xxx_prcm_init(void)
 {
        if (cpu_is_omap44xx())
index 7978092946db5a64ec37e4c66d7f992267ba2914..ee72ae6bd8c961350be2ebb343a027f6d1f4fddf 100644 (file)
@@ -763,6 +763,8 @@ extern u32 omap4_prm_vcvp_read(u8 offset);
 extern void omap4_prm_vcvp_write(u32 val, u8 offset);
 extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset);
 
+extern void omap44xx_prm_reconfigure_io_chain(void);
+
 /* PRM interrupt-related functions */
 extern void omap44xx_prm_read_pending_irqs(unsigned long *events);
 extern void omap44xx_prm_ocp_barrier(void);
This page took 0.028689 seconds and 5 git commands to generate.