Thread (8 messages) 8 messages, 4 authors, 2021-04-20

Re: [PATCH V8 1/1] i2c: i2c-qcom-geni: Add shutdown callback for i2c

From: Stephen Boyd <hidden>
Date: 2021-01-13 06:55:41
Also in: linux-arm-msm, linux-media, lkml

Quoting Roja Rani Yarubandi (2021-01-08 07:05:45)
quoted hunk ↗ jump to hunk
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index 214b4c913a13..c3f584795911 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -375,6 +375,32 @@ static void geni_i2c_tx_msg_cleanup(struct geni_i2c_dev *gi2c,
        }
 }
 
+static void geni_i2c_stop_xfer(struct geni_i2c_dev *gi2c)
+{
+       int ret;
+       u32 geni_status;
+       struct i2c_msg *cur;
+
+       /* Resume device, as runtime suspend can happen anytime during transfer */
+       ret = pm_runtime_get_sync(gi2c->se.dev);
+       if (ret < 0) {
+               dev_err(gi2c->se.dev, "Failed to resume device: %d\n", ret);
+               return;
+       }
+
+       geni_status = readl_relaxed(gi2c->se.base + SE_GENI_STATUS);
+       if (geni_status & M_GENI_CMD_ACTIVE) {
+               cur = gi2c->cur;
Why don't we need to hold the spinlock gi2c::lock here?
+               geni_i2c_abort_xfer(gi2c);
+               if (cur->flags & I2C_M_RD)
+                       geni_i2c_rx_msg_cleanup(gi2c, cur);
+               else
+                       geni_i2c_tx_msg_cleanup(gi2c, cur);
+       }
+
+       pm_runtime_put_sync_suspend(gi2c->se.dev);
+}
+
 static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
                                u32 m_param)
 {
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help