[PATCH 1/3] serial: qcom-geni: Use common GENI resource initialisation helpers

From: Praveen Talari

Date: Mon Jul 20 2026 - 11:57:09 EST


The UART driver maintains local helpers for resource and power-domain
initialisation that duplicate functionality already provided by the common
GENI framework.

Replace the driver-specific implementations with geni_se_resources_init()
and geni_se_domain_attach(), and use the power-domain list stored in
struct geni_se. This reduces code duplication and centralises GENI resource
management without functional changes.

Signed-off-by: Praveen Talari <praveen.talari@xxxxxxxxxxxxxxxx>
---
drivers/tty/serial/qcom_geni_serial.c | 81 ++++-------------------------------
1 file changed, 9 insertions(+), 72 deletions(-)

diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c
index 67b14fda4ff9..4f34eef15598 100644
--- a/drivers/tty/serial/qcom_geni_serial.c
+++ b/drivers/tty/serial/qcom_geni_serial.c
@@ -113,8 +113,7 @@ static DEFINE_IDA(port_ida);
struct qcom_geni_device_data {
bool console;
enum geni_se_xfer_mode mode;
- struct dev_pm_domain_attach_data pd_data;
- int (*resources_init)(struct uart_port *uport);
+ 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);
};
@@ -156,7 +155,6 @@ struct qcom_geni_serial_port {

struct qcom_geni_private_data private_data;
const struct qcom_geni_device_data *dev_data;
- struct dev_pm_domain_list *pd_list;
struct notifier_block panic_nb;
};

@@ -1344,7 +1342,7 @@ static int geni_serial_set_rate(struct uart_port *uport, unsigned int baud)
static int geni_serial_set_level(struct uart_port *uport, unsigned int baud)
{
struct qcom_geni_serial_port *port = to_dev_port(uport);
- struct device *perf_dev = port->pd_list->pd_devs[DOMAIN_IDX_PERF];
+ struct device *perf_dev = port->se.pd_list->pd_devs[DOMAIN_IDX_PERF];

/*
* The performance protocol sets UART communication
@@ -1701,57 +1699,6 @@ 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);
}

-static int geni_serial_pwr_init(struct uart_port *uport)
-{
- struct qcom_geni_serial_port *port = to_dev_port(uport);
- int ret;
-
- ret = dev_pm_domain_attach_list(port->se.dev,
- &port->dev_data->pd_data, &port->pd_list);
- if (ret <= 0)
- return -EINVAL;
-
- return 0;
-}
-
-static int geni_serial_resource_init(struct uart_port *uport)
-{
- struct qcom_geni_serial_port *port = to_dev_port(uport);
- int ret;
-
- port->se.clk = devm_clk_get(port->se.dev, "se");
- if (IS_ERR(port->se.clk)) {
- ret = PTR_ERR(port->se.clk);
- dev_err(port->se.dev, "Err getting SE Core clk %d\n", ret);
- return ret;
- }
-
- ret = geni_icc_get(&port->se, NULL);
- if (ret)
- return ret;
-
- port->se.icc_paths[GENI_TO_CORE].avg_bw = GENI_DEFAULT_BW;
- port->se.icc_paths[CPU_TO_GENI].avg_bw = GENI_DEFAULT_BW;
-
- /* Set BW for register access */
- ret = geni_icc_set_bw(&port->se);
- if (ret)
- return ret;
-
- ret = devm_pm_opp_set_clkname(port->se.dev, "se");
- if (ret)
- return ret;
-
- /* OPP table is optional */
- ret = devm_pm_opp_of_add_table(port->se.dev);
- if (ret && ret != -ENODEV) {
- dev_err(port->se.dev, "invalid OPP table in device tree\n");
- return ret;
- }
-
- return 0;
-}
-
static void qcom_geni_serial_pm(struct uart_port *uport,
unsigned int new_state, unsigned int old_state)
{
@@ -1883,7 +1830,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)
port->se.dev = &pdev->dev;
port->se.wrapper = dev_get_drvdata(pdev->dev.parent);

- ret = port->dev_data->resources_init(uport);
+ ret = port->dev_data->resources_init(&port->se);
if (ret)
return ret;

@@ -1988,7 +1935,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)
DMA_RX_BUF_SIZE, DMA_FROM_DEVICE);
port->rx_dma_addr = 0;
}
- dev_pm_domain_detach_list(port->pd_list);
+ dev_pm_domain_detach_list(port->se.pd_list);
return ret;
}

@@ -2011,7 +1958,7 @@ static void qcom_geni_serial_remove(struct platform_device *pdev)
port->rx_dma_addr = 0;
}

- dev_pm_domain_detach_list(port->pd_list);
+ dev_pm_domain_detach_list(port->se.pd_list);
}

static int __maybe_unused qcom_geni_serial_runtime_suspend(struct device *dev)
@@ -2091,7 +2038,7 @@ static int qcom_geni_serial_resume(struct device *dev)
static const struct qcom_geni_device_data qcom_geni_console_data = {
.console = true,
.mode = GENI_SE_FIFO,
- .resources_init = geni_serial_resource_init,
+ .resources_init = geni_se_resources_init,
.set_rate = geni_serial_set_rate,
.power_state = geni_serial_resource_state,
};
@@ -2099,12 +2046,7 @@ static const struct qcom_geni_device_data qcom_geni_console_data = {
static const struct qcom_geni_device_data sa8255p_qcom_geni_console_data = {
.console = true,
.mode = GENI_SE_FIFO,
- .pd_data = {
- .pd_flags = PD_FLAG_DEV_LINK_ON,
- .pd_names = (const char*[]) { "power", "perf" },
- .num_pd_names = 2,
- },
- .resources_init = geni_serial_pwr_init,
+ .resources_init = geni_se_domain_attach,
.set_rate = geni_serial_set_level,
};
#endif
@@ -2112,7 +2054,7 @@ static const struct qcom_geni_device_data sa8255p_qcom_geni_console_data = {
static const struct qcom_geni_device_data qcom_geni_uart_data = {
.console = false,
.mode = GENI_SE_DMA,
- .resources_init = geni_serial_resource_init,
+ .resources_init = geni_se_resources_init,
.set_rate = geni_serial_set_rate,
.power_state = geni_serial_resource_state,
};
@@ -2120,12 +2062,7 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = {
static const struct qcom_geni_device_data sa8255p_qcom_geni_uart_data = {
.console = false,
.mode = GENI_SE_DMA,
- .pd_data = {
- .pd_flags = PD_FLAG_DEV_LINK_ON,
- .pd_names = (const char*[]) { "power", "perf" },
- .num_pd_names = 2,
- },
- .resources_init = geni_serial_pwr_init,
+ .resources_init = geni_se_domain_attach,
.set_rate = geni_serial_set_level,
};


--
2.34.1