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 <plat/serial.h>
17
18		.pushsection .data
19omap_uart_phys:	.word	0x0
20omap_uart_virt:	.word	0x0
21		.popsection
22
23		/*
24		 * Note that this code won't work if the bootloader passes
25		 * a wrong machine ID number in r1. To debug, just hardcode
26		 * the desired UART phys and virt addresses temporarily into
27		 * the omap_uart_phys and omap_uart_virt above.
28		 */
29		.macro	addruart, rp, rv, tmp
30
31		/* Use omap_uart_phys/virt if already configured */
329:		adr	\rp, 99f		@ get effective addr of 99f
33		ldr	\rv, [\rp]		@ get absolute addr of 99f
34		sub	\rv, \rv, \rp		@ offset between the two
35		ldr	\rp, [\rp, #4]		@ abs addr of omap_uart_phys
36		sub	\tmp, \rp, \rv		@ make it effective
37		ldr	\rp, [\tmp, #0]		@ omap_uart_phys
38		ldr	\rv, [\tmp, #4]		@ omap_uart_virt
39		cmp	\rp, #0			@ is port configured?
40		cmpne	\rv, #0
41		bne	100f			@ already configured
42
43		/* Check the debug UART configuration set in uncompress.h */
44		and	\rp, pc, #0xff000000
45		ldr	\rv, =OMAP_UART_INFO_OFS
46		ldr	\rp, [\rp, \rv]
47
48		/* Select the UART to use based on the UART1 scratchpad value */
4910:		cmp	\rp, #0			@ no port configured?
50		beq	11f			@ if none, try to use UART1
51		cmp	\rp, #OMAP1UART1
52		beq	11f			@ configure OMAP1UART1
53		cmp	\rp, #OMAP1UART2
54		beq	12f			@ configure OMAP1UART2
55		cmp	\rp, #OMAP1UART3
56		beq	13f			@ configure OMAP2UART3
57
58		/* Configure the UART offset from the phys/virt base */
5911:		mov	\rp, #0x00fb0000	@ OMAP1UART1
60		b	98f
6112:		mov	\rp, #0x00fb0000	@ OMAP1UART1
62		orr	\rp, \rp, #0x00000800	@ OMAP1UART2
63		b	98f
6413:		mov	\rp, #0x00fb0000	@ OMAP1UART1
65		orr	\rp, \rp, #0x00000800	@ OMAP1UART2
66		orr	\rp, \rp, #0x00009000	@ OMAP1UART3
67
68		/* Store both phys and virt address for the uart */
6998:		add	\rp, \rp, #0xff000000	@ phys base
70		str	\rp, [\tmp, #0]		@ omap_uart_phys
71		sub	\rp, \rp, #0xff000000	@ phys base
72		add	\rp, \rp, #0xfe000000	@ virt base
73		str	\rp, [\tmp, #4]		@ omap_uart_virt
74		b	9b
75
76		.align
7799:		.word	.
78		.word	omap_uart_phys
79		.ltorg
80
81100:
82		.endm
83
84		.macro	senduart,rd,rx
85		strb	\rd, [\rx]
86		.endm
87
88		.macro	busyuart,rd,rx
891001:		ldrb	\rd, [\rx, #(UART_LSR << OMAP_PORT_SHIFT)]
90		and	\rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
91		teq	\rd, #(UART_LSR_TEMT | UART_LSR_THRE)
92		beq	1002f
93		ldrb	\rd, [\rx, #(UART_LSR << OMAP7XX_PORT_SHIFT)]
94		and	\rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
95		teq	\rd, #(UART_LSR_TEMT | UART_LSR_THRE)
96		bne	1001b
971002:
98		.endm
99
100		.macro	waituart,rd,rx
101		.endm
102