| From 0695efdfa9dc1c1705f31365becdc0a2678a33ec Mon Sep 17 00:00:00 2001 |
| From: Alain Volmat <alain.volmat@st.com> |
| Date: Thu, 24 Oct 2019 14:52:00 +0200 |
| Subject: [PATCH] i2c: stm32f7: report dma error during probe |
| |
| commit d77eceb2de99f5d7e0c645bad15511fe1af59e09 upstream. |
| |
| Distinguish between the case where dma information is not provided |
| within the DT and the case of an error during the dma init. |
| Exit the probe with error in case of an error during dma init. |
| |
| Fixes: bb8822cbbc53 ("i2c: i2c-stm32: Add generic DMA API") |
| Signed-off-by: Alain Volmat <alain.volmat@st.com> |
| Reviewed-by: Pierre-Yves MORDRET <pierre-yves.mordret@st.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/i2c/busses/i2c-stm32.c b/drivers/i2c/busses/i2c-stm32.c |
| index 07d5dfce68d4..1da347e6a358 100644 |
| --- a/drivers/i2c/busses/i2c-stm32.c |
| +++ b/drivers/i2c/busses/i2c-stm32.c |
| @@ -20,13 +20,13 @@ struct stm32_i2c_dma *stm32_i2c_dma_request(struct device *dev, |
| |
| dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); |
| if (!dma) |
| - return NULL; |
| + return ERR_PTR(-ENOMEM); |
| |
| /* Request and configure I2C TX dma channel */ |
| - dma->chan_tx = dma_request_slave_channel(dev, "tx"); |
| - if (!dma->chan_tx) { |
| + dma->chan_tx = dma_request_chan(dev, "tx"); |
| + if (IS_ERR(dma->chan_tx)) { |
| dev_dbg(dev, "can't request DMA tx channel\n"); |
| - ret = -EINVAL; |
| + ret = PTR_ERR(dma->chan_tx); |
| goto fail_al; |
| } |
| |
| @@ -42,10 +42,10 @@ struct stm32_i2c_dma *stm32_i2c_dma_request(struct device *dev, |
| } |
| |
| /* Request and configure I2C RX dma channel */ |
| - dma->chan_rx = dma_request_slave_channel(dev, "rx"); |
| - if (!dma->chan_rx) { |
| + dma->chan_rx = dma_request_chan(dev, "rx"); |
| + if (IS_ERR(dma->chan_rx)) { |
| dev_err(dev, "can't request DMA rx channel\n"); |
| - ret = -EINVAL; |
| + ret = PTR_ERR(dma->chan_rx); |
| goto fail_tx; |
| } |
| |
| @@ -75,7 +75,7 @@ struct stm32_i2c_dma *stm32_i2c_dma_request(struct device *dev, |
| devm_kfree(dev, dma); |
| dev_info(dev, "can't use DMA\n"); |
| |
| - return NULL; |
| + return ERR_PTR(ret); |
| } |
| |
| void stm32_i2c_dma_free(struct stm32_i2c_dma *dma) |
| diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c |
| index 0a0c0191675f..c2ac212ce70c 100644 |
| --- a/drivers/i2c/busses/i2c-stm32f7.c |
| +++ b/drivers/i2c/busses/i2c-stm32f7.c |
| @@ -1951,6 +1951,15 @@ static int stm32f7_i2c_probe(struct platform_device *pdev) |
| i2c_dev->dma = stm32_i2c_dma_request(i2c_dev->dev, phy_addr, |
| STM32F7_I2C_TXDR, |
| STM32F7_I2C_RXDR); |
| + if (PTR_ERR(i2c_dev->dma) == -ENODEV) |
| + i2c_dev->dma = NULL; |
| + else if (IS_ERR(i2c_dev->dma)) { |
| + ret = PTR_ERR(i2c_dev->dma); |
| + if (ret != -EPROBE_DEFER) |
| + dev_err(&pdev->dev, |
| + "Failed to request dma error %i\n", ret); |
| + goto clk_free; |
| + } |
| |
| platform_set_drvdata(pdev, i2c_dev); |
| |
| -- |
| 2.7.4 |
| |