On 7/5/2026 7:27 PM, Aniket Randive wrote:
[...]

  static int qcom_geni_i2c_conf(struct geni_se *se, unsigned long freq)
  {
        struct geni_i2c_dev *gi2c = dev_get_drvdata(se->dev);
@@ -471,7 +484,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, 
struct i2c_msg *msg,
        }
cur = gi2c->cur;
-       time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
+       time_left = wait_for_completion_timeout(&gi2c->done, 
geni_i2c_xfer_timeout(gi2c, len));
Simplify with timeout = geni_i2c_xfer_timeout(gi2c, len) and use as an arg ?
        if (!time_left)
                geni_i2c_abort_xfer(gi2c);
@@ -513,7 +526,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
                writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);
cur = gi2c->cur;
-       time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
+       time_left = wait_for_completion_timeout(&gi2c->done, 
geni_i2c_xfer_timeout(gi2c, len));
        if (!time_left)
                geni_i2c_abort_xfer(gi2c);
@@ -591,7 +604,7 @@ static void geni_i2c_gpi_multi_desc_unmap(struct geni_i2c_dev *gi2c, struct i2c_
   * geni_i2c_gpi_multi_xfer_timeout_handler() - Handles multi message transfer 
timeout
   * @dev: Pointer to the corresponding dev node
   * @multi_xfer: Pointer to the geni_i2c_gpi_multi_desc_xfer
- * @transfer_timeout_msecs: Timeout value in milliseconds
+ * @transfer_timeout_msecs: Per-message completion timeout in jiffies
   * @transfer_comp: Completion object of the transfer
   *
   * This function waits for the completion of each processed transfer messages
@@ -601,7 +614,7 @@ static void geni_i2c_gpi_multi_desc_unmap(struct 
geni_i2c_dev *gi2c, struct i2c_
   */
  static int geni_i2c_gpi_multi_xfer_timeout_handler(struct device *dev,
                                                   struct 
geni_i2c_gpi_multi_desc_xfer *multi_xfer,
-                                                  u32 transfer_timeout_msecs,
+                                                  unsigned long 
timeout_jiffies,
                                                   struct completion 
*transfer_comp)
  {
        int i;
@@ -612,7 +625,7 @@ static int geni_i2c_gpi_multi_xfer_timeout_handler(struct 
device *dev,
if (multi_xfer->msg_idx_cnt != multi_xfer->irq_cnt) {
                        time_left = wait_for_completion_timeout(transfer_comp,
-                                                               
transfer_timeout_msecs);
+                                                               
timeout_jiffies);
                        if (!time_left) {
                                dev_err(dev, "%s: Transfer timeout\n", 
__func__);
                                return -ETIMEDOUT;
@@ -736,8 +749,15 @@ static int geni_i2c_gpi(struct geni_i2c_dev *gi2c, struct 
i2c_msg msgs[],
                dma_async_issue_pending(gi2c->tx_c);
if ((msg_idx == (gi2c->num_msgs - 1)) || flags & DMA_PREP_INTERRUPT) {
+                       size_t max_len = 0;
+                       int j;
+
+                       for (j = 0; j < gi2c->num_msgs; j++)
+                               max_len = max_t(size_t, max_len, msgs[j].len);
+
                        ret = 
geni_i2c_gpi_multi_xfer_timeout_handler(gi2c->se.dev, gi2c_gpi_xfer,
-                                                                     XFER_TIMEOUT, 
&gi2c->done);
+                                                                     
geni_i2c_xfer_timeout(
+                                                                     gi2c, max_len), 
&gi2c->done);
Simplify with timeout = geni_i2c_xfer_timeout(gi2c, len) and use as an arg ?
                        if (ret) {
                                dev_err(gi2c->se.dev,
                                        "I2C multi write msg transfer timeout: 
%d\n",
@@ -852,7 +872,8 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c, 
struct i2c_msg msgs[], i
if (!gi2c->is_tx_multi_desc_xfer) {
                        dma_async_issue_pending(gi2c->tx_c);
-                       time_left = wait_for_completion_timeout(&gi2c->done, 
XFER_TIMEOUT);
+                       time_left = wait_for_completion_timeout(&gi2c->done, 
geni_i2c_xfer_timeout(
+                                                               gi2c, 
msgs[i].len));
                        if (!time_left) {
                                dev_err(gi2c->se.dev, "%s:I2C timeout\n", 
__func__);
                                gi2c->err = -ETIMEDOUT;

Reply via email to