From: Ran Wang <ran.wan...@nxp.com>

When rcpm driver get target register data from DTS property 'fsl,
rcpm-wakeup' (second value), it directly write that data to register
RCPM_IPPDEXPCRx rather than 'OR' the value read from it before. This
operation will over-write those non-related IP control bit which
might have been programmed, should be prevented.

Signed-off-by: Ran Wang <ran.wan...@nxp.com>
Signed-off-by: Yinbo Zhu <yinbo....@nxp.com>
---
 drivers/soc/fsl/rcpm.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/soc/fsl/rcpm.c b/drivers/soc/fsl/rcpm.c
index ff0477b..39eabfb 100644
--- a/drivers/soc/fsl/rcpm.c
+++ b/drivers/soc/fsl/rcpm.c
@@ -75,6 +75,7 @@ static void rcpm_wakeup_fixup(struct device *dev, void *data)
 static int rcpm_suspend_prepare(void)
 {
        int i;
+       u32 val;
 
        WARN_ON(!rcpm);
 
@@ -84,9 +85,12 @@ static int rcpm_suspend_prepare(void)
        dpm_for_each_dev(NULL, rcpm_wakeup_fixup);
 
        for (i = 0; i < rcpm->ipp_num; i++) {
-               rcpm_reg_write(rcpm->ippdexpcr_offset + 4 * i,
-                              rcpm->ippdexpcr[i]);
-               pr_debug("ippdexpcr%d = 0x%x\n", i, rcpm->ippdexpcr[i]);
+               if (rcpm->ippdexpcr[i]) {
+                       val = rcpm_reg_read(rcpm->ippdexpcr_offset + 4 * i);
+                       rcpm_reg_write(rcpm->ippdexpcr_offset + 4 * i,
+                                              val | rcpm->ippdexpcr[i]);
+                       pr_debug("ippdexpcr%d = 0x%x\n", i, rcpm->ippdexpcr[i]);
+               }
        }
 
        return 0;
-- 
1.7.1

Reply via email to