spr_lowlevel_init.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * (C) Copyright 2006
  3. * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <config.h>
  8. /*
  9. * platform specific initializations are already done in Xloader
  10. * Initializations already done include
  11. * DDR, PLLs, IP's clock enable and reset release etc
  12. */
  13. .globl lowlevel_init
  14. lowlevel_init:
  15. mov pc, lr
  16. /* void setfreq(unsigned int device, unsigned int frequency) */
  17. .global setfreq
  18. setfreq:
  19. stmfd sp!,{r14}
  20. stmfd sp!,{r0-r12}
  21. mov r8,sp
  22. ldr sp,SRAM_STACK_V
  23. /* Saving the function arguements for later use */
  24. mov r4,r0
  25. mov r5,r1
  26. /* Putting DDR into self refresh */
  27. ldr r0,DDR_07_V
  28. ldr r1,[r0]
  29. ldr r2,DDR_ACTIVE_V
  30. bic r1, r1, r2
  31. str r1,[r0]
  32. ldr r0,DDR_57_V
  33. ldr r1,[r0]
  34. ldr r2,CYCLES_MASK_V
  35. bic r1, r1, r2
  36. ldr r2,REFRESH_CYCLES_V
  37. orr r1, r1, r2, lsl #16
  38. str r1,[r0]
  39. ldr r0,DDR_07_V
  40. ldr r1,[r0]
  41. ldr r2,SREFRESH_MASK_V
  42. orr r1, r1, r2
  43. str r1,[r0]
  44. /* flush pipeline */
  45. b flush
  46. .align 5
  47. flush:
  48. /* Delay to ensure self refresh mode */
  49. ldr r0,SREFRESH_DELAY_V
  50. delay:
  51. sub r0,r0,#1
  52. cmp r0,#0
  53. bne delay
  54. /* Putting system in slow mode */
  55. ldr r0,SCCTRL_V
  56. mov r1,#2
  57. str r1,[r0]
  58. /* Changing PLL(1/2) frequency */
  59. mov r0,r4
  60. mov r1,r5
  61. cmp r4,#0
  62. beq pll1_freq
  63. /* Change PLL2 (DDR frequency) */
  64. ldr r6,PLL2_FREQ_V
  65. ldr r7,PLL2_CNTL_V
  66. b pll2_freq
  67. pll1_freq:
  68. /* Change PLL1 (CPU frequency) */
  69. ldr r6,PLL1_FREQ_V
  70. ldr r7,PLL1_CNTL_V
  71. pll2_freq:
  72. mov r0,r6
  73. ldr r1,[r0]
  74. ldr r2,PLLFREQ_MASK_V
  75. bic r1,r1,r2
  76. mov r2,r5,lsr#1
  77. orr r1,r1,r2,lsl#24
  78. str r1,[r0]
  79. mov r0,r7
  80. ldr r1,P1C0A_V
  81. str r1,[r0]
  82. ldr r1,P1C0E_V
  83. str r1,[r0]
  84. ldr r1,P1C06_V
  85. str r1,[r0]
  86. ldr r1,P1C0E_V
  87. str r1,[r0]
  88. lock:
  89. ldr r1,[r0]
  90. and r1,r1,#1
  91. cmp r1,#0
  92. beq lock
  93. /* Putting system back to normal mode */
  94. ldr r0,SCCTRL_V
  95. mov r1,#4
  96. str r1,[r0]
  97. /* Putting DDR back to normal */
  98. ldr r0,DDR_07_V
  99. ldr r1,[R0]
  100. ldr r2,SREFRESH_MASK_V
  101. bic r1, r1, r2
  102. str r1,[r0]
  103. ldr r2,DDR_ACTIVE_V
  104. orr r1, r1, r2
  105. str r1,[r0]
  106. /* Delay to ensure self refresh mode */
  107. ldr r0,SREFRESH_DELAY_V
  108. 1:
  109. sub r0,r0,#1
  110. cmp r0,#0
  111. bne 1b
  112. mov sp,r8
  113. /* Resuming back to code */
  114. ldmia sp!,{r0-r12}
  115. ldmia sp!,{pc}
  116. SCCTRL_V:
  117. .word 0xfca00000
  118. PLL1_FREQ_V:
  119. .word 0xfca8000C
  120. PLL1_CNTL_V:
  121. .word 0xfca80008
  122. PLL2_FREQ_V:
  123. .word 0xfca80018
  124. PLL2_CNTL_V:
  125. .word 0xfca80014
  126. PLLFREQ_MASK_V:
  127. .word 0xff000000
  128. P1C0A_V:
  129. .word 0x1C0A
  130. P1C0E_V:
  131. .word 0x1C0E
  132. P1C06_V:
  133. .word 0x1C06
  134. SREFRESH_DELAY_V:
  135. .word 0x9999
  136. SRAM_STACK_V:
  137. .word 0xD2800600
  138. DDR_07_V:
  139. .word 0xfc60001c
  140. DDR_ACTIVE_V:
  141. .word 0x01000000
  142. DDR_57_V:
  143. .word 0xfc6000e4
  144. CYCLES_MASK_V:
  145. .word 0xffff0000
  146. REFRESH_CYCLES_V:
  147. .word 0xf0f0
  148. SREFRESH_MASK_V:
  149. .word 0x00010000
  150. .global setfreq_sz
  151. setfreq_sz:
  152. .word setfreq_sz - setfreq