aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAnson Huang <b20788@freescale.com>2013-08-29 10:03:30 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:01:33 -0400
commit3658d626688273ae61e38bbc78c8f44831e05431 (patch)
treeb4215cf4dc5c72f136e3929e0fa7b2f99b7c10d4 /arch
parent7ccc1d88eca96f73df4c673f16b45ee3ba234074 (diff)
ENGR00277234 ARM: imx: correct RBC/WB setting flow
Currently RBC is enabled right before DSM in asm code and disabled after resume, as the RBC enable didn't call imx6_enable_rbc function, so everytime disabling RBC will be skipped by the logic inside imx6_enable_rbc, this will disobey the RBC rules: RBC counter should be cleared after resume and adding at least 2 CKIL(32KHz) clocks with all wakeup sources masked in GPC; Move WB setting into DSM enter/exit path only. Signed-off-by: Anson Huang <b20788@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-imx/pm-imx6.c17
1 files changed, 3 insertions, 14 deletions
diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c
index acb32940b39b..ea1643f925e3 100644
--- a/arch/arm/mach-imx/pm-imx6.c
+++ b/arch/arm/mach-imx/pm-imx6.c
@@ -91,10 +91,7 @@ void imx6_set_cache_lpm_in_wait(bool enable)
91static void imx6_enable_rbc(bool enable) 91static void imx6_enable_rbc(bool enable)
92{ 92{
93 u32 val; 93 u32 val;
94 static bool last_rbc_mode;
95 94
96 if (last_rbc_mode == enable)
97 return;
98 /* 95 /*
99 * need to mask all interrupts in GPC before 96 * need to mask all interrupts in GPC before
100 * operating RBC configurations 97 * operating RBC configurations
@@ -122,17 +119,11 @@ static void imx6_enable_rbc(bool enable)
122 119
123 /* restore GPC interrupt mask settings */ 120 /* restore GPC interrupt mask settings */
124 imx_gpc_restore_all(); 121 imx_gpc_restore_all();
125
126 last_rbc_mode = enable;
127} 122}
128 123
129static void imx6_enable_wb(bool enable) 124static void imx6_enable_wb(bool enable)
130{ 125{
131 u32 val; 126 u32 val;
132 static bool last_wb_mode;
133
134 if (last_wb_mode == enable)
135 return;
136 127
137 /* configure well bias enable bit */ 128 /* configure well bias enable bit */
138 val = readl_relaxed(ccm_base + CLPCR); 129 val = readl_relaxed(ccm_base + CLPCR);
@@ -145,8 +136,6 @@ static void imx6_enable_wb(bool enable)
145 val &= ~BM_CCR_WB_COUNT; 136 val &= ~BM_CCR_WB_COUNT;
146 val |= enable ? BM_CCR_WB_COUNT : 0; 137 val |= enable ? BM_CCR_WB_COUNT : 0;
147 writel_relaxed(val, ccm_base + CCR); 138 writel_relaxed(val, ccm_base + CCR);
148
149 last_wb_mode = enable;
150} 139}
151 140
152int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) 141int imx6_set_lpm(enum mxc_cpu_pwr_mode mode)
@@ -173,8 +162,6 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode)
173 val &= ~BM_CLPCR_LPM; 162 val &= ~BM_CLPCR_LPM;
174 switch (mode) { 163 switch (mode) {
175 case WAIT_CLOCKED: 164 case WAIT_CLOCKED:
176 imx6_enable_wb(false);
177 imx6_enable_rbc(false);
178 break; 165 break;
179 case WAIT_UNCLOCKED: 166 case WAIT_UNCLOCKED:
180 val |= 0x1 << BP_CLPCR_LPM; 167 val |= 0x1 << BP_CLPCR_LPM;
@@ -207,7 +194,6 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode)
207 } else { 194 } else {
208 val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; 195 val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;
209 } 196 }
210 imx6_enable_wb(true);
211 break; 197 break;
212 default: 198 default:
213 imx_gpc_irq_mask(&desc->irq_data); 199 imx_gpc_irq_mask(&desc->irq_data);
@@ -259,6 +245,7 @@ static int imx6_pm_enter(suspend_state_t state)
259 imx6_set_lpm(WAIT_CLOCKED); 245 imx6_set_lpm(WAIT_CLOCKED);
260 break; 246 break;
261 case PM_SUSPEND_MEM: 247 case PM_SUSPEND_MEM:
248 imx6_enable_wb(true);
262 imx6_set_cache_lpm_in_wait(false); 249 imx6_set_cache_lpm_in_wait(false);
263 imx6_set_lpm(STOP_POWER_OFF); 250 imx6_set_lpm(STOP_POWER_OFF);
264 imx_gpc_pre_suspend(true); 251 imx_gpc_pre_suspend(true);
@@ -270,6 +257,8 @@ static int imx6_pm_enter(suspend_state_t state)
270 imx_smp_prepare(); 257 imx_smp_prepare();
271 imx_anatop_post_resume(); 258 imx_anatop_post_resume();
272 imx_gpc_post_resume(); 259 imx_gpc_post_resume();
260 imx6_enable_rbc(false);
261 imx6_enable_wb(false);
273 imx6_set_cache_lpm_in_wait(true); 262 imx6_set_cache_lpm_in_wait(true);
274 imx6_set_lpm(WAIT_CLOCKED); 263 imx6_set_lpm(WAIT_CLOCKED);
275 break; 264 break;