diff options
author | Tero Kristo <t-kristo@ti.com> | 2014-08-26 11:13:39 +0530 |
---|---|---|
committer | Tero Kristo <t-kristo@ti.com> | 2014-09-01 10:55:13 +0300 |
commit | b18f147871cf52923d0fd94664aa5b7dc8f42672 (patch) | |
tree | f8faee5b23014c97cb08c6afd8d942757ded1117 /arch | |
parent | c63bcb1244aabb3985dbcadb88ecf5a5d3362147 (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.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/sleep33xx.S | 34 | ||||
-rw-r--r-- | arch/arm/mach-omap2/sleep43xx.S | 12 |
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 */ |