summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2014-08-26 11:13:39 +0530
committerTero Kristo <t-kristo@ti.com>2014-09-01 10:55:13 +0300
commitb18f147871cf52923d0fd94664aa5b7dc8f42672 (patch)
treef8faee5b23014c97cb08c6afd8d942757ded1117 /arch
parentc63bcb1244aabb3985dbcadb88ecf5a5d3362147 (diff)
ARM: AM33XX/AM43XX: re-order suspend-params
Required for AM33XX rtc-only mode support. AM33XX uses first four parameters only, AM43XX uses all. Signed-off-by: Tero Kristo <t-kristo@ti.com> [j-keerthy@ti.com] Ported to 3.14 with minor rework Signed-off-by: Keerthy <j-keerthy@ti.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-omap2/pm33xx.h2
-rw-r--r--arch/arm/mach-omap2/sleep33xx.S34
-rw-r--r--arch/arm/mach-omap2/sleep43xx.S12
3 files changed, 40 insertions, 8 deletions
diff --git a/arch/arm/mach-omap2/pm33xx.h b/arch/arm/mach-omap2/pm33xx.h
index d3714de338e..5f72190f231 100644
--- a/arch/arm/mach-omap2/pm33xx.h
+++ b/arch/arm/mach-omap2/pm33xx.h
@@ -48,9 +48,9 @@ struct am33xx_suspend_params {
void __iomem *emif_addr_virt;
u32 wfi_flags;
void __iomem *dram_sync;
+ void __iomem *rtc_base;
void __iomem *l2_base_virt;
void __iomem *cke_override_virt;
- void __iomem *rtc_base;
};
void wkup_m3_reset_data_pos(void);
diff --git a/arch/arm/mach-omap2/sleep33xx.S b/arch/arm/mach-omap2/sleep33xx.S
index e4e6be001dd..ad496cdd754 100644
--- a/arch/arm/mach-omap2/sleep33xx.S
+++ b/arch/arm/mach-omap2/sleep33xx.S
@@ -35,6 +35,10 @@
#define AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE 0x0003
#define AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE 0x0002
+#define RTC_SECONDS_REG 0x0
+#define RTC_PMIC_REG 0x98
+#define RTC_PMIC_POWER_EN (1 << 16)
+
.text
.align 3
@@ -56,12 +60,13 @@
ENTRY(am33xx_do_wfi)
stmfd sp!, {r4 - r11, lr} @ save registers on stack
- ldm r0, {r1-r3} @ gather values passed
+ ldm r0, {r1-r4} @ gather values passed
/* Save the values passed */
str r1, emif_addr_virt
str r2, wfi_flags
str r3, dram_sync_word
+ str r4, rtc_base_addr
ldr r2, wfi_flags
tst r2, #WFI_SELF_REFRESH
@@ -150,6 +155,30 @@ wait_emif_disable:
bne wait_emif_disable
skip_sr:
+ ldr r1, wfi_flags
+ tst r1, #WFI_RTC_ONLY
+ beq am33xx_deep_sleep_suspend
+
+ ldr r1, rtc_base_addr
+ ldr r0, [r1, #RTC_PMIC_REG]
+ orr r0, r0, #RTC_PMIC_POWER_EN
+ str r0, [r1, #RTC_PMIC_REG]
+ ldr r0, [r1, #RTC_PMIC_REG]
+
+ /* Wait for 2 seconds to lose power */
+ mov r3, #2
+ ldr r2, [r1, #RTC_SECONDS_REG]
+rtc_loop:
+ ldr r0, [r1, #RTC_SECONDS_REG]
+ cmp r0, r2
+ beq rtc_loop
+ mov r2, r0
+ subs r3, r3, #1
+ bne rtc_loop
+
+ b re_enable_emif
+
+am33xx_deep_sleep_suspend:
ldr r2, wfi_flags
tst r2, #WFI_WAKE_M3
beq skip_m3
@@ -211,6 +240,7 @@ skip_m3:
movne r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
strne r2, [r1]
+re_enable_emif:
ldr r2, wfi_flags
tst r2, #WFI_SELF_REFRESH
beq skip_reenable_emif
@@ -364,6 +394,8 @@ phys_emif_clkctrl:
AM33XX_CM_PER_EMIF_CLKCTRL_OFFSET)
module_disabled_val:
.word 0x30000
+rtc_base_addr:
+ .word 0xDEADBEEF
/* DDR related defines */
dram_sync_word:
diff --git a/arch/arm/mach-omap2/sleep43xx.S b/arch/arm/mach-omap2/sleep43xx.S
index a1cf8fbb84a..e4b122dc4eb 100644
--- a/arch/arm/mach-omap2/sleep43xx.S
+++ b/arch/arm/mach-omap2/sleep43xx.S
@@ -63,9 +63,9 @@
* 1) emif_addr_virt - ioremapped EMIF address
* 2) wfi_flags - 2 -> DDR2, 3-> DDR3
* 3) dram_sync_word - uncached word in SDRAM
- * 4) l2_virt_base - L2CC ioremapped address for AM437x
- * 5) cke_override_virt - CKE override virtual address
- * 6) rtc_base_addr - ioremapped RTC base address
+ * 4) rtc_base_addr - ioremapped RTC base address
+ * 5) l2_virt_base - L2CC ioremapped address for AM437x
+ * 6) cke_override_virt - CKE override virtual address
*
* The code loads these values taking r0 value as reference to
* the array in registers starting from r0, i.e emif_addr_virt
@@ -84,9 +84,9 @@ ENTRY(am43xx_do_wfi)
str r1, emif_addr_virt
str r2, wfi_flags
str r3, dram_sync_word
- str r4, l2_base_virt
- str r5, cke_override_virt
- str r6, rtc_base_addr
+ str r4, rtc_base_addr
+ str r5, l2_base_virt
+ str r6, cke_override_virt
ldr r0, emif_addr_virt
/* Save EMIF configuration */