Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / arm / mach-omap2 / include / mach / debug-macro.S
1 /* arch/arm/mach-omap2/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 UART_OFFSET(addr)       ((addr) & 0x00ffffff)
21
22 #define omap_uart_v2p(x)        ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET)
23 #define omap_uart_p2v(x)        ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET)
24
25                 .pushsection .data
26 omap_uart_phys: .word   0
27 omap_uart_virt: .word   0
28 omap_uart_lsr:  .word   0
29                 .popsection
30
31                 /*
32                  * Note that this code won't work if the bootloader passes
33                  * a wrong machine ID number in r1. To debug, just hardcode
34                  * the desired UART phys and virt addresses temporarily into
35                  * the omap_uart_phys and omap_uart_virt above.
36                  */
37                 .macro  addruart, rp, rv
38
39                 /* Use omap_uart_phys/virt if already configured */
40 10:             mrc     p15, 0, \rp, c1, c0
41                 tst     \rp, #1                 @ MMU enabled?
42                 ldreq   \rp, =omap_uart_v2p(omap_uart_phys)     @ MMU disabled
43                 ldrne   \rp, =omap_uart_phys    @ MMU enabled
44                 add     \rv, \rp, #4            @ omap_uart_virt
45                 ldr     \rp, [\rp, #0]
46                 ldr     \rv, [\rv, #0]
47                 cmp     \rp, #0                 @ is port configured?
48                 cmpne   \rv, #0
49                 bne     99f                     @ already configured
50
51                 /* Check the debug UART configuration set in uncompress.h */
52                 mrc     p15, 0, \rp, c1, c0
53                 tst     \rp, #1                 @ MMU enabled?
54                 ldreq   \rp, =OMAP_UART_INFO    @ MMU not enabled
55                 ldrne   \rp, =omap_uart_p2v(OMAP_UART_INFO)     @ MMU enabled
56                 ldr     \rp, [\rp, #0]
57
58                 /* Select the UART to use based on the UART1 scratchpad value */
59                 cmp     \rp, #0                 @ no port configured?
60                 beq     21f                     @ if none, try to use UART1
61                 cmp     \rp, #OMAP2UART1        @ OMAP2/3/4UART1
62                 beq     21f                     @ configure OMAP2/3/4UART1
63                 cmp     \rp, #OMAP2UART2        @ OMAP2/3/4UART2
64                 beq     22f                     @ configure OMAP2/3/4UART2
65                 cmp     \rp, #OMAP2UART3        @ only on 24xx
66                 beq     23f                     @ configure OMAP2UART3
67                 cmp     \rp, #OMAP3UART3        @ only on 34xx
68                 beq     33f                     @ configure OMAP3UART3
69                 cmp     \rp, #OMAP4UART3        @ only on 44xx
70                 beq     43f                     @ configure OMAP4UART3
71                 cmp     \rp, #OMAP3UART4        @ only on 36xx
72                 beq     34f                     @ configure OMAP3UART4
73                 cmp     \rp, #OMAP4UART4        @ only on 44xx
74                 beq     44f                     @ configure OMAP4UART4
75                 cmp     \rp, #TI816XUART1       @ ti816x UART offsets different
76                 beq     81f                     @ configure UART1
77                 cmp     \rp, #TI816XUART2       @ ti816x UART offsets different
78                 beq     82f                     @ configure UART2
79                 cmp     \rp, #TI816XUART3       @ ti816x UART offsets different
80                 beq     83f                     @ configure UART3
81                 cmp     \rp, #ZOOM_UART         @ only on zoom2/3
82                 beq     95f                     @ configure ZOOM_UART
83
84                 /* Configure the UART offset from the phys/virt base */
85 21:             mov     \rp, #UART_OFFSET(OMAP2_UART1_BASE)     @ omap2/3/4
86                 b       98f
87 22:             mov     \rp, #UART_OFFSET(OMAP2_UART2_BASE)     @ omap2/3/4
88                 b       98f
89 23:             mov     \rp, #UART_OFFSET(OMAP2_UART3_BASE)
90                 b       98f
91 33:             mov     \rp, #UART_OFFSET(OMAP3_UART1_BASE)
92                 add     \rp, \rp, #0x00fb0000
93                 add     \rp, \rp, #0x00006000           @ OMAP3_UART3_BASE
94                 b       98f
95 34:             mov     \rp, #UART_OFFSET(OMAP3_UART1_BASE)
96                 add     \rp, \rp, #0x00fb0000
97                 add     \rp, \rp, #0x00028000           @ OMAP3_UART4_BASE
98                 b       98f
99 43:             mov     \rp, #UART_OFFSET(OMAP4_UART3_BASE)
100                 b       98f
101 44:             mov     \rp, #UART_OFFSET(OMAP4_UART4_BASE)
102                 b       98f
103 81:             mov     \rp, #UART_OFFSET(TI816X_UART1_BASE)
104                 b       98f
105 82:             mov     \rp, #UART_OFFSET(TI816X_UART2_BASE)
106                 b       98f
107 83:             mov     \rp, #UART_OFFSET(TI816X_UART3_BASE)
108                 b       98f
109 95:             ldr     \rp, =ZOOM_UART_BASE
110                 mrc     p15, 0, \rv, c1, c0
111                 tst     \rv, #1                 @ MMU enabled?
112                 ldreq   \rv, =omap_uart_v2p(omap_uart_phys)     @ MMU disabled
113                 ldrne   \rv, =omap_uart_phys    @ MMU enabled
114                 str     \rp, [\rv, #0]
115                 ldr     \rp, =ZOOM_UART_VIRT
116                 add     \rv, \rv, #4            @ omap_uart_virt
117                 str     \rp, [\rv, #0]
118                 mov     \rp, #(UART_LSR << ZOOM_PORT_SHIFT)
119                 add     \rv, \rv, #4            @ omap_uart_lsr
120                 str     \rp, [\rv, #0]
121                 b       10b
122
123                 /* Store both phys and virt address for the uart */
124 98:             add     \rp, \rp, #0x48000000   @ phys base
125                 mrc     p15, 0, \rv, c1, c0
126                 tst     \rv, #1                 @ MMU enabled?
127                 ldreq   \rv, =omap_uart_v2p(omap_uart_phys)     @ MMU disabled
128                 ldrne   \rv, =omap_uart_phys    @ MMU enabled
129                 str     \rp, [\rv, #0]
130                 sub     \rp, \rp, #0x48000000   @ phys base
131                 add     \rp, \rp, #0xfa000000   @ virt base
132                 add     \rv, \rv, #4            @ omap_uart_virt
133                 str     \rp, [\rv, #0]
134                 mov     \rp, #(UART_LSR << OMAP_PORT_SHIFT)
135                 add     \rv, \rv, #4            @ omap_uart_lsr
136                 str     \rp, [\rv, #0]
137
138                 b       10b
139 99:
140                 .endm
141
142                 .macro  senduart,rd,rx
143                 strb    \rd, [\rx]
144                 .endm
145
146                 .macro  busyuart,rd,rx
147 1001:           mrc     p15, 0, \rd, c1, c0
148                 tst     \rd, #1                 @ MMU enabled?
149                 ldreq   \rd, =omap_uart_v2p(omap_uart_lsr)      @ MMU disabled
150                 ldrne   \rd, =omap_uart_lsr     @ MMU enabled
151                 ldr     \rd, [\rd, #0]
152                 ldrb    \rd, [\rx, \rd]
153                 and     \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
154                 teq     \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
155                 bne     1001b
156                 .endm
157
158                 .macro  waituart,rd,rx
159                 .endm