Re: [PATCH v3 2/3] i2c: qcom-geni: Add bus recovery support for FIFO mode
From: Mukesh Savaliya
Date: Tue Oct 27 2026 - 10:15:37 EST
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)
+{can use goto , jump there at exit with ret updated.
+ 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);
As 4 times i see pm_runtime_put_autosuspend().> + return ret;
+ }
+
+ 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 ?
+ pm_runtime_put_autosuspend(gi2c->se.dev);
+
+ return ret;
+}
+[...]