hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*
 * On-chip UART initializaion for low-level debugging
 *
 * Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <linux/serial_reg.h>
#include <linux/linkage.h>
 
#include "../bcu/bcu-regs.h"
#include "../sc-regs.h"
#include "../sg-regs.h"
 
#if !defined(CONFIG_DEBUG_SEMIHOSTING)
#include CONFIG_DEBUG_LL_INCLUDE
#endif
 
#define BAUDRATE        115200
#define DIV_ROUND(x, d)        (((x) + ((d) / 2)) / (d))
 
ENTRY(debug_ll_init)
   ldr        r0, =SG_REVISION
   ldr        r1, [r0]
   and        r1, r1, #SG_REVISION_TYPE_MASK
   mov        r1, r1, lsr #SG_REVISION_TYPE_SHIFT
 
#if defined(CONFIG_ARCH_UNIPHIER_LD4)
#define UNIPHIER_LD4_UART_CLK        36864000
   cmp        r1, #0x26
   bne        ld4_end
 
   ldr        r0, =SG_IECTRL
   ldr        r1, [r0]
   orr        r1, r1, #1
   str        r1, [r0]
 
   sg_set_pinsel    88, 1, 8, 4, r0, r1    @ HSDOUT6 -> TXD0
 
   ldr        r3, =DIV_ROUND(UNIPHIER_LD4_UART_CLK, 16 * BAUDRATE)
 
   b        init_uart
ld4_end:
#endif
#if defined(CONFIG_ARCH_UNIPHIER_PRO4)
#define UNIPHIER_PRO4_UART_CLK        73728000
   cmp        r1, #0x28
   bne        pro4_end
 
   sg_set_pinsel    128, 0, 4, 8, r0, r1    @ TXD0 -> TXD0
 
   ldr        r0, =SG_LOADPINCTRL
   mov        r1, #1
   str        r1, [r0]
 
   ldr        r0, =SC_CLKCTRL
   ldr        r1, [r0]
   orr        r1, r1, #SC_CLKCTRL_CEN_PERI
   str        r1, [r0]
 
   ldr        r3, =DIV_ROUND(UNIPHIER_PRO4_UART_CLK, 16 * BAUDRATE)
 
   b        init_uart
pro4_end:
#endif
#if defined(CONFIG_ARCH_UNIPHIER_SLD8)
#define UNIPHIER_SLD8_UART_CLK        80000000
   cmp        r1, #0x29
   bne        sld8_end
 
   ldr        r0, =SG_IECTRL
   ldr        r1, [r0]
   orr        r1, r1, #1
   str        r1, [r0]
 
   sg_set_pinsel    70, 3, 8, 4, r0, r1    @ HSDOUT0 -> TXD0
 
   ldr        r3, =DIV_ROUND(UNIPHIER_SLD8_UART_CLK, 16 * BAUDRATE)
 
   b        init_uart
sld8_end:
#endif
#if defined(CONFIG_ARCH_UNIPHIER_PRO5)
#define UNIPHIER_PRO5_UART_CLK        73728000
   cmp        r1, #0x2A
   bne        pro5_end
 
   sg_set_pinsel    47, 0, 4, 8, r0, r1    @ TXD0 -> TXD0
   sg_set_pinsel    49, 0, 4, 8, r0, r1    @ TXD1 -> TXD1
   sg_set_pinsel    51, 0, 4, 8, r0, r1    @ TXD2 -> TXD2
   sg_set_pinsel    53, 0, 4, 8, r0, r1    @ TXD3 -> TXD3
 
   ldr        r0, =SG_LOADPINCTRL
   mov        r1, #1
   str        r1, [r0]
 
   ldr        r0, =SC_CLKCTRL
   ldr        r1, [r0]
   orr        r1, r1, #SC_CLKCTRL_CEN_PERI
   str        r1, [r0]
 
   ldr        r3, =DIV_ROUND(UNIPHIER_PRO5_UART_CLK, 16 * BAUDRATE)
 
   b        init_uart
pro5_end:
#endif
#if defined(CONFIG_ARCH_UNIPHIER_PXS2)
#define UNIPHIER_PXS2_UART_CLK        88900000
   cmp        r1, #0x2E
   bne        pxs2_end
 
   ldr        r0, =SG_IECTRL
   ldr        r1, [r0]
   orr        r1, r1, #1
   str        r1, [r0]
 
   sg_set_pinsel    217, 8, 8, 4, r0, r1    @ TXD0 -> TXD0
   sg_set_pinsel    115, 8, 8, 4, r0, r1    @ TXD1 -> TXD1
   sg_set_pinsel    113, 8, 8, 4, r0, r1    @ TXD2 -> TXD2
   sg_set_pinsel    219, 8, 8, 4, r0, r1    @ TXD3 -> TXD3
 
   ldr        r0, =SC_CLKCTRL
   ldr        r1, [r0]
   orr        r1, r1, #SC_CLKCTRL_CEN_PERI
   str        r1, [r0]
 
   ldr        r3, =DIV_ROUND(UNIPHIER_PXS2_UART_CLK, 16 * BAUDRATE)
 
   b        init_uart
pxs2_end:
#endif
#if defined(CONFIG_ARCH_UNIPHIER_LD6B)
#define UNIPHIER_LD6B_UART_CLK        88900000
   cmp        r1, #0x2F
   bne        ld6b_end
 
   ldr        r0, =SG_IECTRL
   ldr        r1, [r0]
   orr        r1, r1, #1
   str        r1, [r0]
 
   sg_set_pinsel    135, 3, 8, 4, r0, r1    @ PORT10 -> TXD0
   sg_set_pinsel    115, 0, 8, 4, r0, r1    @ TXD1 -> TXD1
   sg_set_pinsel    113, 2, 8, 4, r0, r1    @ SBO0 -> TXD2
 
   ldr        r0, =SC_CLKCTRL
   ldr        r1, [r0]
   orr        r1, r1, #SC_CLKCTRL_CEN_PERI
   str        r1, [r0]
 
   ldr        r3, =DIV_ROUND(UNIPHIER_LD6B_UART_CLK, 16 * BAUDRATE)
 
   b        init_uart
ld6b_end:
#endif
   mov        pc, lr
 
init_uart:
   addruart    r0, r1, r2
   mov        r1, #UART_LCR_WLEN8 << 8
   str        r1, [r0, #0x10]
   str        r3, [r0, #0x24]
 
   mov        pc, lr
ENDPROC(debug_ll_init)