[PATCH v2 9/9] i2c: qcom-geni: Use geni_se_set_rate() for setting source clock frequency
From: Praveen Talari
Date: Thu Aug 27 2026 - 14:08:41 EST
GENI resource management may be handled either through the Linux clock
framework or a firmware-managed performance domain. Source clock
programming currently depends on platform-specific callbacks.
Use geni_se_set_rate() for source clock programming and perform the
source clock configuration from qcom_geni_i2c_conf(), allowing the GENI
core to abstract the underlying resource-management mechanism from the
I2C driver. This removes the need for platform-specific rate-setting
callbacks and enables a common code path across all GENI I2C platforms.
Signed-off-by: Praveen Talari <praveen.talari@xxxxxxxxxxxxxxxx>
---
drivers/i2c/busses/i2c-qcom-geni.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index 0b178701e1d1..deb0d822290c 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -16,7 +16,6 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
-#include <linux/pm_opp.h>
#include <linux/pm_runtime.h>
#include <linux/soc/qcom/geni-se.h>
#include <linux/spinlock.h>
@@ -219,14 +218,14 @@ 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;
int ret;
- ret = dev_pm_opp_set_rate(se->dev, itr->src_clk_freq);
+ ret = geni_se_set_rate(&gi2c->se, itr->src_clk_freq);
if (ret)
return ret;
@@ -985,7 +984,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;
@@ -1228,7 +1227,7 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev)
}
}
- dev_pm_opp_set_rate(dev, 0);
+ geni_se_set_rate(&gi2c->se, 0);
return 0;
}
@@ -1239,7 +1238,7 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev)
struct geni_i2c_dev *gi2c = dev_get_drvdata(dev);
if (gi2c->clk_fld && gi2c->clk_fld->src_clk_freq) {
- ret = dev_pm_opp_set_rate(dev, gi2c->clk_fld->src_clk_freq);
+ ret = geni_se_set_rate(&gi2c->se, gi2c->clk_fld->src_clk_freq);
if (ret)
return ret;
}
@@ -1290,7 +1289,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,
};
@@ -1299,14 +1297,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