dmaengine.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt()
  2025-06-11 16:16 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
@ 2025-06-11 16:16 ` Nuno Sá via B4 Relay
  0 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-06-11 16:16 UTC (permalink / raw)
  To: dmaengine; +Cc: Paul Cercueil, Lars-Peter Clausen, Vinod Koul

From: Nuno Sá <nuno.sa@analog.com>

Simplify axi_dmac_parse_dt() by using the cleanup device_node class for
automatically releasing the of_node reference when going out of scope.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 25717a6ea9848b6c591a3ab6adb27c6f21f002b9..035fc703506977ad59fd0b6ee8a8e5858d2c120e 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
@@ -927,22 +928,18 @@ static int axi_dmac_parse_chan_dt(struct device_node *of_chan,
 
 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
 {
-	struct device_node *of_channels, *of_chan;
 	int ret;
 
-	of_channels = of_get_child_by_name(dev->of_node, "adi,channels");
+	struct device_node *of_channels __free(device_node) = of_get_child_by_name(dev->of_node,
+										   "adi,channels");
 	if (of_channels == NULL)
 		return -ENODEV;
 
-	for_each_child_of_node(of_channels, of_chan) {
+	for_each_child_of_node_scoped(of_channels, of_chan) {
 		ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
-		if (ret) {
-			of_node_put(of_chan);
-			of_node_put(of_channels);
+		if (ret)
 			return -EINVAL;
-		}
 	}
-	of_node_put(of_channels);
 
 	return 0;
 }

-- 
2.49.0



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

* [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt()
  2025-06-27 15:00 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
@ 2025-06-27 15:00 ` Nuno Sá via B4 Relay
  0 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-06-27 15:00 UTC (permalink / raw)
  To: dmaengine; +Cc: Paul Cercueil, Lars-Peter Clausen, Vinod Koul

From: Nuno Sá <nuno.sa@analog.com>

Simplify axi_dmac_parse_dt() by using the cleanup device_node class for
automatically releasing the of_node reference when going out of scope.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 25717a6ea9848b6c591a3ab6adb27c6f21f002b9..035fc703506977ad59fd0b6ee8a8e5858d2c120e 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
@@ -927,22 +928,18 @@ static int axi_dmac_parse_chan_dt(struct device_node *of_chan,
 
 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
 {
-	struct device_node *of_channels, *of_chan;
 	int ret;
 
-	of_channels = of_get_child_by_name(dev->of_node, "adi,channels");
+	struct device_node *of_channels __free(device_node) = of_get_child_by_name(dev->of_node,
+										   "adi,channels");
 	if (of_channels == NULL)
 		return -ENODEV;
 
-	for_each_child_of_node(of_channels, of_chan) {
+	for_each_child_of_node_scoped(of_channels, of_chan) {
 		ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
-		if (ret) {
-			of_node_put(of_chan);
-			of_node_put(of_channels);
+		if (ret)
 			return -EINVAL;
-		}
 	}
-	of_node_put(of_channels);
 
 	return 0;
 }

-- 
2.49.0



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

* [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt()
  2025-07-14 15:39 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
@ 2025-07-14 15:39 ` Nuno Sá via B4 Relay
  0 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-07-14 15:39 UTC (permalink / raw)
  To: dmaengine; +Cc: Paul Cercueil, Lars-Peter Clausen, Vinod Koul

From: Nuno Sá <nuno.sa@analog.com>

Simplify axi_dmac_parse_dt() by using the cleanup device_node class for
automatically releasing the of_node reference when going out of scope.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 25717a6ea9848b6c591a3ab6adb27c6f21f002b9..035fc703506977ad59fd0b6ee8a8e5858d2c120e 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
@@ -927,22 +928,18 @@ static int axi_dmac_parse_chan_dt(struct device_node *of_chan,
 
 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
 {
-	struct device_node *of_channels, *of_chan;
 	int ret;
 
-	of_channels = of_get_child_by_name(dev->of_node, "adi,channels");
+	struct device_node *of_channels __free(device_node) = of_get_child_by_name(dev->of_node,
+										   "adi,channels");
 	if (of_channels == NULL)
 		return -ENODEV;
 
-	for_each_child_of_node(of_channels, of_chan) {
+	for_each_child_of_node_scoped(of_channels, of_chan) {
 		ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
-		if (ret) {
-			of_node_put(of_chan);
-			of_node_put(of_channels);
+		if (ret)
 			return -EINVAL;
-		}
 	}
-	of_node_put(of_channels);
 
 	return 0;
 }

-- 
2.50.1



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

* [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt()
  2025-08-11 15:56 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
@ 2025-08-11 15:56 ` Nuno Sá via B4 Relay
  0 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-08-11 15:56 UTC (permalink / raw)
  To: dmaengine; +Cc: Paul Cercueil, Lars-Peter Clausen, Vinod Koul

From: Nuno Sá <nuno.sa@analog.com>

Simplify axi_dmac_parse_dt() by using the cleanup device_node class for
automatically releasing the of_node reference when going out of scope.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 25717a6ea9848b6c591a3ab6adb27c6f21f002b9..035fc703506977ad59fd0b6ee8a8e5858d2c120e 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
@@ -927,22 +928,18 @@ static int axi_dmac_parse_chan_dt(struct device_node *of_chan,
 
 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
 {
-	struct device_node *of_channels, *of_chan;
 	int ret;
 
-	of_channels = of_get_child_by_name(dev->of_node, "adi,channels");
+	struct device_node *of_channels __free(device_node) = of_get_child_by_name(dev->of_node,
+										   "adi,channels");
 	if (of_channels == NULL)
 		return -ENODEV;
 
-	for_each_child_of_node(of_channels, of_chan) {
+	for_each_child_of_node_scoped(of_channels, of_chan) {
 		ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
-		if (ret) {
-			of_node_put(of_chan);
-			of_node_put(of_channels);
+		if (ret)
 			return -EINVAL;
-		}
 	}
-	of_node_put(of_channels);
 
 	return 0;
 }

-- 
2.50.1



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

* [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements
@ 2025-09-23  8:23 Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 1/4] dma: dma-axi-dmac: fix SW cyclic transfers Nuno Sá via B4 Relay
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-09-23  8:23 UTC (permalink / raw)
  To: dmaengine; +Cc: Vinod Koul, Lars-Peter Clausen, Paul Cercueil

This series adds some fixes to the DMA core with respect with cyclic
transfer and HW scatter gather.

It also adds some improvements. Most notably for allowing bigger that
32bits DMA masks so we do not have to rely on bounce buffers from
swiotlb.

---
Nuno Sá (4):
      dma: dma-axi-dmac: fix SW cyclic transfers
      dma: dma-axi-dmac: fix HW scatter-gather not looking at the queue
      dma: dma-axi-dmac: support bigger than 32bits addresses
      dma: dma-axi-dmac: simplify axi_dmac_parse_dt()

 drivers/dma/dma-axi-dmac.c | 48 +++++++++++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 15 deletions(-)
---
base-commit: cc0bacac6de7763a038550cf43cb94634d8be9cd
change-id: 20250922-b4-dev-axi-dmac-fixes-bbf62fd5ee9c
--

Thanks!
- Nuno Sá



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

* [PATCH RESEND 1/4] dma: dma-axi-dmac: fix SW cyclic transfers
  2025-09-23  8:23 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
@ 2025-09-23  8:23 ` Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 2/4] dma: dma-axi-dmac: fix HW scatter-gather not looking at the queue Nuno Sá via B4 Relay
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-09-23  8:23 UTC (permalink / raw)
  To: dmaengine; +Cc: Vinod Koul, Lars-Peter Clausen, Paul Cercueil

From: Nuno Sá <nuno.sa@analog.com>

If 'hw_cyclic' is false we should still be able to do cyclic transfers in
"software". That was not working for the case where 'desc->num_sgs' is 1
because 'chan->next_desc' is never set with the current desc which means
that the cyclic transfer only runs once and in the next SOT interrupt we
do nothing since vchan_next_desc() will return NULL.

Fix it by setting 'chan->next_desc' as soon as we get a new desc via
vchan_next_desc().

Fixes: 0e3b67b348b8 ("dmaengine: Add support for the Analog Devices AXI-DMAC DMA controller")
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 5b06b0dc67ee12017c165bf815fb7c0e1bf5abd8..e22639822045f237ebcd1fa012a75bbe7dc536c5 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -247,6 +247,7 @@ static void axi_dmac_start_transfer(struct axi_dmac_chan *chan)
 			return;
 		list_move_tail(&vdesc->node, &chan->active_descs);
 		desc = to_axi_dmac_desc(vdesc);
+		chan->next_desc = desc;
 	}
 	sg = &desc->sg[desc->num_submitted];
 
@@ -265,8 +266,6 @@ static void axi_dmac_start_transfer(struct axi_dmac_chan *chan)
 		else
 			chan->next_desc = NULL;
 		flags |= AXI_DMAC_FLAG_LAST;
-	} else {
-		chan->next_desc = desc;
 	}
 
 	sg->hw->id = axi_dmac_read(dmac, AXI_DMAC_REG_TRANSFER_ID);

-- 
2.51.0



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

* [PATCH RESEND 2/4] dma: dma-axi-dmac: fix HW scatter-gather not looking at the queue
  2025-09-23  8:23 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 1/4] dma: dma-axi-dmac: fix SW cyclic transfers Nuno Sá via B4 Relay
@ 2025-09-23  8:23 ` Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 3/4] dma: dma-axi-dmac: support bigger than 32bits addresses Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
  3 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-09-23  8:23 UTC (permalink / raw)
  To: dmaengine; +Cc: Vinod Koul, Lars-Peter Clausen, Paul Cercueil

From: Nuno Sá <nuno.sa@analog.com>

For HW scatter gather transfers we still need to look for the queue. The
HW is capable of queueing 3 concurrent transfers and if we try more than
that we'll get the submit queue full and should return. Otherwise, if we
go ahead and program the new transfer, we end up discarding it.

Fixes: e97dc7435972 ("dmaengine: axi-dmac: Add support for scatter-gather transfers")
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index e22639822045f237ebcd1fa012a75bbe7dc536c5..0f25f6d8ae71fa73fb24c58b3e2ecfea452cd158 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -233,11 +233,9 @@ static void axi_dmac_start_transfer(struct axi_dmac_chan *chan)
 	unsigned int flags = 0;
 	unsigned int val;
 
-	if (!chan->hw_sg) {
-		val = axi_dmac_read(dmac, AXI_DMAC_REG_START_TRANSFER);
-		if (val) /* Queue is full, wait for the next SOT IRQ */
-			return;
-	}
+	val = axi_dmac_read(dmac, AXI_DMAC_REG_START_TRANSFER);
+	if (val) /* Queue is full, wait for the next SOT IRQ */
+		return;
 
 	desc = chan->next_desc;
 

-- 
2.51.0



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

* [PATCH RESEND 3/4] dma: dma-axi-dmac: support bigger than 32bits addresses
  2025-09-23  8:23 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 1/4] dma: dma-axi-dmac: fix SW cyclic transfers Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 2/4] dma: dma-axi-dmac: fix HW scatter-gather not looking at the queue Nuno Sá via B4 Relay
@ 2025-09-23  8:23 ` Nuno Sá via B4 Relay
  2025-09-23  8:23 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
  3 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-09-23  8:23 UTC (permalink / raw)
  To: dmaengine; +Cc: Vinod Koul, Lars-Peter Clausen, Paul Cercueil

From: Nuno Sá <nuno.sa@analog.com>

In some supported platforms as ARCH_ZYNQMP, part of the memory is mapped
above 32bit addresses and since the DMA mask, by default, is set to 32bits,
we would need to rely on swiotlb (which incurs a performance penalty)
for the DMA mappings. Thus, we can write either the SRC or DEST high
addresses with 1's and read them back. The last bit set on the return
value will reflect the IP address bus width and so we can update the
device DMA mask accordingly.

While at it, support bigger that 32 bits transfers in IP without HW
scatter gather support.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 0f25f6d8ae71fa73fb24c58b3e2ecfea452cd158..15c569449a28493bd00e9b320ed83aa2a13144e2 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -69,7 +69,9 @@
 #define AXI_DMAC_REG_START_TRANSFER	0x408
 #define AXI_DMAC_REG_FLAGS		0x40c
 #define AXI_DMAC_REG_DEST_ADDRESS	0x410
+#define AXI_DMAC_REG_DEST_ADDRESS_HIGH	0x490
 #define AXI_DMAC_REG_SRC_ADDRESS	0x414
+#define AXI_DMAC_REG_SRC_ADDRESS_HIGH	0x494
 #define AXI_DMAC_REG_X_LENGTH		0x418
 #define AXI_DMAC_REG_Y_LENGTH		0x41c
 #define AXI_DMAC_REG_DEST_STRIDE	0x420
@@ -271,11 +273,14 @@ static void axi_dmac_start_transfer(struct axi_dmac_chan *chan)
 	if (!chan->hw_sg) {
 		if (axi_dmac_dest_is_mem(chan)) {
 			axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, sg->hw->dest_addr);
+			axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS_HIGH,
+				       sg->hw->dest_addr >> 32);
 			axi_dmac_write(dmac, AXI_DMAC_REG_DEST_STRIDE, sg->hw->dst_stride);
 		}
 
 		if (axi_dmac_src_is_mem(chan)) {
 			axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, sg->hw->src_addr);
+			axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS_HIGH, sg->hw->src_addr >> 32);
 			axi_dmac_write(dmac, AXI_DMAC_REG_SRC_STRIDE, sg->hw->src_stride);
 		}
 	}
@@ -990,6 +995,9 @@ static int axi_dmac_read_chan_config(struct device *dev, struct axi_dmac *dmac)
 static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version)
 {
 	struct axi_dmac_chan *chan = &dmac->chan;
+	struct device *dev = dmac->dma_dev.dev;
+	u32 mask;
+	int ret;
 
 	axi_dmac_write(dmac, AXI_DMAC_REG_FLAGS, AXI_DMAC_FLAG_CYCLIC);
 	if (axi_dmac_read(dmac, AXI_DMAC_REG_FLAGS) == AXI_DMAC_FLAG_CYCLIC)
@@ -1024,6 +1032,22 @@ static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version)
 		return -ENODEV;
 	}
 
+	if (axi_dmac_dest_is_mem(chan)) {
+		axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS_HIGH, 0xffffffff);
+		mask = axi_dmac_read(dmac, AXI_DMAC_REG_DEST_ADDRESS_HIGH);
+	} else {
+		axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS_HIGH, 0xffffffff);
+		mask = axi_dmac_read(dmac, AXI_DMAC_REG_SRC_ADDRESS_HIGH);
+	}
+
+	mask = 32 + fls(mask);
+
+	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(mask));
+	if (ret) {
+		dev_err(dev, "DMA mask set error %d\n", ret);
+		return ret;
+	}
+
 	if (version >= ADI_AXI_PCORE_VER(4, 2, 'a'))
 		chan->hw_partial_xfer = true;
 

-- 
2.51.0



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

* [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt()
  2025-09-23  8:23 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
                   ` (2 preceding siblings ...)
  2025-09-23  8:23 ` [PATCH RESEND 3/4] dma: dma-axi-dmac: support bigger than 32bits addresses Nuno Sá via B4 Relay
@ 2025-09-23  8:23 ` Nuno Sá via B4 Relay
  3 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-09-23  8:23 UTC (permalink / raw)
  To: dmaengine; +Cc: Vinod Koul, Lars-Peter Clausen, Paul Cercueil

From: Nuno Sá <nuno.sa@analog.com>

Simplify axi_dmac_parse_dt() by using the cleanup device_node class for
automatically releasing the of_node reference when going out of scope.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 15c569449a28493bd00e9b320ed83aa2a13144e2..045e9b9a90df562073c078835584a23f26d47350 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -8,6 +8,7 @@
 
 #include <linux/adi-axi-common.h>
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
@@ -927,22 +928,18 @@ static int axi_dmac_parse_chan_dt(struct device_node *of_chan,
 
 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
 {
-	struct device_node *of_channels, *of_chan;
 	int ret;
 
-	of_channels = of_get_child_by_name(dev->of_node, "adi,channels");
+	struct device_node *of_channels __free(device_node) = of_get_child_by_name(dev->of_node,
+										   "adi,channels");
 	if (of_channels == NULL)
 		return -ENODEV;
 
-	for_each_child_of_node(of_channels, of_chan) {
+	for_each_child_of_node_scoped(of_channels, of_chan) {
 		ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
-		if (ret) {
-			of_node_put(of_chan);
-			of_node_put(of_channels);
+		if (ret)
 			return -EINVAL;
-		}
 	}
-	of_node_put(of_channels);
 
 	return 0;
 }

-- 
2.51.0



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

* [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt()
  2025-11-04 16:22 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
@ 2025-11-04 16:22 ` Nuno Sá via B4 Relay
  0 siblings, 0 replies; 10+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 16:22 UTC (permalink / raw)
  To: Vinod Koul, Lars-Peter Clausen, Paul Cercueil
  Cc: Michael Hennerich, dmaengine, linux-kernel

From: Nuno Sá <nuno.sa@analog.com>

Simplify axi_dmac_parse_dt() by using the cleanup device_node class for
automatically releasing the of_node reference when going out of scope.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 15c569449a28..045e9b9a90df 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -8,6 +8,7 @@
 
 #include <linux/adi-axi-common.h>
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
@@ -927,22 +928,18 @@ static int axi_dmac_parse_chan_dt(struct device_node *of_chan,
 
 static int axi_dmac_parse_dt(struct device *dev, struct axi_dmac *dmac)
 {
-	struct device_node *of_channels, *of_chan;
 	int ret;
 
-	of_channels = of_get_child_by_name(dev->of_node, "adi,channels");
+	struct device_node *of_channels __free(device_node) = of_get_child_by_name(dev->of_node,
+										   "adi,channels");
 	if (of_channels == NULL)
 		return -ENODEV;
 
-	for_each_child_of_node(of_channels, of_chan) {
+	for_each_child_of_node_scoped(of_channels, of_chan) {
 		ret = axi_dmac_parse_chan_dt(of_chan, &dmac->chan);
-		if (ret) {
-			of_node_put(of_chan);
-			of_node_put(of_channels);
+		if (ret)
 			return -EINVAL;
-		}
 	}
-	of_node_put(of_channels);
 
 	return 0;
 }

-- 
2.51.0



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

end of thread, other threads:[~2025-11-04 16:21 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-23  8:23 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
2025-09-23  8:23 ` [PATCH RESEND 1/4] dma: dma-axi-dmac: fix SW cyclic transfers Nuno Sá via B4 Relay
2025-09-23  8:23 ` [PATCH RESEND 2/4] dma: dma-axi-dmac: fix HW scatter-gather not looking at the queue Nuno Sá via B4 Relay
2025-09-23  8:23 ` [PATCH RESEND 3/4] dma: dma-axi-dmac: support bigger than 32bits addresses Nuno Sá via B4 Relay
2025-09-23  8:23 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
  -- strict thread matches above, loose matches on Subject: below --
2025-11-04 16:22 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
2025-11-04 16:22 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
2025-08-11 15:56 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
2025-08-11 15:56 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
2025-07-14 15:39 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
2025-07-14 15:39 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
2025-06-27 15:00 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
2025-06-27 15:00 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay
2025-06-11 16:16 [PATCH RESEND 0/4] dma: dma-axi-dmac: fixes and improvements Nuno Sá via B4 Relay
2025-06-11 16:16 ` [PATCH RESEND 4/4] dma: dma-axi-dmac: simplify axi_dmac_parse_dt() Nuno Sá via B4 Relay

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).