setup.S 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /*
  2. * Board specific setup info
  3. *
  4. * (C) Copyright 2004 Ales Jindra <jindra@2n.cz>
  5. * (C) Copyright 2005 Ladislav Michl <michl@2n.cz>
  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
  12. * version 2 published by the Free Software Foundation.
  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. _TEXT_BASE:
  27. .word TEXT_BASE /* SDRAM load addr from config.mk */
  28. OMAP5910_LPG1_BASE: .word 0xfffbd000
  29. OMAP5910_TIPB_SWITCHES_BASE: .word 0xfffbc800
  30. OMAP5910_MPU_TC_BASE: .word 0xfffecc00
  31. OMAP5910_MPU_CLKM_BASE: .word 0xfffece00
  32. OMAP5910_ULPD_PWR_MNG_BASE: .word 0xfffe0800
  33. OMAP5910_DPLL1_BASE: .word 0xfffecf00
  34. OMAP5910_GPIO_BASE: .word 0xfffce000
  35. OMAP5910_MPU_WD_TIMER_BASE: .word 0xfffec800
  36. OMAP5910_MPUI_BASE: .word 0xfffec900
  37. _OMAP5910_ARM_CKCTL: .word OMAP5910_ARM_CKCTL
  38. _OMAP5910_ARM_EN_CLK: .word OMAP5910_ARM_EN_CLK
  39. OMAP5910_MPUI_CTRL: .word 0x0000ff1b
  40. VAL_EMIFS_CS0_CONFIG: .word 0x00009090
  41. VAL_EMIFS_CS1_CONFIG: .word 0x00003031
  42. VAL_EMIFS_CS2_CONFIG: .word 0x00003031
  43. VAL_EMIFS_CS3_CONFIG: .word 0x0000c0c0
  44. VAL_EMIFS_DYN_WAIT: .word 0x00000000
  45. /* autorefresh counter 0x246 ((64000000/13.4)-400)/8192) */
  46. /* SLRF SD_RET ARE SDRAM_TYPE ARCV SDRAM_FREQUENCY PWD CLK */
  47. VAL_EMIFF_SDRAM_CONFIG: .word ((0 << 0) | (0 << 1) | (3 << 2) | (0xd << 4) | (0x246 << 8) | (0 << 24) | (0 << 26) | (0 << 27))
  48. VAL_EMIFF_SDRAM_CONFIG2: .word 0x00000003
  49. VAL_EMIFF_MRS: .word 0x00000037
  50. /*
  51. * GPIO04 - D4 (Onboard LED)
  52. * GPIO07 - LAN91C111 reset
  53. */
  54. GPIO_DIRECTION:
  55. .word 0x0000ff6f
  56. /*
  57. * Disable everything, but D4 LED (connected through invertor)
  58. */
  59. GPIO_OUTPUT:
  60. .word 0x00000010
  61. MUX_CONFIG_BASE:
  62. .word 0xfffe1000
  63. MUX_CONFIG_VALUES:
  64. .align 4
  65. .word 0x00000000 @ FUNC_MUX_CTRL_0
  66. .word 0x00000000 @ FUNC_MUX_CTRL_1
  67. .word 0x00000000 @ FUNC_MUX_CTRL_2
  68. .word 0x00000000 @ FUNC_MUX_CTRL_3
  69. .word 0x00000000 @ FUNC_MUX_CTRL_4
  70. .word 0x12082480 @ FUNC_MUX_CTRL_5
  71. .word 0x0000001c @ FUNC_MUX_CTRL_6
  72. .word 0x00000003 @ FUNC_MUX_CTRL_7
  73. .word 0x10001200 @ FUNC_MUX_CTRL_8
  74. .word 0x01201012 @ FUNC_MUX_CTRL_9
  75. .word 0x02081248 @ FUNC_MUX_CTRL_A
  76. .word 0x00001248 @ FUNC_MUX_CTRL_B
  77. .word 0x12240000 @ FUNC_MUX_CTRL_C
  78. .word 0x00002000 @ FUNC_MUX_CTRL_D
  79. .word 0x00000000 @ PULL_DWN_CTRL_0
  80. .word 0x0000085f @ PULL_DWN_CTRL_1
  81. .word 0x01001000 @ PULL_DWN_CTRL_2
  82. .word 0x00000000 @ PULL_DWN_CTRL_3
  83. .word 0x00000000 @ GATE_INH_CTRL_0
  84. .word 0x00000000 @ VOLTAGE_CTRL_0
  85. .word 0x00000000 @ TEST_DBG_CTRL_0
  86. .word 0x00000006 @ MOD_CONF_CTRL_0
  87. .word 0x0000eaef @ COMP_MODE_CTRL_0
  88. MUX_CONFIG_OFFSETS:
  89. .align 1
  90. .byte 0x00 @ FUNC_MUX_CTRL_0
  91. .byte 0x04 @ FUNC_MUX_CTRL_1
  92. .byte 0x08 @ FUNC_MUX_CTRL_2
  93. .byte 0x10 @ FUNC_MUX_CTRL_3
  94. .byte 0x14 @ FUNC_MUX_CTRL_4
  95. .byte 0x18 @ FUNC_MUX_CTRL_5
  96. .byte 0x1c @ FUNC_MUX_CTRL_6
  97. .byte 0x20 @ FUNC_MUX_CTRL_7
  98. .byte 0x24 @ FUNC_MUX_CTRL_8
  99. .byte 0x28 @ FUNC_MUX_CTRL_9
  100. .byte 0x2c @ FUNC_MUX_CTRL_A
  101. .byte 0x30 @ FUNC_MUX_CTRL_B
  102. .byte 0x34 @ FUNC_MUX_CTRL_C
  103. .byte 0x38 @ FUNC_MUX_CTRL_D
  104. .byte 0x40 @ PULL_DWN_CTRL_0
  105. .byte 0x44 @ PULL_DWN_CTRL_1
  106. .byte 0x48 @ PULL_DWN_CTRL_2
  107. .byte 0x4c @ PULL_DWN_CTRL_3
  108. .byte 0x50 @ GATE_INH_CTRL_0
  109. .byte 0x60 @ VOLTAGE_CTRL_0
  110. .byte 0x70 @ TEST_DBG_CTRL_0
  111. .byte 0x80 @ MOD_CONF_CTRL_0
  112. .byte 0x0c @ COMP_MODE_CTRL_0
  113. .byte 0xff
  114. .globl lowlevel_init
  115. lowlevel_init:
  116. /* Improve performance a bit... */
  117. mrc p15, 0, r1, c0, c0, 0 @ read C15 ID register
  118. mrc p15, 0, r1, c0, c0, 1 @ read C15 Cache information register
  119. mrc p15, 0, r1, c1, c0, 0 @ read C15 Control register
  120. orr r1, r1, #0x1000 @ enable I-cache, map interrupt vector 0xffff0000
  121. mcr p15, 0, r1, c1, c0, 0 @ write C15 Control register
  122. mov r1, #0x00
  123. mcr p15, 0, r1, c7, c5, 0 @ Flush I-cache
  124. nop
  125. nop
  126. nop
  127. nop
  128. /* Setup clocking mode */
  129. ldr r0, OMAP5910_MPU_CLKM_BASE @ prepare base of CLOCK unit
  130. ldrh r1, [r0, #0x18] @ get reset status
  131. bic r1, r1, #(7 << 11) @ clear clock select
  132. orr r1, r1, #(2 << 11) @ set synchronous scalable
  133. mov r2, #0 @ set wait counter to 100 clock cycles
  134. icache_loop:
  135. cmp r2, #0x01
  136. streqh r1, [r0, #0x18]
  137. add r2, r2, #0x01
  138. cmp r2, #0x10
  139. bne icache_loop
  140. nop
  141. /* Setup clock divisors */
  142. ldr r0, OMAP5910_MPU_CLKM_BASE @ base of CLOCK unit
  143. ldr r1, _OMAP5910_ARM_CKCTL
  144. orr r1, r1, #0x2000 @ enable DSP clock
  145. strh r1, [r0, #0x00] @ setup clock divisors
  146. /* Setup DPLL to generate requested freq */
  147. ldr r0, OMAP5910_DPLL1_BASE @ base of DPLL1 register
  148. mov r1, #0x0010 @ set PLL_ENABLE
  149. orr r1, r1, #0x2000 @ set IOB to new locking
  150. orr r1, r1, #(OMAP5910_DPLL_MUL << 7) @ setup multiplier CLKREF
  151. orr r1, r1, #(OMAP5910_DPLL_DIV << 5) @ setup divider CLKREF
  152. strh r1, [r0] @ write
  153. locking:
  154. ldrh r1, [r0] @ get DPLL value
  155. tst r1, #0x01
  156. beq locking @ while LOCK not set
  157. /* Enable clock */
  158. ldr r0, OMAP5910_MPU_CLKM_BASE @ base of CLOCK unit
  159. mov r1, #(1 << 10) @ disable idle mode do not check
  160. @ nWAKEUP pin, other remain active
  161. strh r1, [r0, #0x04]
  162. ldr r1, _OMAP5910_ARM_EN_CLK
  163. strh r1, [r0, #0x08]
  164. mov r1, #0x003f @ FLASH.RP not enabled in idle and
  165. @ max delayed ( 32 x CLKIN )
  166. strh r1, [r0, #0x0c]
  167. /* Configure 5910 pins functions to match our board. */
  168. ldr r0, MUX_CONFIG_BASE
  169. adr r1, MUX_CONFIG_VALUES
  170. adr r2, MUX_CONFIG_OFFSETS
  171. next_mux_cfg:
  172. ldrb r3, [r2], #1
  173. ldr r4, [r1], #4
  174. cmp r3, #0xff
  175. strne r4, [r0, r3]
  176. bne next_mux_cfg
  177. /* Configure GPIO pins (also enables onboard LED) */
  178. ldr r0, OMAP5910_GPIO_BASE
  179. ldr r1, GPIO_OUTPUT
  180. strh r1, [r0, #0x04]
  181. ldr r1, GPIO_DIRECTION
  182. strh r1, [r0, #0x08]
  183. /* EnablePeripherals */
  184. ldr r0, OMAP5910_MPU_CLKM_BASE @ CLOCK unit
  185. mov r1, #0x0001 @ Peripheral enable
  186. strh r1, [r0, #0x14]
  187. /* Program LED Pulse Generator */
  188. ldr r0, OMAP5910_LPG1_BASE @ 1st LED Pulse Generator
  189. mov r1, #0x7F @ Set obscure frequency in
  190. strb r1, [r0, #0x00] @ LCR
  191. mov r1, #0x01 @ Enable clock (CLK_EN) in
  192. strb r1, [r0, #0x04] @ PMR
  193. /* TIPB Lock UART1 */
  194. ldr r0, OMAP5910_TIPB_SWITCHES_BASE @ prepare base of TIPB switches
  195. mov r1, #1 @ ARM allocated
  196. strh r1, [r0,#0x04] @ clear IRQ line and status bits
  197. strh r1, [r0,#0x00]
  198. ldrh r1, [r0,#0x04]
  199. /* Disable watchdog */
  200. ldr r0, OMAP5910_MPU_WD_TIMER_BASE
  201. mov r1, #0xf5
  202. strh r1, [r0, #0x8]
  203. mov r1, #0xa0
  204. strh r1, [r0, #0x8]
  205. /* Enable MCLK */
  206. ldr r0, OMAP5910_ULPD_PWR_MNG_BASE
  207. mov r1, #0x6
  208. strh r1, [r0, #0x34]
  209. strh r1, [r0, #0x34]
  210. /* Setup clock divisors */
  211. ldr r0, OMAP5910_ULPD_PWR_MNG_BASE @ base of ULDPL DPLL1 register
  212. mov r1, #0x0010 @ set PLL_ENABLE
  213. orr r1, r1, #0x2000 @ set IOB to new locking
  214. strh r1, [r0] @ write
  215. ulocking:
  216. ldrh r1, [r0] @ get DPLL value
  217. tst r1, #1
  218. beq ulocking @ while LOCK not set
  219. /* EMIF init */
  220. ldr r0, OMAP5910_MPU_TC_BASE
  221. ldrh r1, [r0, #0x0c] @ EMIFS_CONFIG_REG
  222. bic r1, r1, #0x0c @ pwr down disabled, flash WP
  223. orr r1, r1, #0x01
  224. str r1, [r0, #0x0c]
  225. ldr r1, VAL_EMIFS_CS0_CONFIG
  226. str r1, [r0, #0x10] @ EMIFS_CS0_CONFIG
  227. ldr r1, VAL_EMIFS_CS1_CONFIG
  228. str r1, [r0, #0x14] @ EMIFS_CS1_CONFIG
  229. ldr r1, VAL_EMIFS_CS2_CONFIG
  230. str r1, [r0, #0x18] @ EMIFS_CS2_CONFIG
  231. ldr r1, VAL_EMIFS_CS3_CONFIG
  232. str r1, [r0, #0x1c] @ EMIFS_CS3_CONFIG
  233. ldr r1, VAL_EMIFS_DYN_WAIT
  234. str r1, [r0, #0x40] @ EMIFS_CFG_DYN_WAIT
  235. /* Setup SDRAM */
  236. ldr r1, VAL_EMIFF_SDRAM_CONFIG
  237. str r1, [r0, #0x20] @ EMIFF_SDRAM_CONFIG
  238. ldr r1, VAL_EMIFF_SDRAM_CONFIG2
  239. str r1, [r0, #0x3c] @ EMIFF_SDRAM_CONFIG2
  240. ldr r1, VAL_EMIFF_MRS
  241. str r1, [r0, #0x24] @ EMIFF_MRS
  242. /* SDRAM needs 100us to stabilize */
  243. mov r0, #0x4000
  244. sdelay:
  245. subs r0, r0, #0x1
  246. bne sdelay
  247. /* back to arch calling code */
  248. mov pc, lr
  249. .end