--- /dev/null
+From 28e9b4cd255e3bbb49f0dd6e1fc234e76d046c03 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Feb 2020 10:18:25 -0700
+Subject: serial: uartps: Add a timeout to the tx empty wait
+
+From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
+
+[ Upstream commit 277375b864e8147975b064b513f491e2a910e66a ]
+
+In case the cable is not connected then the target gets into
+an infinite wait for tx empty.
+Add a timeout to the tx empty wait.
+
+Reported-by: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
+Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/xilinx_uartps.c | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
+index 0dbfd02e3b196..9826a15bfd871 100644
+--- a/drivers/tty/serial/xilinx_uartps.c
++++ b/drivers/tty/serial/xilinx_uartps.c
+@@ -31,6 +31,7 @@
+ #include <linux/of.h>
+ #include <linux/module.h>
+ #include <linux/pm_runtime.h>
++#include <linux/iopoll.h>
+
+ #define CDNS_UART_TTY_NAME "ttyPS"
+ #define CDNS_UART_NAME "xuartps"
+@@ -39,6 +40,7 @@
+ #define CDNS_UART_NR_PORTS 2
+ #define CDNS_UART_FIFO_SIZE 64 /* FIFO size */
+ #define CDNS_UART_REGISTER_SPACE 0x1000
++#define TX_TIMEOUT 500000
+
+ /* Rx Trigger level */
+ static int rx_trigger_level = 56;
+@@ -685,16 +687,20 @@ static void cdns_uart_set_termios(struct uart_port *port,
+ unsigned int cval = 0;
+ unsigned int baud, minbaud, maxbaud;
+ unsigned long flags;
+- unsigned int ctrl_reg, mode_reg;
++ unsigned int ctrl_reg, mode_reg, val;
++ int err;
+
+ spin_lock_irqsave(&port->lock, flags);
+
+ /* Wait for the transmit FIFO to empty before making changes */
+ if (!(readl(port->membase + CDNS_UART_CR) &
+ CDNS_UART_CR_TX_DIS)) {
+- while (!(readl(port->membase + CDNS_UART_SR) &
+- CDNS_UART_SR_TXEMPTY)) {
+- cpu_relax();
++ err = readl_poll_timeout(port->membase + CDNS_UART_SR,
++ val, (val & CDNS_UART_SR_TXEMPTY),
++ 1000, TX_TIMEOUT);
++ if (err) {
++ dev_err(port->dev, "timed out waiting for tx empty");
++ return;
+ }
+ }
+
+--
+2.20.1
+