aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinod Koul <vkoul@kernel.org>2020-09-22 15:15:27 +0530
committerVinod Koul <vkoul@kernel.org>2020-09-22 15:15:27 +0530
commitf24c14cb5ae837855061e704a538ee9b271c4b95 (patch)
tree68ecdb919ac997d35a706ce4f6274c00f89640f3
parent554eaba3d29891aee222f5f7142cc7e9f7d54916 (diff)
fixup! i2c: qcom-geni: Add suport for GPI DMApixel/dev41
-rw-r--r--drivers/i2c/busses/i2c-qcom-geni.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index 895ab6930866..b07441d970c9 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -464,12 +464,10 @@ static void i2c_gsi_cb_result(void *cb, const struct dmaengine_result *result)
return;
}
- if (!result->residue) {
- dev_dbg(gi2c->se.dev, "callback for gsi dma txn\n");
- complete(&gi2c->done);
- } else {
- dev_err(gi2c->se.dev, "DMA xfer has pending: %d\n", result->residue);
- }
+ if (result->residue)
+ dev_dbg(gi2c->se.dev, "DMA xfer has pending: %d\n", result->residue);
+
+ complete(&gi2c->done);
}
static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
@@ -515,9 +513,10 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
peripheral.set_config = true;
}
+ peripheral.i2c.multi_msg = false;
for (i = 0; i < num; i++) {
- struct device *rx_dev = gi2c->se.dev;
- struct device *tx_dev = gi2c->se.dev;
+ struct device *rx_dev = gi2c->se.wrapper->dev;
+ struct device *tx_dev = gi2c->se.wrapper->dev;
dma_cookie_t tx_cookie, rx_cookie;
int stretch = (i < (num - 1));
u8 *dma_buf = NULL;
@@ -525,11 +524,6 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
gi2c->cur = &msgs[i];
peripheral.i2c.addr = msgs[i].addr;
- peripheral.i2c.strech = stretch;
- if (msgs[i].flags & I2C_M_RD)
- peripheral.i2c.op = I2C_READ;
- else
- peripheral.i2c.op = I2C_WRITE;
dma_buf = i2c_get_dma_safe_msg_buf(&msgs[i], 1);
if (!dma_buf) {
@@ -546,11 +540,15 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
goto geni_i2c_gsi_xfer_out;
}
+ peripheral.i2c.op = I2C_READ;
+ peripheral.i2c.strech = stretch;
ret = dmaengine_slave_config(gi2c->rx_c, &config);
if (ret) {
dev_err(gi2c->se.dev, "rx dma config error:%d\n", ret);
goto geni_i2c_gsi_xfer_out;
}
+ peripheral.set_config = false;
+ peripheral.i2c.multi_msg = true;
peripheral.rx_len = msgs[i].len;
gi2c->rx_desc = dmaengine_prep_slave_single(gi2c->rx_c, gi2c->rx_ph,
@@ -563,7 +561,7 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
}
gi2c->rx_desc->callback_result = i2c_gsi_cb_result;
- gi2c->rx_desc->callback_param = &gi2c;
+ gi2c->rx_desc->callback_param = gi2c;
/* Issue RX */
rx_cookie = dmaengine_submit(gi2c->rx_desc);
@@ -578,11 +576,15 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
goto geni_i2c_gsi_xfer_out;
}
+ peripheral.i2c.strech = stretch;
+ peripheral.i2c.op = I2C_WRITE;
ret = dmaengine_slave_config(gi2c->tx_c, &config);
if (ret) {
dev_err(gi2c->se.dev, "tx dma config error:%d\n", ret);
goto geni_i2c_gsi_xfer_out;
}
+ peripheral.set_config = false;
+ peripheral.i2c.multi_msg = true;
gi2c->tx_desc = dmaengine_prep_slave_single(gi2c->tx_c, gi2c->tx_ph, msgs[i].len,
DMA_MEM_TO_DEV,
(DMA_PREP_INTERRUPT | DMA_CTRL_ACK));
@@ -591,8 +593,8 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
gi2c->err = -ENOMEM;
goto geni_i2c_err_prep_sg;
}
- gi2c->rx_desc->callback_result = i2c_gsi_cb_result;
- gi2c->rx_desc->callback_param = &gi2c;
+ gi2c->tx_desc->callback_result = i2c_gsi_cb_result;
+ gi2c->tx_desc->callback_param = gi2c;
/* Issue TX */
tx_cookie = dmaengine_submit(gi2c->tx_desc);