lowlevel_init.S 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
  4. * Based on Atheros LSDK/QSDK
  5. */
  6. #include <config.h>
  7. #include <asm/asm.h>
  8. #include <asm/regdef.h>
  9. #include <asm/mipsregs.h>
  10. #include <asm/addrspace.h>
  11. #include <mach/ar71xx_regs.h>
  12. #define MK_PLL_CONF(divint, refdiv, range, outdiv) \
  13. (((0x3F & divint) << 10) | \
  14. ((0x1F & refdiv) << 16) | \
  15. ((0x1 & range) << 21) | \
  16. ((0x7 & outdiv) << 23) )
  17. #define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \
  18. (((0x3 & (cpudiv - 1)) << 5) | \
  19. ((0x3 & (ddrdiv - 1)) << 10) | \
  20. ((0x3 & (ahbdiv - 1)) << 15) )
  21. #define SET_FIELD(name, v) (((v) & QCA953X_##name##_MASK) << \
  22. QCA953X_##name##_SHIFT)
  23. #define DPLL2_KI(v) SET_FIELD(SRIF_DPLL2_KI, v)
  24. #define DPLL2_KD(v) SET_FIELD(SRIF_DPLL2_KD, v)
  25. #define DPLL2_PWD QCA953X_SRIF_DPLL2_PWD
  26. #define MK_DPLL2(ki, kd) (DPLL2_KI(ki) | DPLL2_KD(kd) | DPLL2_PWD)
  27. #define PLL_CPU_NFRAC(v) SET_FIELD(PLL_CPU_CONFIG_NFRAC, v)
  28. #define PLL_CPU_NINT(v) SET_FIELD(PLL_CPU_CONFIG_NINT, v)
  29. #define PLL_CPU_REFDIV(v) SET_FIELD(PLL_CPU_CONFIG_REFDIV, v)
  30. #define PLL_CPU_OUTDIV(v) SET_FIELD(PLL_CPU_CONFIG_OUTDIV, v)
  31. #define MK_PLL_CPU_CONF(frac, nint, ref, outdiv) \
  32. (PLL_CPU_NFRAC(frac) | \
  33. PLL_CPU_NINT(nint) | \
  34. PLL_CPU_REFDIV(ref) | \
  35. PLL_CPU_OUTDIV(outdiv))
  36. #define PLL_DDR_NFRAC(v) SET_FIELD(PLL_DDR_CONFIG_NFRAC, v)
  37. #define PLL_DDR_NINT(v) SET_FIELD(PLL_DDR_CONFIG_NINT, v)
  38. #define PLL_DDR_REFDIV(v) SET_FIELD(PLL_DDR_CONFIG_REFDIV, v)
  39. #define PLL_DDR_OUTDIV(v) SET_FIELD(PLL_DDR_CONFIG_OUTDIV, v)
  40. #define MK_PLL_DDR_CONF(frac, nint, ref, outdiv) \
  41. (PLL_DDR_NFRAC(frac) | \
  42. PLL_DDR_REFDIV(ref) | \
  43. PLL_DDR_NINT(nint) | \
  44. PLL_DDR_OUTDIV(outdiv) | \
  45. QCA953X_PLL_CONFIG_PWD)
  46. #define PLL_CPU_CONF_VAL MK_PLL_CPU_CONF(0, 26, 1, 0)
  47. #define PLL_DDR_CONF_VAL MK_PLL_DDR_CONF(0, 15, 1, 0)
  48. #define PLL_CLK_CTRL_PLL_BYPASS (QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS | \
  49. QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS | \
  50. QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
  51. #define PLL_CLK_CTRL_CPU_DIV(v) SET_FIELD(PLL_CLK_CTRL_CPU_POST_DIV, v)
  52. #define PLL_CLK_CTRL_DDR_DIV(v) SET_FIELD(PLL_CLK_CTRL_DDR_POST_DIV, v)
  53. #define PLL_CLK_CTRL_AHB_DIV(v) SET_FIELD(PLL_CLK_CTRL_AHB_POST_DIV, v)
  54. #define MK_PLL_CLK_CTRL(cpu, ddr, ahb) \
  55. (PLL_CLK_CTRL_CPU_DIV(cpu) | \
  56. PLL_CLK_CTRL_DDR_DIV(ddr) | \
  57. PLL_CLK_CTRL_AHB_DIV(ahb))
  58. #define PLL_CLK_CTRL_VAL (MK_PLL_CLK_CTRL(0, 0, 2) | \
  59. PLL_CLK_CTRL_PLL_BYPASS | \
  60. QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL | \
  61. QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
  62. #define PLL_DDR_DIT_FRAC_MAX(v) SET_FIELD(PLL_DDR_DIT_FRAC_MAX, v)
  63. #define PLL_DDR_DIT_FRAC_MIN(v) SET_FIELD(PLL_DDR_DIT_FRAC_MIN, v)
  64. #define PLL_DDR_DIT_FRAC_STEP(v) SET_FIELD(PLL_DDR_DIT_FRAC_STEP, v)
  65. #define PLL_DDR_DIT_UPD_CNT(v) SET_FIELD(PLL_DDR_DIT_UPD_CNT, v)
  66. #define PLL_CPU_DIT_FRAC_MAX(v) SET_FIELD(PLL_CPU_DIT_FRAC_MAX, v)
  67. #define PLL_CPU_DIT_FRAC_MIN(v) SET_FIELD(PLL_CPU_DIT_FRAC_MIN, v)
  68. #define PLL_CPU_DIT_FRAC_STEP(v) SET_FIELD(PLL_CPU_DIT_FRAC_STEP, v)
  69. #define PLL_CPU_DIT_UPD_CNT(v) SET_FIELD(PLL_CPU_DIT_UPD_CNT, v)
  70. #define MK_PLL_DDR_DIT_FRAC(max, min, step, cnt) \
  71. (QCA953X_PLL_DIT_FRAC_EN | \
  72. PLL_DDR_DIT_FRAC_MAX(max) | \
  73. PLL_DDR_DIT_FRAC_MIN(min) | \
  74. PLL_DDR_DIT_FRAC_STEP(step) | \
  75. PLL_DDR_DIT_UPD_CNT(cnt))
  76. #define MK_PLL_CPU_DIT_FRAC(max, min, step, cnt) \
  77. (QCA953X_PLL_DIT_FRAC_EN | \
  78. PLL_CPU_DIT_FRAC_MAX(max) | \
  79. PLL_CPU_DIT_FRAC_MIN(min) | \
  80. PLL_CPU_DIT_FRAC_STEP(step) | \
  81. PLL_CPU_DIT_UPD_CNT(cnt))
  82. #define PLL_CPU_DIT_FRAC_VAL MK_PLL_CPU_DIT_FRAC(63, 0, 1, 15)
  83. #define PLL_DDR_DIT_FRAC_VAL MK_PLL_DDR_DIT_FRAC(763, 635, 1, 15)
  84. .text
  85. .set noreorder
  86. LEAF(lowlevel_init)
  87. /* RTC Reset */
  88. li t0, CKSEG1ADDR(AR71XX_RESET_BASE)
  89. lw t1, QCA953X_RESET_REG_RESET_MODULE(t0)
  90. li t2, 0x08000000
  91. or t1, t1, t2
  92. sw t1, QCA953X_RESET_REG_RESET_MODULE(t0)
  93. nop
  94. lw t1, QCA953X_RESET_REG_RESET_MODULE(t0)
  95. li t2, 0xf7ffffff
  96. and t1, t1, t2
  97. sw t1, QCA953X_RESET_REG_RESET_MODULE(t0)
  98. nop
  99. /* RTC Force Wake */
  100. li t0, CKSEG1ADDR(QCA953X_RTC_BASE)
  101. li t1, 0x01
  102. sw t1, QCA953X_RTC_REG_SYNC_RESET(t0)
  103. nop
  104. nop
  105. /* Wait for RTC in on state */
  106. 1:
  107. lw t1, QCA953X_RTC_REG_SYNC_STATUS(t0)
  108. andi t1, t1, 0x02
  109. beqz t1, 1b
  110. nop
  111. li t0, CKSEG1ADDR(QCA953X_SRIF_BASE)
  112. li t1, MK_DPLL2(2, 16)
  113. sw t1, QCA953X_SRIF_BB_DPLL2_REG(t0)
  114. sw t1, QCA953X_SRIF_PCIE_DPLL2_REG(t0)
  115. sw t1, QCA953X_SRIF_DDR_DPLL2_REG(t0)
  116. sw t1, QCA953X_SRIF_CPU_DPLL2_REG(t0)
  117. li t0, CKSEG1ADDR(AR71XX_PLL_BASE)
  118. lw t1, QCA953X_PLL_CLK_CTRL_REG(t0)
  119. ori t1, PLL_CLK_CTRL_PLL_BYPASS
  120. sw t1, QCA953X_PLL_CLK_CTRL_REG(t0)
  121. nop
  122. li t1, PLL_CPU_CONF_VAL
  123. sw t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
  124. nop
  125. li t1, PLL_DDR_CONF_VAL
  126. sw t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
  127. nop
  128. li t1, PLL_CLK_CTRL_VAL
  129. sw t1, QCA953X_PLL_CLK_CTRL_REG(t0)
  130. nop
  131. lw t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
  132. li t2, ~QCA953X_PLL_CONFIG_PWD
  133. and t1, t1, t2
  134. sw t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
  135. nop
  136. lw t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
  137. li t2, ~QCA953X_PLL_CONFIG_PWD
  138. and t1, t1, t2
  139. sw t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
  140. nop
  141. lw t1, QCA953X_PLL_CLK_CTRL_REG(t0)
  142. li t2, ~PLL_CLK_CTRL_PLL_BYPASS
  143. and t1, t1, t2
  144. sw t1, QCA953X_PLL_CLK_CTRL_REG(t0)
  145. nop
  146. li t1, PLL_DDR_DIT_FRAC_VAL
  147. sw t1, QCA953X_PLL_DDR_DIT_FRAC_REG(t0)
  148. nop
  149. li t1, PLL_CPU_DIT_FRAC_VAL
  150. sw t1, QCA953X_PLL_CPU_DIT_FRAC_REG(t0)
  151. nop
  152. li t0, CKSEG1ADDR(AR71XX_RESET_BASE)
  153. lui t1, 0x03fc
  154. sw t1, 0xb4(t0)
  155. nop
  156. jr ra
  157. nop
  158. END(lowlevel_init)