lowlevel_init.S 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /*
  2. * Lowlevel setup for ORIGEN board based on S5PV310
  3. *
  4. * Copyright (C) 2011 Samsung Electronics
  5. *
  6. * See file CREDITS for list of people who contributed to this
  7. * project.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License as
  11. * published by the Free Software Foundation; either version 2 of
  12. * the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22. * MA 02111-1307 USA
  23. */
  24. #include <config.h>
  25. #include <version.h>
  26. #include <asm/arch/cpu.h>
  27. #include "origen_setup.h"
  28. /*
  29. * Register usages:
  30. *
  31. * r5 has zero always
  32. * r7 has GPIO part1 base 0x11400000
  33. * r6 has GPIO part2 base 0x11000000
  34. */
  35. _TEXT_BASE:
  36. .word CONFIG_SYS_TEXT_BASE
  37. .globl lowlevel_init
  38. lowlevel_init:
  39. push {lr}
  40. /* r5 has always zero */
  41. mov r5, #0
  42. ldr r7, =S5PC210_GPIO_PART1_BASE
  43. ldr r6, =S5PC210_GPIO_PART2_BASE
  44. /* check reset status */
  45. ldr r0, =(S5PC210_POWER_BASE + INFORM1_OFFSET)
  46. ldr r1, [r0]
  47. /* AFTR wakeup reset */
  48. ldr r2, =S5P_CHECK_DIDLE
  49. cmp r1, r2
  50. beq exit_wakeup
  51. /* LPA wakeup reset */
  52. ldr r2, =S5P_CHECK_LPA
  53. cmp r1, r2
  54. beq exit_wakeup
  55. /* Sleep wakeup reset */
  56. ldr r2, =S5P_CHECK_SLEEP
  57. cmp r1, r2
  58. beq wakeup_reset
  59. /*
  60. * If U-boot is already running in ram, no need to relocate U-Boot.
  61. * Memory controller must be configured before relocating U-Boot
  62. * in ram.
  63. */
  64. ldr r0, =0x0ffffff /* r0 <- Mask Bits*/
  65. bic r1, pc, r0 /* pc <- current addr of code */
  66. /* r1 <- unmasked bits of pc */
  67. ldr r2, _TEXT_BASE /* r2 <- original base addr in ram */
  68. bic r2, r2, r0 /* r2 <- unmasked bits of r2*/
  69. cmp r1, r2 /* compare r1, r2 */
  70. beq 1f /* r0 == r1 then skip sdram init */
  71. /* init system clock */
  72. bl system_clock_init
  73. /* Memory initialize */
  74. bl mem_ctrl_asm_init
  75. 1:
  76. /* for UART */
  77. bl uart_asm_init
  78. bl tzpc_init
  79. pop {pc}
  80. wakeup_reset:
  81. bl system_clock_init
  82. bl mem_ctrl_asm_init
  83. bl tzpc_init
  84. exit_wakeup:
  85. /* Load return address and jump to kernel */
  86. ldr r0, =(S5PC210_POWER_BASE + INFORM0_OFFSET)
  87. /* r1 = physical address of s5pc210_cpu_resume function */
  88. ldr r1, [r0]
  89. /* Jump to kernel*/
  90. mov pc, r1
  91. nop
  92. nop
  93. /*
  94. * system_clock_init: Initialize core clock and bus clock.
  95. * void system_clock_init(void)
  96. */
  97. system_clock_init:
  98. push {lr}
  99. ldr r0, =S5PC210_CLOCK_BASE
  100. /* APLL(1), MPLL(1), CORE(0), HPM(0) */
  101. ldr r1, =CLK_SRC_CPU_VAL
  102. ldr r2, =CLK_SRC_CPU_OFFSET
  103. str r1, [r0, r2]
  104. /* wait ?us */
  105. mov r1, #0x10000
  106. 2: subs r1, r1, #1
  107. bne 2b
  108. ldr r1, =CLK_SRC_TOP0_VAL
  109. ldr r2, =CLK_SRC_TOP0_OFFSET
  110. str r1, [r0, r2]
  111. ldr r1, =CLK_SRC_TOP1_VAL
  112. ldr r2, =CLK_SRC_TOP1_OFFSET
  113. str r1, [r0, r2]
  114. /* DMC */
  115. ldr r1, =CLK_SRC_DMC_VAL
  116. ldr r2, =CLK_SRC_DMC_OFFSET
  117. str r1, [r0, r2]
  118. /*CLK_SRC_LEFTBUS */
  119. ldr r1, =CLK_SRC_LEFTBUS_VAL
  120. ldr r2, =CLK_SRC_LEFTBUS_OFFSET
  121. str r1, [r0, r2]
  122. /*CLK_SRC_RIGHTBUS */
  123. ldr r1, =CLK_SRC_RIGHTBUS_VAL
  124. ldr r2, =CLK_SRC_RIGHTBUS_OFFSET
  125. str r1, [r0, r2]
  126. /* SATA: SCLKMPLL(0), MMC[0:4]: SCLKMPLL(6) */
  127. ldr r1, =CLK_SRC_FSYS_VAL
  128. ldr r2, =CLK_SRC_FSYS_OFFSET
  129. str r1, [r0, r2]
  130. /* UART[0:4] */
  131. ldr r1, =CLK_SRC_PERIL0_VAL
  132. ldr r2, =CLK_SRC_PERIL0_OFFSET
  133. str r1, [r0, r2]
  134. /* wait ?us */
  135. mov r1, #0x10000
  136. 3: subs r1, r1, #1
  137. bne 3b
  138. /* CLK_DIV_CPU0 */
  139. ldr r1, =CLK_DIV_CPU0_VAL
  140. ldr r2, =CLK_DIV_CPU0_OFFSET
  141. str r1, [r0, r2]
  142. /* CLK_DIV_CPU1 */
  143. ldr r1, =CLK_DIV_CPU1_VAL
  144. ldr r2, =CLK_DIV_CPU1_OFFSET
  145. str r1, [r0, r2]
  146. /* CLK_DIV_DMC0 */
  147. ldr r1, =CLK_DIV_DMC0_VAL
  148. ldr r2, =CLK_DIV_DMC0_OFFSET
  149. str r1, [r0, r2]
  150. /*CLK_DIV_DMC1 */
  151. ldr r1, =CLK_DIV_DMC1_VAL
  152. ldr r2, =CLK_DIV_DMC1_OFFSET
  153. str r1, [r0, r2]
  154. /* CLK_DIV_LEFTBUS */
  155. ldr r1, =CLK_DIV_LEFTBUS_VAL
  156. ldr r2, =CLK_DIV_LEFTBUS_OFFSET
  157. str r1, [r0, r2]
  158. /* CLK_DIV_RIGHTBUS */
  159. ldr r1, =CLK_DIV_RIGHTBUS_VAL
  160. ldr r2, =CLK_DIV_RIGHTBUS_OFFSET
  161. str r1, [r0, r2]
  162. /* CLK_DIV_TOP */
  163. ldr r1, =CLK_DIV_TOP_VAL
  164. ldr r2, =CLK_DIV_TOP_OFFSET
  165. str r1, [r0, r2]
  166. /* MMC[0:1] */
  167. ldr r1, =CLK_DIV_FSYS1_VAL /* 800(MPLL) / (15 + 1) */
  168. ldr r2, =CLK_DIV_FSYS1_OFFSET
  169. str r1, [r0, r2]
  170. /* MMC[2:3] */
  171. ldr r1, =CLK_DIV_FSYS2_VAL /* 800(MPLL) / (15 + 1) */
  172. ldr r2, =CLK_DIV_FSYS2_OFFSET
  173. str r1, [r0, r2]
  174. /* MMC4 */
  175. ldr r1, =CLK_DIV_FSYS3_VAL /* 800(MPLL) / (15 + 1) */
  176. ldr r2, =CLK_DIV_FSYS3_OFFSET
  177. str r1, [r0, r2]
  178. /* CLK_DIV_PERIL0: UART Clock Divisors */
  179. ldr r1, =CLK_DIV_PERIL0_VAL
  180. ldr r2, =CLK_DIV_PERIL0_OFFSET
  181. str r1, [r0, r2]
  182. /* Set PLL locktime */
  183. ldr r1, =PLL_LOCKTIME
  184. ldr r2, =APLL_LOCK_OFFSET
  185. str r1, [r0, r2]
  186. ldr r1, =PLL_LOCKTIME
  187. ldr r2, =MPLL_LOCK_OFFSET
  188. str r1, [r0, r2]
  189. ldr r1, =PLL_LOCKTIME
  190. ldr r2, =EPLL_LOCK_OFFSET
  191. str r1, [r0, r2]
  192. ldr r1, =PLL_LOCKTIME
  193. ldr r2, =VPLL_LOCK_OFFSET
  194. str r1, [r0, r2]
  195. /* APLL_CON1 */
  196. ldr r1, =APLL_CON1_VAL
  197. ldr r2, =APLL_CON1_OFFSET
  198. str r1, [r0, r2]
  199. /* APLL_CON0 */
  200. ldr r1, =APLL_CON0_VAL
  201. ldr r2, =APLL_CON0_OFFSET
  202. str r1, [r0, r2]
  203. /* MPLL_CON1 */
  204. ldr r1, =MPLL_CON1_VAL
  205. ldr r2, =MPLL_CON1_OFFSET
  206. str r1, [r0, r2]
  207. /* MPLL_CON0 */
  208. ldr r1, =MPLL_CON0_VAL
  209. ldr r2, =MPLL_CON0_OFFSET
  210. str r1, [r0, r2]
  211. /* EPLL */
  212. ldr r1, =EPLL_CON1_VAL
  213. ldr r2, =EPLL_CON1_OFFSET
  214. str r1, [r0, r2]
  215. /* EPLL_CON0 */
  216. ldr r1, =EPLL_CON0_VAL
  217. ldr r2, =EPLL_CON0_OFFSET
  218. str r1, [r0, r2]
  219. /* VPLL_CON1 */
  220. ldr r1, =VPLL_CON1_VAL
  221. ldr r2, =VPLL_CON1_OFFSET
  222. str r1, [r0, r2]
  223. /* VPLL_CON0 */
  224. ldr r1, =VPLL_CON0_VAL
  225. ldr r2, =VPLL_CON0_OFFSET
  226. str r1, [r0, r2]
  227. /* wait ?us */
  228. mov r1, #0x30000
  229. 4: subs r1, r1, #1
  230. bne 4b
  231. pop {pc}
  232. /*
  233. * uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
  234. * void uart_asm_init(void)
  235. */
  236. .globl uart_asm_init
  237. uart_asm_init:
  238. /* setup UART0-UART3 GPIOs (part1) */
  239. mov r0, r7
  240. ldr r1, =S5PC210_GPIO_A0_CON_VAL
  241. str r1, [r0, #S5PC210_GPIO_A0_CON_OFFSET]
  242. ldr r1, =S5PC210_GPIO_A1_CON_VAL
  243. str r1, [r0, #S5PC210_GPIO_A1_CON_OFFSET]
  244. ldr r0, =S5PC210_UART_BASE
  245. add r0, r0, #S5PC210_DEFAULT_UART_OFFSET
  246. ldr r1, =ULCON_VAL
  247. str r1, [r0, #ULCON_OFFSET]
  248. ldr r1, =UCON_VAL
  249. str r1, [r0, #UCON_OFFSET]
  250. ldr r1, =UFCON_VAL
  251. str r1, [r0, #UFCON_OFFSET]
  252. ldr r1, =UBRDIV_VAL
  253. str r1, [r0, #UBRDIV_OFFSET]
  254. ldr r1, =UFRACVAL_VAL
  255. str r1, [r0, #UFRACVAL_OFFSET]
  256. mov pc, lr
  257. nop
  258. nop
  259. nop
  260. /* Setting TZPC[TrustZone Protection Controller] */
  261. tzpc_init:
  262. ldr r0, =TZPC0_BASE
  263. mov r1, #R0SIZE
  264. str r1, [r0]
  265. mov r1, #DECPROTXSET
  266. str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  267. str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
  268. str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
  269. str r1, [r0, #TZPC_DECPROT3SET_OFFSET]
  270. ldr r0, =TZPC1_BASE
  271. str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  272. str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
  273. str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
  274. str r1, [r0, #TZPC_DECPROT3SET_OFFSET]
  275. ldr r0, =TZPC2_BASE
  276. str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  277. str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
  278. str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
  279. str r1, [r0, #TZPC_DECPROT3SET_OFFSET]
  280. ldr r0, =TZPC3_BASE
  281. str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  282. str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
  283. str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
  284. str r1, [r0, #TZPC_DECPROT3SET_OFFSET]
  285. ldr r0, =TZPC4_BASE
  286. str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  287. str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
  288. str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
  289. str r1, [r0, #TZPC_DECPROT3SET_OFFSET]
  290. ldr r0, =TZPC5_BASE
  291. str r1, [r0, #TZPC_DECPROT0SET_OFFSET]
  292. str r1, [r0, #TZPC_DECPROT1SET_OFFSET]
  293. str r1, [r0, #TZPC_DECPROT2SET_OFFSET]
  294. str r1, [r0, #TZPC_DECPROT3SET_OFFSET]
  295. mov pc, lr