serial: pxa: fine-tune clk useage
[linux/fpc-iii.git] / arch / arm / mach-omap2 / include / mach / debug-macro.S
blobcfaed13d0040f10ac4d94bfc71ef4029308226c6
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  *
14 #include <linux/serial_reg.h>
16 #include <mach/serial.h>
18 #define UART_OFFSET(addr)       ((addr) & 0x00ffffff)
20                 .pushsection .data
21 omap_uart_phys: .word   0
22 omap_uart_virt: .word   0
23 omap_uart_lsr:  .word   0
24                 .popsection
26                 /*
27                  * Note that this code won't work if the bootloader passes
28                  * a wrong machine ID number in r1. To debug, just hardcode
29                  * the desired UART phys and virt addresses temporarily into
30                  * the omap_uart_phys and omap_uart_virt above.
31                  */
32                 .macro  addruart, rp, rv, tmp
34                 /* Use omap_uart_phys/virt if already configured */
35 10:             adr     \rp, 99f                @ get effective addr of 99f
36                 ldr     \rv, [\rp]              @ get absolute addr of 99f
37                 sub     \rv, \rv, \rp           @ offset between the two
38                 ldr     \rp, [\rp, #4]          @ abs addr of omap_uart_phys
39                 sub     \tmp, \rp, \rv          @ make it effective
40                 ldr     \rp, [\tmp, #0]         @ omap_uart_phys
41                 ldr     \rv, [\tmp, #4]         @ omap_uart_virt
42                 cmp     \rp, #0                 @ is port configured?
43                 cmpne   \rv, #0
44                 bne     100f                    @ already configured
46                 /* Check the debug UART configuration set in uncompress.h */
47                 mov     \rp, pc
48                 ldr     \rv, =OMAP_UART_INFO_OFS
49                 and     \rp, \rp, #0xff000000
50                 ldr     \rp, [\rp, \rv]
52                 /* Select the UART to use based on the UART1 scratchpad value */
53                 cmp     \rp, #0                 @ no port configured?
54                 beq     21f                     @ if none, try to use UART1
55                 cmp     \rp, #OMAP2UART1        @ OMAP2/3/4UART1
56                 beq     21f                     @ configure OMAP2/3/4UART1
57                 cmp     \rp, #OMAP2UART2        @ OMAP2/3/4UART2
58                 beq     22f                     @ configure OMAP2/3/4UART2
59                 cmp     \rp, #OMAP2UART3        @ only on 24xx
60                 beq     23f                     @ configure OMAP2UART3
61                 cmp     \rp, #OMAP3UART3        @ only on 34xx
62                 beq     33f                     @ configure OMAP3UART3
63                 cmp     \rp, #OMAP4UART3        @ only on 44xx/54xx
64                 beq     43f                     @ configure OMAP4/5UART3
65                 cmp     \rp, #OMAP3UART4        @ only on 36xx
66                 beq     34f                     @ configure OMAP3UART4
67                 cmp     \rp, #OMAP4UART4        @ only on 44xx/54xx
68                 beq     44f                     @ configure OMAP4/5UART4
69                 cmp     \rp, #TI81XXUART1       @ ti81Xx UART offsets different
70                 beq     81f                     @ configure UART1
71                 cmp     \rp, #TI81XXUART2       @ ti81Xx UART offsets different
72                 beq     82f                     @ configure UART2
73                 cmp     \rp, #TI81XXUART3       @ ti81Xx UART offsets different
74                 beq     83f                     @ configure UART3
75                 cmp     \rp, #AM33XXUART1       @ AM33XX UART offsets different
76                 beq     84f                     @ configure UART1
77                 cmp     \rp, #ZOOM_UART         @ only on zoom2/3
78                 beq     95f                     @ configure ZOOM_UART
80                 /* Configure the UART offset from the phys/virt base */
81 21:             mov     \rp, #UART_OFFSET(OMAP2_UART1_BASE)     @ omap2/3/4
82                 b       98f
83 22:             mov     \rp, #UART_OFFSET(OMAP2_UART2_BASE)     @ omap2/3/4
84                 b       98f
85 23:             mov     \rp, #UART_OFFSET(OMAP2_UART3_BASE)
86                 b       98f
87 33:             mov     \rp, #UART_OFFSET(OMAP3_UART1_BASE)
88                 add     \rp, \rp, #0x00fb0000
89                 add     \rp, \rp, #0x00006000           @ OMAP3_UART3_BASE
90                 b       98f
91 34:             mov     \rp, #UART_OFFSET(OMAP3_UART1_BASE)
92                 add     \rp, \rp, #0x00fb0000
93                 add     \rp, \rp, #0x00028000           @ OMAP3_UART4_BASE
94                 b       98f
95 43:             mov     \rp, #UART_OFFSET(OMAP4_UART3_BASE)
96                 b       98f
97 44:             mov     \rp, #UART_OFFSET(OMAP4_UART4_BASE)
98                 b       98f
99 81:             mov     \rp, #UART_OFFSET(TI81XX_UART1_BASE)
100                 b       98f
101 82:             mov     \rp, #UART_OFFSET(TI81XX_UART2_BASE)
102                 b       98f
103 83:             mov     \rp, #UART_OFFSET(TI81XX_UART3_BASE)
104                 b       98f
105 84:             ldr     \rp, =AM33XX_UART1_BASE
106                 and     \rp, \rp, #0x00ffffff
107                 b       97f
108 95:             ldr     \rp, =ZOOM_UART_BASE
109                 str     \rp, [\tmp, #0]         @ omap_uart_phys
110                 ldr     \rp, =ZOOM_UART_VIRT
111                 str     \rp, [\tmp, #4]         @ omap_uart_virt
112                 mov     \rp, #(UART_LSR << ZOOM_PORT_SHIFT)
113                 str     \rp, [\tmp, #8]         @ omap_uart_lsr
114                 b       10b
116                 /* AM33XX: Store both phys and virt address for the uart */
117 97:             add     \rp, \rp, #0x44000000   @ phys base
118                 str     \rp, [\tmp, #0]         @ omap_uart_phys
119                 sub     \rp, \rp, #0x44000000   @ phys base
120                 add     \rp, \rp, #0xf9000000   @ virt base
121                 str     \rp, [\tmp, #4]         @ omap_uart_virt
122                 mov     \rp, #(UART_LSR << OMAP_PORT_SHIFT)
123                 str     \rp, [\tmp, #8]         @ omap_uart_lsr
125                 b       10b
127                 /* Store both phys and virt address for the uart */
128 98:             add     \rp, \rp, #0x48000000   @ phys base
129                 str     \rp, [\tmp, #0]         @ omap_uart_phys
130                 sub     \rp, \rp, #0x48000000   @ phys base
131                 add     \rp, \rp, #0xfa000000   @ virt base
132                 str     \rp, [\tmp, #4]         @ omap_uart_virt
133                 mov     \rp, #(UART_LSR << OMAP_PORT_SHIFT)
134                 str     \rp, [\tmp, #8]         @ omap_uart_lsr
136                 b       10b
138                 .align
139 99:             .word   .
140                 .word   omap_uart_phys
141                 .ltorg
143 100:            /* Pass the UART_LSR reg address */
144                 ldr     \tmp, [\tmp, #8]        @ omap_uart_lsr
145                 add     \rp, \rp, \tmp
146                 add     \rv, \rv, \tmp
147                 .endm
149                 .macro  senduart,rd,rx
150                 orr     \rd, \rd, \rx, lsl #24  @ preserve LSR reg offset
151                 bic     \rx, \rx, #0xff         @ get base (THR) reg address
152                 strb    \rd, [\rx]              @ send lower byte of rd
153                 orr     \rx, \rx, \rd, lsr #24  @ restore original rx (LSR)
154                 bic     \rd, \rd, #(0xff << 24) @ restore original rd
155                 .endm
157                 .macro  busyuart,rd,rx
158 1001:           ldrb    \rd, [\rx]              @ rx contains UART_LSR address
159                 and     \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
160                 teq     \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
161                 bne     1001b
162                 .endm
164                 .macro  waituart,rd,rx
165                 .endm