lowlevel_init.S 4.3 KB

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