Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a38fd93 authored by Ryan Case's avatar Ryan Case Committed by Greg Kroah-Hartman
Browse files

tty: serial: qcom_geni_serial: Fix UART hang



[ Upstream commit 663abb1a7a7ff8fea9ab0145463de7fcff823755 ]

If a serial console write occured while a UART transmit command was
waiting for a done signal then no further data would be sent until
something new kicked the system into gear. If there is already data
waiting in the circular buffer we must re-enable the tx watermark so we
receive the expected interrupts.

Signed-off-by: default avatarRyan Case <ryandcase@chromium.org>
Reviewed-by: default avatarEvan Green <evgreen@chromium.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent fe1cfc64
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -438,6 +438,7 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s,
	bool locked = true;
	unsigned long flags;
	u32 geni_status;
	u32 irq_en;

	WARN_ON(co->index < 0 || co->index >= GENI_UART_CONS_PORTS);

@@ -472,6 +473,13 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s,
		 * has been sent, in which case we need to look for done first.
		 */
		qcom_geni_serial_poll_tx_done(uport);

		if (uart_circ_chars_pending(&uport->state->xmit)) {
			irq_en = readl_relaxed(uport->membase +
					SE_GENI_M_IRQ_EN);
			writel_relaxed(irq_en | M_TX_FIFO_WATERMARK_EN,
					uport->membase + SE_GENI_M_IRQ_EN);
		}
	}

	__qcom_geni_serial_console_write(uport, s, count);