lowlevel_init.S 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*
  2. * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
  3. *
  4. * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <config.h>
  9. #include <asm/arch/imx-regs.h>
  10. #include <generated/asm-offsets.h>
  11. #include "mx35pdk.h"
  12. #include <asm/arch/lowlevel_macro.S>
  13. /*
  14. * return soc version
  15. * 0x10: TO1
  16. * 0x20: TO2
  17. * 0x30: TO3
  18. */
  19. .macro check_soc_version ret, tmp
  20. ldr \tmp, =IIM_BASE_ADDR
  21. ldr \ret, [\tmp, #IIM_SREV]
  22. cmp \ret, #0x00
  23. moveq \tmp, #ROMPATCH_REV
  24. ldreq \ret, [\tmp]
  25. moveq \ret, \ret, lsl #4
  26. addne \ret, \ret, #0x10
  27. .endm
  28. /* CPLD on CS5 setup */
  29. .macro init_debug_board
  30. ldr r0, =DBG_BASE_ADDR
  31. ldr r1, =DBG_CSCR_U_CONFIG
  32. str r1, [r0, #0x00]
  33. ldr r1, =DBG_CSCR_L_CONFIG
  34. str r1, [r0, #0x04]
  35. ldr r1, =DBG_CSCR_A_CONFIG
  36. str r1, [r0, #0x08]
  37. .endm
  38. /* clock setup */
  39. .macro init_clock
  40. ldr r0, =CCM_BASE_ADDR
  41. /* default CLKO to 1/32 of the ARM core*/
  42. ldr r1, [r0, #CLKCTL_COSR]
  43. bic r1, r1, #0x00000FF00
  44. bic r1, r1, #0x0000000FF
  45. mov r2, #0x00006C00
  46. add r2, r2, #0x67
  47. orr r1, r1, r2
  48. str r1, [r0, #CLKCTL_COSR]
  49. ldr r2, =CCM_CCMR_CONFIG
  50. str r2, [r0, #CLKCTL_CCMR]
  51. check_soc_version r1, r2
  52. cmp r1, #CHIP_REV_2_0
  53. ldrhs r3, =CCM_MPLL_532_HZ
  54. bhs 1f
  55. ldr r2, [r0, #CLKCTL_PDR0]
  56. tst r2, #CLKMODE_CONSUMER
  57. ldrne r3, =CCM_MPLL_532_HZ /* consumer path*/
  58. ldreq r3, =CCM_MPLL_399_HZ /* auto path*/
  59. 1:
  60. str r3, [r0, #CLKCTL_MPCTL]
  61. ldr r1, =CCM_PPLL_300_HZ
  62. str r1, [r0, #CLKCTL_PPCTL]
  63. ldr r1, =CCM_PDR0_CONFIG
  64. bic r1, r1, #0x800000
  65. str r1, [r0, #CLKCTL_PDR0]
  66. ldr r1, [r0, #CLKCTL_CGR0]
  67. orr r1, r1, #0x0C300000
  68. str r1, [r0, #CLKCTL_CGR0]
  69. ldr r1, [r0, #CLKCTL_CGR1]
  70. orr r1, r1, #0x00000C00
  71. orr r1, r1, #0x00000003
  72. str r1, [r0, #CLKCTL_CGR1]
  73. ldr r1, [r0, #CLKCTL_CGR2]
  74. orr r1, r1, #0x00C00000
  75. str r1, [r0, #CLKCTL_CGR2]
  76. .endm
  77. .macro setup_sdram
  78. ldr r0, =ESDCTL_BASE_ADDR
  79. mov r3, #0x2000
  80. str r3, [r0, #0x0]
  81. str r3, [r0, #0x8]
  82. /*ip(r12) has used to save lr register in upper calling*/
  83. mov fp, lr
  84. mov r5, #0x00
  85. mov r2, #0x00
  86. mov r1, #CSD0_BASE_ADDR
  87. bl setup_sdram_bank
  88. mov r5, #0x00
  89. mov r2, #0x00
  90. mov r1, #CSD1_BASE_ADDR
  91. bl setup_sdram_bank
  92. mov lr, fp
  93. 1:
  94. ldr r3, =ESDCTL_DELAY_LINE5
  95. str r3, [r0, #0x30]
  96. .endm
  97. .globl lowlevel_init
  98. lowlevel_init:
  99. mov r10, lr
  100. core_init
  101. init_aips
  102. init_max
  103. init_m3if
  104. init_clock
  105. init_debug_board
  106. cmp pc, #PHYS_SDRAM_1
  107. blo init_sdram_start
  108. cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
  109. blo skip_sdram_setup
  110. init_sdram_start:
  111. /*init_sdram*/
  112. setup_sdram
  113. skip_sdram_setup:
  114. mov lr, r10
  115. mov pc, lr
  116. /*
  117. * r0: ESDCTL control base, r1: sdram slot base
  118. * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
  119. */
  120. setup_sdram_bank:
  121. mov r3, #0xE
  122. tst r2, #0x1
  123. orreq r3, r3, #0x300 /*DDR2*/
  124. str r3, [r0, #0x10]
  125. bic r3, r3, #0x00A
  126. str r3, [r0, #0x10]
  127. beq 2f
  128. mov r3, #0x20000
  129. 1: subs r3, r3, #1
  130. bne 1b
  131. 2: tst r2, #0x1
  132. ldreq r3, =ESDCTL_DDR2_CONFIG
  133. ldrne r3, =ESDCTL_MDDR_CONFIG
  134. cmp r1, #CSD1_BASE_ADDR
  135. strlo r3, [r0, #0x4]
  136. strhs r3, [r0, #0xC]
  137. ldr r3, =ESDCTL_0x92220000
  138. strlo r3, [r0, #0x0]
  139. strhs r3, [r0, #0x8]
  140. mov r3, #0xDA
  141. ldr r4, =ESDCTL_PRECHARGE
  142. strb r3, [r1, r4]
  143. tst r2, #0x1
  144. bne skip_set_mode
  145. cmp r1, #CSD1_BASE_ADDR
  146. ldr r3, =ESDCTL_0xB2220000
  147. strlo r3, [r0, #0x0]
  148. strhs r3, [r0, #0x8]
  149. mov r3, #0xDA
  150. ldr r4, =ESDCTL_DDR2_EMR2
  151. strb r3, [r1, r4]
  152. ldr r4, =ESDCTL_DDR2_EMR3
  153. strb r3, [r1, r4]
  154. ldr r4, =ESDCTL_DDR2_EN_DLL
  155. strb r3, [r1, r4]
  156. ldr r4, =ESDCTL_DDR2_RESET_DLL
  157. strb r3, [r1, r4]
  158. ldr r3, =ESDCTL_0x92220000
  159. strlo r3, [r0, #0x0]
  160. strhs r3, [r0, #0x8]
  161. mov r3, #0xDA
  162. ldr r4, =ESDCTL_PRECHARGE
  163. strb r3, [r1, r4]
  164. skip_set_mode:
  165. cmp r1, #CSD1_BASE_ADDR
  166. ldr r3, =ESDCTL_0xA2220000
  167. strlo r3, [r0, #0x0]
  168. strhs r3, [r0, #0x8]
  169. mov r3, #0xDA
  170. strb r3, [r1]
  171. strb r3, [r1]
  172. ldr r3, =ESDCTL_0xB2220000
  173. strlo r3, [r0, #0x0]
  174. strhs r3, [r0, #0x8]
  175. tst r2, #0x1
  176. ldreq r4, =ESDCTL_DDR2_MR
  177. ldrne r4, =ESDCTL_MDDR_MR
  178. mov r3, #0xDA
  179. strb r3, [r1, r4]
  180. ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
  181. streqb r3, [r1, r4]
  182. ldreq r4, =ESDCTL_DDR2_EN_DLL
  183. ldrne r4, =ESDCTL_MDDR_EMR
  184. strb r3, [r1, r4]
  185. cmp r1, #CSD1_BASE_ADDR
  186. ldr r3, =ESDCTL_0x82228080
  187. strlo r3, [r0, #0x0]
  188. strhs r3, [r0, #0x8]
  189. tst r2, #0x1
  190. moveq r4, #0x20000
  191. movne r4, #0x200
  192. 1: subs r4, r4, #1
  193. bne 1b
  194. str r3, [r1, #0x100]
  195. ldr r4, [r1, #0x100]
  196. cmp r3, r4
  197. movne r3, #1
  198. moveq r3, #0
  199. mov pc, lr