mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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>
95 lines
1.9 KiB
ArmAsm
95 lines
1.9 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright 2005, 2007 Simtec Electronics
|
|
* http://armlinux.simtec.co.uk/
|
|
* Ben Dooks <ben@simtec.co.uk>
|
|
*/
|
|
|
|
#include <linux/serial_s3c.h>
|
|
|
|
/* The S5PV210/S5PC110 implementations are as belows. */
|
|
|
|
.macro fifo_level_s5pv210 rd, rx
|
|
ldr \rd, [\rx, # S3C2410_UFSTAT]
|
|
ARM_BE8(rev \rd, \rd)
|
|
and \rd, \rd, #S5PV210_UFSTAT_TXMASK
|
|
.endm
|
|
|
|
.macro fifo_full_s5pv210 rd, rx
|
|
ldr \rd, [\rx, # S3C2410_UFSTAT]
|
|
ARM_BE8(rev \rd, \rd)
|
|
tst \rd, #S5PV210_UFSTAT_TXFULL
|
|
.endm
|
|
|
|
/* The S3C2440 implementations are used by default as they are the
|
|
* most widely re-used */
|
|
|
|
.macro fifo_level_s3c2440 rd, rx
|
|
ldr \rd, [\rx, # S3C2410_UFSTAT]
|
|
ARM_BE8(rev \rd, \rd)
|
|
and \rd, \rd, #S3C2440_UFSTAT_TXMASK
|
|
.endm
|
|
|
|
#ifndef fifo_level
|
|
#define fifo_level fifo_level_s3c2440
|
|
#endif
|
|
|
|
.macro fifo_full_s3c2440 rd, rx
|
|
ldr \rd, [\rx, # S3C2410_UFSTAT]
|
|
ARM_BE8(rev \rd, \rd)
|
|
tst \rd, #S3C2440_UFSTAT_TXFULL
|
|
.endm
|
|
|
|
#ifndef fifo_full
|
|
#define fifo_full fifo_full_s3c2440
|
|
#endif
|
|
|
|
.macro senduart,rd,rx
|
|
strb \rd, [\rx, # S3C2410_UTXH]
|
|
.endm
|
|
|
|
.macro busyuart, rd, rx
|
|
ldr \rd, [\rx, # S3C2410_UFCON]
|
|
ARM_BE8(rev \rd, \rd)
|
|
tst \rd, #S3C2410_UFCON_FIFOMODE @ fifo enabled?
|
|
beq 1001f @
|
|
@ FIFO enabled...
|
|
1003:
|
|
fifo_full \rd, \rx
|
|
bne 1003b
|
|
b 1002f
|
|
|
|
1001:
|
|
@ busy waiting for non fifo
|
|
ldr \rd, [\rx, # S3C2410_UTRSTAT]
|
|
ARM_BE8(rev \rd, \rd)
|
|
tst \rd, #S3C2410_UTRSTAT_TXFE
|
|
beq 1001b
|
|
|
|
1002: @ exit busyuart
|
|
.endm
|
|
|
|
.macro waituartcts,rd,rx
|
|
.endm
|
|
|
|
.macro waituarttxrdy,rd,rx
|
|
ldr \rd, [\rx, # S3C2410_UFCON]
|
|
ARM_BE8(rev \rd, \rd)
|
|
tst \rd, #S3C2410_UFCON_FIFOMODE @ fifo enabled?
|
|
beq 1001f @
|
|
@ FIFO enabled...
|
|
1003:
|
|
fifo_level \rd, \rx
|
|
teq \rd, #0
|
|
bne 1003b
|
|
b 1002f
|
|
1001:
|
|
@ idle waiting for non fifo
|
|
ldr \rd, [\rx, # S3C2410_UTRSTAT]
|
|
ARM_BE8(rev \rd, \rd)
|
|
tst \rd, #S3C2410_UTRSTAT_TXFE
|
|
beq 1001b
|
|
|
|
1002: @ exit busyuart
|
|
.endm
|