* [PATCH v3 01/13] dmaengine: of_dma: Add devm_of_dma_controller_register()
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 02/13] dmaengine: mxs-dma: Fix missing return value from of_dma_controller_register() Frank Li
` (12 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Add a managed API, devm_of_dma_controller_register(), to simplify DMA
engine controller registration by automatically handling resource
cleanup.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
change in v2
- fixed missing int at stub funciton.
---
include/linux/of_dma.h | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/include/linux/of_dma.h b/include/linux/of_dma.h
index fd706cdf255c61c82ce30ef9a2c44930bef34bc8..16b08234d03b33476ea3f8cc6654f6fd72e60df3 100644
--- a/include/linux/of_dma.h
+++ b/include/linux/of_dma.h
@@ -38,6 +38,26 @@ extern int of_dma_controller_register(struct device_node *np,
void *data);
extern void of_dma_controller_free(struct device_node *np);
+static void __of_dma_controller_free(void *np)
+{
+ of_dma_controller_free(np);
+}
+
+static inline int
+devm_of_dma_controller_register(struct device *dev, struct device_node *np,
+ struct dma_chan *(*of_dma_xlate)
+ (struct of_phandle_args *, struct of_dma *),
+ void *data)
+{
+ int ret;
+
+ ret = of_dma_controller_register(np, of_dma_xlate, data);
+ if (ret)
+ return ret;
+
+ return devm_add_action_or_reset(dev, __of_dma_controller_free, np);
+}
+
extern int of_dma_router_register(struct device_node *np,
void *(*of_dma_route_allocate)
(struct of_phandle_args *, struct of_dma *),
@@ -64,6 +84,15 @@ static inline void of_dma_controller_free(struct device_node *np)
{
}
+static inline int
+devm_of_dma_controller_register(struct device *dev, struct device_node *np,
+ struct dma_chan *(*of_dma_xlate)
+ (struct of_phandle_args *, struct of_dma *),
+ void *data)
+{
+ return -ENODEV;
+}
+
static inline int of_dma_router_register(struct device_node *np,
void *(*of_dma_route_allocate)
(struct of_phandle_args *, struct of_dma *),
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 02/13] dmaengine: mxs-dma: Fix missing return value from of_dma_controller_register()
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
2026-02-25 21:41 ` [PATCH v3 01/13] dmaengine: of_dma: Add devm_of_dma_controller_register() Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 03/13] dmaengine: mxs-dma: Use local dev variable in probe() Frank Li
` (11 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Propagate the return value of of_dma_controller_register() in probe()
instead of ignoring it.
Fixes: a580b8c5429a6 ("dmaengine: mxs-dma: add dma support for i.MX23/28")
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/mxs-dma.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index cfb9962417ef68e976ae03c3c6f3054dc89bd1e6..53f572b6b6fc62c6cb2496f0da281887f8fc3280 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -824,6 +824,7 @@ static int mxs_dma_probe(struct platform_device *pdev)
if (ret) {
dev_err(mxs_dma->dma_device.dev,
"failed to register controller\n");
+ return ret;
}
dev_info(mxs_dma->dma_device.dev, "initialized\n");
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 03/13] dmaengine: mxs-dma: Use local dev variable in probe()
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
2026-02-25 21:41 ` [PATCH v3 01/13] dmaengine: of_dma: Add devm_of_dma_controller_register() Frank Li
2026-02-25 21:41 ` [PATCH v3 02/13] dmaengine: mxs-dma: Fix missing return value from of_dma_controller_register() Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 04/13] dmaengine: mxs-dma: Use dev_err_probe() to simplify code Frank Li
` (10 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Introduce a local dev variable in probe() to avoid repeated use of
&pdev->dev throughout the function.
No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/mxs-dma.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index 53f572b6b6fc62c6cb2496f0da281887f8fc3280..5340f831ae9dbf5423564e070735f5289c8d49de 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -744,20 +744,21 @@ static int mxs_dma_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
const struct mxs_dma_type *dma_type;
+ struct device *dev = &pdev->dev;
struct mxs_dma_engine *mxs_dma;
int ret, i;
- mxs_dma = devm_kzalloc(&pdev->dev, sizeof(*mxs_dma), GFP_KERNEL);
+ mxs_dma = devm_kzalloc(dev, sizeof(*mxs_dma), GFP_KERNEL);
if (!mxs_dma)
return -ENOMEM;
ret = of_property_read_u32(np, "dma-channels", &mxs_dma->nr_channels);
if (ret) {
- dev_err(&pdev->dev, "failed to read dma-channels\n");
+ dev_err(dev, "failed to read dma-channels\n");
return ret;
}
- dma_type = (struct mxs_dma_type *)of_device_get_match_data(&pdev->dev);
+ dma_type = (struct mxs_dma_type *)of_device_get_match_data(dev);
mxs_dma->type = dma_type->type;
mxs_dma->dev_id = dma_type->id;
@@ -765,7 +766,7 @@ static int mxs_dma_probe(struct platform_device *pdev)
if (IS_ERR(mxs_dma->base))
return PTR_ERR(mxs_dma->base);
- mxs_dma->clk = devm_clk_get(&pdev->dev, NULL);
+ mxs_dma->clk = devm_clk_get(dev, NULL);
if (IS_ERR(mxs_dma->clk))
return PTR_ERR(mxs_dma->clk);
@@ -795,10 +796,10 @@ static int mxs_dma_probe(struct platform_device *pdev)
return ret;
mxs_dma->pdev = pdev;
- mxs_dma->dma_device.dev = &pdev->dev;
+ mxs_dma->dma_device.dev = dev;
/* mxs_dma gets 65535 bytes maximum sg size */
- dma_set_max_seg_size(mxs_dma->dma_device.dev, MAX_XFER_BYTES);
+ dma_set_max_seg_size(dev, MAX_XFER_BYTES);
mxs_dma->dma_device.device_alloc_chan_resources = mxs_dma_alloc_chan_resources;
mxs_dma->dma_device.device_free_chan_resources = mxs_dma_free_chan_resources;
@@ -816,18 +817,18 @@ static int mxs_dma_probe(struct platform_device *pdev)
ret = dmaenginem_async_device_register(&mxs_dma->dma_device);
if (ret) {
- dev_err(mxs_dma->dma_device.dev, "unable to register\n");
+ dev_err(dev, "unable to register\n");
return ret;
}
ret = of_dma_controller_register(np, mxs_dma_xlate, mxs_dma);
if (ret) {
- dev_err(mxs_dma->dma_device.dev,
+ dev_err(dev,
"failed to register controller\n");
return ret;
}
- dev_info(mxs_dma->dma_device.dev, "initialized\n");
+ dev_info(dev, "initialized\n");
return 0;
}
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 04/13] dmaengine: mxs-dma: Use dev_err_probe() to simplify code
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (2 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 03/13] dmaengine: mxs-dma: Use local dev variable in probe() Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 05/13] dmaengine: mxs-dma: Use managed API devm_of_dma_controller_register() Frank Li
` (9 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use dev_err_probe() simplify code. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/mxs-dma.c | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index 5340f831ae9dbf5423564e070735f5289c8d49de..e05bca738d2efe45d385dfb2180dd1c75b00163e 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -753,10 +753,8 @@ static int mxs_dma_probe(struct platform_device *pdev)
return -ENOMEM;
ret = of_property_read_u32(np, "dma-channels", &mxs_dma->nr_channels);
- if (ret) {
- dev_err(dev, "failed to read dma-channels\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to read dma-channels\n");
dma_type = (struct mxs_dma_type *)of_device_get_match_data(dev);
mxs_dma->type = dma_type->type;
@@ -816,17 +814,13 @@ static int mxs_dma_probe(struct platform_device *pdev)
mxs_dma->dma_device.device_issue_pending = mxs_dma_enable_chan;
ret = dmaenginem_async_device_register(&mxs_dma->dma_device);
- if (ret) {
- dev_err(dev, "unable to register\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "unable to register\n");
ret = of_dma_controller_register(np, mxs_dma_xlate, mxs_dma);
- if (ret) {
- dev_err(dev,
- "failed to register controller\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "failed to register controller\n");
dev_info(dev, "initialized\n");
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 05/13] dmaengine: mxs-dma: Use managed API devm_of_dma_controller_register()
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (3 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 04/13] dmaengine: mxs-dma: Use dev_err_probe() to simplify code Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 06/13] dmaengine: mxs-dma: Add module license and description Frank Li
` (8 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use managed API devm_of_dma_controller_register() to prepare support module
remove.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/mxs-dma.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index e05bca738d2efe45d385dfb2180dd1c75b00163e..be35affb91576f43d4ec41179f4f0013eee2d347 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -817,7 +817,7 @@ static int mxs_dma_probe(struct platform_device *pdev)
if (ret)
return dev_err_probe(dev, ret, "unable to register\n");
- ret = of_dma_controller_register(np, mxs_dma_xlate, mxs_dma);
+ ret = devm_of_dma_controller_register(dev, np, mxs_dma_xlate, mxs_dma);
if (ret)
return dev_err_probe(dev, ret,
"failed to register controller\n");
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 06/13] dmaengine: mxs-dma: Add module license and description
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (4 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 05/13] dmaengine: mxs-dma: Use managed API devm_of_dma_controller_register() Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 07/13] dmaengine: mxs-dma: Turn MXS_DMA as tristate Frank Li
` (7 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li, Jindong Yue
From: Jindong Yue <jindong.yue@nxp.com>
Module license string is required for loading it as a module.
Signed-off-by: Jindong Yue <jindong.yue@nxp.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/mxs-dma.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index be35affb91576f43d4ec41179f4f0013eee2d347..7acb3d29dad3074ac842425619f7373fdf0e56b3 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -836,3 +836,6 @@ static struct platform_driver mxs_dma_driver = {
};
builtin_platform_driver(mxs_dma_driver);
+
+MODULE_DESCRIPTION("MXS DMA driver");
+MODULE_LICENSE("GPL");
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 07/13] dmaengine: mxs-dma: Turn MXS_DMA as tristate
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (5 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 06/13] dmaengine: mxs-dma: Add module license and description Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 08/13] dmaengine: imx-sdma: Use devm_clk_get_prepared() to simplify code Frank Li
` (6 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li, Jindong Yue
From: Jindong Yue <jindong.yue@nxp.com>
Use tristate for mxs-dma to support module building.
Signed-off-by: Jindong Yue <jindong.yue@nxp.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 66cda7cc9f7ab92e198d80cc5f0fb6420b937088..abeb086ba1d6b31206be8b18acb6363d73170339 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -505,7 +505,7 @@ config MV_XOR_V2
platforms.
config MXS_DMA
- bool "MXS DMA support"
+ tristate "MXS DMA support"
depends on ARCH_MXS || ARCH_MXC || COMPILE_TEST
select STMP_DEVICE
select DMA_ENGINE
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 08/13] dmaengine: imx-sdma: Use devm_clk_get_prepared() to simplify code
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (6 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 07/13] dmaengine: mxs-dma: Turn MXS_DMA as tristate Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 09/13] dmaengine: imx-sdma: Use managed API " Frank Li
` (5 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use devm_clk_get_prepared() to simplify code. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/imx-sdma.c | 26 +++++---------------------
1 file changed, 5 insertions(+), 21 deletions(-)
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 4c8196d78001201bd354bbdb8057440eae625030..187e8e573fdf437a0d614548f1aa777a0ba3e24d 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -2265,34 +2265,24 @@ static int sdma_probe(struct platform_device *pdev)
if (IS_ERR(sdma->regs))
return PTR_ERR(sdma->regs);
- sdma->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
+ sdma->clk_ipg = devm_clk_get_prepared(&pdev->dev, "ipg");
if (IS_ERR(sdma->clk_ipg))
return PTR_ERR(sdma->clk_ipg);
- sdma->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
+ sdma->clk_ahb = devm_clk_get_prepared(&pdev->dev, "ahb");
if (IS_ERR(sdma->clk_ahb))
return PTR_ERR(sdma->clk_ahb);
- ret = clk_prepare(sdma->clk_ipg);
- if (ret)
- return ret;
-
- ret = clk_prepare(sdma->clk_ahb);
- if (ret)
- goto err_clk;
-
ret = devm_request_irq(&pdev->dev, irq, sdma_int_handler, 0,
dev_name(&pdev->dev), sdma);
if (ret)
- goto err_irq;
+ return ret;
sdma->irq = irq;
sdma->script_addrs = kzalloc_obj(*sdma->script_addrs);
- if (!sdma->script_addrs) {
- ret = -ENOMEM;
- goto err_irq;
- }
+ if (!sdma->script_addrs)
+ return -ENOMEM;
/* initially no scripts available */
saddr_arr = (s32 *)sdma->script_addrs;
@@ -2406,10 +2396,6 @@ static int sdma_probe(struct platform_device *pdev)
dma_async_device_unregister(&sdma->dma_device);
err_init:
kfree(sdma->script_addrs);
-err_irq:
- clk_unprepare(sdma->clk_ahb);
-err_clk:
- clk_unprepare(sdma->clk_ipg);
return ret;
}
@@ -2421,8 +2407,6 @@ static void sdma_remove(struct platform_device *pdev)
devm_free_irq(&pdev->dev, sdma->irq, sdma);
dma_async_device_unregister(&sdma->dma_device);
kfree(sdma->script_addrs);
- clk_unprepare(sdma->clk_ahb);
- clk_unprepare(sdma->clk_ipg);
/* Kill the tasklet */
for (i = 0; i < MAX_DMA_CHANNELS; i++) {
struct sdma_channel *sdmac = &sdma->channel[i];
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 09/13] dmaengine: imx-sdma: Use managed API to simplify code
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (7 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 08/13] dmaengine: imx-sdma: Use devm_clk_get_prepared() to simplify code Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 10/13] dmaengine: imx-sdma: Use dev_err_probe() " Frank Li
` (4 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use managed API devm_kzalloc(), dmaenginem_async_device_register() and
devm_of_dma_controller_register() to simple code.
No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/imx-sdma.c | 21 +++++++--------------
1 file changed, 7 insertions(+), 14 deletions(-)
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 187e8e573fdf437a0d614548f1aa777a0ba3e24d..16b5f60bc748ad20380670da337846fdefb5fc58 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -2323,11 +2323,11 @@ static int sdma_probe(struct platform_device *pdev)
ret = sdma_init(sdma);
if (ret)
- goto err_init;
+ return ret;
ret = sdma_event_remap(sdma);
if (ret)
- goto err_init;
+ return ret;
if (sdma->drvdata->script_addrs)
sdma_add_scripts(sdma, sdma->drvdata->script_addrs);
@@ -2353,17 +2353,18 @@ static int sdma_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, sdma);
- ret = dma_async_device_register(&sdma->dma_device);
+ ret = dmaenginem_async_device_register(&sdma->dma_device);
if (ret) {
dev_err(&pdev->dev, "unable to register\n");
- goto err_init;
+ return ret;
}
if (np) {
- ret = of_dma_controller_register(np, sdma_xlate, sdma);
+ ret = devm_of_dma_controller_register(&pdev->dev, np,
+ sdma_xlate, sdma);
if (ret) {
dev_err(&pdev->dev, "failed to register controller\n");
- goto err_register;
+ return ret;
}
spba_bus = of_find_compatible_node(NULL, NULL, "fsl,spba-bus");
@@ -2391,12 +2392,6 @@ static int sdma_probe(struct platform_device *pdev)
}
return 0;
-
-err_register:
- dma_async_device_unregister(&sdma->dma_device);
-err_init:
- kfree(sdma->script_addrs);
- return ret;
}
static void sdma_remove(struct platform_device *pdev)
@@ -2405,8 +2400,6 @@ static void sdma_remove(struct platform_device *pdev)
int i;
devm_free_irq(&pdev->dev, sdma->irq, sdma);
- dma_async_device_unregister(&sdma->dma_device);
- kfree(sdma->script_addrs);
/* Kill the tasklet */
for (i = 0; i < MAX_DMA_CHANNELS; i++) {
struct sdma_channel *sdmac = &sdma->channel[i];
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 10/13] dmaengine: imx-sdma: Use dev_err_probe() to simplify code
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (8 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 09/13] dmaengine: imx-sdma: Use managed API " Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 11/13] dmaengine: fsl-edma: Use managed API dmaenginem_async_device_register() Frank Li
` (3 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use dev_err_probe() to simplify code. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/imx-sdma.c | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 16b5f60bc748ad20380670da337846fdefb5fc58..3d527883776b40131c5c5190d12ef81c9ece8699 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -2354,18 +2354,15 @@ static int sdma_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, sdma);
ret = dmaenginem_async_device_register(&sdma->dma_device);
- if (ret) {
- dev_err(&pdev->dev, "unable to register\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "unable to register\n");
if (np) {
ret = devm_of_dma_controller_register(&pdev->dev, np,
sdma_xlate, sdma);
- if (ret) {
- dev_err(&pdev->dev, "failed to register controller\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "failed to register controller\n");
spba_bus = of_find_compatible_node(NULL, NULL, "fsl,spba-bus");
ret = of_address_to_resource(spba_bus, 0, &spba_res);
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 11/13] dmaengine: fsl-edma: Use managed API dmaenginem_async_device_register()
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (9 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 10/13] dmaengine: imx-sdma: Use dev_err_probe() " Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 12/13] dmaengine: fsl-edma: Use dev_err_probe() to simplify code Frank Li
` (2 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use managed API dmaenginem_async_device_register() and
devm_of_dma_controller_register() to simple code.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/fsl-edma-main.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c
index dbcdd1e68319005dfab85a6c28b4e3f929f29132..57a185bb4076db1257e761e1c1be523178a5ff04 100644
--- a/drivers/dma/fsl-edma-main.c
+++ b/drivers/dma/fsl-edma-main.c
@@ -882,20 +882,19 @@ static int fsl_edma_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, fsl_edma);
- ret = dma_async_device_register(&fsl_edma->dma_dev);
+ ret = dmaenginem_async_device_register(&fsl_edma->dma_dev);
if (ret) {
dev_err(&pdev->dev,
"Can't register Freescale eDMA engine. (%d)\n", ret);
return ret;
}
- ret = of_dma_controller_register(np,
+ ret = devm_of_dma_controller_register(&pdev->dev, np,
drvdata->dmamuxs ? fsl_edma_xlate : fsl_edma3_xlate,
fsl_edma);
if (ret) {
dev_err(&pdev->dev,
"Can't register Freescale eDMA of_dma. (%d)\n", ret);
- dma_async_device_unregister(&fsl_edma->dma_dev);
return ret;
}
@@ -908,12 +907,9 @@ static int fsl_edma_probe(struct platform_device *pdev)
static void fsl_edma_remove(struct platform_device *pdev)
{
- struct device_node *np = pdev->dev.of_node;
struct fsl_edma_engine *fsl_edma = platform_get_drvdata(pdev);
fsl_edma_irq_exit(pdev, fsl_edma);
- of_dma_controller_free(np);
- dma_async_device_unregister(&fsl_edma->dma_dev);
fsl_edma_cleanup_vchan(&fsl_edma->dma_dev);
}
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 12/13] dmaengine: fsl-edma: Use dev_err_probe() to simplify code
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (10 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 11/13] dmaengine: fsl-edma: Use managed API dmaenginem_async_device_register() Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-02-25 21:41 ` [PATCH v3 13/13] dmaengine: fsl-qdma: " Frank Li
2026-03-09 11:45 ` [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Vinod Koul
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use dev_err_probe() to simplify code.
No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/fsl-edma-main.c | 47 +++++++++++++++++++--------------------------
1 file changed, 20 insertions(+), 27 deletions(-)
diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c
index 57a185bb4076db1257e761e1c1be523178a5ff04..950538cc88830a7f899449fe6dc43efacc9d2e3c 100644
--- a/drivers/dma/fsl-edma-main.c
+++ b/drivers/dma/fsl-edma-main.c
@@ -709,16 +709,14 @@ static int fsl_edma_probe(struct platform_device *pdev)
int ret, i;
drvdata = device_get_match_data(&pdev->dev);
- if (!drvdata) {
- dev_err(&pdev->dev, "unable to find driver data\n");
- return -EINVAL;
- }
+ if (!drvdata)
+ return dev_err_probe(&pdev->dev, -EINVAL,
+ "unable to find driver data\n");
ret = of_property_read_u32(np, "dma-channels", &chans);
- if (ret) {
- dev_err(&pdev->dev, "Can't get dma-channels.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't get dma-channels.\n");
fsl_edma = devm_kzalloc(&pdev->dev, struct_size(fsl_edma, chans, chans),
GFP_KERNEL);
@@ -742,10 +740,10 @@ static int fsl_edma_probe(struct platform_device *pdev)
if (drvdata->flags & FSL_EDMA_DRV_HAS_DMACLK) {
fsl_edma->dmaclk = devm_clk_get_enabled(&pdev->dev, "dma");
- if (IS_ERR(fsl_edma->dmaclk)) {
- dev_err(&pdev->dev, "Missing DMA block clock.\n");
- return PTR_ERR(fsl_edma->dmaclk);
- }
+ if (IS_ERR(fsl_edma->dmaclk))
+ return dev_err_probe(&pdev->dev,
+ PTR_ERR(fsl_edma->dmaclk),
+ "Missing DMA block clock.\n");
}
ret = of_property_read_variable_u32_array(np, "dma-channel-mask", chan_mask, 1, 2);
@@ -769,11 +767,10 @@ static int fsl_edma_probe(struct platform_device *pdev)
sprintf(clkname, "dmamux%d", i);
fsl_edma->muxclk[i] = devm_clk_get_enabled(&pdev->dev, clkname);
- if (IS_ERR(fsl_edma->muxclk[i])) {
- dev_err(&pdev->dev, "Missing DMAMUX block clock.\n");
- /* on error: disable all previously enabled clks */
- return PTR_ERR(fsl_edma->muxclk[i]);
- }
+ if (IS_ERR(fsl_edma->muxclk[i]))
+ return dev_err_probe(&pdev->dev,
+ PTR_ERR(fsl_edma->muxclk[i]),
+ "Missing DMAMUX block clock.\n");
}
fsl_edma->big_endian = of_property_read_bool(np, "big-endian");
@@ -883,20 +880,16 @@ static int fsl_edma_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, fsl_edma);
ret = dmaenginem_async_device_register(&fsl_edma->dma_dev);
- if (ret) {
- dev_err(&pdev->dev,
- "Can't register Freescale eDMA engine. (%d)\n", ret);
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't register Freescale eDMA engine.\n");
ret = devm_of_dma_controller_register(&pdev->dev, np,
drvdata->dmamuxs ? fsl_edma_xlate : fsl_edma3_xlate,
fsl_edma);
- if (ret) {
- dev_err(&pdev->dev,
- "Can't register Freescale eDMA of_dma. (%d)\n", ret);
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't register Freescale eDMA of_dma.\n");
/* enable round robin arbitration */
if (!(drvdata->flags & FSL_EDMA_DRV_SPLIT_REG))
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v3 13/13] dmaengine: fsl-qdma: Use dev_err_probe() to simplify code
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (11 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 12/13] dmaengine: fsl-edma: Use dev_err_probe() to simplify code Frank Li
@ 2026-02-25 21:41 ` Frank Li
2026-03-09 11:45 ` [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Vinod Koul
13 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2026-02-25 21:41 UTC (permalink / raw)
To: Rob Herring, Vinod Koul, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Saravana Kannan
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Frank Li
Use dev_err_probe() to simplify code. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/dma/fsl-qdma.c | 47 +++++++++++++++++++----------------------------
1 file changed, 19 insertions(+), 28 deletions(-)
diff --git a/drivers/dma/fsl-qdma.c b/drivers/dma/fsl-qdma.c
index 0bbff9df362f87ca7cfa09c668ad5996111a424f..df843fad0ece50c148b6a45d2c1c6ddb413d5c24 100644
--- a/drivers/dma/fsl-qdma.c
+++ b/drivers/dma/fsl-qdma.c
@@ -1127,22 +1127,19 @@ static int fsl_qdma_probe(struct platform_device *pdev)
struct device_node *np = pdev->dev.of_node;
ret = of_property_read_u32(np, "dma-channels", &chans);
- if (ret) {
- dev_err(&pdev->dev, "Can't get dma-channels.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't get dma-channels.\n");
ret = of_property_read_u32(np, "block-offset", &blk_off);
- if (ret) {
- dev_err(&pdev->dev, "Can't get block-offset.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't get block-offset.\n");
ret = of_property_read_u32(np, "block-number", &blk_num);
- if (ret) {
- dev_err(&pdev->dev, "Can't get block-number.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't get block-number.\n");
blk_num = min_t(int, blk_num, num_online_cpus());
@@ -1167,10 +1164,8 @@ static int fsl_qdma_probe(struct platform_device *pdev)
return -ENOMEM;
ret = of_property_read_u32(np, "fsl,dma-queues", &queues);
- if (ret) {
- dev_err(&pdev->dev, "Can't get queues.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "Can't get queues.\n");
fsl_qdma->desc_allocated = 0;
fsl_qdma->n_chans = chans;
@@ -1231,28 +1226,24 @@ static int fsl_qdma_probe(struct platform_device *pdev)
fsl_qdma->dma_dev.device_terminate_all = fsl_qdma_terminate_all;
ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(40));
- if (ret) {
- dev_err(&pdev->dev, "dma_set_mask failure.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "dma_set_mask failure.\n");
platform_set_drvdata(pdev, fsl_qdma);
ret = fsl_qdma_reg_init(fsl_qdma);
- if (ret) {
- dev_err(&pdev->dev, "Can't Initialize the qDMA engine.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't Initialize the qDMA engine.\n");
ret = fsl_qdma_irq_init(pdev, fsl_qdma);
if (ret)
return ret;
ret = dma_async_device_register(&fsl_qdma->dma_dev);
- if (ret) {
- dev_err(&pdev->dev, "Can't register NXP Layerscape qDMA engine.\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Can't register NXP Layerscape qDMA engine.\n");
return 0;
}
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement
2026-02-25 21:41 [PATCH v3 00/13] dmaegnine: freescale-dmas: small improvement Frank Li
` (12 preceding siblings ...)
2026-02-25 21:41 ` [PATCH v3 13/13] dmaengine: fsl-qdma: " Frank Li
@ 2026-03-09 11:45 ` Vinod Koul
13 siblings, 0 replies; 15+ messages in thread
From: Vinod Koul @ 2026-03-09 11:45 UTC (permalink / raw)
To: Rob Herring, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Saravana Kannan, Frank Li
Cc: dmaengine, devicetree, linux-kernel, imx, linux-arm-kernel,
Shawn Guo, Jindong Yue
On Wed, 25 Feb 2026 16:41:36 -0500, Frank Li wrote:
> Add managed API devm_of_dma_controller_register().
>
> simple mxs-dma code and add build as module support.
> Use dev_err_probe() simple freescale dmaengines.
>
>
Applied, thanks!
[01/13] dmaengine: of_dma: Add devm_of_dma_controller_register()
commit: 3a005126c9d7f30093627a6f329656c358e16b3a
[02/13] dmaengine: mxs-dma: Fix missing return value from of_dma_controller_register()
commit: ab2bf6d4c0a0152907b18d25c1b118ea5ea779df
[03/13] dmaengine: mxs-dma: Use local dev variable in probe()
commit: 96857a90982c2a461520fadc55dda3b8051e8d96
[04/13] dmaengine: mxs-dma: Use dev_err_probe() to simplify code
commit: 4a5b0a728d665b3b7b08fb5bf6b2f69c995e30ec
[05/13] dmaengine: mxs-dma: Use managed API devm_of_dma_controller_register()
commit: d11544c674b64beb9948724ba27187238c52b079
[06/13] dmaengine: mxs-dma: Add module license and description
commit: e1b712c9352cf74285973462ced8d60ed7a9183c
[07/13] dmaengine: mxs-dma: Turn MXS_DMA as tristate
commit: 67adf1f6643d75e33509900a2cb35db3a31f0410
[08/13] dmaengine: imx-sdma: Use devm_clk_get_prepared() to simplify code
commit: 5daee52d7cc87415367fa0051a80998cccbab920
[09/13] dmaengine: imx-sdma: Use managed API to simplify code
commit: 8982cb214a7f29db7d28058a3b4697f436af34d2
[10/13] dmaengine: imx-sdma: Use dev_err_probe() to simplify code
commit: 917edfa57783352cd491cd5759a04d7b60de1714
[11/13] dmaengine: fsl-edma: Use managed API dmaenginem_async_device_register()
commit: 4035726a6b724ff0f04b4f1429c7b1a935fc2e76
[12/13] dmaengine: fsl-edma: Use dev_err_probe() to simplify code
commit: 804e18f7da6d29cff7ed4e004bcc05658f51d737
[13/13] dmaengine: fsl-qdma: Use dev_err_probe() to simplify code
commit: 2438deea9ff82940ebfce67e232d558199ab8a6e
Best regards,
--
~Vinod
^ permalink raw reply [flat|nested] 15+ messages in thread