Commit cebc07d8 authored by Wolfram Sang's avatar Wolfram Sang Committed by Wolfram Sang

i2c: sh_mobile: fix leak when using DMA bounce buffer

We only freed the bounce buffer after successful DMA, missing the cases
where DMA setup may have gone wrong. Use a better location which always
gets called after each message and use 'stop_after_dma' as a flag for a
successful transfer.
Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 531db501
...@@ -507,8 +507,6 @@ static void sh_mobile_i2c_dma_callback(void *data) ...@@ -507,8 +507,6 @@ static void sh_mobile_i2c_dma_callback(void *data)
pd->pos = pd->msg->len; pd->pos = pd->msg->len;
pd->stop_after_dma = true; pd->stop_after_dma = true;
i2c_put_dma_safe_msg_buf(pd->dma_buf, pd->msg, true);
iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE);
} }
...@@ -706,6 +704,10 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, ...@@ -706,6 +704,10 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter,
timeout = wait_event_timeout(pd->wait, timeout = wait_event_timeout(pd->wait,
pd->sr & (ICSR_TACK | SW_DONE), pd->sr & (ICSR_TACK | SW_DONE),
adapter->timeout); adapter->timeout);
/* 'stop_after_dma' tells if DMA transfer was complete */
i2c_put_dma_safe_msg_buf(pd->dma_buf, pd->msg, pd->stop_after_dma);
if (!timeout) { if (!timeout) {
dev_err(pd->dev, "Transfer request timed out\n"); dev_err(pd->dev, "Transfer request timed out\n");
if (pd->dma_direction != DMA_NONE) if (pd->dma_direction != DMA_NONE)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment