lowlevel_init.S 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. /*
  2. * Lowlevel setup for universal board based on EXYNOS4210
  3. *
  4. * Copyright (C) 2010 Samsung Electronics
  5. * Kyungmin Park <kyungmin.park@samsung.com>
  6. *
  7. * See file CREDITS for list of people who contributed to this
  8. * project.
  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 as
  12. * published by the Free Software Foundation; either version 2 of
  13. * the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  23. * MA 02111-1307 USA
  24. */
  25. #include <config.h>
  26. #include <version.h>
  27. #include <asm/arch/cpu.h>
  28. #include <asm/arch/clock.h>
  29. /*
  30. * Register usages:
  31. *
  32. * r5 has zero always
  33. * r7 has GPIO part1 base 0x11400000
  34. * r6 has GPIO part2 base 0x11000000
  35. */
  36. .globl lowlevel_init
  37. lowlevel_init:
  38. mov r11, lr
  39. /* r5 has always zero */
  40. mov r5, #0
  41. ldr r7, =EXYNOS4_GPIO_PART1_BASE
  42. ldr r6, =EXYNOS4_GPIO_PART2_BASE
  43. /* System Timer */
  44. ldr r0, =EXYNOS4_SYSTIMER_BASE
  45. ldr r1, =0x5000
  46. str r1, [r0, #0x0]
  47. ldr r1, =0xffffffff
  48. str r1, [r0, #0x8]
  49. ldr r1, =0x49
  50. str r1, [r0, #0x4]
  51. /* PMIC manual reset */
  52. /* nPOWER: XEINT_23: GPX2[7] */
  53. add r0, r6, #0xC40 @ EXYNOS4_GPIO_X2_OFFSET
  54. ldr r1, [r0, #0x0]
  55. bic r1, r1, #(0xf << 28) @ 28 = 7 * 4-bit
  56. orr r1, r1, #(0x1 << 28) @ Output
  57. str r1, [r0, #0x0]
  58. ldr r1, [r0, #0x4]
  59. orr r1, r1, #(1 << 7) @ 7 = 7 * 1-bit
  60. str r1, [r0, #0x4]
  61. /* init system clock */
  62. bl system_clock_init
  63. /* Disable Watchdog */
  64. ldr r0, =EXYNOS4_WATCHDOG_BASE @0x10060000
  65. str r5, [r0]
  66. /* UART */
  67. bl uart_asm_init
  68. /* PMU init */
  69. bl system_power_init
  70. bl tzpc_init
  71. mov lr, r11
  72. mov pc, lr
  73. nop
  74. nop
  75. nop
  76. /*
  77. * uart_asm_init: Initialize UART's pins
  78. */
  79. uart_asm_init:
  80. /*
  81. * setup UART0-UART4 GPIOs (part1)
  82. * GPA1CON[3] = I2C_3_SCL (3)
  83. * GPA1CON[2] = I2C_3_SDA (3)
  84. */
  85. mov r0, r7
  86. ldr r1, =0x22222222
  87. str r1, [r0, #0x00] @ EXYNOS4_GPIO_A0_OFFSET
  88. ldr r1, =0x00223322
  89. str r1, [r0, #0x20] @ EXYNOS4_GPIO_A1_OFFSET
  90. /* UART_SEL GPY4[7] (part2) at EXYNOS4 */
  91. add r0, r6, #0x1A0 @ EXYNOS4_GPIO_Y4_OFFSET
  92. ldr r1, [r0, #0x0]
  93. bic r1, r1, #(0xf << 28) @ 28 = 7 * 4-bit
  94. orr r1, r1, #(0x1 << 28)
  95. str r1, [r0, #0x0]
  96. ldr r1, [r0, #0x8]
  97. bic r1, r1, #(0x3 << 14) @ 14 = 7 * 2-bit
  98. orr r1, r1, #(0x3 << 14) @ Pull-up enabled
  99. str r1, [r0, #0x8]
  100. ldr r1, [r0, #0x4]
  101. orr r1, r1, #(1 << 7) @ 7 = 7 * 1-bit
  102. str r1, [r0, #0x4]
  103. mov pc, lr
  104. nop
  105. nop
  106. nop
  107. system_clock_init:
  108. ldr r0, =EXYNOS4_CLOCK_BASE
  109. /* APLL(1), MPLL(1), CORE(0), HPM(0) */
  110. ldr r1, =0x0101
  111. ldr r2, =0x14200 @ CLK_SRC_CPU
  112. str r1, [r0, r2]
  113. /* wait ?us */
  114. mov r1, #0x10000
  115. 1: subs r1, r1, #1
  116. bne 1b
  117. /*
  118. * CLK_SRC_TOP0
  119. * MUX_ONENAND_SEL[28] 0: DOUT133, 1: DOUT166
  120. * MUX_VPLL_SEL[8] 0: FINPLL, 1: FOUTVPLL
  121. * MUX_EPLL_SEL[4] 0: FINPLL, 1: FOUTEPLL
  122. */
  123. ldr r1, =0x10000110
  124. ldr r2, =0x0C210 @ CLK_SRC_TOP
  125. str r1, [r0, r2]
  126. /* SATA: SCLKMPLL(0), MMC[0:4]: SCLKMPLL(6) */
  127. ldr r1, =0x0066666
  128. ldr r2, =0x0C240 @ CLK_SRC_FSYS
  129. str r1, [r0, r2]
  130. /* UART[0:5], PWM: SCLKMPLL(6) */
  131. ldr r1, =0x6666666
  132. ldr r2, =0x0C250 @ CLK_SRC_PERIL0_OFFSET
  133. str r1, [r0, r2]
  134. /* CPU0: CORE, COREM0, COREM1, PERI, ATB, PCLK_DBG, APLL */
  135. ldr r1, =0x0133730
  136. ldr r2, =0x14500 @ CLK_DIV_CPU0
  137. str r1, [r0, r2]
  138. /* CPU1: COPY, HPM */
  139. ldr r1, =0x03
  140. ldr r2, =0x14504 @ CLK_DIV_CPU1
  141. str r1, [r0, r2]
  142. /* DMC0: ACP, ACP_PCLK, DPHY, DMC, DMCD, DMCP, COPY2 CORE_TIMER */
  143. ldr r1, =0x13111113
  144. ldr r2, =0x10500 @ CLK_DIV_DMC0
  145. str r1, [r0, r2]
  146. /* DMC1: PWI, DVSEM, DPM */
  147. ldr r1, =0x01010100
  148. ldr r2, =0x10504 @ CLK_DIV_DMC1
  149. str r1, [r0, r2]
  150. /* LEFTBUS: GDL, GPL */
  151. ldr r1, =0x13
  152. ldr r2, =0x04500 @ CLK_DIV_LEFTBUS
  153. str r1, [r0, r2]
  154. /* RIGHHTBUS: GDR, GPR */
  155. ldr r1, =0x13
  156. ldr r2, =0x08500 @ CLK_DIV_RIGHTBUS
  157. str r1, [r0, r2]
  158. /*
  159. * CLK_DIV_TOP
  160. * ONENAND_RATIOD[18:16]: 0 SCLK_ONENAND = MOUTONENAND / (n + 1)
  161. * ACLK_200, ACLK_100, ACLK_160, ACLK_133,
  162. */
  163. ldr r1, =0x00005473
  164. ldr r2, =0x0C510 @ CLK_DIV_TOP
  165. str r1, [r0, r2]
  166. /* MMC[0:1] */
  167. ldr r1, =0x000f000f /* 800(MPLL) / (15 + 1) */
  168. ldr r2, =0x0C544 @ CLK_DIV_FSYS1
  169. str r1, [r0, r2]
  170. /* MMC[2:3] */
  171. ldr r1, =0x000f000f /* 800(MPLL) / (15 + 1) */
  172. ldr r2, =0x0C548 @ CLK_DIV_FSYS2
  173. str r1, [r0, r2]
  174. /* MMC4 */
  175. ldr r1, =0x000f /* 800(MPLL) / (15 + 1) */
  176. ldr r2, =0x0C54C @ CLK_DIV_FSYS3
  177. str r1, [r0, r2]
  178. /* UART[0:5] */
  179. ldr r1, =0x774777
  180. ldr r2, =0x0C550 @ CLK_DIV_PERIL0
  181. str r1, [r0, r2]
  182. /* SLIMBUS: ???, PWM */
  183. ldr r1, =0x8
  184. ldr r2, =0x0C55C @ CLK_DIV_PERIL3
  185. str r1, [r0, r2]
  186. /* PLL Setting */
  187. ldr r1, =0x1C20
  188. ldr r2, =0x14000 @ APLL_LOCK
  189. str r1, [r0, r2]
  190. ldr r2, =0x14008 @ MPLL_LOCK
  191. str r1, [r0, r2]
  192. ldr r2, =0x0C010 @ EPLL_LOCK
  193. str r1, [r0, r2]
  194. ldr r2, =0x0C020 @ VPLL_LOCK
  195. str r1, [r0, r2]
  196. /* APLL */
  197. ldr r1, =0x8000001c
  198. ldr r2, =0x14104 @ APLL_CON1
  199. str r1, [r0, r2]
  200. ldr r1, =0x80c80601 @ 800MHz
  201. ldr r2, =0x14100 @ APLL_CON0
  202. str r1, [r0, r2]
  203. /* MPLL */
  204. ldr r1, =0x8000001C
  205. ldr r2, =0x1410C @ MPLL_CON1
  206. str r1, [r0, r2]
  207. ldr r1, =0x80c80601 @ 800MHz
  208. ldr r2, =0x14108 @ MPLL_CON0
  209. str r1, [r0, r2]
  210. /* EPLL */
  211. ldr r1, =0x0
  212. ldr r2, =0x0C114 @ EPLL_CON1
  213. str r1, [r0, r2]
  214. ldr r1, =0x80300302 @ 96MHz
  215. ldr r2, =0x0C110 @ EPLL_CON0
  216. str r1, [r0, r2]
  217. /* VPLL */
  218. ldr r1, =0x11000400
  219. ldr r2, =0x0C124 @ VPLL_CON1
  220. str r1, [r0, r2]
  221. ldr r1, =0x80350302 @ 108MHz
  222. ldr r2, =0x0C120 @ VPLL_CON0
  223. str r1, [r0, r2]
  224. /*
  225. * SMMUJPEG[11], JPEG[6], CSIS1[5] : 0111 1001
  226. * Turn off all
  227. */
  228. ldr r1, =0xFFF80000
  229. ldr r2, =0x0C920 @ CLK_GATE_IP_CAM
  230. str r1, [r0, r2]
  231. /* Turn off all */
  232. ldr r1, =0xFFFFFFC0
  233. ldr r2, =0x0C924 @ CLK_GATE_IP_VP
  234. str r1, [r0, r2]
  235. /* Turn off all */
  236. ldr r1, =0xFFFFFFE0
  237. ldr r2, =0x0C928 @ CLK_GATE_IP_MFC
  238. str r1, [r0, r2]
  239. /* Turn off all */
  240. ldr r1, =0xFFFFFFFC
  241. ldr r2, =0x0C92C @ CLK_GATE_IP_G3D
  242. str r1, [r0, r2]
  243. /* Turn off all */
  244. ldr r1, =0xFFFFFC00
  245. ldr r2, =0x0C930 @ CLK_GATE_IP_IMAGE
  246. str r1, [r0, r2]
  247. /* DSIM0[3], MDNIE0[2], MIE0[1] : 0001 */
  248. ldr r1, =0xFFFFFFF1
  249. ldr r2, =0x0C934 @ CLK_GATE_IP_LCD0
  250. str r1, [r0, r2]
  251. /* Turn off all */
  252. ldr r1, =0xFFFFFFC0
  253. ldr r2, =0x0C938 @ CLK_GATE_IP_LCD1
  254. str r1, [r0, r2]
  255. /*
  256. * SMMUPCIE[18], NFCON[16] : 1111 1010
  257. * PCIE[14], SATA[10], SDMMC43[9:8] : 1011 1000
  258. * SDMMC1[6], TSI[4], SATAPHY[3], PCIEPHY[2] : 1010 0011
  259. */
  260. ldr r1, =0xFFFAB8A3
  261. ldr r2, =0x0C940 @ CLK_GATE_IP_FSYS
  262. str r1, [r0, r2]
  263. /* Turn off all */
  264. ldr r1, =0xFFFFFFFC
  265. ldr r2, =0x0C94C @ CLK_GATE_IP_GPS
  266. str r1, [r0, r2]
  267. /*
  268. * AC97[27], SPDIF[26], SLIMBUS[25] : 1111 0001
  269. * I2C2[8] : 1111 1110
  270. */
  271. ldr r1, =0xF1FFFEFF
  272. ldr r2, =0x0C950 @ CLK_GATE_IP_PERIL
  273. str r1, [r0, r2]
  274. /*
  275. * KEYIF[16] : 1111 1110
  276. */
  277. ldr r1, =0xFFFEFFFF
  278. ldr r2, =0x0C960 @ CLK_GATE_IP_PERIR
  279. str r1, [r0, r2]
  280. /* LCD1[5], G3D[3], MFC[2], TV[1] : 1101 0001 */
  281. ldr r1, =0xFFFFFFD1
  282. ldr r2, =0x0C970 @ CLK_GATE_BLOCK
  283. str r1, [r0, r2]
  284. mov pc, lr
  285. nop
  286. nop
  287. nop
  288. system_power_init:
  289. ldr r0, =EXYNOS4_POWER_BASE @ 0x10020000
  290. ldr r2, =0x330C @ PS_HOLD_CONTROL
  291. ldr r1, [r0, r2]
  292. orr r1, r1, #(0x3 << 8) @ Data High, Output En
  293. str r1, [r0, r2]
  294. /* Power Down */
  295. add r2, r0, #0x3000
  296. str r5, [r2, #0xC20] @ TV_CONFIGURATION
  297. str r5, [r2, #0xC40] @ MFC_CONFIGURATION
  298. str r5, [r2, #0xC60] @ G3D_CONFIGURATION
  299. str r5, [r2, #0xCA0] @ LCD1_CONFIGURATION
  300. str r5, [r2, #0xCE0] @ GPS_CONFIGURATION
  301. mov pc, lr
  302. nop
  303. nop
  304. nop
  305. tzpc_init:
  306. ldr r0, =0x10110000
  307. mov r1, #0x0
  308. str r1, [r0]
  309. mov r1, #0xff
  310. str r1, [r0, #0x0804]
  311. str r1, [r0, #0x0810]
  312. str r1, [r0, #0x081C]
  313. str r1, [r0, #0x0828]
  314. ldr r0, =0x10120000
  315. mov r1, #0x0
  316. str r1, [r0]
  317. mov r1, #0xff
  318. str r1, [r0, #0x0804]
  319. str r1, [r0, #0x0810]
  320. str r1, [r0, #0x081C]
  321. str r1, [r0, #0x0828]
  322. ldr r0, =0x10130000
  323. mov r1, #0x0
  324. str r1, [r0]
  325. mov r1, #0xff
  326. str r1, [r0, #0x0804]
  327. str r1, [r0, #0x0810]
  328. str r1, [r0, #0x081C]
  329. str r1, [r0, #0x0828]
  330. ldr r0, =0x10140000
  331. mov r1, #0x0
  332. str r1, [r0]
  333. mov r1, #0xff
  334. str r1, [r0, #0x0804]
  335. str r1, [r0, #0x0810]
  336. str r1, [r0, #0x081C]
  337. str r1, [r0, #0x0828]
  338. ldr r0, =0x10150000
  339. mov r1, #0x0
  340. str r1, [r0]
  341. mov r1, #0xff
  342. str r1, [r0, #0x0804]
  343. str r1, [r0, #0x0810]
  344. str r1, [r0, #0x081C]
  345. str r1, [r0, #0x0828]
  346. mov pc, lr