* [PATCH v2] ASoC: soc-generic-dmaengine: Handle DMA channel request failures correctly
@ 2026-07-20 5:26 phucduc.bui
0 siblings, 0 replies; only message in thread
From: phucduc.bui @ 2026-07-20 5:26 UTC (permalink / raw)
To: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Lars-Peter Clausen
Cc: linux-kernel, linux-sound, bui duc phuc
From: bui duc phuc <phucduc.bui@gmail.com>
Currently any dma_request_chan() failure other than -EPROBE_DEFER is
silently ignored, since a missing channel is expected for devices that
only support one DMA direction.
Improve the handling of these failures by:
- reporting failures when a configured DMA channel cannot be requested;
- failing probe if neither playback nor capture obtains a DMA channel,
since the PCM device would be unusable.
Devices that legitimately support only one DMA direction continue to
work as before.
Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
---
Changes in v2:
- Update the commit message and title.
- Refine DMA channel request failure handling to match the
dma_request_chan() implementation.
sound/soc/soc-generic-dmaengine-pcm.c | 29 +++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c
index 467426d2b5e4..7ed698314573 100644
--- a/sound/soc/soc-generic-dmaengine-pcm.c
+++ b/sound/soc/soc-generic-dmaengine-pcm.c
@@ -3,6 +3,7 @@
// Copyright (C) 2013, Analog Devices Inc.
// Author: Lars-Peter Clausen <lars@metafoo.de>
+#include <linux/acpi.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/dmaengine.h>
@@ -395,6 +396,28 @@ static int dmaengine_pcm_request_chan_of(struct dmaengine_pcm *pcm,
*/
if (PTR_ERR(chan) == -EPROBE_DEFER)
return -EPROBE_DEFER;
+
+ bool has_fw_node = dev->of_node || is_acpi_device_node(dev->fwnode);
+ bool has_legacy_config = config->chan_names[i];
+ bool name_exists_in_fw = false;
+
+ if (has_fw_node)
+ name_exists_in_fw = device_property_match_string(dev,
+ "dma-names",
+ name) >= 0;
+
+ if (has_fw_node && name_exists_in_fw)
+ dev_warn(dev, "DTS/ACPI DMA channel '%s' request failed (%ld)\n",
+ name, PTR_ERR(chan));
+
+ if (has_fw_node && !name_exists_in_fw && has_legacy_config)
+ dev_warn(dev, "DTS/ACPI name '%s' not found, legacy failed (%ld)\n",
+ name, PTR_ERR(chan));
+
+ if (!has_fw_node && has_legacy_config)
+ dev_warn(dev, "Legacy DMA channel '%s' request failed (%ld)\n",
+ name, PTR_ERR(chan));
+
pcm->chan[i] = NULL;
} else {
pcm->chan[i] = chan;
@@ -406,6 +429,12 @@ static int dmaengine_pcm_request_chan_of(struct dmaengine_pcm *pcm,
if (pcm->flags & SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX)
pcm->chan[1] = pcm->chan[0];
+ if (!pcm->chan[0] &&
+ !pcm->chan[1]) {
+ dev_err(dev, "no DMA channel found for either playback or capture\n");
+ return -ENODEV;
+ }
+
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-20 5:26 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-20 5:26 [PATCH v2] ASoC: soc-generic-dmaengine: Handle DMA channel request failures correctly phucduc.bui
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.