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 56a8005..da7f534 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 0cdee6e..823aea0 100644
--- a/arch/arm/mach-omap2/smartreflex.h
+++ b/arch/arm/mach-omap2/smartreflex.h
@@ -77,6 +77,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

Reply via email to