mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev
@ 2026-09-23 18:45 Frank.Li
  2026-09-23 18:50 ` Frank Li
  2026-09-23 18:57 ` Arnd Bergmann
  0 siblings, 2 replies; 6+ messages in thread
From: Frank.Li @ 2026-09-23 18:45 UTC (permalink / raw)
  To: Ulf Hansson, Aubin Constans, Nicolas Ferre, Alexandre Belloni,
	Claudiu Beznea, Paul Cercueil, Russell King, Frank Li,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Aaro Koskinen, Andreas Färber, Manivannan Sadhasivam,
	Wolfram Sang, Jesper Nilsson, Lars Persson, Arnd Bergmann,
	Johan Hovold, Ge Gordon, Vinod Koul, Albert Yang, Jared Kangas,
	Brian Masney, Martin Blumenstingl, Linus Walleij, Fan Wu,
	Rosen Penev, Pengpeng Hou, Marco Crivellari,
	Pedro Demarchi Gomes, Zhan Xusheng, Pan Chuang, Khalid Aziz,
	Ethan Nelson-Moore, Rakuram Eswaran, Takashi Sakamoto,
	Runyu Xiao, Matthew Wilcox (Oracle),
	Uwe Kleine-König, open list:MULTIMEDIA CARD (MMC),
	SECURE DIGITAL (SD) AND...,
	open list, moderated list:ARM/Microchip (AT91) SoC support,
	open list:INGENIC JZ47xx SoCs,
	open list:ARM/FREESCALE IMX / MXC / LAYERSCAPE ARM ARCHIT...,
	open list:OMAP MMC SUPPORT,
	moderated list:ARM/ACTIONS SEMI ARCHITECTURE,
	open list:TMIO/SDHI MMC DRIVER,
	open list:ARM/ARTPEC MACHINE SUPPORT
  Cc: imx

From: Frank Li <Frank.Li@nxp.com>

Replace direct dma_chan::device::dev access with the proper
dmaengine_get_dma_device() for consumer API

chan->device->dev is not always the device used for DMA mapping.
Some DMA engines support per-channel IOMMU mappings, so different
channels may use different DMA devices.  dmaengine_get_dma_device()
returns the correct device for each channel.

This also prepares for making the DMA engine provider data structures
private. DMA consumers should not access DMA engine internals directly.

mxs-mmc.c wrong use mmc host device when do DMA map. Fix it by use
dmaengine_get_dma_device().

Assisted-by: LLM
Reviewed-by: Linus Walleij <linusw@kernel.org>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Change in v4
- Fix miss "R" at Reviewed-by tags.
- Fix error path unmap dev at mxs-mmc.c (sashakio reported)
- move dmaengine_get_dma_device(host->dma) after mxcmci_use_dma() to avoid
defer host->dma if use pio mode (sashakio reported)

Change in v3
- add Linus Walleij and Vinod Koul's review by tags
- Add missed omap and mxs-mmc.c (sashakio reported)

Change in v2
- find more place, which use device->dev for dma mapping. This time should
clean all.
- Reviewed-by: Linus Walleij <linusw@kernel.org>

Cc: imx@lists.linux.dev
Cc: vkoul@kernel.org
---
 drivers/mmc/host/Kconfig                 |  2 +-
 drivers/mmc/host/atmel-mci.c             |  8 +++++---
 drivers/mmc/host/jz4740_mmc.c            |  8 ++++----
 drivers/mmc/host/mmci.c                  | 14 +++++++-------
 drivers/mmc/host/moxart-mmc.c            | 10 ++++++----
 drivers/mmc/host/mxcmmc.c                | 14 +++++++-------
 drivers/mmc/host/mxs-mmc.c               |  9 +++++----
 drivers/mmc/host/omap.c                  |  4 ++--
 drivers/mmc/host/omap_hsmmc.c            | 12 ++++++------
 drivers/mmc/host/owl-mmc.c               |  4 ++--
 drivers/mmc/host/pxamci.c                |  4 ++--
 drivers/mmc/host/renesas_sdhi_sys_dmac.c |  8 ++++----
 drivers/mmc/host/sh_mmcif.c              |  8 ++++----
 drivers/mmc/host/usdhi6rol0.c            |  6 +++---
 14 files changed, 58 insertions(+), 53 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 79bfc425e7c7c..a8d0e7be0fec2 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -214,7 +214,7 @@ config MMC_SDHCI_OF_AT91
 config MMC_SDHCI_OF_ESDHC
 	tristate "SDHCI OF support for the Freescale eSDHC controller"
 	depends on MMC_SDHCI_PLTFM
-	depends on PPC || ARCH_MXC || ARCH_LAYERSCAPE || COMPILE_TEST
+	depends on PPC || ARCHMXC || ARCH_LAYERSCAPE || COMPILE_TEST
 	select MMC_SDHCI_IO_ACCESSORS
 	select FSL_GUTS
 	help
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index 8f4df250a77a0..fb756e8858db3 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -961,7 +961,7 @@ static void atmci_dma_cleanup(struct atmel_mci *host)
 	struct mmc_data                 *data = host->data;
 
 	if (data)
-		dma_unmap_sg(host->dma.chan->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(host->dma.chan),
 				data->sg, data->sg_len,
 				mmc_get_dma_dir(data));
 }
@@ -1116,6 +1116,7 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)
 	unsigned int			sglen;
 	u32				maxburst;
 	u32 iflags;
+	struct device *dma_dev;
 
 	data->error = -EINPROGRESS;
 
@@ -1145,6 +1146,7 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)
 		return -ENODEV;
 
 	chan = host->dma.chan;
+	dma_dev = dmaengine_get_dma_device(chan);
 	host->data_chan = chan;
 
 	if (data->flags & MMC_DATA_READ) {
@@ -1161,7 +1163,7 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)
 		atmci_writel(host, ATMCI_DMA, ATMCI_DMA_CHKSIZE(maxburst) |
 			ATMCI_DMAEN);
 
-	sglen = dma_map_sg(chan->device->dev, data->sg,
+	sglen = dma_map_sg(dma_dev, data->sg,
 			data->sg_len, mmc_get_dma_dir(data));
 
 	dmaengine_slave_config(chan, &host->dma_conf);
@@ -1177,7 +1179,7 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)
 
 	return iflags;
 unmap_exit:
-	dma_unmap_sg(chan->device->dev, data->sg, data->sg_len,
+	dma_unmap_sg(dma_dev, data->sg, data->sg_len,
 		     mmc_get_dma_dir(data));
 	return -ENOMEM;
 }
diff --git a/drivers/mmc/host/jz4740_mmc.c b/drivers/mmc/host/jz4740_mmc.c
index 6a3c26b7c82d8..3343c8aa1bffe 100644
--- a/drivers/mmc/host/jz4740_mmc.c
+++ b/drivers/mmc/host/jz4740_mmc.c
@@ -256,7 +256,7 @@ static int jz4740_mmc_acquire_dma_channels(struct jz4740_mmc_host *host)
 	 * the parameters of the DMA engine device.
 	 */
 	if (host->dma_tx) {
-		struct device *dev = host->dma_tx->device->dev;
+		struct device *dev = dmaengine_get_dma_device(host->dma_tx);
 		unsigned int max_seg_size = dma_get_max_seg_size(dev);
 
 		if (max_seg_size < host->mmc->max_seg_size)
@@ -264,7 +264,7 @@ static int jz4740_mmc_acquire_dma_channels(struct jz4740_mmc_host *host)
 	}
 
 	if (host->dma_rx) {
-		struct device *dev = host->dma_rx->device->dev;
+		struct device *dev = dmaengine_get_dma_device(host->dma_rx);
 		unsigned int max_seg_size = dma_get_max_seg_size(dev);
 
 		if (max_seg_size < host->mmc->max_seg_size)
@@ -289,7 +289,7 @@ static void jz4740_mmc_dma_unmap(struct jz4740_mmc_host *host,
 	struct dma_chan *chan = jz4740_mmc_get_dma_chan(host, data);
 	enum dma_data_direction dir = mmc_get_dma_dir(data);
 
-	dma_unmap_sg(chan->device->dev, data->sg, data->sg_len, dir);
+	dma_unmap_sg(dmaengine_get_dma_device(chan), data->sg, data->sg_len, dir);
 	data->host_cookie = COOKIE_UNMAPPED;
 }
 
@@ -307,7 +307,7 @@ static int jz4740_mmc_prepare_dma_data(struct jz4740_mmc_host *host,
 	if (data->host_cookie == COOKIE_PREMAPPED)
 		return data->sg_count;
 
-	sg_count = dma_map_sg(chan->device->dev,
+	sg_count = dma_map_sg(dmaengine_get_dma_device(chan),
 			data->sg,
 			data->sg_len,
 			dir);
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 416bdb184ed4c..2d72f56d354f1 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -893,14 +893,14 @@ int mmci_dmae_setup(struct mmci_host *host)
 	 * the parameters of the DMA engine device.
 	 */
 	if (dmae->tx_channel) {
-		struct device *dev = dmae->tx_channel->device->dev;
+		struct device *dev = dmaengine_get_dma_device(dmae->tx_channel);
 		unsigned int max_seg_size = dma_get_max_seg_size(dev);
 
 		if (max_seg_size < host->mmc->max_seg_size)
 			host->mmc->max_seg_size = max_seg_size;
 	}
 	if (dmae->rx_channel) {
-		struct device *dev = dmae->rx_channel->device->dev;
+		struct device *dev = dmaengine_get_dma_device(dmae->rx_channel);
 		unsigned int max_seg_size = dma_get_max_seg_size(dev);
 
 		if (max_seg_size < host->mmc->max_seg_size)
@@ -940,7 +940,7 @@ static void mmci_dma_unmap(struct mmci_host *host, struct mmc_data *data)
 	else
 		chan = dmae->tx_channel;
 
-	dma_unmap_sg(chan->device->dev, data->sg, data->sg_len,
+	dma_unmap_sg(dmaengine_get_dma_device(chan), data->sg, data->sg_len,
 		     mmc_get_dma_dir(data));
 }
 
@@ -1023,7 +1023,7 @@ static int _mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data,
 		.device_fc = variant->dma_flow_controller,
 	};
 	struct dma_chan *chan;
-	struct dma_device *device;
+	struct device *dma_dev;
 	struct dma_async_tx_descriptor *desc;
 	int nr_sg;
 	unsigned long flags = DMA_CTRL_ACK;
@@ -1056,8 +1056,8 @@ static int _mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data,
 	if (host->variant->dma_power_of_2 && !is_power_of_2(data->blksz))
 		return -EINVAL;
 
-	device = chan->device;
-	nr_sg = dma_map_sg(device->dev, data->sg, data->sg_len,
+	dma_dev = dmaengine_get_dma_device(chan);
+	nr_sg = dma_map_sg(dma_dev, data->sg, data->sg_len,
 			   mmc_get_dma_dir(data));
 	if (nr_sg == 0)
 		return -EINVAL;
@@ -1077,7 +1077,7 @@ static int _mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data,
 	return 0;
 
  unmap_exit:
-	dma_unmap_sg(device->dev, data->sg, data->sg_len,
+	dma_unmap_sg(dma_dev, data->sg, data->sg_len,
 		     mmc_get_dma_dir(data));
 	return -ENOMEM;
 }
diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c
index 28aed13549a64..6c0974c494207 100644
--- a/drivers/mmc/host/moxart-mmc.c
+++ b/drivers/mmc/host/moxart-mmc.c
@@ -262,6 +262,7 @@ static void moxart_transfer_dma(struct mmc_data *data, struct moxart_host *host)
 	u32 len, dir_slave;
 	struct dma_async_tx_descriptor *desc = NULL;
 	struct dma_chan *dma_chan;
+	struct device *dma_dev;
 	long timeout;
 
 	if (host->data_len == data->bytes_xfered)
@@ -275,7 +276,8 @@ static void moxart_transfer_dma(struct mmc_data *data, struct moxart_host *host)
 		dir_slave = DMA_DEV_TO_MEM;
 	}
 
-	len = dma_map_sg(dma_chan->device->dev, data->sg,
+	dma_dev = dmaengine_get_dma_device(dma_chan);
+	len = dma_map_sg(dma_dev, data->sg,
 			 data->sg_len, mmc_get_dma_dir(data));
 
 	if (len > 0) {
@@ -306,7 +308,7 @@ static void moxart_transfer_dma(struct mmc_data *data, struct moxart_host *host)
 	data->bytes_xfered = host->data_len;
 
 unmap:
-	dma_unmap_sg(dma_chan->device->dev,
+	dma_unmap_sg(dma_dev,
 		     data->sg, data->sg_len,
 		     mmc_get_dma_dir(data));
 }
@@ -642,8 +644,8 @@ static int moxart_probe(struct platform_device *pdev)
 		dmaengine_slave_config(host->dma_chan_rx, &cfg);
 
 		mmc->max_seg_size = min3(mmc->max_req_size,
-			dma_get_max_seg_size(host->dma_chan_rx->device->dev),
-			dma_get_max_seg_size(host->dma_chan_tx->device->dev));
+			dma_get_max_seg_size(dmaengine_get_dma_device(host->dma_chan_rx)),
+			dma_get_max_seg_size(dmaengine_get_dma_device(host->dma_chan_tx)));
 	}
 
 	if (readl(host->base + REG_BUS_WIDTH) & BUS_WIDTH_4_SUPPORT)
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c
index 097498a3f8ff4..91502cde0b6cc 100644
--- a/drivers/mmc/host/mxcmmc.c
+++ b/drivers/mmc/host/mxcmmc.c
@@ -290,6 +290,7 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
 	unsigned int datasize = nob * blksz;
 	struct scatterlist *sg;
 	enum dma_transfer_direction slave_dirn;
+	struct device *dma_dev;
 	int i, nents;
 
 	host->data = data;
@@ -302,6 +303,8 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
 	if (!mxcmci_use_dma(host))
 		return 0;
 
+	dma_dev = dmaengine_get_dma_device(host->dma);
+
 	for_each_sg(data->sg, sg, data->sg_len, i) {
 		if (sg->offset & 3 || sg->length & 3 || sg->length < 512) {
 			host->do_dma = 0;
@@ -319,8 +322,7 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
 		mxcmci_swap_buffers(data);
 	}
 
-	nents = dma_map_sg(host->dma->device->dev, data->sg,
-				     data->sg_len,  host->dma_dir);
+	nents = dma_map_sg(dma_dev, data->sg, data->sg_len,  host->dma_dir);
 	if (nents != data->sg_len)
 		return -EINVAL;
 
@@ -329,8 +331,7 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
 		DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 
 	if (!host->desc) {
-		dma_unmap_sg(host->dma->device->dev, data->sg, data->sg_len,
-				host->dma_dir);
+		dma_unmap_sg(dma_dev, data->sg, data->sg_len, host->dma_dir);
 		host->do_dma = 0;
 		return 0; /* Fall back to PIO */
 	}
@@ -439,7 +440,7 @@ static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat)
 	int data_error;
 
 	if (mxcmci_use_dma(host)) {
-		dma_unmap_sg(host->dma->device->dev, data->sg, data->sg_len,
+		dma_unmap_sg(dmaengine_get_dma_device(host->dma), data->sg, data->sg_len,
 				host->dma_dir);
 		mxcmci_swap_buffers(data);
 	}
@@ -1125,8 +1126,7 @@ static int mxcmci_probe(struct platform_device *pdev)
 		}
 	}
 	if (host->dma)
-		mmc->max_seg_size = dma_get_max_seg_size(
-				host->dma->device->dev);
+		mmc->max_seg_size = dma_get_max_seg_size(dmaengine_get_dma_device(host->dma));
 	else
 		dev_info(mmc_dev(host->mmc), "dma not available. Using PIO\n");
 
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index 7c7c52d9e8e72..c42e7734caf1e 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -143,7 +143,7 @@ static void mxs_mmc_request_done(struct mxs_mmc_host *host)
 		mxs_mmc_start_cmd(host, mrq->cmd);
 		return;
 	} else if (data) {
-		dma_unmap_sg(mmc_dev(host->mmc), data->sg,
+		dma_unmap_sg(dmaengine_get_dma_device(ssp->dmach), data->sg,
 			     data->sg_len, ssp->dma_dir);
 		/*
 		 * If there was an error on any block, we mark all
@@ -214,6 +214,7 @@ static struct dma_async_tx_descriptor *mxs_mmc_prep_dma(
 	struct mxs_mmc_host *host, unsigned long flags)
 {
 	struct mxs_ssp *ssp = &host->ssp;
+	struct device *dma_dev = dmaengine_get_dma_device(ssp->dmach);
 	struct dma_async_tx_descriptor *desc;
 	struct mmc_data *data = host->data;
 	struct scatterlist * sgl;
@@ -221,7 +222,7 @@ static struct dma_async_tx_descriptor *mxs_mmc_prep_dma(
 
 	if (data) {
 		/* data */
-		dma_map_sg(mmc_dev(host->mmc), data->sg,
+		dma_map_sg(dma_dev, data->sg,
 			   data->sg_len, ssp->dma_dir);
 		sgl = data->sg;
 		sg_len = data->sg_len;
@@ -238,7 +239,7 @@ static struct dma_async_tx_descriptor *mxs_mmc_prep_dma(
 		desc->callback_param = host;
 	} else {
 		if (data)
-			dma_unmap_sg(mmc_dev(host->mmc), data->sg,
+			dma_unmap_sg(dma_dev, data->sg,
 				     data->sg_len, ssp->dma_dir);
 	}
 
@@ -640,7 +641,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
 	mmc->max_blk_size = 1 << 0xf;
 	mmc->max_blk_count = (ssp_is_old(ssp)) ? 0xff : 0xffffff;
 	mmc->max_req_size = (ssp_is_old(ssp)) ? 0xffff : 0xffffffff;
-	mmc->max_seg_size = dma_get_max_seg_size(ssp->dmach->device->dev);
+	mmc->max_seg_size = dma_get_max_seg_size(dmaengine_get_dma_device(ssp->dmach));
 
 	platform_set_drvdata(pdev, mmc);
 
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
index 527b89a5ed707..37a8408351750 100644
--- a/drivers/mmc/host/omap.c
+++ b/drivers/mmc/host/omap.c
@@ -431,7 +431,7 @@ mmc_omap_release_dma(struct mmc_omap_host *host, struct mmc_data *data,
 			/* Claim nothing transferred on error... */
 			data->bytes_xfered = 0;
 		}
-		dev = c->device->dev;
+		dev = dmaengine_get_dma_device(c);
 	}
 	dma_unmap_sg(dev, data->sg, host->sg_len, dma_data_dir);
 }
@@ -1037,7 +1037,7 @@ mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req)
 			*bp = burst;
 		}
 
-		host->sg_len = dma_map_sg(c->device->dev, data->sg, sg_len,
+		host->sg_len = dma_map_sg(dmaengine_get_dma_device(c), data->sg, sg_len,
 					  dma_data_dir);
 		if (host->sg_len == 0)
 			goto use_pio;
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index de5a3b70107d8..44c326fd2a9b2 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -915,7 +915,7 @@ static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
 		struct dma_chan *chan = omap_hsmmc_get_dma_chan(host, host->data);
 
 		dmaengine_terminate_all(chan);
-		dma_unmap_sg(chan->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(chan),
 			host->data->sg, host->data->sg_len,
 			mmc_get_dma_dir(host->data));
 
@@ -1170,7 +1170,7 @@ static void omap_hsmmc_dma_callback(void *param)
 	data = host->mrq->data;
 	chan = omap_hsmmc_get_dma_chan(host, data);
 	if (!data->host_cookie)
-		dma_unmap_sg(chan->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(chan),
 			     data->sg, data->sg_len,
 			     mmc_get_dma_dir(data));
 
@@ -1204,7 +1204,7 @@ static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
 
 	/* Check if next job is already prepared */
 	if (next || data->host_cookie != host->next_data.cookie) {
-		dma_len = dma_map_sg(chan->device->dev, data->sg, data->sg_len,
+		dma_len = dma_map_sg(dmaengine_get_dma_device(chan), data->sg, data->sg_len,
 				     mmc_get_dma_dir(data));
 
 	} else {
@@ -1390,7 +1390,7 @@ static void omap_hsmmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,
 	if (host->use_dma && data->host_cookie) {
 		struct dma_chan *c = omap_hsmmc_get_dma_chan(host, data);
 
-		dma_unmap_sg(c->device->dev, data->sg, data->sg_len,
+		dma_unmap_sg(dmaengine_get_dma_device(c), data->sg, data->sg_len,
 			     mmc_get_dma_dir(data));
 		data->host_cookie = 0;
 	}
@@ -1912,8 +1912,8 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
 	 * increase this figure here, we get warnings from the DMA API debug.
 	 */
 	mmc->max_seg_size = min3(mmc->max_req_size,
-			dma_get_max_seg_size(host->rx_chan->device->dev),
-			dma_get_max_seg_size(host->tx_chan->device->dev));
+			dma_get_max_seg_size(dmaengine_get_dma_device(host->rx_chan)),
+			dma_get_max_seg_size(dmaengine_get_dma_device(host->tx_chan)));
 
 	/* Request IRQ for MMC operations */
 	ret = devm_request_irq(&pdev->dev, host->irq, omap_hsmmc_irq, 0,
diff --git a/drivers/mmc/host/owl-mmc.c b/drivers/mmc/host/owl-mmc.c
index d5b8a110267b8..668cf9704ac29 100644
--- a/drivers/mmc/host/owl-mmc.c
+++ b/drivers/mmc/host/owl-mmc.c
@@ -162,7 +162,7 @@ static void owl_mmc_finish_request(struct owl_mmc_host *owl_host)
 	owl_host->mrq = NULL;
 
 	if (data)
-		dma_unmap_sg(owl_host->dma->device->dev, data->sg, data->sg_len,
+		dma_unmap_sg(dmaengine_get_dma_device(owl_host->dma), data->sg, data->sg_len,
 			     owl_host->dma_dir);
 
 	/* Finally finish request */
@@ -313,7 +313,7 @@ static int owl_mmc_prepare_data(struct owl_mmc_host *owl_host,
 		owl_host->dma_cfg.direction = DMA_DEV_TO_MEM;
 	}
 
-	dma_map_sg(owl_host->dma->device->dev, data->sg,
+	dma_map_sg(dmaengine_get_dma_device(owl_host->dma), data->sg,
 		   data->sg_len, owl_host->dma_dir);
 
 	dmaengine_slave_config(owl_host->dma, &owl_host->dma_cfg);
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
index f8427f071c009..c3edd98376bcc 100644
--- a/drivers/mmc/host/pxamci.c
+++ b/drivers/mmc/host/pxamci.c
@@ -201,7 +201,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
 		return;
 	}
 
-	host->dma_len = dma_map_sg(chan->device->dev, data->sg, data->sg_len,
+	host->dma_len = dma_map_sg(dmaengine_get_dma_device(chan), data->sg, data->sg_len,
 				   host->dma_dir);
 
 	tx = dmaengine_prep_slave_sg(chan, data->sg, host->dma_len, direction,
@@ -337,7 +337,7 @@ static int pxamci_data_done(struct pxamci_host *host, unsigned int stat)
 		chan = host->dma_chan_rx;
 	else
 		chan = host->dma_chan_tx;
-	dma_unmap_sg(chan->device->dev,
+	dma_unmap_sg(dmaengine_get_dma_device(chan),
 		     data->sg, data->sg_len, host->dma_dir);
 
 	if (stat & STAT_READ_TIME_OUT)
diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
index c7df4da9e865b..bf2b32cfbec6c 100644
--- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
@@ -134,11 +134,11 @@ static void renesas_sdhi_sys_dmac_dma_callback(void *arg)
 		goto out;
 
 	if (host->data->flags & MMC_DATA_READ)
-		dma_unmap_sg(host->chan_rx->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(host->chan_rx),
 			     host->sg_ptr, host->sg_len,
 			     DMA_FROM_DEVICE);
 	else
-		dma_unmap_sg(host->chan_tx->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(host->chan_tx),
 			     host->sg_ptr, host->sg_len,
 			     DMA_TO_DEVICE);
 
@@ -188,7 +188,7 @@ static void renesas_sdhi_sys_dmac_start_dma_rx(struct tmio_mmc_host *host)
 		sg = host->sg_ptr;
 	}
 
-	ret = dma_map_sg(chan->device->dev, sg, host->sg_len, DMA_FROM_DEVICE);
+	ret = dma_map_sg(dmaengine_get_dma_device(chan), sg, host->sg_len, DMA_FROM_DEVICE);
 	if (ret > 0)
 		desc = dmaengine_prep_slave_sg(chan, sg, ret, DMA_DEV_TO_MEM,
 					       DMA_CTRL_ACK);
@@ -264,7 +264,7 @@ static void renesas_sdhi_sys_dmac_start_dma_tx(struct tmio_mmc_host *host)
 		sg = host->sg_ptr;
 	}
 
-	ret = dma_map_sg(chan->device->dev, sg, host->sg_len, DMA_TO_DEVICE);
+	ret = dma_map_sg(dmaengine_get_dma_device(chan), sg, host->sg_len, DMA_TO_DEVICE);
 	if (ret > 0)
 		desc = dmaengine_prep_slave_sg(chan, sg, ret, DMA_MEM_TO_DEV,
 					       DMA_CTRL_ACK);
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index a205c222a821d..e8d2bd1491eee 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -289,7 +289,7 @@ static void sh_mmcif_start_dma_rx(struct sh_mmcif_host *host)
 	dma_cookie_t cookie = -EINVAL;
 	int ret;
 
-	ret = dma_map_sg(chan->device->dev, sg, data->sg_len,
+	ret = dma_map_sg(dmaengine_get_dma_device(chan), sg, data->sg_len,
 			 DMA_FROM_DEVICE);
 	if (ret > 0) {
 		host->dma_active = true;
@@ -339,7 +339,7 @@ static void sh_mmcif_start_dma_tx(struct sh_mmcif_host *host)
 	dma_cookie_t cookie = -EINVAL;
 	int ret;
 
-	ret = dma_map_sg(chan->device->dev, sg, data->sg_len,
+	ret = dma_map_sg(dmaengine_get_dma_device(chan), sg, data->sg_len,
 			 DMA_TO_DEVICE);
 	if (ret > 0) {
 		host->dma_active = true;
@@ -1173,11 +1173,11 @@ static bool sh_mmcif_end_cmd(struct sh_mmcif_host *host)
 							 host->timeout);
 
 	if (data->flags & MMC_DATA_READ)
-		dma_unmap_sg(host->chan_rx->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(host->chan_rx),
 			     data->sg, data->sg_len,
 			     DMA_FROM_DEVICE);
 	else
-		dma_unmap_sg(host->chan_tx->device->dev,
+		dma_unmap_sg(dmaengine_get_dma_device(host->chan_tx),
 			     data->sg, data->sg_len,
 			     DMA_TO_DEVICE);
 
diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
index 8d9d4f362999f..74888260e85c5 100644
--- a/drivers/mmc/host/usdhi6rol0.c
+++ b/drivers/mmc/host/usdhi6rol0.c
@@ -539,10 +539,10 @@ static void usdhi6_dma_stop_unmap(struct usdhi6_host *host)
 	host->dma_active = false;
 
 	if (data->flags & MMC_DATA_READ)
-		dma_unmap_sg(host->chan_rx->device->dev, data->sg,
+		dma_unmap_sg(dmaengine_get_dma_device(host->chan_rx), data->sg,
 			     data->sg_len, DMA_FROM_DEVICE);
 	else
-		dma_unmap_sg(host->chan_tx->device->dev, data->sg,
+		dma_unmap_sg(dmaengine_get_dma_device(host->chan_tx), data->sg,
 			     data->sg_len, DMA_TO_DEVICE);
 }
 
@@ -583,7 +583,7 @@ static int usdhi6_dma_setup(struct usdhi6_host *host, struct dma_chan *chan,
 		return -EINVAL;
 	}
 
-	ret = dma_map_sg(chan->device->dev, sg, data->sg_len, data_dir);
+	ret = dma_map_sg(dmaengine_get_dma_device(chan), sg, data->sg_len, data_dir);
 	if (ret > 0) {
 		host->dma_active = true;
 		desc = dmaengine_prep_slave_sg(chan, sg, ret, dir,
-- 
2.43.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev
  2026-09-23 18:45 [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev Frank.Li
@ 2026-09-23 18:50 ` Frank Li
  2026-09-23 18:57 ` Arnd Bergmann
  1 sibling, 0 replies; 6+ messages in thread
From: Frank Li @ 2026-09-23 18:50 UTC (permalink / raw)
  To: Ulf Hansson, Aubin Constans, Nicolas Ferre, Alexandre Belloni,
	Claudiu Beznea, Paul Cercueil, Russell King, Frank Li,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Aaro Koskinen, Andreas Färber, Manivannan Sadhasivam,
	Wolfram Sang, Jesper Nilsson, Lars Persson, Arnd Bergmann,
	Johan Hovold, Ge Gordon, Vinod Koul, Albert Yang, Jared Kangas,
	Brian Masney, Martin Blumenstingl, Linus Walleij, Fan Wu,
	Rosen Penev, Pengpeng Hou, Marco Crivellari,
	Pedro Demarchi Gomes, Zhan Xusheng, Pan Chuang, Khalid Aziz,
	Ethan Nelson-Moore, Rakuram Eswaran, Takashi Sakamoto,
	Runyu Xiao, Matthew Wilcox (Oracle),
	Uwe Kleine-König, open list:MULTIMEDIA CARD (MMC),
	SECURE DIGITAL (SD) AND...,
	open list, moderated list:ARM/Microchip (AT91) SoC support,
	open list:INGENIC JZ47xx SoCs,
	open list:ARM/FREESCALE IMX / MXC / LAYERSCAPE ARM ARCHIT...,
	open list:OMAP MMC SUPPORT,
	moderated list:ARM/ACTIONS SEMI ARCHITECTURE,
	open list:TMIO/SDHI MMC DRIVER,
	open list:ARM/ARTPEC MACHINE SUPPORT

On Wed, Sep 23, 2026 at 02:45:47PM -0400, Frank.Li@oss.nxp.com wrote:
> From: Frank Li <Frank.Li@nxp.com>
>
> Replace direct dma_chan::device::dev access with the proper
> dmaengine_get_dma_device() for consumer API
>
> chan->device->dev is not always the device used for DMA mapping.
> Some DMA engines support per-channel IOMMU mappings, so different
> channels may use different DMA devices.  dmaengine_get_dma_device()
> returns the correct device for each channel.
>
> This also prepares for making the DMA engine provider data structures
> private. DMA consumers should not access DMA engine internals directly.
>
> mxs-mmc.c wrong use mmc host device when do DMA map. Fix it by use
> dmaengine_get_dma_device().
>
> Assisted-by: LLM
> Reviewed-by: Linus Walleij <linusw@kernel.org>
> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Reviewed-by: Vinod Koul <vkoul@kernel.org>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
> Change in v4
> - Fix miss "R" at Reviewed-by tags.
> - Fix error path unmap dev at mxs-mmc.c (sashakio reported)
> - move dmaengine_get_dma_device(host->dma) after mxcmci_use_dma() to avoid
> defer host->dma if use pio mode (sashakio reported)
>
> Change in v3
> - add Linus Walleij and Vinod Koul's review by tags
> - Add missed omap and mxs-mmc.c (sashakio reported)
>
> Change in v2
> - find more place, which use device->dev for dma mapping. This time should
> clean all.
> - Reviewed-by: Linus Walleij <linusw@kernel.org>
>
> Cc: imx@lists.linux.dev
> Cc: vkoul@kernel.org
> ---
>  drivers/mmc/host/Kconfig                 |  2 +-

Please forget this version, I make misstake to include a debug code, sorry
for annoise.

Frank

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev
  2026-09-23 18:45 [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev Frank.Li
  2026-09-23 18:50 ` Frank Li
@ 2026-09-23 18:57 ` Arnd Bergmann
  2026-09-23 19:33   ` Frank Li
  1 sibling, 1 reply; 6+ messages in thread
From: Arnd Bergmann @ 2026-09-23 18:57 UTC (permalink / raw)
  To: Frank Li, Ulf Hansson, Aubin Constans, Nicolas Ferre,
	Alexandre Belloni, Claudiu Beznea, Paul Cercueil, Russell King,
	Frank Li, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Aaro Koskinen, Andreas Färber, Manivannan Sadhasivam,
	Wolfram Sang, Jesper Nilsson, Lars Persson, Johan Hovold,
	gordon.ge, Vinod Koul, yangzh0906, Jared Kangas, Brian Masney,
	Martin Blumenstingl, Linus Walleij, Fan Wu, Rosen Penev,
	Pengpeng Hou, Marco Crivellari, Pedro Demarchi Gomes,
	Zhan Xusheng, Pan Chuang, Khalid Aziz, Ethan Nelson-Moore,
	Rakuram Eswaran, Takashi Sakamoto, Runyu Xiao, Matthew Wilcox,
	Uwe Kleine-König, linux-mmc @ vger . kernel . org,
	open list, moderated list:ARM/Microchip (AT91) SoC support,
	open list:INGENIC JZ47xx SoCs,
	open list:ARM/FREESCALE IMX / MXC / LAYERSCAPE ARM ARCHIT...,
	Linux-OMAP, moderated list:ARM/ACTIONS SEMI ARCHITECTURE,
	Linux-Renesas, open list:ARM/ARTPEC MACHINE SUPPORT

On Wed, Sep 23, 2026, at 20:45, Frank.Li@oss.nxp.com wrote:
> @@ -214,7 +214,7 @@ config MMC_SDHCI_OF_AT91
>  config MMC_SDHCI_OF_ESDHC
>  	tristate "SDHCI OF support for the Freescale eSDHC controller"
>  	depends on MMC_SDHCI_PLTFM
> -	depends on PPC || ARCH_MXC || ARCH_LAYERSCAPE || COMPILE_TEST
> +	depends on PPC || ARCHMXC || ARCH_LAYERSCAPE || COMPILE_TEST
>  	select MMC_SDHCI_IO_ACCESSORS
>  	select FSL_GUTS

This looks like an accidental bug that should be removed from the patch.

> @@ -961,7 +961,7 @@ static void atmci_dma_cleanup(struct atmel_mci *host)
>  	struct mmc_data                 *data = host->data;
> 
>  	if (data)
> -		dma_unmap_sg(host->dma.chan->device->dev,
> +		dma_unmap_sg(dmaengine_get_dma_device(host->dma.chan),
>  				data->sg, data->sg_len,
>  				mmc_get_dma_dir(data));

Since you have the exact construct in a lot of drivers, would
it make sense to take this one step further and introduce
a new set of helpers in drivers/dma/dmaengine.h, such as

unsigned int dmaengine_map_sg(struct dma_chan *chan, struct scatterlist *sg, ...);

      Arnd

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev
  2026-09-23 18:57 ` Arnd Bergmann
@ 2026-09-23 19:33   ` Frank Li
  2026-09-23 21:40     ` Frank Li
  0 siblings, 1 reply; 6+ messages in thread
From: Frank Li @ 2026-09-23 19:33 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Ulf Hansson, Aubin Constans, Nicolas Ferre, Alexandre Belloni,
	Claudiu Beznea, Paul Cercueil, Russell King, Frank Li,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Aaro Koskinen, Andreas Färber, Manivannan Sadhasivam,
	Wolfram Sang, Jesper Nilsson, Lars Persson, Johan Hovold,
	gordon.ge, Vinod Koul, yangzh0906, Jared Kangas, Brian Masney,
	Martin Blumenstingl, Linus Walleij, Fan Wu, Rosen Penev,
	Pengpeng Hou, Marco Crivellari, Pedro Demarchi Gomes,
	Zhan Xusheng, Pan Chuang, Khalid Aziz, Ethan Nelson-Moore,
	Rakuram Eswaran, Takashi Sakamoto, Runyu Xiao, Matthew Wilcox,
	Uwe Kleine-König, linux-mmc @ vger . kernel . org,
	open list, moderated list:ARM/Microchip (AT91) SoC support,
	open list:INGENIC JZ47xx SoCs,
	open list:ARM/FREESCALE IMX / MXC / LAYERSCAPE ARM ARCHIT...,
	Linux-OMAP, moderated list:ARM/ACTIONS SEMI ARCHITECTURE,
	Linux-Renesas, open list:ARM/ARTPEC MACHINE SUPPORT

On Wed, Sep 23, 2026 at 08:57:04PM +0200, Arnd Bergmann wrote:
> On Wed, Sep 23, 2026, at 20:45, Frank.Li@oss.nxp.com wrote:
> > @@ -214,7 +214,7 @@ config MMC_SDHCI_OF_AT91
> >  config MMC_SDHCI_OF_ESDHC
> >  	tristate "SDHCI OF support for the Freescale eSDHC controller"
> >  	depends on MMC_SDHCI_PLTFM
> > -	depends on PPC || ARCH_MXC || ARCH_LAYERSCAPE || COMPILE_TEST
> > +	depends on PPC || ARCHMXC || ARCH_LAYERSCAPE || COMPILE_TEST
> >  	select MMC_SDHCI_IO_ACCESSORS
> >  	select FSL_GUTS
>
> This looks like an accidental bug that should be removed from the patch.

It is accidently including my local change to build test. I found it when
post it.

>
> > @@ -961,7 +961,7 @@ static void atmci_dma_cleanup(struct atmel_mci *host)
> >  	struct mmc_data                 *data = host->data;
> >
> >  	if (data)
> > -		dma_unmap_sg(host->dma.chan->device->dev,
> > +		dma_unmap_sg(dmaengine_get_dma_device(host->dma.chan),
> >  				data->sg, data->sg_len,
> >  				mmc_get_dma_dir(data));
>
> Since you have the exact construct in a lot of drivers, would
> it make sense to take this one step further and introduce
> a new set of helpers in drivers/dma/dmaengine.h, such as
>
> unsigned int dmaengine_map_sg(struct dma_chan *chan, struct scatterlist *sg, ...);

If add this, suppose should be set of map_*, like dmaengine_map_single(),

Vinod:
	Is it add new APIs like thats?

Frank

>
>       Arnd

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev
  2026-09-23 19:33   ` Frank Li
@ 2026-09-23 21:40     ` Frank Li
  2026-09-23 23:01       ` Arnd Bergmann
  0 siblings, 1 reply; 6+ messages in thread
From: Frank Li @ 2026-09-23 21:40 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Ulf Hansson, Aubin Constans, Nicolas Ferre, Alexandre Belloni,
	Claudiu Beznea, Paul Cercueil, Russell King, Frank Li,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Aaro Koskinen, Andreas Färber, Manivannan Sadhasivam,
	Wolfram Sang, Jesper Nilsson, Lars Persson, Johan Hovold,
	gordon.ge, Vinod Koul, yangzh0906, Jared Kangas, Brian Masney,
	Martin Blumenstingl, Linus Walleij, Fan Wu, Rosen Penev,
	Pengpeng Hou, Marco Crivellari, Pedro Demarchi Gomes,
	Zhan Xusheng, Pan Chuang, Khalid Aziz, Ethan Nelson-Moore,
	Rakuram Eswaran, Takashi Sakamoto, Runyu Xiao, Matthew Wilcox,
	Uwe Kleine-König, linux-mmc @ vger . kernel . org,
	open list, moderated list:ARM/Microchip (AT91) SoC support,
	open list:INGENIC JZ47xx SoCs,
	open list:ARM/FREESCALE IMX / MXC / LAYERSCAPE ARM ARCHIT...,
	Linux-OMAP, moderated list:ARM/ACTIONS SEMI ARCHITECTURE,
	Linux-Renesas, open list:ARM/ARTPEC MACHINE SUPPORT

On Wed, Sep 23, 2026 at 02:33:35PM -0500, Frank Li wrote:
> On Wed, Sep 23, 2026 at 08:57:04PM +0200, Arnd Bergmann wrote:
> > On Wed, Sep 23, 2026, at 20:45, Frank.Li@oss.nxp.com wrote:
> > > @@ -214,7 +214,7 @@ config MMC_SDHCI_OF_AT91
> > >  config MMC_SDHCI_OF_ESDHC
> > >  	tristate "SDHCI OF support for the Freescale eSDHC controller"
> > >  	depends on MMC_SDHCI_PLTFM
> > > -	depends on PPC || ARCH_MXC || ARCH_LAYERSCAPE || COMPILE_TEST
> > > +	depends on PPC || ARCHMXC || ARCH_LAYERSCAPE || COMPILE_TEST
> > >  	select MMC_SDHCI_IO_ACCESSORS
> > >  	select FSL_GUTS
> >
> > This looks like an accidental bug that should be removed from the patch.
>
> It is accidently including my local change to build test. I found it when
> post it.
>
> >
> > > @@ -961,7 +961,7 @@ static void atmci_dma_cleanup(struct atmel_mci *host)
> > >  	struct mmc_data                 *data = host->data;
> > >
> > >  	if (data)
> > > -		dma_unmap_sg(host->dma.chan->device->dev,
> > > +		dma_unmap_sg(dmaengine_get_dma_device(host->dma.chan),
> > >  				data->sg, data->sg_len,
> > >  				mmc_get_dma_dir(data));
> >
> > Since you have the exact construct in a lot of drivers, would
> > it make sense to take this one step further and introduce
> > a new set of helpers in drivers/dma/dmaengine.h, such as
> >
> > unsigned int dmaengine_map_sg(struct dma_chan *chan, struct scatterlist *sg, ...);
>
> If add this, suppose should be set of map_*, like dmaengine_map_single(),
>
> Vinod:
> 	Is it add new APIs like thats?

Maybe we can enhence dmaengine_prep_slave_sg(),

Most patten like

	sglen = dma_map_sg(chan->device->dev, data->sg,
			data->sg_len, mmc_get_dma_dir(data));

	dmaengine_slave_config(chan, &host->dma_conf);
	desc = dmaengine_prep_slave_sg(chan,
			data->sg, sglen, slave_dirn,
			DMA_PREP_INTERRUPT | DMA_CTRL_ACK);

let dmaengine_prep_slave_sg() include dma_map_sg(), which also reduce
error handle when return desc is NULL.

after call complete, auto ummap_sg(). We may add DMA_PREP_MAP flags to
keep back compatiblity.

after enhancement
	consumer just need call

	dmaengine_prep_slave_sg(chan, data->sg, data->sg_len, slave_dirn,
			        DMA_PREP_INTERRUPT | DMA_CTRL_ACK |
				DMA_PREP_MAP)

Frank
>
> Frank
>
> >
> >       Arnd

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev
  2026-09-23 21:40     ` Frank Li
@ 2026-09-23 23:01       ` Arnd Bergmann
  0 siblings, 0 replies; 6+ messages in thread
From: Arnd Bergmann @ 2026-09-23 23:01 UTC (permalink / raw)
  To: Frank Li
  Cc: Ulf Hansson, Aubin Constans, Nicolas Ferre, Alexandre Belloni,
	Claudiu Beznea, Paul Cercueil, Russell King, Frank Li,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Aaro Koskinen, Andreas Färber, Manivannan Sadhasivam,
	Wolfram Sang, Jesper Nilsson, Lars Persson, Johan Hovold,
	gordon.ge, Vinod Koul, yangzh0906, Jared Kangas, Brian Masney,
	Martin Blumenstingl, Linus Walleij, Fan Wu, Rosen Penev,
	Pengpeng Hou, Marco Crivellari, Pedro Demarchi Gomes,
	Zhan Xusheng, Pan Chuang, Khalid Aziz, Ethan Nelson-Moore,
	Rakuram Eswaran, Takashi Sakamoto, Runyu Xiao, Matthew Wilcox,
	Uwe Kleine-König, linux-mmc @ vger . kernel . org,
	open list, moderated list:ARM/Microchip (AT91) SoC support,
	open list:INGENIC JZ47xx SoCs,
	open list:ARM/FREESCALE IMX / MXC / LAYERSCAPE ARM ARCHIT...,
	Linux-OMAP, moderated list:ARM/ACTIONS SEMI ARCHITECTURE,
	Linux-Renesas, open list:ARM/ARTPEC MACHINE SUPPORT

On Wed, Sep 23, 2026, at 23:40, Frank Li wrote:
> On Wed, Sep 23, 2026 at 02:33:35PM -0500, Frank Li wrote:
>> On Wed, Sep 23, 2026 at 08:57:04PM +0200, Arnd Bergmann wrote:

> after enhancement
> 	consumer just need call
>
> 	dmaengine_prep_slave_sg(chan, data->sg, data->sg_len, slave_dirn,
> 			        DMA_PREP_INTERRUPT | DMA_CTRL_ACK |
> 				DMA_PREP_MAP)

If that works, I think that would be perfect, good idea!

       Arnd

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-09-23 23:02 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-23 18:45 [PATCH v4 1/1] mmc: use dmaengine_get_dma_device() instead of chan->device->dev Frank.Li
2026-09-23 18:50 ` Frank Li
2026-09-23 18:57 ` Arnd Bergmann
2026-09-23 19:33   ` Frank Li
2026-09-23 21:40     ` Frank Li
2026-09-23 23:01       ` Arnd Bergmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®