| From 9f9e3e0d4dd3338b3f3dde080789f71901e1e4ff Mon Sep 17 00:00:00 2001 |
| From: Esben Haabendal <eha@deif.com> |
| Date: Mon, 9 Jul 2018 11:43:01 +0200 |
| Subject: i2c: imx: Fix reinit_completion() use |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Esben Haabendal <eha@deif.com> |
| |
| commit 9f9e3e0d4dd3338b3f3dde080789f71901e1e4ff upstream. |
| |
| Make sure to call reinit_completion() before dma is started to avoid race |
| condition where reinit_completion() is called after complete() and before |
| wait_for_completion_timeout(). |
| |
| Signed-off-by: Esben Haabendal <eha@deif.com> |
| Fixes: ce1a78840ff7 ("i2c: imx: add DMA support for freescale i2c driver") |
| Reviewed-by: Uwe Kleine-Kรถnig <u.kleine-koenig@pengutronix.de> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| Cc: stable@kernel.org |
| Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/i2c/busses/i2c-imx.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/i2c/busses/i2c-imx.c |
| +++ b/drivers/i2c/busses/i2c-imx.c |
| @@ -376,6 +376,7 @@ static int i2c_imx_dma_xfer(struct imx_i |
| goto err_desc; |
| } |
| |
| + reinit_completion(&dma->cmd_complete); |
| txdesc->callback = i2c_imx_dma_callback; |
| txdesc->callback_param = i2c_imx; |
| if (dma_submit_error(dmaengine_submit(txdesc))) { |
| @@ -619,7 +620,6 @@ static int i2c_imx_dma_write(struct imx_ |
| * The first byte must be transmitted by the CPU. |
| */ |
| imx_i2c_write_reg(msgs->addr << 1, i2c_imx, IMX_I2C_I2DR); |
| - reinit_completion(&i2c_imx->dma->cmd_complete); |
| time_left = wait_for_completion_timeout( |
| &i2c_imx->dma->cmd_complete, |
| msecs_to_jiffies(DMA_TIMEOUT)); |
| @@ -678,7 +678,6 @@ static int i2c_imx_dma_read(struct imx_i |
| if (result) |
| return result; |
| |
| - reinit_completion(&i2c_imx->dma->cmd_complete); |
| time_left = wait_for_completion_timeout( |
| &i2c_imx->dma->cmd_complete, |
| msecs_to_jiffies(DMA_TIMEOUT)); |