Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion drivers/tty/serial/qcom_geni_serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -1860,6 +1860,7 @@ static int qcom_geni_serial_suspend(struct device *dev)
struct qcom_geni_serial_port *port = dev_get_drvdata(dev);
struct uart_port *uport = &port->uport;
struct qcom_geni_private_data *private_data = uport->private_data;
int ret;

/*
* This is done so we can hit the lowest possible state in suspend
Expand All @@ -1869,7 +1870,19 @@ static int qcom_geni_serial_suspend(struct device *dev)
geni_icc_set_tag(&port->se, QCOM_ICC_TAG_ACTIVE_ONLY);
geni_icc_set_bw(&port->se);
}
return uart_suspend_port(private_data->drv, uport);

ret = uart_suspend_port(private_data->drv, uport);
if (ret)
return ret;

/*
* When no_console_suspend is set the console must remain active
* across system sleep, so skip the force suspend path.
*/
if (uart_console(uport) && !uport->suspended)
return 0;

return pm_runtime_force_suspend(dev);
}

static int qcom_geni_serial_resume(struct device *dev)
Expand All @@ -1879,6 +1892,10 @@ static int qcom_geni_serial_resume(struct device *dev)
struct uart_port *uport = &port->uport;
struct qcom_geni_private_data *private_data = uport->private_data;

ret = pm_runtime_force_resume(dev);
if (ret)
return ret;

ret = uart_resume_port(private_data->drv, uport);
if (uart_console(uport)) {
geni_icc_set_tag(&port->se, QCOM_ICC_TAG_ALWAYS);
Expand Down
Loading