sleep.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Low-level PXA250/210 sleep/wakeUp support
  3.  *
  4.  * Initial SA1110 code:
  5.  * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com>
  6.  *
  7.  * Adapted for PXA by Nicolas Pitre:
  8.  * Copyright (c) 2002 Monta Vista Software, Inc.
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License.
  12.  */
  13. #include <linux/config.h>
  14. #include <linux/linkage.h>
  15. #include <asm/assembler.h>
  16. #include <asm/hardware.h>
  17. .text
  18. /*
  19.  * pxa_cpu_suspend()
  20.  *
  21.  * Forces CPU into sleep state
  22.  */
  23. ENTRY(pxa_cpu_suspend)
  24. mra r2, r3, acc0
  25. stmfd sp!, {r2 - r12, lr} @ save registers on stack
  26. @ get coprocessor registers
  27. mrc p15, 0, r4, c15, c1, 0 @ CP access reg
  28. mrc p15, 0, r5, c13, c0, 0 @ PID
  29. mrc  p15, 0, r6, c3, c0, 0 @ domain ID
  30. mrc  p15, 0, r7, c2, c0, 0 @ translation table base addr
  31. mrc p15, 0, r8, c1, c1, 0           @ auxiliary control reg
  32. mrc  p15, 0, r9, c1, c0, 0 @ control reg
  33. @ store them plus current virtual stack ptr on stack
  34. mov r10, sp
  35. stmfd sp!, {r4 - r10}
  36. @ preserve phys address of stack
  37. mov r0, sp
  38. bl sleep_phys_sp
  39. ldr r1, =sleep_save_sp
  40. str r0, [r1]
  41. @ clean data cache 
  42. bl cpu_xscale_cache_clean_invalidate_all
  43. @ Put the processor to sleep
  44. @ (also workaround for sighting 28071)
  45. @ prepare value for sleep mode
  46. mov r1, #3 @ sleep mode
  47. @ prepare to put SDRAM into self-refresh manually
  48. ldr r4, =MDREFR
  49. ldr r5, [r4]
  50. orr r5, r5, #MDREFR_SLFRSH
  51. @ prepare pointer to physical address 0 (virtual mapping in generic.c)
  52. mov r2, #UNCACHED_PHYS_0
  53. @ align execution to a cache line
  54. b 1f
  55. .ltorg
  56. .align 5
  57. 1:
  58. @ All needed values are now in registers. 
  59. @ These last instructions should be in cache
  60. @ put SDRAM into self-refresh
  61. str r5, [r4]
  62. @ force address lines low by reading at physical address 0
  63. ldr r3, [r2]
  64. @ enter sleep mode
  65. mcr p14, 0, r1, c7, c0, 0
  66. 20: nop
  67. b 20b @ loop waiting for sleep
  68. /*
  69.  * cpu_pxa_resume()
  70.  *
  71.  * entry point from bootloader into kernel during resume
  72.  *
  73.  * Note: Yes, part of the following code is located into the .data section.
  74.  *       This is to allow sleep_save_sp to be accessed with a relative load
  75.  *       while we can't rely on any MMU translation.  We could have put
  76.  *       sleep_save_sp in the .text section as well, but some setups might
  77.  *       insist on it to be truely read-only.
  78.  */
  79. .data
  80. .align 5
  81. ENTRY(pxa_cpu_resume)
  82. mov r0, #I_BIT | F_BIT | MODE_SVC @ set SVC, irqs off
  83. msr cpsr_c, r0
  84. ldr r0, sleep_save_sp @ stack phys addr
  85. ldr r2, =resume_after_mmu @ its absolute virtual address
  86. ldmfd r0, {r4 - r9, sp} @ CP regs + virt stack ptr
  87. mov r1, #0
  88. mcr p15, 0, r1, c8, c7, 0    @ invalidate I & D TLBs
  89. mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB
  90. #ifdef CONFIG_XSCALE_CACHE_ERRATA
  91. bic     r9, r9, #0x0004 @ see cpu_xscale_proc_init
  92. #endif
  93. mcr p15, 0, r4, c15, c1, 0 @ CP access reg
  94. mcr p15, 0, r5, c13, c0, 0 @ PID
  95. mcr  p15, 0, r6, c3, c0, 0 @ domain ID
  96. mcr  p15, 0, r7, c2, c0, 0 @ translation table base addr
  97. mcr p15, 0, r8, c1, c1, 0           @ auxiliary control reg
  98. b resume_turn_on_mmu @ cache align execution
  99. .align 5
  100. resume_turn_on_mmu:
  101. mcr  p15, 0, r9, c1, c0, 0 @ turn on MMU, caches, etc.
  102. @ Let us ensure we jump to resume_after_mmu only when the mcr above
  103. @ actually took effect.  They call it the "cpwait" operation.
  104. mrc p15, 0, r1, c2, c0, 0 @ queue a dependency on CP15
  105. sub pc, r2, r1, lsr #32 @ jump to virtual addr 
  106. nop
  107. nop
  108. nop
  109. sleep_save_sp:
  110. .word 0 @ preserve stack phys ptr here
  111. .text
  112. resume_after_mmu:
  113. #ifdef CONFIG_XSCALE_CACHE_ERRATA
  114. bl cpu_xscale_proc_init
  115. #endif
  116. ldmfd sp!, {r2, r3}
  117. mar acc0, r2, r3
  118. ldmfd sp!, {r4 - r12, pc} @ return to caller