lowlevel_init.S 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /*
  2. * Lowlevel setup for ORIGEN board based on EXYNOS4210
  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, =EXYNOS4_GPIO_PART1_BASE
  43. ldr r6, =EXYNOS4_GPIO_PART2_BASE
  44. /* check reset status */
  45. ldr r0, =(EXYNOS4_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 arch_cpu_init
  79. bl tzpc_init
  80. pop {pc}
  81. wakeup_reset:
  82. bl system_clock_init
  83. bl mem_ctrl_asm_init
  84. bl arch_cpu_init
  85. bl tzpc_init
  86. exit_wakeup:
  87. /* Load return address and jump to kernel */
  88. ldr r0, =(EXYNOS4_POWER_BASE + INFORM0_OFFSET)
  89. /* r1 = physical address of exynos4210_cpu_resume function */
  90. ldr r1, [r0]
  91. /* Jump to kernel*/
  92. mov pc, r1
  93. nop
  94. nop
  95. /*
  96. * system_clock_init: Initialize core clock and bus clock.
  97. * void system_clock_init(void)
  98. */
  99. system_clock_init:
  100. push {lr}
  101. ldr r0, =EXYNOS4_CLOCK_BASE
  102. /* APLL(1), MPLL(1), CORE(0), HPM(0) */
  103. ldr r1, =CLK_SRC_CPU_VAL
  104. ldr r2, =CLK_SRC_CPU_OFFSET
  105. str r1, [r0, r2]
  106. /* wait ?us */
  107. mov r1, #0x10000
  108. 2: subs r1, r1, #1
  109. bne 2b
  110. ldr r1, =CLK_SRC_TOP0_VAL
  111. ldr r2, =CLK_SRC_TOP0_OFFSET
  112. str r1, [r0, r2]
  113. ldr r1, =CLK_SRC_TOP1_VAL
  114. ldr r2, =CLK_SRC_TOP1_OFFSET
  115. str r1, [r0, r2]
  116. /* DMC */
  117. ldr r1, =CLK_SRC_DMC_VAL
  118. ldr r2, =CLK_SRC_DMC_OFFSET
  119. str r1, [r0, r2]
  120. /*CLK_SRC_LEFTBUS */
  121. ldr r1, =CLK_SRC_LEFTBUS_VAL
  122. ldr r2, =CLK_SRC_LEFTBUS_OFFSET
  123. str r1, [r0, r2]
  124. /*CLK_SRC_RIGHTBUS */
  125. ldr r1, =CLK_SRC_RIGHTBUS_VAL
  126. ldr r2, =CLK_SRC_RIGHTBUS_OFFSET
  127. str r1, [r0, r2]
  128. /* SATA: SCLKMPLL(0), MMC[0:4]: SCLKMPLL(6) */
  129. ldr r1, =CLK_SRC_FSYS_VAL
  130. ldr r2, =CLK_SRC_FSYS_OFFSET
  131. str r1, [r0, r2]
  132. /* UART[0:4] */
  133. ldr r1, =CLK_SRC_PERIL0_VAL
  134. ldr r2, =CLK_SRC_PERIL0_OFFSET
  135. str r1, [r0, r2]
  136. /* CAM , FIMC 0-3 */
  137. ldr r1, =CLK_SRC_CAM_VAL
  138. ldr r2, =CLK_SRC_CAM_OFFSET
  139. str r1, [r0, r2]
  140. /* MFC */
  141. ldr r1, =CLK_SRC_MFC_VAL
  142. ldr r2, =CLK_SRC_MFC_OFFSET
  143. str r1, [r0, r2]
  144. /* G3D */
  145. ldr r1, =CLK_SRC_G3D_VAL
  146. ldr r2, =CLK_SRC_G3D_OFFSET
  147. str r1, [r0, r2]
  148. /* LCD0 */
  149. ldr r1, =CLK_SRC_LCD0_VAL
  150. ldr r2, =CLK_SRC_LCD0_OFFSET
  151. str r1, [r0, r2]
  152. /* wait ?us */
  153. mov r1, #0x10000
  154. 3: subs r1, r1, #1
  155. bne 3b
  156. /* CLK_DIV_CPU0 */
  157. ldr r1, =CLK_DIV_CPU0_VAL
  158. ldr r2, =CLK_DIV_CPU0_OFFSET
  159. str r1, [r0, r2]
  160. /* CLK_DIV_CPU1 */
  161. ldr r1, =CLK_DIV_CPU1_VAL
  162. ldr r2, =CLK_DIV_CPU1_OFFSET
  163. str r1, [r0, r2]
  164. /* CLK_DIV_DMC0 */
  165. ldr r1, =CLK_DIV_DMC0_VAL
  166. ldr r2, =CLK_DIV_DMC0_OFFSET
  167. str r1, [r0, r2]
  168. /*CLK_DIV_DMC1 */
  169. ldr r1, =CLK_DIV_DMC1_VAL
  170. ldr r2, =CLK_DIV_DMC1_OFFSET
  171. str r1, [r0, r2]
  172. /* CLK_DIV_LEFTBUS */
  173. ldr r1, =CLK_DIV_LEFTBUS_VAL
  174. ldr r2, =CLK_DIV_LEFTBUS_OFFSET
  175. str r1, [r0, r2]
  176. /* CLK_DIV_RIGHTBUS */
  177. ldr r1, =CLK_DIV_RIGHTBUS_VAL
  178. ldr r2, =CLK_DIV_RIGHTBUS_OFFSET
  179. str r1, [r0, r2]
  180. /* CLK_DIV_TOP */
  181. ldr r1, =CLK_DIV_TOP_VAL
  182. ldr r2, =CLK_DIV_TOP_OFFSET
  183. str r1, [r0, r2]
  184. /* MMC[0:1] */
  185. ldr r1, =CLK_DIV_FSYS1_VAL /* 800(MPLL) / (15 + 1) */
  186. ldr r2, =CLK_DIV_FSYS1_OFFSET
  187. str r1, [r0, r2]
  188. /* MMC[2:3] */
  189. ldr r1, =CLK_DIV_FSYS2_VAL /* 800(MPLL) / (15 + 1) */
  190. ldr r2, =CLK_DIV_FSYS2_OFFSET
  191. str r1, [r0, r2]
  192. /* MMC4 */
  193. ldr r1, =CLK_DIV_FSYS3_VAL /* 800(MPLL) / (15 + 1) */
  194. ldr r2, =CLK_DIV_FSYS3_OFFSET
  195. str r1, [r0, r2]
  196. /* CLK_DIV_PERIL0: UART Clock Divisors */
  197. ldr r1, =CLK_DIV_PERIL0_VAL
  198. ldr r2, =CLK_DIV_PERIL0_OFFSET
  199. str r1, [r0, r2]
  200. /* CAM, FIMC 0-3: CAM Clock Divisors */
  201. ldr r1, =CLK_DIV_CAM_VAL
  202. ldr r2, =CLK_DIV_CAM_OFFSET
  203. str r1, [r0, r2]
  204. /* CLK_DIV_MFC: MFC Clock Divisors */
  205. ldr r1, =CLK_DIV_MFC_VAL
  206. ldr r2, =CLK_DIV_MFC_OFFSET
  207. str r1, [r0, r2]
  208. /* CLK_DIV_G3D: G3D Clock Divisors */
  209. ldr r1, =CLK_DIV_G3D_VAL
  210. ldr r2, =CLK_DIV_G3D_OFFSET
  211. str r1, [r0, r2]
  212. /* CLK_DIV_LCD0: LCD0 Clock Divisors */
  213. ldr r1, =CLK_DIV_LCD0_VAL
  214. ldr r2, =CLK_DIV_LCD0_OFFSET
  215. str r1, [r0, r2]
  216. /* Set PLL locktime */
  217. ldr r1, =PLL_LOCKTIME
  218. ldr r2, =APLL_LOCK_OFFSET
  219. str r1, [r0, r2]
  220. ldr r1, =PLL_LOCKTIME
  221. ldr r2, =MPLL_LOCK_OFFSET
  222. str r1, [r0, r2]
  223. ldr r1, =PLL_LOCKTIME
  224. ldr r2, =EPLL_LOCK_OFFSET
  225. str r1, [r0, r2]
  226. ldr r1, =PLL_LOCKTIME
  227. ldr r2, =VPLL_LOCK_OFFSET
  228. str r1, [r0, r2]
  229. /* APLL_CON1 */
  230. ldr r1, =APLL_CON1_VAL
  231. ldr r2, =APLL_CON1_OFFSET
  232. str r1, [r0, r2]
  233. /* APLL_CON0 */
  234. ldr r1, =APLL_CON0_VAL
  235. ldr r2, =APLL_CON0_OFFSET
  236. str r1, [r0, r2]
  237. /* MPLL_CON1 */
  238. ldr r1, =MPLL_CON1_VAL
  239. ldr r2, =MPLL_CON1_OFFSET
  240. str r1, [r0, r2]
  241. /* MPLL_CON0 */
  242. ldr r1, =MPLL_CON0_VAL
  243. ldr r2, =MPLL_CON0_OFFSET
  244. str r1, [r0, r2]
  245. /* EPLL */
  246. ldr r1, =EPLL_CON1_VAL
  247. ldr r2, =EPLL_CON1_OFFSET
  248. str r1, [r0, r2]
  249. /* EPLL_CON0 */
  250. ldr r1, =EPLL_CON0_VAL
  251. ldr r2, =EPLL_CON0_OFFSET
  252. str r1, [r0, r2]
  253. /* VPLL_CON1 */
  254. ldr r1, =VPLL_CON1_VAL
  255. ldr r2, =VPLL_CON1_OFFSET
  256. str r1, [r0, r2]
  257. /* VPLL_CON0 */
  258. ldr r1, =VPLL_CON0_VAL
  259. ldr r2, =VPLL_CON0_OFFSET
  260. str r1, [r0, r2]
  261. /* wait ?us */
  262. mov r1, #0x30000
  263. 4: subs r1, r1, #1
  264. bne 4b
  265. pop {pc}
  266. /*
  267. * uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
  268. * void uart_asm_init(void)
  269. */
  270. .globl uart_asm_init
  271. uart_asm_init:
  272. /* setup UART0-UART3 GPIOs (part1) */
  273. mov r0, r7
  274. ldr r1, =EXYNOS4_GPIO_A0_CON_VAL
  275. str r1, [r0, #EXYNOS4_GPIO_A0_CON_OFFSET]
  276. ldr r1, =EXYNOS4_GPIO_A1_CON_VAL
  277. str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]
  278. ldr r0, =EXYNOS4_UART_BASE
  279. add r0, r0, #EXYNOS4_DEFAULT_UART_OFFSET
  280. ldr r1, =ULCON_VAL
  281. str r1, [r0, #ULCON_OFFSET]
  282. ldr r1, =UCON_VAL
  283. str r1, [r0, #UCON_OFFSET]
  284. ldr r1, =UFCON_VAL
  285. str r1, [r0, #UFCON_OFFSET]
  286. ldr r1, =UBRDIV_VAL
  287. str r1, [r0, #UBRDIV_OFFSET]
  288. ldr r1, =UFRACVAL_VAL
  289. str r1, [r0, #UFRACVAL_OFFSET]
  290. mov pc, lr
  291. nop
  292. nop
  293. nop