lowlevel_init.S 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. .endm
  87. .macro setup_sdram
  88. ldr r0, =ESDCTL_BASE_ADDR
  89. mov r3, #0x2000
  90. str r3, [r0, #0x0]
  91. str r3, [r0, #0x8]
  92. /*ip(r12) has used to save lr register in upper calling*/
  93. mov fp, lr
  94. mov r5, #0x00
  95. mov r2, #0x00
  96. mov r1, #CSD0_BASE_ADDR
  97. bl setup_sdram_bank
  98. mov r5, #0x00
  99. mov r2, #0x00
  100. mov r1, #CSD1_BASE_ADDR
  101. bl setup_sdram_bank
  102. mov lr, fp
  103. 1:
  104. ldr r3, =ESDCTL_DELAY_LINE5
  105. str r3, [r0, #0x30]
  106. .endm
  107. .globl lowlevel_init
  108. lowlevel_init:
  109. mov r10, lr
  110. core_init
  111. init_aips
  112. init_max
  113. init_m3if
  114. init_clock
  115. init_debug_board
  116. cmp pc, #PHYS_SDRAM_1
  117. blo init_sdram_start
  118. cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
  119. blo skip_sdram_setup
  120. init_sdram_start:
  121. /*init_sdram*/
  122. setup_sdram
  123. skip_sdram_setup:
  124. mov lr, r10
  125. mov pc, lr
  126. /*
  127. * r0: ESDCTL control base, r1: sdram slot base
  128. * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
  129. */
  130. setup_sdram_bank:
  131. mov r3, #0xE
  132. tst r2, #0x1
  133. orreq r3, r3, #0x300 /*DDR2*/
  134. str r3, [r0, #0x10]
  135. bic r3, r3, #0x00A
  136. str r3, [r0, #0x10]
  137. beq 2f
  138. mov r3, #0x20000
  139. 1: subs r3, r3, #1
  140. bne 1b
  141. 2: tst r2, #0x1
  142. ldreq r3, =ESDCTL_DDR2_CONFIG
  143. ldrne r3, =ESDCTL_MDDR_CONFIG
  144. cmp r1, #CSD1_BASE_ADDR
  145. strlo r3, [r0, #0x4]
  146. strhs r3, [r0, #0xC]
  147. ldr r3, =ESDCTL_0x92220000
  148. strlo r3, [r0, #0x0]
  149. strhs r3, [r0, #0x8]
  150. mov r3, #0xDA
  151. ldr r4, =ESDCTL_PRECHARGE
  152. strb r3, [r1, r4]
  153. tst r2, #0x1
  154. bne skip_set_mode
  155. cmp r1, #CSD1_BASE_ADDR
  156. ldr r3, =ESDCTL_0xB2220000
  157. strlo r3, [r0, #0x0]
  158. strhs r3, [r0, #0x8]
  159. mov r3, #0xDA
  160. ldr r4, =ESDCTL_DDR2_EMR2
  161. strb r3, [r1, r4]
  162. ldr r4, =ESDCTL_DDR2_EMR3
  163. strb r3, [r1, r4]
  164. ldr r4, =ESDCTL_DDR2_EN_DLL
  165. strb r3, [r1, r4]
  166. ldr r4, =ESDCTL_DDR2_RESET_DLL
  167. strb r3, [r1, r4]
  168. ldr r3, =ESDCTL_0x92220000
  169. strlo r3, [r0, #0x0]
  170. strhs r3, [r0, #0x8]
  171. mov r3, #0xDA
  172. ldr r4, =ESDCTL_PRECHARGE
  173. strb r3, [r1, r4]
  174. skip_set_mode:
  175. cmp r1, #CSD1_BASE_ADDR
  176. ldr r3, =ESDCTL_0xA2220000
  177. strlo r3, [r0, #0x0]
  178. strhs r3, [r0, #0x8]
  179. mov r3, #0xDA
  180. strb r3, [r1]
  181. strb r3, [r1]
  182. ldr r3, =ESDCTL_0xB2220000
  183. strlo r3, [r0, #0x0]
  184. strhs r3, [r0, #0x8]
  185. tst r2, #0x1
  186. ldreq r4, =ESDCTL_DDR2_MR
  187. ldrne r4, =ESDCTL_MDDR_MR
  188. mov r3, #0xDA
  189. strb r3, [r1, r4]
  190. ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
  191. streqb r3, [r1, r4]
  192. ldreq r4, =ESDCTL_DDR2_EN_DLL
  193. ldrne r4, =ESDCTL_MDDR_EMR
  194. strb r3, [r1, r4]
  195. cmp r1, #CSD1_BASE_ADDR
  196. ldr r3, =ESDCTL_0x82228080
  197. strlo r3, [r0, #0x0]
  198. strhs r3, [r0, #0x8]
  199. tst r2, #0x1
  200. moveq r4, #0x20000
  201. movne r4, #0x200
  202. 1: subs r4, r4, #1
  203. bne 1b
  204. str r3, [r1, #0x100]
  205. ldr r4, [r1, #0x100]
  206. cmp r3, r4
  207. movne r3, #1
  208. moveq r3, #0
  209. mov pc, lr