sleep43xx.S (74655749a58405e259eaaba66bfc391fdbe1e34e) sleep43xx.S (8c5a916f4c8815196cc8a86b9582ca89422aac25)
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Low level suspend code for AM43XX SoCs
4 *
5 * Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/
6 * Dave Gerlach, Vaibhav Bedia
7 */
8

--- 34 unchanged lines hidden (view full) ---

43#define AM43XX_CM_MPU_CLKSTCTRL AM43XX_CM_REGADDR(AM43XX_CM_MPU_INST, \
44 AM43XX_CM_MPU_MPU_CDOFFS)
45#define AM43XX_CM_MPU_MPU_CLKCTRL AM43XX_CM_REGADDR(AM43XX_CM_MPU_INST, \
46 AM43XX_CM_MPU_MPU_CLKCTRL_OFFSET)
47#define AM43XX_CM_PER_EMIF_CLKCTRL AM43XX_CM_REGADDR(AM43XX_CM_PER_INST, \
48 AM43XX_CM_PER_EMIF_CLKCTRL_OFFSET)
49#define AM43XX_PRM_EMIF_CTRL_OFFSET 0x0030
50
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Low level suspend code for AM43XX SoCs
4 *
5 * Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/
6 * Dave Gerlach, Vaibhav Bedia
7 */
8

--- 34 unchanged lines hidden (view full) ---

43#define AM43XX_CM_MPU_CLKSTCTRL AM43XX_CM_REGADDR(AM43XX_CM_MPU_INST, \
44 AM43XX_CM_MPU_MPU_CDOFFS)
45#define AM43XX_CM_MPU_MPU_CLKCTRL AM43XX_CM_REGADDR(AM43XX_CM_MPU_INST, \
46 AM43XX_CM_MPU_MPU_CLKCTRL_OFFSET)
47#define AM43XX_CM_PER_EMIF_CLKCTRL AM43XX_CM_REGADDR(AM43XX_CM_PER_INST, \
48 AM43XX_CM_PER_EMIF_CLKCTRL_OFFSET)
49#define AM43XX_PRM_EMIF_CTRL_OFFSET 0x0030
50
51#define RTC_SECONDS_REG 0x0
52#define RTC_PMIC_REG 0x98
53#define RTC_PMIC_POWER_EN BIT(16)
54#define RTC_PMIC_EXT_WAKEUP_STS BIT(12)
55#define RTC_PMIC_EXT_WAKEUP_POL BIT(4)
56#define RTC_PMIC_EXT_WAKEUP_EN BIT(0)
57
51 .arm
52 .align 3
53
54ENTRY(am43xx_do_wfi)
55 stmfd sp!, {r4 - r11, lr} @ save registers on stack
56
57 /* Save wfi_flags arg to data space */
58 mov r4, r0

--- 83 unchanged lines hidden (view full) ---

142#endif
143
144 /* Restore wfi_flags */
145 adr r3, am43xx_pm_ro_sram_data
146 ldr r2, [r3, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
147 ldr r4, [r2, #AMX3_PM_WFI_FLAGS_OFFSET]
148
149cache_skip_flush:
58 .arm
59 .align 3
60
61ENTRY(am43xx_do_wfi)
62 stmfd sp!, {r4 - r11, lr} @ save registers on stack
63
64 /* Save wfi_flags arg to data space */
65 mov r4, r0

--- 83 unchanged lines hidden (view full) ---

149#endif
150
151 /* Restore wfi_flags */
152 adr r3, am43xx_pm_ro_sram_data
153 ldr r2, [r3, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
154 ldr r4, [r2, #AMX3_PM_WFI_FLAGS_OFFSET]
155
156cache_skip_flush:
157 /*
158 * If we are trying to enter RTC+DDR mode we must perform
159 * a read from the rtc address space to ensure translation
160 * presence in the TLB to avoid page table walk after DDR
161 * is unavailable.
162 */
163 tst r4, #WFI_FLAG_RTC_ONLY
164 beq skip_rtc_va_refresh
165
166 adr r3, am43xx_pm_ro_sram_data
167 ldr r1, [r3, #AMX3_PM_RTC_BASE_VIRT_OFFSET]
168 ldr r0, [r1]
169
170skip_rtc_va_refresh:
150 /* Check if we want self refresh */
151 tst r4, #WFI_FLAG_SELF_REFRESH
152 beq emif_skip_enter_sr
153
154 adr r9, am43xx_emif_sram_table
155
156 ldr r3, [r9, #EMIF_PM_ENTER_SR_OFFSET]
157 blx r3

--- 19 unchanged lines hidden (view full) ---

177
178wait_emif_disable:
179 ldr r2, [r1]
180 mov r3, #AM33XX_CM_CLKCTRL_MODULESTATE_DISABLED
181 cmp r2, r3
182 bne wait_emif_disable
183
184emif_skip_disable:
171 /* Check if we want self refresh */
172 tst r4, #WFI_FLAG_SELF_REFRESH
173 beq emif_skip_enter_sr
174
175 adr r9, am43xx_emif_sram_table
176
177 ldr r3, [r9, #EMIF_PM_ENTER_SR_OFFSET]
178 blx r3

--- 19 unchanged lines hidden (view full) ---

198
199wait_emif_disable:
200 ldr r2, [r1]
201 mov r3, #AM33XX_CM_CLKCTRL_MODULESTATE_DISABLED
202 cmp r2, r3
203 bne wait_emif_disable
204
205emif_skip_disable:
206 tst r4, #WFI_FLAG_RTC_ONLY
207 beq skip_rtc_only
208
209 adr r3, am43xx_pm_ro_sram_data
210 ldr r1, [r3, #AMX3_PM_RTC_BASE_VIRT_OFFSET]
211
212 ldr r0, [r1, #RTC_PMIC_REG]
213 orr r0, r0, #RTC_PMIC_POWER_EN
214 orr r0, r0, #RTC_PMIC_EXT_WAKEUP_STS
215 orr r0, r0, #RTC_PMIC_EXT_WAKEUP_EN
216 orr r0, r0, #RTC_PMIC_EXT_WAKEUP_POL
217 str r0, [r1, #RTC_PMIC_REG]
218 ldr r0, [r1, #RTC_PMIC_REG]
219 /* Wait for 2 seconds to lose power */
220 mov r3, #2
221 ldr r2, [r1, #RTC_SECONDS_REG]
222rtc_loop:
223 ldr r0, [r1, #RTC_SECONDS_REG]
224 cmp r0, r2
225 beq rtc_loop
226 mov r2, r0
227 subs r3, r3, #1
228 bne rtc_loop
229
230 b re_enable_emif
231
232skip_rtc_only:
233
185 tst r4, #WFI_FLAG_WAKE_M3
186 beq wkup_m3_skip
187
188 /*
189 * For the MPU WFI to be registered as an interrupt
190 * to WKUP_M3, MPU_CLKCTRL.MODULEMODE needs to be set
191 * to DISABLED
192 */

--- 49 unchanged lines hidden (view full) ---

242 mov r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO
243 str r2, [r1]
244
245 /* Set MPU_CLKCTRL.MODULEMODE back to ENABLE */
246 ldr r1, am43xx_virt_mpu_clkctrl
247 mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
248 str r2, [r1]
249
234 tst r4, #WFI_FLAG_WAKE_M3
235 beq wkup_m3_skip
236
237 /*
238 * For the MPU WFI to be registered as an interrupt
239 * to WKUP_M3, MPU_CLKCTRL.MODULEMODE needs to be set
240 * to DISABLED
241 */

--- 49 unchanged lines hidden (view full) ---

291 mov r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO
292 str r2, [r1]
293
294 /* Set MPU_CLKCTRL.MODULEMODE back to ENABLE */
295 ldr r1, am43xx_virt_mpu_clkctrl
296 mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
297 str r2, [r1]
298
299re_enable_emif:
250 /* Re-enable EMIF */
251 ldr r1, am43xx_virt_emif_clkctrl
252 mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
253 str r2, [r1]
254wait_emif_enable:
255 ldr r3, [r1]
256 cmp r2, r3
257 bne wait_emif_enable

--- 118 unchanged lines hidden (view full) ---

376 mov r0, #0
377 ldr pc, resume_addr
378ENDPROC(am43xx_resume_from_deep_sleep)
379
380/*
381 * Local variables
382 */
383 .align
300 /* Re-enable EMIF */
301 ldr r1, am43xx_virt_emif_clkctrl
302 mov r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
303 str r2, [r1]
304wait_emif_enable:
305 ldr r3, [r1]
306 cmp r2, r3
307 bne wait_emif_enable

--- 118 unchanged lines hidden (view full) ---

426 mov r0, #0
427 ldr pc, resume_addr
428ENDPROC(am43xx_resume_from_deep_sleep)
429
430/*
431 * Local variables
432 */
433 .align
384resume_addr:
385 .word cpu_resume - PAGE_OFFSET + 0x80000000
386kernel_flush:
387 .word v7_flush_dcache_all
388ddr_start:
389 .word PAGE_OFFSET
390
391am43xx_phys_emif_poweroff:
392 .word (AM43XX_CM_BASE + AM43XX_PRM_DEVICE_INST + \
393 AM43XX_PRM_EMIF_CTRL_OFFSET)

--- 30 unchanged lines hidden (view full) ---

424
425ENTRY(am43xx_pm_sram)
426 .word am43xx_do_wfi
427 .word am43xx_do_wfi_sz
428 .word am43xx_resume_offset
429 .word am43xx_emif_sram_table
430 .word am43xx_pm_ro_sram_data
431
434kernel_flush:
435 .word v7_flush_dcache_all
436ddr_start:
437 .word PAGE_OFFSET
438
439am43xx_phys_emif_poweroff:
440 .word (AM43XX_CM_BASE + AM43XX_PRM_DEVICE_INST + \
441 AM43XX_PRM_EMIF_CTRL_OFFSET)

--- 30 unchanged lines hidden (view full) ---

472
473ENTRY(am43xx_pm_sram)
474 .word am43xx_do_wfi
475 .word am43xx_do_wfi_sz
476 .word am43xx_resume_offset
477 .word am43xx_emif_sram_table
478 .word am43xx_pm_ro_sram_data
479
480resume_addr:
481 .word cpu_resume - PAGE_OFFSET + 0x80000000
432.align 3
433
434ENTRY(am43xx_pm_ro_sram_data)
435 .space AMX3_PM_RO_SRAM_DATA_SIZE
436
437ENTRY(am43xx_do_wfi_sz)
438 .word . - am43xx_do_wfi
482.align 3
483
484ENTRY(am43xx_pm_ro_sram_data)
485 .space AMX3_PM_RO_SRAM_DATA_SIZE
486
487ENTRY(am43xx_do_wfi_sz)
488 .word . - am43xx_do_wfi