* [PATCH 1/1] iio: use dmaengine_get_dma_device() instead of chan->device->dev
@ 2026-09-17 20:36 Frank.Li
2026-09-18 6:47 ` Andy Shevchenko
2026-09-18 17:54 ` Vinod Koul
0 siblings, 2 replies; 3+ messages in thread
From: Frank.Li @ 2026-09-17 20:36 UTC (permalink / raw)
To: Eugen Hristev, Jonathan Cameron, David Lechner, Nuno Sá,
Andy Shevchenko, Nicolas Ferre, Alexandre Belloni,
Claudiu Beznea, Maxime Coquelin, Alexandre Torgue,
Daniel Lezcano, Felix Gu, Stepan Ionichev, Shuvam Pandey,
Antoniu Miclaus, Frank Li, Piyush Patle,
Uwe Kleine-König (The Capable Hub),
Takashi Sakamoto, Giorgi Tchankvetadze, Olivier Moysan,
Rob Herring (Arm),
Pei Xiao, Shi Hao, Kees Cook, Michael Hennerich,
open list:MICROCHIP SAMA5D2-COMPATIBLE ADC DRIVER,
moderated list:ARM/Microchip (AT91) SoC support, open list,
moderated list:ARM/STM32 ARCHITECTURE
Cc: imx, vkoul
From: Frank Li <Frank.Li@nxp.com>
Replace direct dma_chan::device::dev access with the proper
dmaengine_get_dma_device() accessor in IIO DMA consumers.
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.
Assisted-by: LLM
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Cc: imx@lists.linux.dev
Cc: vkoul@kernel.org
---
drivers/iio/adc/at91-sama5d2_adc.c | 9 ++++++---
drivers/iio/adc/nxp-sar-adc.c | 2 +-
drivers/iio/adc/stm32-adc.c | 10 ++++++----
drivers/iio/adc/stm32-dfsdm-adc.c | 4 ++--
drivers/iio/adc/ti_am335x_adc.c | 4 ++--
drivers/iio/buffer/industrialio-buffer-dmaengine.c | 5 +++--
6 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index e8a5285bb6d4f..0e7d07fb27ca7 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -2016,6 +2016,8 @@ static void at91_adc_dma_init(struct at91_adc_state *st)
unsigned int pages = DIV_ROUND_UP(AT91_HWFIFO_MAX_SIZE *
sample_size * 2, PAGE_SIZE);
+ struct device *dma_dev;
+
if (st->dma_st.dma_chan)
return;
@@ -2026,7 +2028,8 @@ static void at91_adc_dma_init(struct at91_adc_state *st)
goto dma_exit;
}
- st->dma_st.rx_buf = dma_alloc_coherent(st->dma_st.dma_chan->device->dev,
+ dma_dev = dmaengine_get_dma_device(st->dma_st.dma_chan);
+ st->dma_st.rx_buf = dma_alloc_coherent(dma_dev,
pages * PAGE_SIZE,
&st->dma_st.rx_dma_buf,
GFP_KERNEL);
@@ -2054,7 +2057,7 @@ static void at91_adc_dma_init(struct at91_adc_state *st)
return;
dma_free_area:
- dma_free_coherent(st->dma_st.dma_chan->device->dev, pages * PAGE_SIZE,
+ dma_free_coherent(dma_dev, pages * PAGE_SIZE,
st->dma_st.rx_buf, st->dma_st.rx_dma_buf);
dma_chan_disable:
dma_release_channel(st->dma_st.dma_chan);
@@ -2078,7 +2081,7 @@ static void at91_adc_dma_disable(struct at91_adc_state *st)
/* wait for all transactions to be terminated first*/
dmaengine_terminate_sync(st->dma_st.dma_chan);
- dma_free_coherent(st->dma_st.dma_chan->device->dev, pages * PAGE_SIZE,
+ dma_free_coherent(dmaengine_get_dma_device(st->dma_st.dma_chan), pages * PAGE_SIZE,
st->dma_st.rx_buf, st->dma_st.rx_dma_buf);
dma_release_channel(st->dma_st.dma_chan);
st->dma_st.dma_chan = NULL;
diff --git a/drivers/iio/adc/nxp-sar-adc.c b/drivers/iio/adc/nxp-sar-adc.c
index 894d3211b2838..2f716a2f97b80 100644
--- a/drivers/iio/adc/nxp-sar-adc.c
+++ b/drivers/iio/adc/nxp-sar-adc.c
@@ -604,7 +604,7 @@ static void nxp_sar_adc_dma_cb(void *data)
dma_buf = &info->dma_buf;
dma_samples = (u32 *)dma_buf->buf;
- dev_dma = info->dma_chan->device->dev;
+ dev_dma = dmaengine_get_dma_device(info->dma_chan);
/*
* DMA in some corner cases might have already be charged for
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
index 5c6c06b269be6..6aa672177970a 100644
--- a/drivers/iio/adc/stm32-adc.c
+++ b/drivers/iio/adc/stm32-adc.c
@@ -2456,6 +2456,7 @@ static int stm32_adc_dma_request(struct device *dev, struct iio_dev *indio_dev)
{
struct stm32_adc *adc = iio_priv(indio_dev);
struct dma_slave_config config = { };
+ struct device *dma_dev;
int ret;
adc->dma_chan = dma_request_chan(dev, "rx");
@@ -2470,7 +2471,8 @@ static int stm32_adc_dma_request(struct device *dev, struct iio_dev *indio_dev)
return 0;
}
- adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
+ dma_dev = dmaengine_get_dma_device(adc->dma_chan);
+ adc->rx_buf = dma_alloc_coherent(dma_dev,
STM32_DMA_BUFFER_SIZE,
&adc->rx_dma_buf, GFP_KERNEL);
if (!adc->rx_buf) {
@@ -2490,7 +2492,7 @@ static int stm32_adc_dma_request(struct device *dev, struct iio_dev *indio_dev)
return 0;
err_free:
- dma_free_coherent(adc->dma_chan->device->dev, STM32_DMA_BUFFER_SIZE,
+ dma_free_coherent(dma_dev, STM32_DMA_BUFFER_SIZE,
adc->rx_buf, adc->rx_dma_buf);
err_release:
dma_release_channel(adc->dma_chan);
@@ -2617,7 +2619,7 @@ static int stm32_adc_probe(struct platform_device *pdev)
err_dma_disable:
if (adc->dma_chan) {
- dma_free_coherent(adc->dma_chan->device->dev,
+ dma_free_coherent(dmaengine_get_dma_device(adc->dma_chan),
STM32_DMA_BUFFER_SIZE,
adc->rx_buf, adc->rx_dma_buf);
dma_release_channel(adc->dma_chan);
@@ -2640,7 +2642,7 @@ static void stm32_adc_remove(struct platform_device *pdev)
pm_runtime_put_noidle(&pdev->dev);
iio_triggered_buffer_cleanup(indio_dev);
if (adc->dma_chan) {
- dma_free_coherent(adc->dma_chan->device->dev,
+ dma_free_coherent(dmaengine_get_dma_device(adc->dma_chan),
STM32_DMA_BUFFER_SIZE,
adc->rx_buf, adc->rx_dma_buf);
dma_release_channel(adc->dma_chan);
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index 00f05e167afc9..674767da3ac37 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1484,7 +1484,7 @@ static void stm32_dfsdm_dma_release(struct iio_dev *indio_dev)
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
if (adc->dma_chan) {
- dma_free_coherent(adc->dma_chan->device->dev,
+ dma_free_coherent(dmaengine_get_dma_device(adc->dma_chan),
DFSDM_DMA_BUFFER_SIZE,
adc->rx_buf, adc->dma_buf);
dma_release_channel(adc->dma_chan);
@@ -1504,7 +1504,7 @@ static int stm32_dfsdm_dma_request(struct device *dev,
return ret;
}
- adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
+ adc->rx_buf = dma_alloc_coherent(dmaengine_get_dma_device(adc->dma_chan),
DFSDM_DMA_BUFFER_SIZE,
&adc->dma_buf, GFP_KERNEL);
if (!adc->rx_buf) {
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 1516dd332f905..e53c839e87ef3 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -548,7 +548,7 @@ static int tiadc_request_dma(struct platform_device *pdev,
}
/* RX buffer */
- dma->buf = dma_alloc_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
+ dma->buf = dma_alloc_coherent(dmaengine_get_dma_device(dma->chan), DMA_BUFFER_SIZE,
&dma->addr, GFP_KERNEL);
if (!dma->buf)
goto err;
@@ -688,7 +688,7 @@ static void tiadc_remove(struct platform_device *pdev)
u32 step_en;
if (dma->chan) {
- dma_free_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
+ dma_free_coherent(dmaengine_get_dma_device(dma->chan), DMA_BUFFER_SIZE,
dma->buf, dma->addr);
dma_release_channel(dma->chan);
}
diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
index 559880e0cad72..b9f8b5b3aa6b6 100644
--- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
+++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
@@ -254,6 +254,7 @@ static const struct iio_dev_attr *iio_dmaengine_buffer_attrs[] = {
*/
static struct iio_buffer *iio_dmaengine_buffer_alloc(struct dma_chan *chan)
{
+ struct device *dma_dev = dmaengine_get_dma_device(chan);
struct dmaengine_buffer *dmaengine_buffer;
unsigned int width, src_width, dest_width;
struct dma_slave_caps caps;
@@ -281,9 +282,9 @@ static struct iio_buffer *iio_dmaengine_buffer_alloc(struct dma_chan *chan)
INIT_LIST_HEAD(&dmaengine_buffer->active);
dmaengine_buffer->chan = chan;
dmaengine_buffer->align = width;
- dmaengine_buffer->max_size = dma_get_max_seg_size(chan->device->dev);
+ dmaengine_buffer->max_size = dma_get_max_seg_size(dma_dev);
- iio_dma_buffer_init(&dmaengine_buffer->queue, chan->device->dev,
+ iio_dma_buffer_init(&dmaengine_buffer->queue, dma_dev,
&iio_dmaengine_default_ops);
dmaengine_buffer->queue.buffer.attrs = iio_dmaengine_buffer_attrs;
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH 1/1] iio: use dmaengine_get_dma_device() instead of chan->device->dev
2026-09-17 20:36 [PATCH 1/1] iio: use dmaengine_get_dma_device() instead of chan->device->dev Frank.Li
@ 2026-09-18 6:47 ` Andy Shevchenko
2026-09-18 17:54 ` Vinod Koul
1 sibling, 0 replies; 3+ messages in thread
From: Andy Shevchenko @ 2026-09-18 6:47 UTC (permalink / raw)
To: Frank.Li
Cc: Eugen Hristev, Jonathan Cameron, David Lechner, Nuno Sá,
Andy Shevchenko, Nicolas Ferre, Alexandre Belloni,
Claudiu Beznea, Maxime Coquelin, Alexandre Torgue,
Daniel Lezcano, Felix Gu, Stepan Ionichev, Shuvam Pandey,
Antoniu Miclaus, Frank Li, Piyush Patle,
Uwe Kleine-König (The Capable Hub),
Takashi Sakamoto, Giorgi Tchankvetadze, Olivier Moysan,
Rob Herring (Arm),
Pei Xiao, Shi Hao, Kees Cook, Michael Hennerich,
open list:MICROCHIP SAMA5D2-COMPATIBLE ADC DRIVER,
moderated list:ARM/Microchip (AT91) SoC support, open list,
moderated list:ARM/STM32 ARCHITECTURE, imx, vkoul
On Thu, Sep 17, 2026 at 04:36:26PM -0400, Frank.Li@oss.nxp.com wrote:
> Replace direct dma_chan::device::dev access with the proper
> dmaengine_get_dma_device() accessor in IIO DMA consumers.
>
> 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.
...
> drivers/iio/adc/at91-sama5d2_adc.c | 9 ++++++---
> drivers/iio/adc/nxp-sar-adc.c | 2 +-
> drivers/iio/adc/stm32-adc.c | 10 ++++++----
> drivers/iio/adc/stm32-dfsdm-adc.c | 4 ++--
> drivers/iio/adc/ti_am335x_adc.c | 4 ++--
> drivers/iio/buffer/industrialio-buffer-dmaengine.c | 5 +++--
Strictly speaking this is two patches, one per ADC folder and the other against
IIO core. But this one is not a big one, so up to Jonathan.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/1] iio: use dmaengine_get_dma_device() instead of chan->device->dev
2026-09-17 20:36 [PATCH 1/1] iio: use dmaengine_get_dma_device() instead of chan->device->dev Frank.Li
2026-09-18 6:47 ` Andy Shevchenko
@ 2026-09-18 17:54 ` Vinod Koul
1 sibling, 0 replies; 3+ messages in thread
From: Vinod Koul @ 2026-09-18 17:54 UTC (permalink / raw)
To: Frank.Li
Cc: Eugen Hristev, Jonathan Cameron, David Lechner, Nuno Sá,
Andy Shevchenko, Nicolas Ferre, Alexandre Belloni,
Claudiu Beznea, Maxime Coquelin, Alexandre Torgue,
Daniel Lezcano, Felix Gu, Stepan Ionichev, Shuvam Pandey,
Antoniu Miclaus, Frank Li, Piyush Patle,
Uwe Kleine-König (The Capable Hub),
Takashi Sakamoto, Giorgi Tchankvetadze, Olivier Moysan,
Rob Herring (Arm),
Pei Xiao, Shi Hao, Kees Cook, Michael Hennerich,
open list:MICROCHIP SAMA5D2-COMPATIBLE ADC DRIVER,
moderated list:ARM/Microchip (AT91) SoC support, open list,
moderated list:ARM/STM32 ARCHITECTURE, imx
On 17-09-26, 16:36, 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() accessor in IIO DMA consumers.
>
> 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.
>
> Assisted-by: LLM
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Vinod Koul <vkoul@kernel.org>
--
~Vinod
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-09-18 17:54 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-17 20:36 [PATCH 1/1] iio: use dmaengine_get_dma_device() instead of chan->device->dev Frank.Li
2026-09-18 6:47 ` Andy Shevchenko
2026-09-18 17:54 ` Vinod Koul
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®