[PATCH v5 7/9] ALSA: pcm_dmaengine: Use dma_slave_caps bus width helpers
Nuno Sá
nuno.sa at analog.com
Fri Oct 9 08:52:59 PDT 2026
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 at nxp.com>
Signed-off-by: Nuno Sá <nuno.sa at analog.com>
---
Andy, I decided to not go with the implicit call to bitmap_zero() in
_set() and _set_many(). The reason is that almost all the users are dma
controllers where the bitmap is initialized (given it's part of the
dma_device struct) so it seems unnecessary churn just to make one caller
"happy". These APIs also follow bitmap (set_bit() included) semantics so
it makes sense to me to leave as-is. Added a note on the kernel doc
though.
And it's easier to add the implicit call in the future (if it proves
necessary). Removing it, not so easy...
---
sound/core/pcm_dmaengine.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/sound/core/pcm_dmaengine.c b/sound/core/pcm_dmaengine.c
index 1306b04be171..f7a061f07e95 100644
--- a/sound/core/pcm_dmaengine.c
+++ b/sound/core/pcm_dmaengine.c
@@ -408,16 +408,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 +434,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 +468,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.56.0
More information about the linux-arm-kernel
mailing list