]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i2c: stm32: fix the device used for the DMA map
authorClément Le Goffic <clement.legoffic@foss.st.com>
Fri, 4 Jul 2025 08:39:14 +0000 (10:39 +0200)
committerAndi Shyti <andi.shyti@kernel.org>
Thu, 10 Jul 2025 09:58:33 +0000 (11:58 +0200)
If the DMA mapping failed, it produced an error log with the wrong
device name:
"stm32-dma3 40400000.dma-controller: rejecting DMA map of vmalloc memory"
Fix this issue by replacing the dev with the I2C dev.

Fixes: bb8822cbbc53 ("i2c: i2c-stm32: Add generic DMA API")
Signed-off-by: Clément Le Goffic <clement.legoffic@foss.st.com>
Cc: <stable@vger.kernel.org> # v4.18+
Acked-by: Alain Volmat <alain.volmat@foss.st.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250704-i2c-upstream-v4-1-84a095a2c728@foss.st.com
drivers/i2c/busses/i2c-stm32.c
drivers/i2c/busses/i2c-stm32f7.c

index 157c64e27d0bd3ca44b6e38be9caa96f9a41d784..f84ec056e36dfedb2d72fe34c0b179604943708e 100644 (file)
@@ -102,7 +102,6 @@ int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma,
                            void *dma_async_param)
 {
        struct dma_async_tx_descriptor *txdesc;
-       struct device *chan_dev;
        int ret;
 
        if (rd_wr) {
@@ -116,11 +115,10 @@ int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma,
        }
 
        dma->dma_len = len;
-       chan_dev = dma->chan_using->device->dev;
 
-       dma->dma_buf = dma_map_single(chan_dev, buf, dma->dma_len,
+       dma->dma_buf = dma_map_single(dev, buf, dma->dma_len,
                                      dma->dma_data_dir);
-       if (dma_mapping_error(chan_dev, dma->dma_buf)) {
+       if (dma_mapping_error(dev, dma->dma_buf)) {
                dev_err(dev, "DMA mapping failed\n");
                return -EINVAL;
        }
@@ -150,7 +148,7 @@ int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma,
        return 0;
 
 err:
-       dma_unmap_single(chan_dev, dma->dma_buf, dma->dma_len,
+       dma_unmap_single(dev, dma->dma_buf, dma->dma_len,
                         dma->dma_data_dir);
        return ret;
 }
index e4aaeb2262d0578d0c66e7c8ae51e8751676abfb..817d081460c23cddccd4640f775156bffcdb3269 100644 (file)
@@ -741,10 +741,10 @@ static void stm32f7_i2c_dma_callback(void *arg)
 {
        struct stm32f7_i2c_dev *i2c_dev = (struct stm32f7_i2c_dev *)arg;
        struct stm32_i2c_dma *dma = i2c_dev->dma;
-       struct device *dev = dma->chan_using->device->dev;
 
        stm32f7_i2c_disable_dma_req(i2c_dev);
-       dma_unmap_single(dev, dma->dma_buf, dma->dma_len, dma->dma_data_dir);
+       dma_unmap_single(i2c_dev->dev, dma->dma_buf, dma->dma_len,
+                        dma->dma_data_dir);
        complete(&dma->dma_complete);
 }