ARM: add an extra temp register to the low level debugging addruart macro
[linux-2.6.git] / arch / arm / mach-omap1 / include / mach / debug-macro.S
1 /* arch/arm/mach-omap1/include/mach/debug-macro.S
2  *
3  * Debugging macro include header
4  *
5  *  Copyright (C) 1994-1999 Russell King
6  *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12 */
13
14 #include <linux/serial_reg.h>
15
16 #include <asm/memory.h>
17
18 #include <plat/serial.h>
19
20 #define omap_uart_v2p(x)        ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET)
21 #define omap_uart_p2v(x)        ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET)
22
23                 .pushsection .data
24 omap_uart_phys: .word   0x0
25 omap_uart_virt: .word   0x0
26                 .popsection
27
28                 /*
29                  * Note that this code won't work if the bootloader passes
30                  * a wrong machine ID number in r1. To debug, just hardcode
31                  * the desired UART phys and virt addresses temporarily into
32                  * the omap_uart_phys and omap_uart_virt above.
33                  */
34                 .macro  addruart, rp, rv, tmp
35
36                 /* Use omap_uart_phys/virt if already configured */
37 9:              mrc     p15, 0, \rp, c1, c0
38                 tst     \rp, #1                 @ MMU enabled?
39                 ldreq   \rp, =omap_uart_v2p(omap_uart_phys)     @ MMU disabled
40                 ldrne   \rp, =omap_uart_phys    @ MMU enabled
41                 add     \rv, \rp, #4            @ omap_uart_virt
42                 ldr     \rp, [\rp, #0]
43                 ldr     \rv, [\rv, #0]
44                 cmp     \rp, #0                 @ is port configured?
45                 cmpne   \rv, #0
46                 bne     99f                     @ already configured
47
48                 /* Check the debug UART configuration set in uncompress.h */
49                 mrc     p15, 0, \rp, c1, c0
50                 tst     \rp, #1                 @ MMU enabled?
51                 ldreq   \rp, =OMAP_UART_INFO    @ MMU not enabled
52                 ldrne   \rp, =omap_uart_p2v(OMAP_UART_INFO)     @ MMU enabled
53                 ldr     \rp, [\rp, #0]
54
55                 /* Select the UART to use based on the UART1 scratchpad value */
56 10:             cmp     \rp, #0                 @ no port configured?
57                 beq     11f                     @ if none, try to use UART1
58                 cmp     \rp, #OMAP1UART1
59                 beq     11f                     @ configure OMAP1UART1
60                 cmp     \rp, #OMAP1UART2
61                 beq     12f                     @ configure OMAP1UART2
62                 cmp     \rp, #OMAP1UART3
63                 beq     13f                     @ configure OMAP2UART3
64
65                 /* Configure the UART offset from the phys/virt base */
66 11:             mov     \rp, #0x00fb0000        @ OMAP1UART1
67                 b       98f
68 12:             mov     \rp, #0x00fb0000        @ OMAP1UART1
69                 orr     \rp, \rp, #0x00000800   @ OMAP1UART2
70                 b       98f
71 13:             mov     \rp, #0x00fb0000        @ OMAP1UART1
72                 orr     \rp, \rp, #0x00000800   @ OMAP1UART2
73                 orr     \rp, \rp, #0x00009000   @ OMAP1UART3
74
75                 /* Store both phys and virt address for the uart */
76 98:             add     \rp, \rp, #0xff000000   @ phys base
77                 mrc     p15, 0, \rv, c1, c0
78                 tst     \rv, #1                 @ MMU enabled?
79                 ldreq   \rv, =omap_uart_v2p(omap_uart_phys)     @ MMU disabled
80                 ldrne   \rv, =omap_uart_phys    @ MMU enabled
81                 str     \rp, [\rv, #0]
82                 sub     \rp, \rp, #0xff000000   @ phys base
83                 add     \rp, \rp, #0xfe000000   @ virt base
84                 add     \rv, \rv, #4            @ omap_uart_lsr
85                 str     \rp, [\rv, #0]
86                 b       9b
87 99:
88                 .endm
89
90                 .macro  senduart,rd,rx
91                 strb    \rd, [\rx]
92                 .endm
93
94                 .macro  busyuart,rd,rx
95 1001:           ldrb    \rd, [\rx, #(UART_LSR << OMAP_PORT_SHIFT)]
96                 and     \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
97                 teq     \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
98                 beq     1002f
99                 ldrb    \rd, [\rx, #(UART_LSR << OMAP7XX_PORT_SHIFT)]
100                 and     \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
101                 teq     \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
102                 bne     1001b
103 1002:
104                 .endm
105
106                 .macro  waituart,rd,rx
107                 .endm