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 <plat/serial.h> 17 18#define UART_OFFSET(addr) ((addr) & 0x00ffffff) 19 20 .pushsection .data 21omap_uart_phys: .word 0 22omap_uart_virt: .word 0 23omap_uart_lsr: .word 0 24 .popsection 25 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 33 34 /* Use omap_uart_phys/virt if already configured */ 3510: 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 45 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] 51 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 64 beq 43f @ configure OMAP4UART3 65 cmp \rp, #OMAP3UART4 @ only on 36xx 66 beq 34f @ configure OMAP3UART4 67 cmp \rp, #OMAP4UART4 @ only on 44xx 68 beq 44f @ configure OMAP4UART4 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, #ZOOM_UART @ only on zoom2/3 76 beq 95f @ configure ZOOM_UART 77 78 /* Configure the UART offset from the phys/virt base */ 7921: mov \rp, #UART_OFFSET(OMAP2_UART1_BASE) @ omap2/3/4 80 b 98f 8122: mov \rp, #UART_OFFSET(OMAP2_UART2_BASE) @ omap2/3/4 82 b 98f 8323: mov \rp, #UART_OFFSET(OMAP2_UART3_BASE) 84 b 98f 8533: mov \rp, #UART_OFFSET(OMAP3_UART1_BASE) 86 add \rp, \rp, #0x00fb0000 87 add \rp, \rp, #0x00006000 @ OMAP3_UART3_BASE 88 b 98f 8934: mov \rp, #UART_OFFSET(OMAP3_UART1_BASE) 90 add \rp, \rp, #0x00fb0000 91 add \rp, \rp, #0x00028000 @ OMAP3_UART4_BASE 92 b 98f 9343: mov \rp, #UART_OFFSET(OMAP4_UART3_BASE) 94 b 98f 9544: mov \rp, #UART_OFFSET(OMAP4_UART4_BASE) 96 b 98f 9781: mov \rp, #UART_OFFSET(TI81XX_UART1_BASE) 98 b 98f 9982: mov \rp, #UART_OFFSET(TI81XX_UART2_BASE) 100 b 98f 10183: mov \rp, #UART_OFFSET(TI81XX_UART3_BASE) 102 b 98f 103 10495: ldr \rp, =ZOOM_UART_BASE 105 str \rp, [\tmp, #0] @ omap_uart_phys 106 ldr \rp, =ZOOM_UART_VIRT 107 str \rp, [\tmp, #4] @ omap_uart_virt 108 mov \rp, #(UART_LSR << ZOOM_PORT_SHIFT) 109 str \rp, [\tmp, #8] @ omap_uart_lsr 110 b 10b 111 112 /* Store both phys and virt address for the uart */ 11398: add \rp, \rp, #0x48000000 @ phys base 114 str \rp, [\tmp, #0] @ omap_uart_phys 115 sub \rp, \rp, #0x48000000 @ phys base 116 add \rp, \rp, #0xfa000000 @ virt base 117 str \rp, [\tmp, #4] @ omap_uart_virt 118 mov \rp, #(UART_LSR << OMAP_PORT_SHIFT) 119 str \rp, [\tmp, #8] @ omap_uart_lsr 120 121 b 10b 122 123 .align 12499: .word . 125 .word omap_uart_phys 126 .ltorg 127 128100: /* Pass the UART_LSR reg address */ 129 ldr \tmp, [\tmp, #8] @ omap_uart_lsr 130 add \rp, \rp, \tmp 131 add \rv, \rv, \tmp 132 .endm 133 134 .macro senduart,rd,rx 135 orr \rd, \rd, \rx, lsl #24 @ preserve LSR reg offset 136 bic \rx, \rx, #0xff @ get base (THR) reg address 137 strb \rd, [\rx] @ send lower byte of rd 138 orr \rx, \rx, \rd, lsr #24 @ restore original rx (LSR) 139 bic \rd, \rd, #(0xff << 24) @ restore original rd 140 .endm 141 142 .macro busyuart,rd,rx 1431001: ldrb \rd, [\rx] @ rx contains UART_LSR address 144 and \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE) 145 teq \rd, #(UART_LSR_TEMT | UART_LSR_THRE) 146 bne 1001b 147 .endm 148 149 .macro waituart,rd,rx 150 .endm 151