This patch was triggered by a remark from Russell that introducing a call to the waituart (needed to fix debug prints on the Qualcomm platforms) was dangerous because in some cases this will involve waiting for a modem CTS (clear to send) signal, and debug messages would maybe not work on platforms with no modem connected to the UART port: they will just hang waiting for the modem to assert CTS and this might never happen. Looking through all UART debug drivers implementing the waituart macro I discovered that all users except two actually use this macro to check if the UART is ready for TX, let's call this TXRDY. Only two debug UART drivers actually check for CTS: - arch/arm/include/debug/8250.S - arch/arm/include/debug/tegra.S The former is very significant since the 8250 is possibly the most common UART on the planet. We have the following problem: the semantics of waituart are ambiguous making it dangerous to introduce the macro to debug code fixing debug prints for Qualcomm. To start to pry this problem apart, this patch does the following: - Convert all debug UART drivers to define two macros: - waituartcts with the clear semantic to wait for CTS to be asserted - waituarttxrdy with the clear semantic to wait for the TX capability of the UART to be ready - When doing this take care to assign the right function to each drivers macro, so they now do exactly the above. - Update the three sites in the kernel invoking the waituart macro to call waituartcts/waituarttxrdy in sequence, so that the functional impact on the kernel should be zero. After this we can start to change the code sites using this code to do the right thing. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
83 lines
2.0 KiB
ArmAsm
83 lines
2.0 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Debugging macro include header
|
|
*
|
|
* Copyright (C) 1994-1999 Russell King
|
|
* Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
|
|
*/
|
|
|
|
#include <linux/serial_reg.h>
|
|
|
|
/* External port on Zoom2/3 */
|
|
#define ZOOM_UART_BASE 0x10000000
|
|
#define ZOOM_UART_VIRT 0xfa400000
|
|
|
|
#define OMAP_PORT_SHIFT 2
|
|
#define ZOOM_PORT_SHIFT 1
|
|
|
|
#define UART_OFFSET(addr) ((addr) & 0x00ffffff)
|
|
|
|
.pushsection .data
|
|
.align 2
|
|
omap_uart_phys: .word 0
|
|
omap_uart_virt: .word 0
|
|
omap_uart_lsr: .word 0
|
|
.popsection
|
|
|
|
.macro addruart, rp, rv, tmp
|
|
|
|
/* Use omap_uart_phys/virt if already configured */
|
|
10: adr \rp, 99f @ get effective addr of 99f
|
|
ldr \rv, [\rp] @ get absolute addr of 99f
|
|
sub \rv, \rv, \rp @ offset between the two
|
|
ldr \rp, [\rp, #4] @ abs addr of omap_uart_phys
|
|
sub \tmp, \rp, \rv @ make it effective
|
|
ldr \rp, [\tmp, #0] @ omap_uart_phys
|
|
ldr \rv, [\tmp, #4] @ omap_uart_virt
|
|
cmp \rp, #0 @ is port configured?
|
|
cmpne \rv, #0
|
|
bne 100f @ already configured
|
|
|
|
/* Configure the UART offset from the phys/virt base */
|
|
#ifdef CONFIG_DEBUG_ZOOM_UART
|
|
ldr \rp, =ZOOM_UART_BASE
|
|
str \rp, [\tmp, #0] @ omap_uart_phys
|
|
ldr \rp, =ZOOM_UART_VIRT
|
|
str \rp, [\tmp, #4] @ omap_uart_virt
|
|
mov \rp, #(UART_LSR << ZOOM_PORT_SHIFT)
|
|
str \rp, [\tmp, #8] @ omap_uart_lsr
|
|
#endif
|
|
b 10b
|
|
|
|
.align
|
|
99: .word .
|
|
.word omap_uart_phys
|
|
.ltorg
|
|
|
|
100: /* Pass the UART_LSR reg address */
|
|
ldr \tmp, [\tmp, #8] @ omap_uart_lsr
|
|
add \rp, \rp, \tmp
|
|
add \rv, \rv, \tmp
|
|
.endm
|
|
|
|
.macro senduart,rd,rx
|
|
orr \rd, \rd, \rx, lsl #24 @ preserve LSR reg offset
|
|
bic \rx, \rx, #0xff @ get base (THR) reg address
|
|
strb \rd, [\rx] @ send lower byte of rd
|
|
orr \rx, \rx, \rd, lsr #24 @ restore original rx (LSR)
|
|
bic \rd, \rd, #(0xff << 24) @ restore original rd
|
|
.endm
|
|
|
|
.macro busyuart,rd,rx
|
|
1001: ldrb \rd, [\rx] @ rx contains UART_LSR address
|
|
and \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
|
|
teq \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
|
|
bne 1001b
|
|
.endm
|
|
|
|
.macro waituartcts,rd,rx
|
|
.endm
|
|
|
|
.macro waituarttxrdy,rd,rx
|
|
.endm
|