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: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
531db50170
commit
cebc07d84a
|
@ -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,
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue