lowlevel_init.S 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * Copyright (C) 2009 Samsung Electronics
  3. * Kyungmin Park <kyungmin.park@samsung.com>
  4. * Minkyu Kang <mk7.kang@samsung.com>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <config.h>
  9. #include <asm/arch/cpu.h>
  10. #include <asm/arch/power.h>
  11. /*
  12. * Register usages:
  13. *
  14. * r5 has zero always
  15. */
  16. .globl lowlevel_init
  17. lowlevel_init:
  18. mov r9, lr
  19. /* r5 has always zero */
  20. mov r5, #0
  21. ldr r8, =S5PC100_GPIO_BASE
  22. /* Disable Watchdog */
  23. ldr r0, =S5PC100_WATCHDOG_BASE @0xEA200000
  24. orr r0, r0, #0x0
  25. str r5, [r0]
  26. /* setting SRAM */
  27. ldr r0, =S5PC100_SROMC_BASE
  28. ldr r1, =0x9
  29. str r1, [r0]
  30. /* S5PC100 has 3 groups of interrupt sources */
  31. ldr r0, =S5PC100_VIC0_BASE @0xE4000000
  32. ldr r1, =S5PC100_VIC1_BASE @0xE4000000
  33. ldr r2, =S5PC100_VIC2_BASE @0xE4000000
  34. /* Disable all interrupts (VIC0, VIC1 and VIC2) */
  35. mvn r3, #0x0
  36. str r3, [r0, #0x14] @INTENCLEAR
  37. str r3, [r1, #0x14] @INTENCLEAR
  38. str r3, [r2, #0x14] @INTENCLEAR
  39. /* Set all interrupts as IRQ */
  40. str r5, [r0, #0xc] @INTSELECT
  41. str r5, [r1, #0xc] @INTSELECT
  42. str r5, [r2, #0xc] @INTSELECT
  43. /* Pending Interrupt Clear */
  44. str r5, [r0, #0xf00] @INTADDRESS
  45. str r5, [r1, #0xf00] @INTADDRESS
  46. str r5, [r2, #0xf00] @INTADDRESS
  47. /* for UART */
  48. bl uart_asm_init
  49. /* for TZPC */
  50. bl tzpc_asm_init
  51. 1:
  52. mov lr, r9
  53. mov pc, lr
  54. /*
  55. * system_clock_init: Initialize core clock and bus clock.
  56. * void system_clock_init(void)
  57. */
  58. system_clock_init:
  59. ldr r8, =S5PC100_CLOCK_BASE @ 0xE0100000
  60. /* Set Clock divider */
  61. ldr r1, =0x00011110
  62. str r1, [r8, #0x304]
  63. ldr r1, =0x1
  64. str r1, [r8, #0x308]
  65. ldr r1, =0x00011301
  66. str r1, [r8, #0x300]
  67. /* Set Lock Time */
  68. ldr r1, =0xe10 @ Locktime : 0xe10 = 3600
  69. str r1, [r8, #0x000] @ APLL_LOCK
  70. str r1, [r8, #0x004] @ MPLL_LOCK
  71. str r1, [r8, #0x008] @ EPLL_LOCK
  72. str r1, [r8, #0x00C] @ HPLL_LOCK
  73. /* APLL_CON */
  74. ldr r1, =0x81bc0400 @ SDIV 0, PDIV 4, MDIV 444 (1332MHz)
  75. str r1, [r8, #0x100]
  76. /* MPLL_CON */
  77. ldr r1, =0x80590201 @ SDIV 1, PDIV 2, MDIV 89 (267MHz)
  78. str r1, [r8, #0x104]
  79. /* EPLL_CON */
  80. ldr r1, =0x80870303 @ SDIV 3, PDIV 3, MDIV 135 (67.5MHz)
  81. str r1, [r8, #0x108]
  82. /* HPLL_CON */
  83. ldr r1, =0x80600603
  84. str r1, [r8, #0x10C]
  85. /* Set Source Clock */
  86. ldr r1, =0x1111 @ A, M, E, HPLL Muxing
  87. str r1, [r8, #0x200] @ CLK_SRC0
  88. ldr r1, =0x1000001 @ Uart Clock & CLK48M Muxing
  89. str r1, [r8, #0x204] @ CLK_SRC1
  90. ldr r1, =0x9000 @ ARMCLK/4
  91. str r1, [r8, #0x400] @ CLK_OUT
  92. /* wait at least 200us to stablize all clock */
  93. mov r2, #0x10000
  94. 1: subs r2, r2, #1
  95. bne 1b
  96. mov pc, lr
  97. /*
  98. * uart_asm_init: Initialize UART's pins
  99. */
  100. uart_asm_init:
  101. mov r0, r8
  102. ldr r1, =0x22222222
  103. str r1, [r0, #0x0] @ GPA0_CON
  104. ldr r1, =0x00022222
  105. str r1, [r0, #0x20] @ GPA1_CON
  106. mov pc, lr
  107. /*
  108. * tzpc_asm_init: Initialize TZPC
  109. */
  110. tzpc_asm_init:
  111. ldr r0, =0xE3800000
  112. mov r1, #0x0
  113. str r1, [r0]
  114. mov r1, #0xff
  115. str r1, [r0, #0x804]
  116. str r1, [r0, #0x810]
  117. ldr r0, =0xE2800000
  118. str r1, [r0, #0x804]
  119. str r1, [r0, #0x810]
  120. str r1, [r0, #0x81C]
  121. ldr r0, =0xE2900000
  122. str r1, [r0, #0x804]
  123. str r1, [r0, #0x810]
  124. mov pc, lr