diff options
author | Vinod Koul <vkoul@kernel.org> | 2020-09-22 15:15:27 +0530 |
---|---|---|
committer | Vinod Koul <vkoul@kernel.org> | 2020-09-22 15:15:27 +0530 |
commit | f24c14cb5ae837855061e704a538ee9b271c4b95 (patch) | |
tree | 68ecdb919ac997d35a706ce4f6274c00f89640f3 | |
parent | 554eaba3d29891aee222f5f7142cc7e9f7d54916 (diff) |
fixup! i2c: qcom-geni: Add suport for GPI DMApixel/dev41
-rw-r--r-- | drivers/i2c/busses/i2c-qcom-geni.c | 34 |
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); |