diff options
Diffstat (limited to 'arch/arm/mach-omap2/include/mach/debug-macro.S')
| -rw-r--r-- | arch/arm/mach-omap2/include/mach/debug-macro.S | 130 | 
1 files changed, 101 insertions, 29 deletions
diff --git a/arch/arm/mach-omap2/include/mach/debug-macro.S b/arch/arm/mach-omap2/include/mach/debug-macro.S index e9f255df916..4a63a2ea484 100644 --- a/arch/arm/mach-omap2/include/mach/debug-macro.S +++ b/arch/arm/mach-omap2/include/mach/debug-macro.S @@ -11,32 +11,107 @@   *  */ -		.macro	addruart,rx +#include <linux/serial_reg.h> + +#include <plat/serial.h> + +#define UART_OFFSET(addr)	((addr) & 0x00ffffff) + +		.pushsection .data +omap_uart_phys:	.word	0 +omap_uart_virt:	.word	0 +omap_uart_lsr:	.word	0 +		.popsection + +		/* +		 * Note that this code won't work if the bootloader passes +		 * a wrong machine ID number in r1. To debug, just hardcode +		 * the desired UART phys and virt addresses temporarily into +		 * the omap_uart_phys and omap_uart_virt above. +		 */ +		.macro	addruart, rx, tmp + +		/* Use omap_uart_phys/virt if already configured */ +10:		mrc	p15, 0, \rx, c1, c0 +		tst	\rx, #1			@ MMU enabled? +		ldreq	\rx, =omap_uart_phys	@ physical base address +		ldrne	\rx, =omap_uart_virt	@ virtual base address +		ldr	\rx, [\rx, #0] +		cmp	\rx, #0			@ is port configured? +		bne	99f			@ already configured + +		/* Check UART1 scratchpad register for uart to use */  		mrc	p15, 0, \rx, c1, c0  		tst	\rx, #1			@ MMU enabled? -#ifdef  CONFIG_ARCH_OMAP2  		moveq	\rx, #0x48000000	@ physical base address  		movne	\rx, #0xfa000000	@ virtual base -		orr	\rx, \rx, #0x0006a000 -#ifdef CONFIG_OMAP_LL_DEBUG_UART2 -		add	\rx, \rx, #0x00002000	@ UART 2 -#endif -#ifdef CONFIG_OMAP_LL_DEBUG_UART3 -		add	\rx, \rx, #0x00004000	@ UART 3 -#endif +		orr	\rx, \rx, #0x0006a000	@ uart1 on omap2/3/4 +		ldrb	\rx, [\rx, #(UART_SCR << OMAP_PORT_SHIFT)] @ scratchpad -#elif defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) -		moveq	\rx, #0x48000000	@ physical base address -		movne	\rx, #0xfa000000	@ virtual base -		orr	\rx, \rx, #0x0006a000 -#ifdef CONFIG_OMAP_LL_DEBUG_UART2 -		add	\rx, \rx, #0x00002000	@ UART 2 -#endif -#ifdef CONFIG_OMAP_LL_DEBUG_UART3 -		add	\rx, \rx, #0x00fb0000	@ UART 3 -		add	\rx, \rx, #0x00006000 -#endif -#endif +		/* Select the UART to use based on the UART1 scratchpad value */ +		cmp	\rx, #0			@ no port configured? +		beq	21f			@ if none, try to use UART1 +		cmp	\rx, #OMAP2UART1	@ OMAP2/3/4UART1 +		beq	21f			@ configure OMAP2/3/4UART1 +		cmp	\rx, #OMAP2UART2	@ OMAP2/3/4UART2 +		beq	22f			@ configure OMAP2/3/4UART2 +		cmp	\rx, #OMAP2UART3	@ only on 24xx +		beq	23f			@ configure OMAP2UART3 +		cmp	\rx, #OMAP3UART3	@ only on 34xx +		beq	33f			@ configure OMAP3UART3 +		cmp	\rx, #OMAP4UART3	@ only on 44xx +		beq	43f			@ configure OMAP4UART3 +		cmp	\rx, #OMAP3UART4	@ only on 36xx +		beq	34f			@ configure OMAP3UART4 +		cmp	\rx, #OMAP4UART4	@ only on 44xx +		beq	44f			@ configure OMAP4UART4 +		cmp	\rx, #ZOOM_UART		@ only on zoom2/3 +		beq	95f			@ configure ZOOM_UART + +		/* Configure the UART offset from the phys/virt base */ +21:		mov	\rx, #UART_OFFSET(OMAP2_UART1_BASE)	@ omap2/3/4 +		b	98f +22:		mov	\rx, #UART_OFFSET(OMAP2_UART2_BASE)	@ omap2/3/4 +		b	98f +23:		mov	\rx, #UART_OFFSET(OMAP2_UART3_BASE) +		b	98f +33:		mov	\rx, #UART_OFFSET(OMAP3_UART1_BASE) +		add	\rx, \rx, #0x00fb0000 +		add	\rx, \rx, #0x00006000		@ OMAP3_UART3_BASE +		b	98f +34:		mov	\rx, #UART_OFFSET(OMAP3_UART1_BASE) +		add	\rx, \rx, #0x00fb0000 +		add	\rx, \rx, #0x00028000		@ OMAP3_UART4_BASE +		b	98f +43:		mov	\rx, #UART_OFFSET(OMAP4_UART3_BASE) +		b	98f +44:		mov	\rx, #UART_OFFSET(OMAP4_UART4_BASE) +		b	98f +95:		mov	\rx, #ZOOM_UART_BASE +		ldr	\tmp, =omap_uart_phys +		str	\rx, [\tmp, #0] +		mov	\rx, #ZOOM_UART_VIRT +		ldr	\tmp, =omap_uart_virt +		str	\rx, [\tmp, #0] +		mov	\rx, #(UART_LSR << ZOOM_PORT_SHIFT) +		ldr	\tmp, =omap_uart_lsr +		str	\rx, [\tmp, #0] +		b	10b + +		/* Store both phys and virt address for the uart */ +98:		add	\rx, \rx, #0x48000000	@ phys base +		ldr	\tmp, =omap_uart_phys +		str	\rx, [\tmp, #0] +		sub	\rx, \rx, #0x48000000	@ phys base +		add	\rx, \rx, #0xfa000000	@ virt base +		ldr	\tmp, =omap_uart_virt +		str	\rx, [\tmp, #0] +		mov	\rx, #(UART_LSR << OMAP_PORT_SHIFT) +		ldr	\tmp, =omap_uart_lsr +		str	\rx, [\tmp, #0] + +		b	10b +99:  		.endm  		.macro	senduart,rd,rx @@ -44,15 +119,12 @@  		.endm  		.macro	busyuart,rd,rx -1001:		ldrb	\rd, [\rx, #(0x5 << 2)]	@ OMAP-1510 and friends -		and	\rd, \rd, #0x60 -		teq	\rd, #0x60 -		beq	1002f -		ldrb	\rd, [\rx, #(0x5 << 0)]	@ OMAP-730 only -		and	\rd, \rd, #0x60 -		teq	\rd, #0x60 +1001:		ldr	\rd, =omap_uart_lsr +		ldr	\rd, [\rd, #0] +		ldrb	\rd, [\rx, \rd] +		and	\rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE) +		teq	\rd, #(UART_LSR_TEMT | UART_LSR_THRE)  		bne	1001b -1002:  		.endm  		.macro	waituart,rd,rx  |