/* * sleep mode for CSR SiRFprimaII * * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. * * Licensed under GPLv2 or later. */ #include #include #include #include "pm.h" #define DENALI_CTL_22_OFF 0x58 #define DENALI_CTL_112_OFF 0x1c0 .text ENTRY(sirfsoc_finish_suspend) @ r5: mem controller ldr r0, =sirfsoc_memc_base ldr r5, [r0] @ r6: pwrc base offset ldr r0, =sirfsoc_pwrc_base ldr r6, [r0] @ r7: rtc iobrg controller ldr r0, =sirfsoc_rtciobrg_base ldr r7, [r0] @ Read the power control register and set the @ sleep force bit. add r0, r6, #SIRFSOC_PWRC_PDN_CTRL bl __sirfsoc_rtc_iobrg_readl orr r0,r0,#SIRFSOC_PWR_SLEEPFORCE add r1, r6, #SIRFSOC_PWRC_PDN_CTRL bl sirfsoc_rtc_iobrg_pre_writel mov r1, #0x1 @ read the MEM ctl register and set the self @ refresh bit ldr r2, [r5, #DENALI_CTL_22_OFF] orr r2, r2, #0x1 @ Following code has to run from cache since @ the RAM is going to self refresh mode .align 5 str r2, [r5, #DENALI_CTL_22_OFF] 1: ldr r4, [r5, #DENALI_CTL_112_OFF] tst r4, #0x1 bne 1b @ write SLEEPFORCE through rtc iobridge str r1, [r7] @ wait rtc io bridge sync 1: ldr r3, [r7] tst r3, #0x01 bne 1b b .