aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuhiro Fujita <kazuhiro.fujita.jg@renesas.com>2020-03-27 18:17:28 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-04-29 16:31:34 +0200
commitd407f7dc0662ec2d8c5f79d79786144d3340e761 (patch)
tree0c120aa61fef12e653743c901576cc499a7b4abf
parentd3ee95dedd88ed3fcd4647e4a8e265acaf27b2f0 (diff)
downloadlinux-yocto-d407f7dc0662ec2d8c5f79d79786144d3340e761.tar.gz
linux-yocto-d407f7dc0662ec2d8c5f79d79786144d3340e761.tar.bz2
linux-yocto-d407f7dc0662ec2d8c5f79d79786144d3340e761.zip
serial: sh-sci: Make sure status register SCxSR is read in correct sequence
commit 3dc4db3662366306e54ddcbda4804acb1258e4ba upstream. For SCIF and HSCIF interfaces the SCxSR register holds the status of data that is to be read next from SCxRDR register, But where as for SCIFA and SCIFB interfaces SCxSR register holds status of data that is previously read from SCxRDR register. This patch makes sure the status register is read depending on the port types so that errors are caught accordingly. Cc: <stable@vger.kernel.org> Signed-off-by: Kazuhiro Fujita <kazuhiro.fujita.jg@renesas.com> Signed-off-by: Hao Bui <hao.bui.yg@renesas.com> Signed-off-by: KAZUMI HARADA <kazumi.harada.rh@renesas.com> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://lore.kernel.org/r/1585333048-31828-1-git-send-email-kazuhiro.fujita.jg@renesas.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/tty/serial/sh-sci.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 9e1a6af23ca2..8aaa7900927a 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -873,9 +873,16 @@ static void sci_receive_chars(struct uart_port *port)
tty_insert_flip_char(tport, c, TTY_NORMAL);
} else {
for (i = 0; i < count; i++) {
- char c = serial_port_in(port, SCxRDR);
-
- status = serial_port_in(port, SCxSR);
+ char c;
+
+ if (port->type == PORT_SCIF ||
+ port->type == PORT_HSCIF) {
+ status = serial_port_in(port, SCxSR);
+ c = serial_port_in(port, SCxRDR);
+ } else {
+ c = serial_port_in(port, SCxRDR);
+ status = serial_port_in(port, SCxSR);
+ }
if (uart_handle_sysrq_char(port, c)) {
count--; i--;
continue;