lowlevel_init.S 4.9 KB

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