hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
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
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Debugging macro include header
 *
 *  Copyright (C) 1994-1999 Russell King
 *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
*/
 
#include <linux/serial_reg.h>
 
/* External port on Zoom2/3 */
#define ZOOM_UART_BASE        0x10000000
#define ZOOM_UART_VIRT        0xfa400000
 
#define OMAP_PORT_SHIFT        2
#define ZOOM_PORT_SHIFT        1
 
#define UART_OFFSET(addr)    ((addr) & 0x00ffffff)
 
       .pushsection .data
       .align    2
omap_uart_phys:    .word    0
omap_uart_virt:    .word    0
omap_uart_lsr:    .word    0
       .popsection
 
       .macro    addruart, rp, rv, tmp
 
       /* Use omap_uart_phys/virt if already configured */
10:        adr    \rp, 99f        @ get effective addr of 99f
       ldr    \rv, [\rp]        @ get absolute addr of 99f
       sub    \rv, \rv, \rp        @ offset between the two
       ldr    \rp, [\rp, #4]        @ abs addr of omap_uart_phys
       sub    \tmp, \rp, \rv        @ make it effective
       ldr    \rp, [\tmp, #0]        @ omap_uart_phys
       ldr    \rv, [\tmp, #4]        @ omap_uart_virt
       cmp    \rp, #0            @ is port configured?
       cmpne    \rv, #0
       bne    100f            @ already configured
 
       /* Configure the UART offset from the phys/virt base */
#ifdef CONFIG_DEBUG_ZOOM_UART
       ldr    \rp, =ZOOM_UART_BASE
       str    \rp, [\tmp, #0]        @ omap_uart_phys
       ldr    \rp, =ZOOM_UART_VIRT
       str    \rp, [\tmp, #4]        @ omap_uart_virt
       mov    \rp, #(UART_LSR << ZOOM_PORT_SHIFT)
       str    \rp, [\tmp, #8]        @ omap_uart_lsr
#endif
       b    10b
 
       .align
99:        .word    .
       .word    omap_uart_phys
       .ltorg
 
100:        /* Pass the UART_LSR reg address */
       ldr    \tmp, [\tmp, #8]    @ omap_uart_lsr
       add    \rp, \rp, \tmp
       add    \rv, \rv, \tmp
       .endm
 
       .macro    senduart,rd,rx
       orr    \rd, \rd, \rx, lsl #24    @ preserve LSR reg offset
       bic    \rx, \rx, #0xff        @ get base (THR) reg address
       strb    \rd, [\rx]        @ send lower byte of rd
       orr    \rx, \rx, \rd, lsr #24    @ restore original rx (LSR)
       bic    \rd, \rd, #(0xff << 24)    @ restore original rd
       .endm
 
       .macro    busyuart,rd,rx
1001:        ldrb    \rd, [\rx]        @ rx contains UART_LSR address
       and    \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
       teq    \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
       bne    1001b
       .endm
 
       .macro    waituartcts,rd,rx
       .endm
 
       .macro    waituarttxrdy,rd,rx
       .endm