diff options
author | Anson Huang <b20788@freescale.com> | 2013-08-29 10:03:30 -0400 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 09:01:33 -0400 |
commit | 3658d626688273ae61e38bbc78c8f44831e05431 (patch) | |
tree | b4215cf4dc5c72f136e3929e0fa7b2f99b7c10d4 /arch | |
parent | 7ccc1d88eca96f73df4c673f16b45ee3ba234074 (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.c | 17 |
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) | |||
91 | static void imx6_enable_rbc(bool enable) | 91 | static 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 | ||
129 | static void imx6_enable_wb(bool enable) | 124 | static 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 | ||
152 | int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) | 141 | int 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; |