lowlevel_init_luton.S 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
  2. /*
  3. * Copyright (c) 2018 Microsemi Corporation
  4. */
  5. #include <asm/asm.h>
  6. #include <asm/regdef.h>
  7. #define BASE_MACRO 0x600a0000
  8. #define REG_OFFSET(t, o) (t + (o*4))
  9. #define REG_MACRO(x) REG_OFFSET(BASE_MACRO, x)
  10. #define BIT(nr) (1 << (nr))
  11. #define MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0 REG_MACRO(6)
  12. #define MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS BIT(0)
  13. #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 REG_MACRO(2)
  14. #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0 REG_MACRO(0)
  15. #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV (0x3F << 6)
  16. #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV_ENC(x) (x << 6)
  17. .set noreorder
  18. LEAF(pll_init)
  19. /* Make sure PLL is locked */
  20. lw v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0
  21. andi v1, v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS
  22. bne v1, zero, 1f
  23. nop
  24. /* Black magic from frontend */
  25. li v1, 0x00610400
  26. sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
  27. li v1, 0x00610c00
  28. sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
  29. li v1, 0x00610800
  30. sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
  31. li v1, 0x00610000
  32. sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
  33. /* Wait for lock */
  34. 2: lw v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0
  35. andi v1, v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS
  36. /* Keep looping if zero (no lock bit yet) */
  37. beq v1, zero, 2b
  38. nop
  39. /* Setup PLL CPU clock divider for 416MHz */
  40. 1: lw v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0
  41. /* Keep reserved bits */
  42. li v1, ~MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV
  43. and v0, v0, v1
  44. /* Set code 6 ~ 416.66 MHz */
  45. ori v0, v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV_ENC(6)
  46. sw v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0
  47. jr ra
  48. nop
  49. END(pll_init)