[PATCH v3 7/9] ALSA: pcm_dmaengine: Use dma_slave_caps bus width helpers
From: Nuno Sá
Date: Mon Aug 31 2026 - 07:51:10 EST
Use the dma_slave_caps bus width helpers instead of reading the legacy
src_addr_widths and dst_addr_widths masks directly.
Keep the existing default assumption of 1, 2 and 4 byte widths when the
DMA channel does not report slave capabilities.
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
Signed-off-by: Nuno Sá <nuno.sa@xxxxxxxxxx>
---
sound/core/pcm_dmaengine.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/sound/core/pcm_dmaengine.c b/sound/core/pcm_dmaengine.c
index 1306b04be171..2dbbdeae6c4c 100644
--- a/sound/core/pcm_dmaengine.c
+++ b/sound/core/pcm_dmaengine.c
@@ -11,6 +11,7 @@
*/
#include <linux/module.h>
#include <linux/init.h>
+#include <linux/dma/engine/widthmask.h>
#include <linux/dmaengine.h>
#include <linux/slab.h>
#include <sound/pcm.h>
@@ -408,16 +409,24 @@ int snd_dmaengine_pcm_refine_runtime_hwparams(
struct snd_pcm_hardware *hw,
struct dma_chan *chan)
{
+ enum dma_slave_buswidth default_widths[] = {
+ DMA_SLAVE_BUSWIDTH_1_BYTE,
+ DMA_SLAVE_BUSWIDTH_2_BYTES,
+ DMA_SLAVE_BUSWIDTH_4_BYTES,
+ };
struct dma_slave_caps dma_caps;
- u32 addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
- BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) |
- BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
+ dma_buswidth_mask_t bus_widths = {};
snd_pcm_format_t i;
int ret = 0;
if (!hw || !chan || !dma_data)
return -EINVAL;
+ ret = dma_bus_width_set_many(bus_widths, default_widths,
+ ARRAY_SIZE(default_widths));
+ if (ret)
+ return ret;
+
ret = dma_get_slave_caps(chan, &dma_caps);
if (ret == 0) {
if (dma_caps.cmd_pause && dma_caps.cmd_resume)
@@ -426,9 +435,9 @@ int snd_dmaengine_pcm_refine_runtime_hwparams(
hw->info |= SNDRV_PCM_INFO_BATCH;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- addr_widths = dma_caps.dst_addr_widths;
+ dma_bus_width_copy(bus_widths, dma_caps.dst_bus_widths);
else
- addr_widths = dma_caps.src_addr_widths;
+ dma_bus_width_copy(bus_widths, dma_caps.src_bus_widths);
}
/*
@@ -460,7 +469,7 @@ int snd_dmaengine_pcm_refine_runtime_hwparams(
case 24:
case 32:
case 64:
- if (addr_widths & (1 << (bits / 8)))
+ if (dma_bus_width_test(bus_widths, bits / 8))
hw->formats |= pcm_format_to_bits(i);
break;
default:
--
2.55.0