ARM: OMAP3: PM: correct enable/disable of daisy io chain
authorMohan V <mohanv@ti.com>
Fri, 22 Jun 2012 14:40:02 +0000 (08:40 -0600)
committerPaul Walmsley <paul@pwsan.com>
Fri, 22 Jun 2012 14:40:02 +0000 (08:40 -0600)
Currently the enabling and disabling of IO Daisy chain is not
according to the TRM. The below steps are followed to enable/
disable the IO chain, based loosely on the "Sec 3.5.7.2.2
I/O Wake-Up Mechanism" section in OMAP3630 Public TRM[1].

Steps to enable IO chain:
[a] Set PM_WKEN_WKUP.EN_IO bit
[b] Set the PM_WKEN_WKUP.EN_IO_CHAIN bit
[c] Poll for PM_WKST_WKUP.ST_IO_CHAIN.
[d] When ST_IO_CHAIN bit set to 1, clear PM_WKEN_WKUP.EN_IO_CHAIN
[e] Clear ST_IO_CHAIN bit.

Steps to disable IO chain:
[a] Clear PM_WKEN_WKUP.EN_IO_CHAIN bit
[b] Clear PM_WKEN_WKUP.EN_IO bit
[c] Clear PM_WKST_WKUP.ST_IO bit by writing 1 to it.

Step [e] & [c] in each case can be skipped, as these are handled
by the PRCM interrupt handler later.

[1] http://focus.ti.com/pdfs/wtbu/OMAP36xx_ES1.x_PUBLIC_TRM_vV.zip

Signed-off-by: Mohan V <mohanv@ti.com>
Signed-off-by: Vishwanath BS <vishwanath.bs@ti.com>
[paul@pwsan.com: modified commit message to clarify that these steps are
 based loosely on the TRM section, rather than documented exactly]
Reviewed-by: Rajendra Nayak <rnayak@ti.com>
[paul@pwsan.com: resolved new warnings from checkpatch]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
arch/arm/mach-omap2/pm34xx.c

index a34023d0ca7c665627d96ba4109a8a0e17b4ec6e..6d7f0d8a310365fffd67ed6f3b32c19d07de5e36 100644 (file)
@@ -81,16 +81,17 @@ static void omap3_enable_io_chain(void)
        /* Do a readback to assure write has been done */
        omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN);
 
-       while (!(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN) &
+       while (!(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKST) &
                 OMAP3430_ST_IO_CHAIN_MASK)) {
                timeout++;
                if (timeout > 1000) {
                        pr_err("Wake up daisy chain activation failed.\n");
                        return;
                }
-               omap2_prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK,
-                                          WKUP_MOD, PM_WKEN);
        }
+       omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD,
+                                    PM_WKEN);
+
 }
 
 static void omap3_disable_io_chain(void)