]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
serial: qcom-geni: move resource control logic to separate functions
authorPraveen Talari <quic_ptalari@quicinc.com>
Mon, 21 Jul 2025 17:45:29 +0000 (23:15 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 22 Jul 2025 16:52:50 +0000 (18:52 +0200)
Supports use in PM system/runtime frameworks, helping to distinguish new
resource control mechanisms and facilitate future modifications within
the new API.

The code that handles the actual enable or disable of resources like clock
and ICC paths to a separate function (geni_serial_resources_on() and
geni_serial_resources_off()) which enhances code readability.

Introduced minor return checks in newly added function APIs to enhance
error detection and prevent silent failures.

Signed-off-by: Praveen Talari <quic_ptalari@quicinc.com>
Link: https://lore.kernel.org/r/20250721174532.14022-6-quic_ptalari@quicinc.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/qcom_geni_serial.c

index 1e1c60d7aceda8c5b8c04ca9dfc93fd11e594ba3..45d9735247f83a3b273fca092e44d0be3b9c3350 100644 (file)
@@ -1619,6 +1619,42 @@ static struct uart_driver qcom_geni_uart_driver = {
        .nr =  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_init(struct qcom_geni_serial_port *port)
 {
        int ret;
@@ -1659,23 +1695,17 @@ static int geni_serial_resource_init(struct qcom_geni_serial_port *port)
 static void qcom_geni_serial_pm(struct uart_port *uport,
                unsigned int new_state, unsigned int old_state)
 {
-       struct qcom_geni_serial_port *port = to_dev_port(uport);
 
        /* If we've never been called, treat it as off */
        if (old_state == UART_PM_STATE_UNDEFINED)
                old_state = UART_PM_STATE_OFF;
 
-       if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) {
-               geni_icc_enable(&port->se);
-               if (port->clk_rate)
-                       dev_pm_opp_set_rate(uport->dev, port->clk_rate);
-               geni_se_resources_on(&port->se);
-       } else if (new_state == UART_PM_STATE_OFF &&
-                       old_state == UART_PM_STATE_ON) {
-               geni_se_resources_off(&port->se);
-               dev_pm_opp_set_rate(uport->dev, 0);
-               geni_icc_disable(&port->se);
-       }
+       if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF)
+               geni_serial_resources_on(uport);
+       else if (new_state == UART_PM_STATE_OFF &&
+                old_state == UART_PM_STATE_ON)
+               geni_serial_resources_off(uport);
+
 }
 
 /**