linux-omap  

[PATCHv2 14/17] OMAP3: PM: Correcting accessing of ERRCONFIG register in smartreflex.c

Thara Gopinath
Thu, 18 Mar 2010 02:16:28 -0700

Smartreflex error config register is special as it contains
certain status bits which if written a 1 into means a clear
of those bits. This patch takes special care during modify of
this register that no status bits in this register are accidently
set to 1.

This issue was first reported by Nishanth Menon.

Signed-off-by: Thara Gopinath <th...@ti.com>
---
 arch/arm/mach-omap2/smartreflex.c |   11 +++++++++++
 arch/arm/mach-omap2/smartreflex.h |    6 ++++++
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index aeb9761..7858113 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -71,6 +71,17 @@ static inline void sr_modify_reg(struct omap_sr *sr, 
unsigned offset, u32 mask,
 
        reg_val = omap_hwmod_readl(odev->hwmods[0], offset);
        reg_val &= ~mask;
+       /*
+        * Smartreflex error config register is special as it contains
+        * certain status bits which if written a 1 into means a clear
+        * of those bits. So in order to make sure no accidental write of
+        * 1 happens to those status bits, do a clear of them in the read
+        * value. Now if there is an actual reguest to write to these bits
+        * they will be set in the nex step.
+        */
+       if (offset == ERRCONFIG)
+               reg_val &= ~ERRCONFIG_STATUS_MASK;
+
        reg_val |= value;
 
        omap_hwmod_writel(reg_val, odev->hwmods[0], offset);
diff --git a/arch/arm/mach-omap2/smartreflex.h 
b/arch/arm/mach-omap2/smartreflex.h
index 52309e0..58681b6 100644
--- a/arch/arm/mach-omap2/smartreflex.h
+++ b/arch/arm/mach-omap2/smartreflex.h
@@ -84,6 +84,12 @@ extern struct dentry *pm_dbg_main_dir;
 #define        ERRCONFIG_MCUDISACKINTEN        BIT(23)
 #define ERRCONFIG_MCUDISACKINTST       BIT(22)
 
+#define ERRCONFIG_STATUS_MASK          (ERRCONFIG_VPBOUNDINTST | \
+                                       ERRCONFIG_MCUACCUMINTST | \
+                                       ERRCONFIG_MCUVALIDINTST | \
+                                       ERRCONFIG_MCUBOUNDINTST | \
+                                       ERRCONFIG_MCUDISACKINTST)
+
 /* Common Bit values */
 
 #define SRCLKLENGTH_12MHZ_SYSCLK       0x3C
-- 
1.7.0.rc1.33.g07cf0f

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html