|  | /* | 
|  | * arch/arm/mach-tegra/include/mach/debug-macro.S | 
|  | * | 
|  | * Copyright (C) 2010,2011 Google, Inc. | 
|  | * Copyright (C) 2011-2012 NVIDIA CORPORATION. All Rights Reserved. | 
|  | * | 
|  | * Author: | 
|  | *	Colin Cross <ccross@google.com> | 
|  | *	Erik Gilling <konkers@google.com> | 
|  | *	Doug Anderson <dianders@chromium.org> | 
|  | *	Stephen Warren <swarren@nvidia.com> | 
|  | * | 
|  | * Portions based on mach-omap2's debug-macro.S | 
|  | * Copyright (C) 1994-1999 Russell King | 
|  | * | 
|  | * This software is licensed under the terms of the GNU General Public | 
|  | * License version 2, as published by the Free Software Foundation, and | 
|  | * may be copied, distributed, and modified under those terms. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <linux/serial_reg.h> | 
|  |  | 
|  | #include <mach/iomap.h> | 
|  | #include <mach/irammap.h> | 
|  |  | 
|  | .macro  addruart, rp, rv, tmp | 
|  | adr	\rp, 99f		@ actual addr of 99f | 
|  | ldr	\rv, [\rp]		@ linked addr is stored there | 
|  | sub	\rv, \rv, \rp		@ offset between the two | 
|  | ldr	\rp, [\rp, #4]		@ linked tegra_uart_config | 
|  | sub	\tmp, \rp, \rv		@ actual tegra_uart_config | 
|  | ldr	\rp, [\tmp]		@ Load tegra_uart_config | 
|  | cmp	\rp, #1			@ needs intitialization? | 
|  | bne	100f			@ no; go load the addresses | 
|  | mov	\rv, #0			@ yes; record init is done | 
|  | str	\rv, [\tmp] | 
|  | mov	\rp, #TEGRA_IRAM_BASE	@ See if cookie is in IRAM | 
|  | ldr	\rv, [\rp, #TEGRA_IRAM_DEBUG_UART_OFFSET] | 
|  | movw	\rp, #TEGRA_IRAM_DEBUG_UART_COOKIE & 0xffff | 
|  | movt	\rp, #TEGRA_IRAM_DEBUG_UART_COOKIE >> 16 | 
|  | cmp	\rv, \rp		@ Cookie present? | 
|  | bne	100f			@ No, use default UART | 
|  | mov	\rp, #TEGRA_IRAM_BASE	@ Load UART address from IRAM | 
|  | ldr	\rv, [\rp, #TEGRA_IRAM_DEBUG_UART_OFFSET + 4] | 
|  | str	\rv, [\tmp, #4]		@ Store in tegra_uart_phys | 
|  | sub	\rv, \rv, #IO_APB_PHYS	@ Calculate virt address | 
|  | add	\rv, \rv, #IO_APB_VIRT | 
|  | str	\rv, [\tmp, #8]		@ Store in tegra_uart_virt | 
|  | b	100f | 
|  |  | 
|  | .align | 
|  | 99:		.word	. | 
|  | .word	tegra_uart_config | 
|  | .ltorg | 
|  |  | 
|  | 100:		ldr	\rp, [\tmp, #4]		@ Load tegra_uart_phys | 
|  | ldr	\rv, [\tmp, #8]		@ Load tegra_uart_virt | 
|  | .endm | 
|  |  | 
|  | #define UART_SHIFT 2 | 
|  |  | 
|  | /* | 
|  | * Code below is swiped from <asm/hardware/debug-8250.S>, but add an extra | 
|  | * check to make sure that we aren't in the CONFIG_TEGRA_DEBUG_UART_NONE case. | 
|  | * We use the fact that all 5 valid UART addresses all have something in the | 
|  | * 2nd-to-lowest byte. | 
|  | */ | 
|  |  | 
|  | .macro	senduart, rd, rx | 
|  | tst	\rx, #0x0000ff00 | 
|  | strneb	\rd, [\rx, #UART_TX << UART_SHIFT] | 
|  | 1001: | 
|  | .endm | 
|  |  | 
|  | .macro	busyuart, rd, rx | 
|  | tst	\rx, #0x0000ff00 | 
|  | beq	1002f | 
|  | 1001:		ldrb	\rd, [\rx, #UART_LSR << UART_SHIFT] | 
|  | 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 | 
|  | #ifdef FLOW_CONTROL | 
|  | tst	\rx, #0x0000ff00 | 
|  | beq	1002f | 
|  | 1001:		ldrb	\rd, [\rx, #UART_MSR << UART_SHIFT] | 
|  | tst	\rd, #UART_MSR_CTS | 
|  | beq	1001b | 
|  | 1002: | 
|  | #endif | 
|  | .endm |