diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index c8c4f01d3143..83ba0f5433ef 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -117,7 +117,8 @@ struct qcom_geni_device_data { enum geni_se_xfer_mode mode; int (*resources_init)(struct geni_se *se); int (*set_rate)(struct uart_port *uport, unsigned int baud); - int (*power_state)(struct uart_port *uport, bool state); + int (*power_on)(struct geni_se *se); + int (*power_off)(struct geni_se *se); }; struct qcom_geni_private_data { @@ -1817,47 +1818,6 @@ static struct uart_driver qcom_geni_uart_driver = { .nr = CONFIG_SERIAL_QCOM_GENI_UART_PORTS, }; -static int geni_serial_resources_on(struct uart_port *uport) -{ - struct qcom_geni_serial_port *port = to_dev_port(uport); - int ret; - - ret = geni_icc_enable(&port->se); - if (ret) - return ret; - - ret = geni_se_resources_on(&port->se); - if (ret) { - geni_icc_disable(&port->se); - return ret; - } - - if (port->clk_rate) - dev_pm_opp_set_rate(uport->dev, port->clk_rate); - - return 0; -} - -static int geni_serial_resources_off(struct uart_port *uport) -{ - struct qcom_geni_serial_port *port = to_dev_port(uport); - int ret; - - dev_pm_opp_set_rate(uport->dev, 0); - ret = geni_se_resources_off(&port->se); - if (ret) - return ret; - - geni_icc_disable(&port->se); - - return 0; -} - -static int geni_serial_resource_state(struct uart_port *uport, bool power_on) -{ - return power_on ? geni_serial_resources_on(uport) : geni_serial_resources_off(uport); -} - /** * qcom_geni_rs485_config - Configure RS485 settings for the UART port * @uport: Pointer to the UART port structure @@ -2115,25 +2075,27 @@ static void qcom_geni_serial_remove(struct platform_device *pdev) static int __maybe_unused qcom_geni_serial_runtime_suspend(struct device *dev) { struct qcom_geni_serial_port *port = dev_get_drvdata(dev); - struct uart_port *uport = &port->uport; - int ret = 0; - if (port->dev_data->power_state) - ret = port->dev_data->power_state(uport, false); - - return ret; + return port->dev_data->power_off ? + port->dev_data->power_off(&port->se) : 0; } static int __maybe_unused qcom_geni_serial_runtime_resume(struct device *dev) { struct qcom_geni_serial_port *port = dev_get_drvdata(dev); struct uart_port *uport = &port->uport; - int ret = 0; + int ret; - if (port->dev_data->power_state) - ret = port->dev_data->power_state(uport, true); + if (port->dev_data->power_on) { + ret = port->dev_data->power_on(&port->se); + if (ret) + return ret; + } - return ret; + if (port->se.has_opp && port->clk_rate) + return dev_pm_opp_set_rate(uport->dev, port->clk_rate); + + return 0; } static int qcom_geni_serial_suspend(struct device *dev) @@ -2191,7 +2153,8 @@ static const struct qcom_geni_device_data qcom_geni_console_data = { .mode = GENI_SE_FIFO, .resources_init = geni_se_resources_init, .set_rate = geni_serial_set_rate, - .power_state = geni_serial_resource_state, + .power_on = geni_se_resources_activate, + .power_off = geni_se_resources_deactivate, }; static const struct qcom_geni_device_data sa8255p_qcom_geni_console_data = { @@ -2207,7 +2170,8 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = { .mode = GENI_SE_DMA, .resources_init = geni_se_resources_init, .set_rate = geni_serial_set_rate, - .power_state = geni_serial_resource_state, + .power_on = geni_se_resources_activate, + .power_off = geni_se_resources_deactivate, }; static const struct qcom_geni_device_data sa8255p_qcom_geni_uart_data = {