[PATCH 7/7] i2c: qcom-geni: Use geni_se_set_rate() for setting source clock frequency
Praveen Talari <[email protected]> Wed, 05 Aug 2026 01:27:45 +0530
| Newsgroups | gmane.linux.drivers.i2c,gmane.linux.ports.arm.kernel,gmane.linux.power-management.general,gmane.linux.kernel,gmane.linux.ports.arm.msm,gmane.linux.serial,gmane.linux.kernel.spi.devel |
|---|---|
| Message-ID | <20260805-derive_clk_perf_tbl_from_perf_domain_opp_table-v1-7-61171ab1cdce@oss.qualcomm.com> |
On the SA8255P platform there is no Linux clock handler for the SE source clock; resources are instead managed by firmware via a genpd performance domain. The I2C driver therefore relies on geni_se_set_rate() to apply the fixed 19.2 MHz source clock frequency expected by the SCL divider and counter values programmed by qcom_geni_i2c_conf(). Call geni_se_set_rate() directly from qcom_geni_i2c_conf() so the configured frequency is applied to the correct device (the perf domain device on the firmware-managed path, or se->dev otherwise) without the I2C driver needing to know which resources_init() variant is in use. Drop the now-unused set_rate field from struct geni_i2c_desc, the geni_se_set_perf_opp() usage on the SA8255P variant, and the unused freq parameter from qcom_geni_i2c_conf(). Signed-off-by: Praveen Talari <[email protected]> --- drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index a23554d101fd..4561e2d235d5 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -213,11 +213,11 @@ static int geni_i2c_clk_map_idx(struct geni_i2c_dev *gi2c) return -EINVAL; } -static int qcom_geni_i2c_conf(struct geni_se *se, unsigned long freq) +static int qcom_geni_i2c_conf(struct geni_se *se) { struct geni_i2c_dev *gi2c = dev_get_drvdata(se->dev); const struct geni_i2c_clk_fld *itr = gi2c->clk_fld; - u32 val; + u32 val, ret; writel_relaxed(0, gi2c->se.base + SE_GENI_CLK_SEL); @@ -233,6 +233,10 @@ static int qcom_geni_i2c_conf(struct geni_se *se, unsigned long freq) itr->clk_div, itr->t_high_cnt, itr->t_low_cnt, itr->t_cycle_cnt); + ret = geni_se_set_rate(&gi2c->se, 19200000); + if (ret) + return ret; + return geni_icc_set_bw_ab(&gi2c->se, GENI_DEFAULT_BW, GENI_DEFAULT_BW, Bps_to_icc(gi2c->clk_freq_out)); } @@ -975,7 +979,7 @@ static int geni_i2c_xfer(struct i2c_adapter *adap, return ret; } - ret = gi2c->dev_data->set_rate(&gi2c->se, gi2c->clk_freq_out); + ret = qcom_geni_i2c_conf(&gi2c->se); if (ret) return ret; @@ -1272,7 +1276,6 @@ static const struct dev_pm_ops geni_i2c_pm_ops = { static const struct geni_i2c_desc geni_i2c = { .resources_init = geni_se_resources_init, - .set_rate = qcom_geni_i2c_conf, .power_on = geni_se_resources_activate, .power_off = geni_se_resources_deactivate, }; @@ -1281,14 +1284,12 @@ static const struct geni_i2c_desc i2c_master_hub = { .no_dma_support = true, .tx_fifo_depth = 16, .resources_init = geni_se_resources_init, - .set_rate = qcom_geni_i2c_conf, .power_on = geni_se_resources_activate, .power_off = geni_se_resources_deactivate, }; static const struct geni_i2c_desc sa8255p_geni_i2c = { .resources_init = geni_se_domain_attach, - .set_rate = geni_se_set_perf_opp, }; #ifdef CONFIG_ACPI -- 2.34.1