sram34xx.S 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /*
  2. * linux/arch/arm/mach-omap3/sram.S
  3. *
  4. * Omap3 specific functions that need to be run in internal SRAM
  5. *
  6. * Copyright (C) 2004, 2007, 2008 Texas Instruments, Inc.
  7. * Copyright (C) 2008 Nokia Corporation
  8. *
  9. * Rajendra Nayak <rnayak@ti.com>
  10. * Richard Woodruff <r-woodruff2@ti.com>
  11. * Paul Walmsley
  12. *
  13. * This program is free software; you can redistribute it and/or
  14. * modify it under the terms of the GNU General Public License as
  15. * published by the Free Software Foundation; either version 2 of
  16. * the License, or (at your option) any later version.
  17. *
  18. * This program is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * You should have received a copy of the GNU General Public License
  24. * along with this program; if not, write to the Free Software
  25. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  26. * MA 02111-1307 USA
  27. */
  28. #include <linux/linkage.h>
  29. #include <asm/assembler.h>
  30. #include <mach/hardware.h>
  31. #include <mach/io.h>
  32. #include "sdrc.h"
  33. #include "cm.h"
  34. .text
  35. /* r1 parameters */
  36. #define SDRC_NO_UNLOCK_DLL 0x0
  37. #define SDRC_UNLOCK_DLL 0x1
  38. /* SDRC_DLLA_CTRL bit settings */
  39. #define FIXEDDELAY_SHIFT 24
  40. #define FIXEDDELAY_MASK (0xff << FIXEDDELAY_SHIFT)
  41. #define DLLIDLE_MASK 0x4
  42. /*
  43. * SDRC_DLLA_CTRL default values: TI hardware team indicates that
  44. * FIXEDDELAY should be initialized to 0xf. This apparently was
  45. * empirically determined during process testing, so no derivation
  46. * was provided.
  47. */
  48. #define FIXEDDELAY_DEFAULT (0x0f << FIXEDDELAY_SHIFT)
  49. /* SDRC_DLLA_STATUS bit settings */
  50. #define LOCKSTATUS_MASK 0x4
  51. /* SDRC_POWER bit settings */
  52. #define SRFRONIDLEREQ_MASK 0x40
  53. /* CM_IDLEST1_CORE bit settings */
  54. #define ST_SDRC_MASK 0x2
  55. /* CM_ICLKEN1_CORE bit settings */
  56. #define EN_SDRC_MASK 0x2
  57. /* CM_CLKSEL1_PLL bit settings */
  58. #define CORE_DPLL_CLKOUT_DIV_SHIFT 0x1b
  59. /*
  60. * omap3_sram_configure_core_dpll - change DPLL3 M2 divider
  61. *
  62. * Params passed in registers:
  63. * r0 = new M2 divider setting (only 1 and 2 supported right now)
  64. * r1 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for
  65. * SDRC rates < 83MHz
  66. * r2 = number of MPU cycles to wait for SDRC to stabilize after
  67. * reprogramming the SDRC when switching to a slower MPU speed
  68. * r3 = increasing SDRC rate? (1 = yes, 0 = no)
  69. *
  70. * Params passed via the stack. The needed params will be copied in SRAM
  71. * before use by the code in SRAM (SDRAM is not accessible during SDRC
  72. * reconfiguration):
  73. * new SDRC_RFR_CTRL_0 register contents
  74. * new SDRC_ACTIM_CTRL_A_0 register contents
  75. * new SDRC_ACTIM_CTRL_B_0 register contents
  76. * new SDRC_MR_0 register value
  77. * new SDRC_RFR_CTRL_1 register contents
  78. * new SDRC_ACTIM_CTRL_A_1 register contents
  79. * new SDRC_ACTIM_CTRL_B_1 register contents
  80. * new SDRC_MR_1 register value
  81. *
  82. * If the param SDRC_RFR_CTRL_1 is 0, the parameters
  83. * are not programmed into the SDRC CS1 registers
  84. */
  85. ENTRY(omap3_sram_configure_core_dpll)
  86. stmfd sp!, {r1-r12, lr} @ store regs to stack
  87. @ pull the extra args off the stack
  88. @ and store them in SRAM
  89. ldr r4, [sp, #52]
  90. str r4, omap_sdrc_rfr_ctrl_0_val
  91. ldr r4, [sp, #56]
  92. str r4, omap_sdrc_actim_ctrl_a_0_val
  93. ldr r4, [sp, #60]
  94. str r4, omap_sdrc_actim_ctrl_b_0_val
  95. ldr r4, [sp, #64]
  96. str r4, omap_sdrc_mr_0_val
  97. ldr r4, [sp, #68]
  98. str r4, omap_sdrc_rfr_ctrl_1_val
  99. cmp r4, #0 @ if SDRC_RFR_CTRL_1 is 0,
  100. beq skip_cs1_params @ do not use cs1 params
  101. ldr r4, [sp, #72]
  102. str r4, omap_sdrc_actim_ctrl_a_1_val
  103. ldr r4, [sp, #76]
  104. str r4, omap_sdrc_actim_ctrl_b_1_val
  105. ldr r4, [sp, #80]
  106. str r4, omap_sdrc_mr_1_val
  107. skip_cs1_params:
  108. dsb @ flush buffered writes to interconnect
  109. cmp r3, #1 @ if increasing SDRC clk rate,
  110. bleq configure_sdrc @ program the SDRC regs early (for RFR)
  111. cmp r1, #SDRC_UNLOCK_DLL @ set the intended DLL state
  112. bleq unlock_dll
  113. blne lock_dll
  114. bl sdram_in_selfrefresh @ put SDRAM in self refresh, idle SDRC
  115. bl configure_core_dpll @ change the DPLL3 M2 divider
  116. mov r12, r2
  117. bl wait_clk_stable @ wait for SDRC to stabilize
  118. bl enable_sdrc @ take SDRC out of idle
  119. cmp r1, #SDRC_UNLOCK_DLL @ wait for DLL status to change
  120. bleq wait_dll_unlock
  121. blne wait_dll_lock
  122. cmp r3, #1 @ if increasing SDRC clk rate,
  123. beq return_to_sdram @ return to SDRAM code, otherwise,
  124. bl configure_sdrc @ reprogram SDRC regs now
  125. return_to_sdram:
  126. isb @ prevent speculative exec past here
  127. mov r0, #0 @ return value
  128. ldmfd sp!, {r1-r12, pc} @ restore regs and return
  129. unlock_dll:
  130. ldr r11, omap3_sdrc_dlla_ctrl
  131. ldr r12, [r11]
  132. bic r12, r12, #FIXEDDELAY_MASK
  133. orr r12, r12, #FIXEDDELAY_DEFAULT
  134. orr r12, r12, #DLLIDLE_MASK
  135. str r12, [r11] @ (no OCP barrier needed)
  136. bx lr
  137. lock_dll:
  138. ldr r11, omap3_sdrc_dlla_ctrl
  139. ldr r12, [r11]
  140. bic r12, r12, #DLLIDLE_MASK
  141. str r12, [r11] @ (no OCP barrier needed)
  142. bx lr
  143. sdram_in_selfrefresh:
  144. ldr r11, omap3_sdrc_power @ read the SDRC_POWER register
  145. ldr r12, [r11] @ read the contents of SDRC_POWER
  146. mov r9, r12 @ keep a copy of SDRC_POWER bits
  147. orr r12, r12, #SRFRONIDLEREQ_MASK @ enable self refresh on idle
  148. str r12, [r11] @ write back to SDRC_POWER register
  149. ldr r12, [r11] @ posted-write barrier for SDRC
  150. idle_sdrc:
  151. ldr r11, omap3_cm_iclken1_core @ read the CM_ICLKEN1_CORE reg
  152. ldr r12, [r11]
  153. bic r12, r12, #EN_SDRC_MASK @ disable iclk bit for SDRC
  154. str r12, [r11]
  155. wait_sdrc_idle:
  156. ldr r11, omap3_cm_idlest1_core
  157. ldr r12, [r11]
  158. and r12, r12, #ST_SDRC_MASK @ check for SDRC idle
  159. cmp r12, #ST_SDRC_MASK
  160. bne wait_sdrc_idle
  161. bx lr
  162. configure_core_dpll:
  163. ldr r11, omap3_cm_clksel1_pll
  164. ldr r12, [r11]
  165. ldr r10, core_m2_mask_val @ modify m2 for core dpll
  166. and r12, r12, r10
  167. orr r12, r12, r0, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT
  168. str r12, [r11]
  169. ldr r12, [r11] @ posted-write barrier for CM
  170. bx lr
  171. wait_clk_stable:
  172. subs r12, r12, #1
  173. bne wait_clk_stable
  174. bx lr
  175. enable_sdrc:
  176. ldr r11, omap3_cm_iclken1_core
  177. ldr r12, [r11]
  178. orr r12, r12, #EN_SDRC_MASK @ enable iclk bit for SDRC
  179. str r12, [r11]
  180. wait_sdrc_idle1:
  181. ldr r11, omap3_cm_idlest1_core
  182. ldr r12, [r11]
  183. and r12, r12, #ST_SDRC_MASK
  184. cmp r12, #0
  185. bne wait_sdrc_idle1
  186. restore_sdrc_power_val:
  187. ldr r11, omap3_sdrc_power
  188. str r9, [r11] @ restore SDRC_POWER, no barrier needed
  189. bx lr
  190. wait_dll_lock:
  191. ldr r11, omap3_sdrc_dlla_status
  192. ldr r12, [r11]
  193. and r12, r12, #LOCKSTATUS_MASK
  194. cmp r12, #LOCKSTATUS_MASK
  195. bne wait_dll_lock
  196. bx lr
  197. wait_dll_unlock:
  198. ldr r11, omap3_sdrc_dlla_status
  199. ldr r12, [r11]
  200. and r12, r12, #LOCKSTATUS_MASK
  201. cmp r12, #0x0
  202. bne wait_dll_unlock
  203. bx lr
  204. configure_sdrc:
  205. ldr r12, omap_sdrc_rfr_ctrl_0_val @ fetch value from SRAM
  206. ldr r11, omap3_sdrc_rfr_ctrl_0 @ fetch addr from SRAM
  207. str r12, [r11] @ store
  208. ldr r12, omap_sdrc_actim_ctrl_a_0_val
  209. ldr r11, omap3_sdrc_actim_ctrl_a_0
  210. str r12, [r11]
  211. ldr r12, omap_sdrc_actim_ctrl_b_0_val
  212. ldr r11, omap3_sdrc_actim_ctrl_b_0
  213. str r12, [r11]
  214. ldr r12, omap_sdrc_mr_0_val
  215. ldr r11, omap3_sdrc_mr_0
  216. str r12, [r11]
  217. ldr r12, omap_sdrc_rfr_ctrl_1_val
  218. cmp r12, #0 @ if SDRC_RFR_CTRL_1 is 0,
  219. beq skip_cs1_prog @ do not program cs1 params
  220. ldr r11, omap3_sdrc_rfr_ctrl_1
  221. str r12, [r11]
  222. ldr r12, omap_sdrc_actim_ctrl_a_1_val
  223. ldr r11, omap3_sdrc_actim_ctrl_a_1
  224. str r12, [r11]
  225. ldr r12, omap_sdrc_actim_ctrl_b_1_val
  226. ldr r11, omap3_sdrc_actim_ctrl_b_1
  227. str r12, [r11]
  228. ldr r12, omap_sdrc_mr_1_val
  229. ldr r11, omap3_sdrc_mr_1
  230. str r12, [r11]
  231. skip_cs1_prog:
  232. ldr r12, [r11] @ posted-write barrier for SDRC
  233. bx lr
  234. omap3_sdrc_power:
  235. .word OMAP34XX_SDRC_REGADDR(SDRC_POWER)
  236. omap3_cm_clksel1_pll:
  237. .word OMAP34XX_CM_REGADDR(PLL_MOD, CM_CLKSEL1)
  238. omap3_cm_idlest1_core:
  239. .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST)
  240. omap3_cm_iclken1_core:
  241. .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_ICLKEN1)
  242. omap3_sdrc_rfr_ctrl_0:
  243. .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_0)
  244. omap3_sdrc_rfr_ctrl_1:
  245. .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_1)
  246. omap3_sdrc_actim_ctrl_a_0:
  247. .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0)
  248. omap3_sdrc_actim_ctrl_a_1:
  249. .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_1)
  250. omap3_sdrc_actim_ctrl_b_0:
  251. .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0)
  252. omap3_sdrc_actim_ctrl_b_1:
  253. .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_1)
  254. omap3_sdrc_mr_0:
  255. .word OMAP34XX_SDRC_REGADDR(SDRC_MR_0)
  256. omap3_sdrc_mr_1:
  257. .word OMAP34XX_SDRC_REGADDR(SDRC_MR_1)
  258. omap_sdrc_rfr_ctrl_0_val:
  259. .word 0xDEADBEEF
  260. omap_sdrc_rfr_ctrl_1_val:
  261. .word 0xDEADBEEF
  262. omap_sdrc_actim_ctrl_a_0_val:
  263. .word 0xDEADBEEF
  264. omap_sdrc_actim_ctrl_a_1_val:
  265. .word 0xDEADBEEF
  266. omap_sdrc_actim_ctrl_b_0_val:
  267. .word 0xDEADBEEF
  268. omap_sdrc_actim_ctrl_b_1_val:
  269. .word 0xDEADBEEF
  270. omap_sdrc_mr_0_val:
  271. .word 0xDEADBEEF
  272. omap_sdrc_mr_1_val:
  273. .word 0xDEADBEEF
  274. omap3_sdrc_dlla_status:
  275. .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
  276. omap3_sdrc_dlla_ctrl:
  277. .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
  278. core_m2_mask_val:
  279. .word 0x07FFFFFF
  280. ENTRY(omap3_sram_configure_core_dpll_sz)
  281. .word . - omap3_sram_configure_core_dpll