]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
serial: uart_poll_init() should power on the UART
authorDouglas Anderson <dianders@chromium.org>
Thu, 16 Mar 2023 20:20:56 +0000 (13:20 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Mar 2023 08:51:52 +0000 (10:51 +0200)
On Qualcomm devices which use the "geni" serial driver, kdb/kgdb won't
be very happy if you use it but the resources of the port haven't been
powered on. Today kdb/kgdb rely on someone else powering the port
on. This could be the normal kernel console or an agetty running.
Let's fix this to explicitly power things on when setting up a polling
driver.

Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20230316132027.RESEND.1.I106c39498d8094c6f5e7ada42c7db17aa5c64e48@changeid
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c

index db7f6c0c39bf799026d1b100dea6d7f542c291f4..afafbb7edb4adc2d22d18a78d9609bbbdb258157 100644 (file)
@@ -2590,6 +2590,7 @@ static int uart_poll_init(struct tty_driver *driver, int line, char *options)
 {
        struct uart_driver *drv = driver->driver_state;
        struct uart_state *state = drv->state + line;
+       enum uart_pm_state pm_state;
        struct tty_port *tport;
        struct uart_port *port;
        int baud = 9600;
@@ -2607,6 +2608,9 @@ static int uart_poll_init(struct tty_driver *driver, int line, char *options)
                goto out;
        }
 
+       pm_state = state->pm_state;
+       uart_change_pm(state, UART_PM_STATE_ON);
+
        if (port->ops->poll_init) {
                /*
                 * We don't set initialized as we only initialized the hw,
@@ -2623,6 +2627,8 @@ static int uart_poll_init(struct tty_driver *driver, int line, char *options)
                console_list_unlock();
        }
 out:
+       if (ret)
+               uart_change_pm(state, pm_state);
        mutex_unlock(&tport->mutex);
        return ret;
 }