debug_ll.S 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * On-chip UART initializaion for low-level debugging
  3. *
  4. * Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <linux/serial_reg.h>
  9. #include <linux/linkage.h>
  10. #include "bcu/bcu-regs.h"
  11. #include "sc-regs.h"
  12. #include "sg-regs.h"
  13. #if !defined(CONFIG_DEBUG_SEMIHOSTING)
  14. #include CONFIG_DEBUG_LL_INCLUDE
  15. #endif
  16. #define BAUDRATE 115200
  17. #define DIV_ROUND(x, d) (((x) + ((d) / 2)) / (d))
  18. ENTRY(debug_ll_init)
  19. ldr r0, =SG_REVISION
  20. ldr r1, [r0]
  21. and r1, r1, #SG_REVISION_TYPE_MASK
  22. mov r1, r1, lsr #SG_REVISION_TYPE_SHIFT
  23. #if defined(CONFIG_ARCH_UNIPHIER_PH1_SLD3)
  24. #define PH1_SLD3_UART_CLK 36864000
  25. cmp r1, #0x25
  26. bne ph1_sld3_end
  27. sg_set_pinsel 64, 1, 4, 4, r0, r1 @ TXD0 -> TXD0
  28. ldr r0, =BCSCR5
  29. ldr r1, =0x24440000
  30. str r1, [r0]
  31. ldr r0, =SC_CLKCTRL
  32. ldr r1, [r0]
  33. orr r1, r1, #SC_CLKCTRL_CEN_PERI
  34. str r1, [r0]
  35. ldr r3, =DIV_ROUND(PH1_SLD3_UART_CLK, 16 * BAUDRATE)
  36. b init_uart
  37. ph1_sld3_end:
  38. #endif
  39. #if defined(CONFIG_ARCH_UNIPHIER_PH1_LD4)
  40. #define PH1_LD4_UART_CLK 36864000
  41. cmp r1, #0x26
  42. bne ph1_ld4_end
  43. ldr r0, =SG_IECTRL
  44. ldr r1, [r0]
  45. orr r1, r1, #1
  46. str r1, [r0]
  47. sg_set_pinsel 88, 1, 8, 4, r0, r1 @ HSDOUT6 -> TXD0
  48. ldr r3, =DIV_ROUND(PH1_LD4_UART_CLK, 16 * BAUDRATE)
  49. b init_uart
  50. ph1_ld4_end:
  51. #endif
  52. #if defined(CONFIG_ARCH_UNIPHIER_PH1_PRO4)
  53. #define PH1_PRO4_UART_CLK 73728000
  54. cmp r1, #0x28
  55. bne ph1_pro4_end
  56. sg_set_pinsel 128, 0, 4, 8, r0, r1 @ TXD0 -> TXD0
  57. ldr r0, =SG_LOADPINCTRL
  58. mov r1, #1
  59. str r1, [r0]
  60. ldr r0, =SC_CLKCTRL
  61. ldr r1, [r0]
  62. orr r1, r1, #SC_CLKCTRL_CEN_PERI
  63. str r1, [r0]
  64. ldr r3, =DIV_ROUND(PH1_PRO4_UART_CLK, 16 * BAUDRATE)
  65. b init_uart
  66. ph1_pro4_end:
  67. #endif
  68. #if defined(CONFIG_ARCH_UNIPHIER_PH1_SLD8)
  69. #define PH1_SLD8_UART_CLK 80000000
  70. cmp r1, #0x29
  71. bne ph1_sld8_end
  72. ldr r0, =SG_IECTRL
  73. ldr r1, [r0]
  74. orr r1, r1, #1
  75. str r1, [r0]
  76. sg_set_pinsel 70, 3, 8, 4, r0, r1 @ HSDOUT0 -> TXD0
  77. ldr r3, =DIV_ROUND(PH1_SLD8_UART_CLK, 16 * BAUDRATE)
  78. b init_uart
  79. ph1_sld8_end:
  80. #endif
  81. #if defined(CONFIG_ARCH_UNIPHIER_PH1_PRO5)
  82. #define PH1_PRO5_UART_CLK 73728000
  83. cmp r1, #0x2A
  84. bne ph1_pro5_end
  85. sg_set_pinsel 47, 0, 4, 8, r0, r1 @ TXD0 -> TXD0
  86. sg_set_pinsel 49, 0, 4, 8, r0, r1 @ TXD1 -> TXD1
  87. sg_set_pinsel 51, 0, 4, 8, r0, r1 @ TXD2 -> TXD2
  88. sg_set_pinsel 53, 0, 4, 8, r0, r1 @ TXD3 -> TXD3
  89. ldr r0, =SG_LOADPINCTRL
  90. mov r1, #1
  91. str r1, [r0]
  92. ldr r0, =SC_CLKCTRL
  93. ldr r1, [r0]
  94. orr r1, r1, #SC_CLKCTRL_CEN_PERI
  95. str r1, [r0]
  96. ldr r3, =DIV_ROUND(PH1_PRO5_UART_CLK, 16 * BAUDRATE)
  97. b init_uart
  98. ph1_pro5_end:
  99. #endif
  100. #if defined(CONFIG_ARCH_UNIPHIER_PROXSTREAM2)
  101. #define PROXSTREAM2_UART_CLK 88900000
  102. cmp r1, #0x2E
  103. bne proxstream2_end
  104. ldr r0, =SG_IECTRL
  105. ldr r1, [r0]
  106. orr r1, r1, #1
  107. str r1, [r0]
  108. sg_set_pinsel 217, 8, 8, 4, r0, r1 @ TXD0 -> TXD0
  109. sg_set_pinsel 115, 8, 8, 4, r0, r1 @ TXD1 -> TXD1
  110. sg_set_pinsel 113, 8, 8, 4, r0, r1 @ TXD2 -> TXD2
  111. sg_set_pinsel 219, 8, 8, 4, r0, r1 @ TXD3 -> TXD3
  112. ldr r0, =SC_CLKCTRL
  113. ldr r1, [r0]
  114. orr r1, r1, #SC_CLKCTRL_CEN_PERI
  115. str r1, [r0]
  116. ldr r3, =DIV_ROUND(PROXSTREAM2_UART_CLK, 16 * BAUDRATE)
  117. b init_uart
  118. proxstream2_end:
  119. #endif
  120. #if defined(CONFIG_ARCH_UNIPHIER_PH1_LD6B)
  121. #define PH1_LD6B_UART_CLK 88900000
  122. cmp r1, #0x2F
  123. bne ph1_ld6b_end
  124. ldr r0, =SG_IECTRL
  125. ldr r1, [r0]
  126. orr r1, r1, #1
  127. str r1, [r0]
  128. sg_set_pinsel 135, 3, 8, 4, r0, r1 @ PORT10 -> TXD0
  129. sg_set_pinsel 115, 0, 8, 4, r0, r1 @ TXD1 -> TXD1
  130. sg_set_pinsel 113, 2, 8, 4, r0, r1 @ SBO0 -> TXD2
  131. ldr r0, =SC_CLKCTRL
  132. ldr r1, [r0]
  133. orr r1, r1, #SC_CLKCTRL_CEN_PERI
  134. str r1, [r0]
  135. ldr r3, =DIV_ROUND(PH1_LD6B_UART_CLK, 16 * BAUDRATE)
  136. b init_uart
  137. ph1_ld6b_end:
  138. #endif
  139. init_uart:
  140. addruart r0, r1, r2
  141. mov r1, #UART_LCR_WLEN8 << 8
  142. str r1, [r0, #0x10]
  143. str r3, [r0, #0x24]
  144. mov pc, lr
  145. ENDPROC(debug_ll_init)