Re: [PATCH v3 2/3] i2c: qcom-geni: Add bus recovery support for FIFO mode

From: Aniket RANDIVE

Date: Tue Nov 03 2026 - 02:22:21 EST




On 10/27/2026 7:37 PM, Mukesh Savaliya wrote:


On 10/27/2026 10:43 AM, Aniket Randive wrote:
[...]> ---
  drivers/i2c/busses/i2c-qcom-geni.c | 127 +++++++++++++++++++++++++++ +++++++++-
  1 file changed, 126 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/ i2c-qcom-geni.c
index 60b6273f538c..d9e86f110ae9 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c

[...]> +static int geni_i2c_recover_bus(struct i2c_adapter *adap)
+{
+    struct geni_i2c_dev *gi2c = i2c_get_adapdata(adap);
+    u32 ios;
+    int ret;
+
+    ret = pm_runtime_get_sync(gi2c->se.dev);
+    if (ret < 0) {
+        dev_err(gi2c->se.dev, "bus recovery failed, error turning SE resources:%d\n", ret);
+        pm_runtime_put_noidle(gi2c->se.dev);
+        return ret;
+    }
+
+    ret = gi2c->dev_data->set_rate(&gi2c->se, gi2c->clk_freq_out);
+    if (ret) {
+        dev_err(gi2c->se.dev, "bus recovery failed, error setting clock rate: %d\n",
+            ret);
+        pm_runtime_put_autosuspend(gi2c->se.dev);
can use goto , jump there at exit with ret updated.
As 4 times i see pm_runtime_put_autosuspend().> +        return ret;

Agree. I will make the change in next patch.

+    }
+
+    if (geni_i2c_bus_is_free(gi2c)) {
+        pm_runtime_put_autosuspend(gi2c->se.dev);
+        return 0;
+    }
+
+    /* Bus clear cannot recover a target holding SCL low. */
+    ios = readl_relaxed(gi2c->se.base + SE_GENI_IOS);
+    if (!(ios & IO2_DATA_IN)) {
+        pm_runtime_put_autosuspend(gi2c->se.dev);
+        return -EBUSY;
+    }
+
+    ret = geni_i2c_fifo_bus_cmd(gi2c, I2C_BUS_CLEAR);
+    if (!ret)
+        ret = geni_i2c_fifo_bus_cmd(gi2c, I2C_STOP_ON_BUS);
+
+    /*
+     * Recovery succeeds only once both bus lines are released. The bus
+     * state is the authority, while a clean opcode status with either
+     * line low is a failed recovery.
+     */
+    if (geni_i2c_bus_is_free(gi2c))
+        ret = 0;
+    else if (!ret)
+        ret = -EBUSY;
+

Please simplify with ternary condition ?


Sure. I will do the change.

+    pm_runtime_put_autosuspend(gi2c->se.dev);
+
+    return ret;
+}
+[...]