[PATCH 4/7] serial: qcom-geni: Use geni_se_set_rate() for source clock configuration
Praveen Talari <[email protected]> Wed, 05 Aug 2026 01:27:42 +0530
| Newsgroups | gmane.linux.serial,gmane.linux.ports.arm.kernel,gmane.linux.power-management.general,gmane.linux.kernel,gmane.linux.ports.arm.msm,gmane.linux.kernel.spi.devel,gmane.linux.drivers.i2c |
|---|---|
| Message-ID | <20260805-derive_clk_perf_tbl_from_perf_domain_opp_table-v1-4-61171ab1cdce@oss.qualcomm.com> |
The driver calls dev_pm_opp_set_rate() directly on uport->dev to apply the computed source clock frequency, and dispatches baud rate handling through a per-variant dev_data->set_rate() callback that either recalculates the clock divider (Linux clock managed path) or selects a performance level via geni_se_set_perf_level() (SA8255P firmware managed path). Now that geni_se_domain_attach() populates se->clk_perf_tbl from the perf domain's OPP table, geni_se_clk_freq_match() can resolve a source clock frequency and divider on the SA8255P path the same way it already does for the Linux clock managed path. This removes the need for a separate perf-level based set_rate implementation, so geni_serial_set_rate() can be called unconditionally and dev_data->set_rate can be dropped. Switch to calling geni_serial_set_rate() directly from qcom_geni_serial_set_termios(), and use geni_se_set_rate() in place of dev_pm_opp_set_rate() so the frequency is applied to the correct device (the perf domain device on the firmware managed path, or uport->dev otherwise) without the driver needing to know which resources_init variant is in use. Remove the now-unused set_rate field from struct qcom_geni_device_data and its per-variant initializers. Signed-off-by: Praveen Talari <[email protected]> --- drivers/tty/serial/qcom_geni_serial.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 3633723acef8..cd1940eae084 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -114,7 +114,6 @@ struct qcom_geni_device_data { bool console; enum geni_se_xfer_mode mode; int (*resources_init)(struct geni_se *se); - int (*set_rate)(struct geni_se *se, unsigned long baud); int (*power_on)(struct geni_se *se); int (*power_off)(struct geni_se *se); }; @@ -1474,7 +1473,10 @@ static int geni_serial_set_rate(struct geni_se *se, unsigned long baud) uport->uartclk = clk_rate; port->clk_rate = clk_rate; - dev_pm_opp_set_rate(uport->dev, clk_rate); + ret = geni_se_set_rate(&port->se, clk_rate); + if (ret) + return ret; + ser_clk_cfg = SER_CLK_EN; ser_clk_cfg |= clk_div << CLK_DIV_SHFT; @@ -1513,7 +1515,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport, /* baud rate */ baud = uart_get_baud_rate(uport, termios, old, 300, 8000000); - ret = port->dev_data->set_rate(&port->se, baud); + ret = geni_serial_set_rate(&port->se, baud); if (ret) return; @@ -2040,6 +2042,8 @@ static int __maybe_unused qcom_geni_serial_runtime_suspend(struct device *dev) { struct qcom_geni_serial_port *port = dev_get_drvdata(dev); + geni_se_set_rate(&port->se, 0); + return port->dev_data->power_off ? port->dev_data->power_off(&port->se) : 0; } @@ -2047,7 +2051,6 @@ static int __maybe_unused qcom_geni_serial_runtime_suspend(struct device *dev) 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; if (port->dev_data->power_on) { @@ -2056,8 +2059,8 @@ static int __maybe_unused qcom_geni_serial_runtime_resume(struct device *dev) return ret; } - if (port->se.has_opp && port->clk_rate) - return dev_pm_opp_set_rate(uport->dev, port->clk_rate); + if (port->clk_rate) + return geni_se_set_rate(&port->se, port->clk_rate); return 0; } @@ -2116,7 +2119,6 @@ static const struct qcom_geni_device_data qcom_geni_console_data = { .console = true, .mode = GENI_SE_FIFO, .resources_init = geni_se_resources_init, - .set_rate = geni_serial_set_rate, .power_on = geni_se_resources_activate, .power_off = geni_se_resources_deactivate, }; @@ -2125,7 +2127,6 @@ static const struct qcom_geni_device_data sa8255p_qcom_geni_console_data = { .console = true, .mode = GENI_SE_FIFO, .resources_init = geni_se_domain_attach, - .set_rate = geni_se_set_perf_level, }; #endif @@ -2133,7 +2134,6 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = { .console = false, .mode = GENI_SE_DMA, .resources_init = geni_se_resources_init, - .set_rate = geni_serial_set_rate, .power_on = geni_se_resources_activate, .power_off = geni_se_resources_deactivate, }; @@ -2142,7 +2142,6 @@ static const struct qcom_geni_device_data sa8255p_qcom_geni_uart_data = { .console = false, .mode = GENI_SE_DMA, .resources_init = geni_se_domain_attach, - .set_rate = geni_se_set_perf_level, }; static const struct dev_pm_ops qcom_geni_serial_pm_ops = { -- 2.34.1