]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
serial: qcom-geni: fix polled console initialisation
authorJohan Hovold <johan+linaro@kernel.org>
Wed, 9 Oct 2024 14:51:02 +0000 (16:51 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Oct 2024 06:39:23 +0000 (08:39 +0200)
The polled console (KGDB/KDB) implementation must not call port setup
unconditionally as the port may already be in use by the console or a
getty.

Only make sure that the receiver is enabled, but do not enable any
device interrupts.

Fixes: d8851a96ba25 ("tty: serial: qcom-geni-serial: Add a poll_init() function")
Cc: stable@vger.kernel.org # 6.4
Cc: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20241009145110.16847-2-johan+linaro@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/qcom_geni_serial.c

index 6f0db310cf69e90b82e7ae73262d15095d4697b5..c237c9d107cd2bfc144d24a2a0feaad51146d0a0 100644 (file)
@@ -147,6 +147,7 @@ static struct uart_driver qcom_geni_uart_driver;
 
 static void __qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport);
 static void qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport);
+static int qcom_geni_serial_port_setup(struct uart_port *uport);
 
 static inline struct qcom_geni_serial_port *to_dev_port(struct uart_port *uport)
 {
@@ -395,6 +396,23 @@ static void qcom_geni_serial_poll_put_char(struct uart_port *uport,
        writel(c, uport->membase + SE_GENI_TX_FIFOn);
        qcom_geni_serial_poll_tx_done(uport);
 }
+
+static int qcom_geni_serial_poll_init(struct uart_port *uport)
+{
+       struct qcom_geni_serial_port *port = to_dev_port(uport);
+       int ret;
+
+       if (!port->setup) {
+               ret = qcom_geni_serial_port_setup(uport);
+               if (ret)
+                       return ret;
+       }
+
+       if (!qcom_geni_serial_secondary_active(uport))
+               geni_se_setup_s_cmd(&port->se, UART_START_READ, 0);
+
+       return 0;
+}
 #endif
 
 #ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
@@ -1582,7 +1600,7 @@ static const struct uart_ops qcom_geni_console_pops = {
 #ifdef CONFIG_CONSOLE_POLL
        .poll_get_char  = qcom_geni_serial_get_char,
        .poll_put_char  = qcom_geni_serial_poll_put_char,
-       .poll_init = qcom_geni_serial_port_setup,
+       .poll_init = qcom_geni_serial_poll_init,
 #endif
        .pm = qcom_geni_serial_pm,
 };