Skip to contentSkip to conversation

dmaengine: mv_xor: use devm_platform_ioremap_resource()

PATCH In review Rosen Penev 2 participants 2 messages Jul 14 – Sep 24 dmaengine

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 dmaengine: mv_xor: use devm_platform_ioremap_resource()

Replace the two open-coded platform_get_resource() plus devm_ioremap() sequences with devm_platform_ioremap_resource() for the low and high XOR register windows. This folds the resource lookup and mapping into a single call and returns an ERR_PTR on failure, checked with IS_ERR() and propagated via PTR_ERR().

devm_platform_ioremap_resource() reserves the region via devm_request_mem_region(), which requires non-overlapping reg ranges. All XOR nodes in the Marvell DTS describe two distinct 0x100 register windows that do not overlap each other, and sibling XOR nodes interleave without overlapping, so the newly-reserving mapping introduces no region conflict.

Built for ARM (defconfig + CONFIG_MV_XOR) with LLVM=1; drivers/dma/mv_xor.o compiles cleanly.

Assisted-by opencode:hy3-free
---
 drivers/dma/mv_xor.c | 23 ++++++-----------------
 1 file changed, 6 insertions(+), 17 deletions(-)
drivers/dma/mv_xor.c +6 -17
index 25ed61f1b089..fe2e6b9ec185 100644
@@ -1309,7 +1309,6 @@ static int mv_xor_probe(struct platform_device *pdev)
 	const struct mbus_dram_target_info *dram;
 	struct mv_xor_device *xordev;
 	struct mv_xor_platform_data *pdata = dev_get_platdata(&pdev->dev);
-	struct resource *res;
 	unsigned int max_engines, max_channels;
 	int i, ret;
 
@@ -1319,23 +1318,13 @@ static int mv_xor_probe(struct platform_device *pdev)
 	if (!xordev)
 		return -ENOMEM;
 
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (!res)
-		return -ENODEV;
+	xordev->xor_base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(xordev->xor_base))
+		return PTR_ERR(xordev->xor_base);
 
-	xordev->xor_base = devm_ioremap(&pdev->dev, res->start,
-					resource_size(res));
-	if (!xordev->xor_base)
-		return -EBUSY;
-
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-	if (!res)
-		return -ENODEV;
-
-	xordev->xor_high_base = devm_ioremap(&pdev->dev, res->start,
-					     resource_size(res));
-	if (!xordev->xor_high_base)
-		return -EBUSY;
+	xordev->xor_high_base = devm_platform_ioremap_resource(pdev, 1);
+	if (IS_ERR(xordev->xor_high_base))
+		return PTR_ERR(xordev->xor_high_base);
 
 	platform_set_drvdata(pdev, xordev);
 
Signature · 1 line
2.55.0
Reviewed-by on v1 1/1
#1 lore raw
Quoted 13 lines · Rosen Penev

Replace the two open-coded platform_get_resource() plus devm_ioremap() sequences with devm_platform_ioremap_resource() for the low and high XOR register windows. This folds the resource lookup and mapping into a single call and returns an ERR_PTR on failure, checked with IS_ERR() and propagated via PTR_ERR().

devm_platform_ioremap_resource() reserves the region via devm_request_mem_region(), which requires non-overlapping reg ranges. All XOR nodes in the Marvell DTS describe two distinct 0x100 register windows that do not overlap each other, and sibling XOR nodes interleave without overlapping, so the newly-reserving mapping introduces no region conflict.

Quoted 2 lines

Built for ARM (defconfig + CONFIG_MV_XOR) with LLVM=1; drivers/dma/mv_xor.o compiles cleanly.

Nit: suppose pass build is neccesary steps before post patch. So needn't mention it commit message.

Quoted 52 lines
Assisted-by opencode:hy3-free
---
 drivers/dma/mv_xor.c | 23 ++++++-----------------
 1 file changed, 6 insertions(+), 17 deletions(-)
drivers/dma/mv_xor.c +6 -18
index 25ed61f1b089..fe2e6b9ec185 100644
@@ -1309,7 +1309,6 @@ static int mv_xor_probe(struct platform_device *pdev)
 	const struct mbus_dram_target_info *dram;
 	struct mv_xor_device *xordev;
 	struct mv_xor_platform_data *pdata = dev_get_platdata(&pdev->dev);
-	struct resource *res;
 	unsigned int max_engines, max_channels;
 	int i, ret;
 
@@ -1319,23 +1318,13 @@ static int mv_xor_probe(struct platform_device *pdev)
 	if (!xordev)
 		return -ENOMEM;
 
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (!res)
-		return -ENODEV;
+	xordev->xor_base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(xordev->xor_base))
+		return PTR_ERR(xordev->xor_base);
 
-	xordev->xor_base = devm_ioremap(&pdev->dev, res->start,
-					resource_size(res));
-	if (!xordev->xor_base)
-		return -EBUSY;
-
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-	if (!res)
-		return -ENODEV;
-
-	xordev->xor_high_base = devm_ioremap(&pdev->dev, res->start,
-					     resource_size(res));
-	if (!xordev->xor_high_base)
-		return -EBUSY;
+	xordev->xor_high_base = devm_platform_ioremap_resource(pdev, 1);
+	if (IS_ERR(xordev->xor_high_base))
+		return PTR_ERR(xordev->xor_high_base);
 
 	platform_set_drvdata(pdev, xordev);
 
--

2.55.0