All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2 0/4] memory: fsl_ifc: Switch to modern devm and platform IRQ APIs
@ 2026-07-21 20:24 Rosen Penev
  2026-07-21 20:24 ` [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API Rosen Penev
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Rosen Penev @ 2026-07-21 20:24 UTC (permalink / raw)
  To: linux-kernel; +Cc: Krzysztof Kozlowski

Convert the Freescale IFC controller driver from legacy OF-specific
APIs to modern platform-device and devm-based equivalents. This
eliminates manual resource tracking in error paths and remove(),
simplifying the driver and reducing LoC by ~40%.

Patch 1 replaces irq_of_parse_and_map() with platform_get_irq() /
platform_get_irq_optional() and fixes unconditional free_irq() calls
on the optional NAND IRQ.
Patch 2 replaces of_iomap() with devm_platform_ioremap_resource(),
dropping the manual iounmap in remove/error paths and fixing a
missing free_irq on the main IRQ request_irq failure.
Patch 3 switches from request_irq to devm_request_irq, removing the
error-path labels entirely and reducing remove() to just
of_platform_depopulate.
Patch 4 removes of_platform_default_populate.

Rosen Penev (4):
  memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to
    platform IRQ API
  memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error
    paths
  memory: fsl_ifc: Use devm_request_irq and simplify remove
  memory: fsl_ifc: drop simple-bus emulation

 drivers/memory/fsl_ifc.c | 101 +++++++++++++--------------------------
 1 file changed, 32 insertions(+), 69 deletions(-)

-- 
2.55.0


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

* [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API
  2026-07-21 20:24 [PATCHv2 0/4] memory: fsl_ifc: Switch to modern devm and platform IRQ APIs Rosen Penev
@ 2026-07-21 20:24 ` Rosen Penev
  2026-09-01 15:29   ` Krzysztof Kozlowski
  2026-07-21 20:24 ` [PATCHv2 2/4] memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error paths Rosen Penev
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: Rosen Penev @ 2026-07-21 20:24 UTC (permalink / raw)
  To: linux-kernel; +Cc: Krzysztof Kozlowski

Switch from irq_of_parse_and_map() to platform_get_irq() for the main
controller IRQ, and use platform_get_irq_optional() for the NAND IRQ
which is optional. Guard free_irq() calls on the NAND IRQ with a
nand_irq > 0 check to avoid passing invalid IRQ numbers on platforms
without a dedicated NAND interrupt line.

Get IRQs first as they can return a probe defferal error. Helps avoid
doing actual work in such a case.

Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/memory/fsl_ifc.c | 43 ++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index e89e0c6cc4bc..dce94d8b05b9 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -89,12 +89,10 @@ static void fsl_ifc_ctrl_remove(struct platform_device *dev)
 	struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(&dev->dev);
 
 	of_platform_depopulate(&dev->dev);
-	free_irq(ctrl->nand_irq, ctrl);
+	if (ctrl->nand_irq > 0)
+		free_irq(ctrl->nand_irq, ctrl);
 	free_irq(ctrl->irq, ctrl);
 
-	irq_dispose_mapping(ctrl->nand_irq);
-	irq_dispose_mapping(ctrl->irq);
-
 	iounmap(ctrl->gregs);
 
 	dev_set_drvdata(&dev->dev, NULL);
@@ -204,9 +202,21 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	int ret = 0;
 	int version, banks;
 	void __iomem *addr;
+	int nand_irq;
+	int irq;
 
 	dev_info(&dev->dev, "Freescale Integrated Flash Controller\n");
 
+	/* get the Controller level irq */
+	irq = platform_get_irq(dev, 0);
+	if (irq < 0)
+		return irq;
+
+	/* get the nand machine irq */
+	nand_irq = platform_get_irq_optional(dev, 1);
+	if (nand_irq == -EPROBE_DEFER)
+		return nand_irq;
+
 	fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
 					GFP_KERNEL);
 	if (!fsl_ifc_ctrl_dev)
@@ -246,23 +256,13 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 		addr += PGOFFSET_4K;
 	fsl_ifc_ctrl_dev->rregs = addr;
 
-	/* get the Controller level irq */
-	fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0);
-	if (fsl_ifc_ctrl_dev->irq == 0) {
-		dev_err(&dev->dev, "failed to get irq resource for IFC\n");
-		ret = -ENODEV;
-		goto err;
-	}
-
-	/* get the nand machine irq */
-	fsl_ifc_ctrl_dev->nand_irq =
-			irq_of_parse_and_map(dev->dev.of_node, 1);
+	fsl_ifc_ctrl_dev->irq = irq;
 
 	fsl_ifc_ctrl_dev->dev = &dev->dev;
 
 	ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev);
 	if (ret < 0)
-		goto err_unmap_nandirq;
+		goto err;
 
 	init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait);
 
@@ -271,10 +271,11 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	if (ret != 0) {
 		dev_err(&dev->dev, "failed to install irq (%d)\n",
 			fsl_ifc_ctrl_dev->irq);
-		goto err_unmap_nandirq;
+		goto err;
 	}
 
-	if (fsl_ifc_ctrl_dev->nand_irq) {
+	fsl_ifc_ctrl_dev->nand_irq = nand_irq;
+	if (fsl_ifc_ctrl_dev->nand_irq > 0) {
 		ret = request_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_nand_irq,
 				0, "fsl-ifc-nand", fsl_ifc_ctrl_dev);
 		if (ret != 0) {
@@ -292,12 +293,10 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	return 0;
 
 err_free_nandirq:
-	free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
+	if (fsl_ifc_ctrl_dev->nand_irq > 0)
+		free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
 err_free_irq:
 	free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
-err_unmap_nandirq:
-	irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq);
-	irq_dispose_mapping(fsl_ifc_ctrl_dev->irq);
 err:
 	iounmap(fsl_ifc_ctrl_dev->gregs);
 	return ret;
-- 
2.55.0


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

* [PATCHv2 2/4] memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error paths
  2026-07-21 20:24 [PATCHv2 0/4] memory: fsl_ifc: Switch to modern devm and platform IRQ APIs Rosen Penev
  2026-07-21 20:24 ` [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API Rosen Penev
@ 2026-07-21 20:24 ` Rosen Penev
  2026-09-01 15:34   ` Krzysztof Kozlowski
  2026-07-21 20:24 ` [PATCHv2 3/4] memory: fsl_ifc: Use devm_request_irq and simplify remove Rosen Penev
  2026-07-21 20:24 ` [PATCHv2 4/4] memory: fsl_ifc: drop simple-bus emulation Rosen Penev
  3 siblings, 1 reply; 11+ messages in thread
From: Rosen Penev @ 2026-07-21 20:24 UTC (permalink / raw)
  To: linux-kernel; +Cc: Krzysztof Kozlowski

Replace of_iomap() with devm_platform_ioremap_resource() for automatic
resource management, eliminating manual iounmap in remove and error
paths. devm_ioremap_resource() reserves the region and checks for
overlaps, which is safe here since the IFC controller register space
and child chip-select ranges are always at distinct addresses in all
DTS files.

As one of the errors is -EPROBE_DEFER, run it before anything else to
avoid doing actual work in such a case.

Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/memory/fsl_ifc.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index dce94d8b05b9..7e6800fc8480 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -92,10 +92,6 @@ static void fsl_ifc_ctrl_remove(struct platform_device *dev)
 	if (ctrl->nand_irq > 0)
 		free_irq(ctrl->nand_irq, ctrl);
 	free_irq(ctrl->irq, ctrl);
-
-	iounmap(ctrl->gregs);
-
-	dev_set_drvdata(&dev->dev, NULL);
 }
 
 /*
@@ -201,6 +197,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 {
 	int ret = 0;
 	int version, banks;
+	void __iomem *gregs;
 	void __iomem *addr;
 	int nand_irq;
 	int irq;
@@ -217,6 +214,11 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	if (nand_irq == -EPROBE_DEFER)
 		return nand_irq;
 
+	/* IOMAP the entire IFC region */
+	gregs = devm_platform_ioremap_resource(dev, 0);
+	if (IS_ERR(gregs))
+		return PTR_ERR(gregs);
+
 	fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
 					GFP_KERNEL);
 	if (!fsl_ifc_ctrl_dev)
@@ -224,12 +226,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 
 	dev_set_drvdata(&dev->dev, fsl_ifc_ctrl_dev);
 
-	/* IOMAP the entire IFC region */
-	fsl_ifc_ctrl_dev->gregs = of_iomap(dev->dev.of_node, 0);
-	if (!fsl_ifc_ctrl_dev->gregs) {
-		dev_err(&dev->dev, "failed to get memory region\n");
-		return -ENODEV;
-	}
+	fsl_ifc_ctrl_dev->gregs = gregs;
 
 	if (of_property_read_bool(dev->dev.of_node, "little-endian")) {
 		fsl_ifc_ctrl_dev->little_endian = true;
@@ -262,7 +259,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 
 	ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev);
 	if (ret < 0)
-		goto err;
+		return ret;
 
 	init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait);
 
@@ -271,7 +268,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	if (ret != 0) {
 		dev_err(&dev->dev, "failed to install irq (%d)\n",
 			fsl_ifc_ctrl_dev->irq);
-		goto err;
+		goto err_free_irq;
 	}
 
 	fsl_ifc_ctrl_dev->nand_irq = nand_irq;
@@ -297,8 +294,6 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 		free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
 err_free_irq:
 	free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
-err:
-	iounmap(fsl_ifc_ctrl_dev->gregs);
 	return ret;
 }
 
-- 
2.55.0


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

* [PATCHv2 3/4] memory: fsl_ifc: Use devm_request_irq and simplify remove
  2026-07-21 20:24 [PATCHv2 0/4] memory: fsl_ifc: Switch to modern devm and platform IRQ APIs Rosen Penev
  2026-07-21 20:24 ` [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API Rosen Penev
  2026-07-21 20:24 ` [PATCHv2 2/4] memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error paths Rosen Penev
@ 2026-07-21 20:24 ` Rosen Penev
  2026-07-21 20:24 ` [PATCHv2 4/4] memory: fsl_ifc: drop simple-bus emulation Rosen Penev
  3 siblings, 0 replies; 11+ messages in thread
From: Rosen Penev @ 2026-07-21 20:24 UTC (permalink / raw)
  To: linux-kernel; +Cc: Krzysztof Kozlowski

Switch from request_irq to devm_request_irq(), eliminating the error
path labels and free_irq() calls in remove(). Since both IRQs are now
devm-managed, the remove function only needs of_platform_depopulate
to tear down child devices before devm cleanup fires.

Remove dev_err calls on failure as devm_request_irq() already does this.

Don't bother using the irq variables in the struct. They were only used to
free the irqs in _remove.

Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/memory/fsl_ifc.c | 47 ++++++++++------------------------------
 1 file changed, 12 insertions(+), 35 deletions(-)

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index 7e6800fc8480..7fea6a356b55 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -86,12 +86,7 @@ static int fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl)
 
 static void fsl_ifc_ctrl_remove(struct platform_device *dev)
 {
-	struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(&dev->dev);
-
 	of_platform_depopulate(&dev->dev);
-	if (ctrl->nand_irq > 0)
-		free_irq(ctrl->nand_irq, ctrl);
-	free_irq(ctrl->irq, ctrl);
 }
 
 /*
@@ -253,8 +248,6 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 		addr += PGOFFSET_4K;
 	fsl_ifc_ctrl_dev->rregs = addr;
 
-	fsl_ifc_ctrl_dev->irq = irq;
-
 	fsl_ifc_ctrl_dev->dev = &dev->dev;
 
 	ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev);
@@ -263,38 +256,22 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 
 	init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait);
 
-	ret = request_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_irq, IRQF_SHARED,
-			  "fsl-ifc", fsl_ifc_ctrl_dev);
-	if (ret != 0) {
-		dev_err(&dev->dev, "failed to install irq (%d)\n",
-			fsl_ifc_ctrl_dev->irq);
-		goto err_free_irq;
-	}
+	ret = devm_request_irq(&dev->dev, irq,
+			       fsl_ifc_ctrl_irq, IRQF_SHARED,
+			       "fsl-ifc", fsl_ifc_ctrl_dev);
+	if (ret)
+		return ret;
 
-	fsl_ifc_ctrl_dev->nand_irq = nand_irq;
-	if (fsl_ifc_ctrl_dev->nand_irq > 0) {
-		ret = request_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_nand_irq,
-				0, "fsl-ifc-nand", fsl_ifc_ctrl_dev);
-		if (ret != 0) {
-			dev_err(&dev->dev, "failed to install irq (%d)\n",
-				fsl_ifc_ctrl_dev->nand_irq);
-			goto err_free_irq;
-		}
+	if (nand_irq > 0) {
+		ret = devm_request_irq(&dev->dev,
+				       nand_irq, fsl_ifc_nand_irq, 0,
+				       "fsl-ifc-nand", fsl_ifc_ctrl_dev);
+		if (ret)
+			return ret;
 	}
 
 	/* legacy dts may still use "simple-bus" compatible */
-	ret = of_platform_default_populate(dev->dev.of_node, NULL, &dev->dev);
-	if (ret)
-		goto err_free_nandirq;
-
-	return 0;
-
-err_free_nandirq:
-	if (fsl_ifc_ctrl_dev->nand_irq > 0)
-		free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
-err_free_irq:
-	free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
-	return ret;
+	return of_platform_default_populate(dev->dev.of_node, NULL, &dev->dev);
 }
 
 static const struct of_device_id fsl_ifc_match[] = {
-- 
2.55.0


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

* [PATCHv2 4/4] memory: fsl_ifc: drop simple-bus emulation
  2026-07-21 20:24 [PATCHv2 0/4] memory: fsl_ifc: Switch to modern devm and platform IRQ APIs Rosen Penev
                   ` (2 preceding siblings ...)
  2026-07-21 20:24 ` [PATCHv2 3/4] memory: fsl_ifc: Use devm_request_irq and simplify remove Rosen Penev
@ 2026-07-21 20:24 ` Rosen Penev
  3 siblings, 0 replies; 11+ messages in thread
From: Rosen Penev @ 2026-07-21 20:24 UTC (permalink / raw)
  To: linux-kernel; +Cc: Krzysztof Kozlowski

of_platform_default_populate() in fsl_ifc_ctrl_probe() was a workaround
for legacy device trees that lacked "simple-bus" on the IFC node.
Commit 103478597591 ("powerpc/85xx: Add fsl,ifc to common device ids")
ensures the IFC node is populated as a platform device via
of_platform_bus_probe(), so the driver no longer needs to manually
populate its children -- they are handled by their own dedicated
drivers (NAND, NOR, etc.) matching on their own compatibles.

Drop the of_platform_default_populate() call and the corresponding
of_platform_depopulate() in fsl_ifc_ctrl_remove(), which is now dead
code and can be removed entirely.

Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/memory/fsl_ifc.c | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index 7fea6a356b55..c591b89a1dd4 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -15,7 +15,6 @@
 #include <linux/slab.h>
 #include <linux/io.h>
 #include <linux/of.h>
-#include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/fsl_ifc.h>
 #include <linux/irqdomain.h>
@@ -84,11 +83,6 @@ static int fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl)
 	return 0;
 }
 
-static void fsl_ifc_ctrl_remove(struct platform_device *dev)
-{
-	of_platform_depopulate(&dev->dev);
-}
-
 /*
  * NAND events are split between an operational interrupt which only
  * receives OPC, and an error interrupt that receives everything else,
@@ -270,8 +264,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 			return ret;
 	}
 
-	/* legacy dts may still use "simple-bus" compatible */
-	return of_platform_default_populate(dev->dev.of_node, NULL, &dev->dev);
+	return 0;
 }
 
 static const struct of_device_id fsl_ifc_match[] = {
@@ -287,7 +280,6 @@ static struct platform_driver fsl_ifc_ctrl_driver = {
 		.of_match_table = fsl_ifc_match,
 	},
 	.probe       = fsl_ifc_ctrl_probe,
-	.remove  = fsl_ifc_ctrl_remove,
 };
 
 static int __init fsl_ifc_init(void)
-- 
2.55.0


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

* Re: [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API
  2026-07-21 20:24 ` [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API Rosen Penev
@ 2026-09-01 15:29   ` Krzysztof Kozlowski
  2026-09-06 18:34     ` Rosen Penev
  0 siblings, 1 reply; 11+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-01 15:29 UTC (permalink / raw)
  To: Rosen Penev, linux-kernel

On 21/07/2026 22:24, Rosen Penev wrote:
> Switch from irq_of_parse_and_map() to platform_get_irq() for the main
> controller IRQ, and use platform_get_irq_optional() for the NAND IRQ
> which is optional. Guard free_irq() calls on the NAND IRQ with a
> nand_irq > 0 check to avoid passing invalid IRQ numbers on platforms
> without a dedicated NAND interrupt line.
> 
> Get IRQs first as they can return a probe defferal error. Helps avoid
> doing actual work in such a case.
> 
> Assisted-by: opencode:big-pickle
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
>  drivers/memory/fsl_ifc.c | 43 ++++++++++++++++++++--------------------
>  1 file changed, 21 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
> index e89e0c6cc4bc..dce94d8b05b9 100644
> --- a/drivers/memory/fsl_ifc.c
> +++ b/drivers/memory/fsl_ifc.c
> @@ -89,12 +89,10 @@ static void fsl_ifc_ctrl_remove(struct platform_device *dev)
>  	struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(&dev->dev);
>  
>  	of_platform_depopulate(&dev->dev);
> -	free_irq(ctrl->nand_irq, ctrl);
> +	if (ctrl->nand_irq > 0)

0 is a valid IRQ for Linux, I think.

> +		free_irq(ctrl->nand_irq, ctrl);
>  	free_irq(ctrl->irq, ctrl);
>  
> -	irq_dispose_mapping(ctrl->nand_irq);
> -	irq_dispose_mapping(ctrl->irq);
> -
>  	iounmap(ctrl->gregs);
>  
>  	dev_set_drvdata(&dev->dev, NULL);
> @@ -204,9 +202,21 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  	int ret = 0;
>  	int version, banks;
>  	void __iomem *addr;
> +	int nand_irq;
> +	int irq;

Why do you need the intermediate variables?

>  
>  	dev_info(&dev->dev, "Freescale Integrated Flash Controller\n");
>  
> +	/* get the Controller level irq */
> +	irq = platform_get_irq(dev, 0);
> +	if (irq < 0)

... as also shown here.

> +		return irq;
> +
> +	/* get the nand machine irq */
> +	nand_irq = platform_get_irq_optional(dev, 1);
> +	if (nand_irq == -EPROBE_DEFER)
> +		return nand_irq;
> +
>  	fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
>  					GFP_KERNEL);
>  	if (!fsl_ifc_ctrl_dev)
> @@ -246,23 +256,13 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  		addr += PGOFFSET_4K;
>  	fsl_ifc_ctrl_dev->rregs = addr;
>  
> -	/* get the Controller level irq */
> -	fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0);
> -	if (fsl_ifc_ctrl_dev->irq == 0) {
> -		dev_err(&dev->dev, "failed to get irq resource for IFC\n");
> -		ret = -ENODEV;
> -		goto err;
> -	}
> -
> -	/* get the nand machine irq */
> -	fsl_ifc_ctrl_dev->nand_irq =
> -			irq_of_parse_and_map(dev->dev.of_node, 1);
> +	fsl_ifc_ctrl_dev->irq = irq;
>  
>  	fsl_ifc_ctrl_dev->dev = &dev->dev;
>  
>  	ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev);
>  	if (ret < 0)
> -		goto err_unmap_nandirq;
> +		goto err;
>  
>  	init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait);
>  
> @@ -271,10 +271,11 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  	if (ret != 0) {
>  		dev_err(&dev->dev, "failed to install irq (%d)\n",
>  			fsl_ifc_ctrl_dev->irq);
> -		goto err_unmap_nandirq;
> +		goto err;
>  	}
>  
> -	if (fsl_ifc_ctrl_dev->nand_irq) {
> +	fsl_ifc_ctrl_dev->nand_irq = nand_irq;
> +	if (fsl_ifc_ctrl_dev->nand_irq > 0) {

...but not here.

>  		ret = request_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_nand_irq,
>  				0, "fsl-ifc-nand", fsl_ifc_ctrl_dev);
>  		if (ret != 0) {
> @@ -292,12 +293,10 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  	return 0;
>  
>  err_free_nandirq:
> -	free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
> +	if (fsl_ifc_ctrl_dev->nand_irq > 0)
> +		free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
>  err_free_irq:
>  	free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
> -err_unmap_nandirq:
> -	irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq);
> -	irq_dispose_mapping(fsl_ifc_ctrl_dev->irq);
>  err:
>  	iounmap(fsl_ifc_ctrl_dev->gregs);
>  	return ret;


Best regards,
Krzysztof

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

* Re: [PATCHv2 2/4] memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error paths
  2026-07-21 20:24 ` [PATCHv2 2/4] memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error paths Rosen Penev
@ 2026-09-01 15:34   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 11+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-01 15:34 UTC (permalink / raw)
  To: Rosen Penev, linux-kernel

On 21/07/2026 22:24, Rosen Penev wrote:
> Replace of_iomap() with devm_platform_ioremap_resource() for automatic
> resource management, eliminating manual iounmap in remove and error
> paths. devm_ioremap_resource() reserves the region and checks for
> overlaps, which is safe here since the IFC controller register space
> and child chip-select ranges are always at distinct addresses in all
> DTS files.
> 
> As one of the errors is -EPROBE_DEFER, run it before anything else to
> avoid doing actual work in such a case.
> 
> Assisted-by: opencode:big-pickle
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
>  drivers/memory/fsl_ifc.c | 23 +++++++++--------------
>  1 file changed, 9 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
> index dce94d8b05b9..7e6800fc8480 100644
> --- a/drivers/memory/fsl_ifc.c
> +++ b/drivers/memory/fsl_ifc.c
> @@ -92,10 +92,6 @@ static void fsl_ifc_ctrl_remove(struct platform_device *dev)
>  	if (ctrl->nand_irq > 0)
>  		free_irq(ctrl->nand_irq, ctrl);
>  	free_irq(ctrl->irq, ctrl);
> -
> -	iounmap(ctrl->gregs);
> -
> -	dev_set_drvdata(&dev->dev, NULL);
>  }
>  
>  /*
> @@ -201,6 +197,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  {
>  	int ret = 0;
>  	int version, banks;
> +	void __iomem *gregs;

Why another local variable?

>  	void __iomem *addr;
>  	int nand_irq;
>  	int irq;
> @@ -217,6 +214,11 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  	if (nand_irq == -EPROBE_DEFER)
>  		return nand_irq;
>  
> +	/* IOMAP the entire IFC region */
> +	gregs = devm_platform_ioremap_resource(dev, 0);
> +	if (IS_ERR(gregs))
> +		return PTR_ERR(gregs);
> +
>  	fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
>  					GFP_KERNEL);
>  	if (!fsl_ifc_ctrl_dev)
> @@ -224,12 +226,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>  
>  	dev_set_drvdata(&dev->dev, fsl_ifc_ctrl_dev);
>  
> -	/* IOMAP the entire IFC region */
> -	fsl_ifc_ctrl_dev->gregs = of_iomap(dev->dev.of_node, 0);

This is not equivalent and commit msg does not address that. Old code
allowed multiple maps of the same address space but new code bails with
EBUSY.

Again, I asked last time - how did you test it?

Please mark the patches as RFT.


Best regards,
Krzysztof

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

* Re: [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API
  2026-09-01 15:29   ` Krzysztof Kozlowski
@ 2026-09-06 18:34     ` Rosen Penev
  2026-09-09  6:00       ` Krzysztof Kozlowski
  0 siblings, 1 reply; 11+ messages in thread
From: Rosen Penev @ 2026-09-06 18:34 UTC (permalink / raw)
  To: Krzysztof Kozlowski; +Cc: linux-kernel

On Tue, Sep 1, 2026 at 8:29 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 21/07/2026 22:24, Rosen Penev wrote:
> > Switch from irq_of_parse_and_map() to platform_get_irq() for the main
> > controller IRQ, and use platform_get_irq_optional() for the NAND IRQ
> > which is optional. Guard free_irq() calls on the NAND IRQ with a
> > nand_irq > 0 check to avoid passing invalid IRQ numbers on platforms
> > without a dedicated NAND interrupt line.
> >
> > Get IRQs first as they can return a probe defferal error. Helps avoid
> > doing actual work in such a case.
> >
> > Assisted-by: opencode:big-pickle
> > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > ---
> >  drivers/memory/fsl_ifc.c | 43 ++++++++++++++++++++--------------------
> >  1 file changed, 21 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
> > index e89e0c6cc4bc..dce94d8b05b9 100644
> > --- a/drivers/memory/fsl_ifc.c
> > +++ b/drivers/memory/fsl_ifc.c
> > @@ -89,12 +89,10 @@ static void fsl_ifc_ctrl_remove(struct platform_device *dev)
> >       struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(&dev->dev);
> >
> >       of_platform_depopulate(&dev->dev);
> > -     free_irq(ctrl->nand_irq, ctrl);
> > +     if (ctrl->nand_irq > 0)
>
> 0 is a valid IRQ for Linux, I think.
No. platform_get_irq has

WARN(ret == 0, "0 is an invalid IRQ number\n")

and 0 is an error with irq_of_parse_and_map.
>
> > +             free_irq(ctrl->nand_irq, ctrl);
> >       free_irq(ctrl->irq, ctrl);
> >
> > -     irq_dispose_mapping(ctrl->nand_irq);
> > -     irq_dispose_mapping(ctrl->irq);
> > -
> >       iounmap(ctrl->gregs);
> >
> >       dev_set_drvdata(&dev->dev, NULL);
> > @@ -204,9 +202,21 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
> >       int ret = 0;
> >       int version, banks;
> >       void __iomem *addr;
> > +     int nand_irq;
> > +     int irq;
>
> Why do you need the intermediate variables?
In order to call platform_get_irq before any allocation happens in probe.
>
> >
> >       dev_info(&dev->dev, "Freescale Integrated Flash Controller\n");
> >
> > +     /* get the Controller level irq */
> > +     irq = platform_get_irq(dev, 0);
> > +     if (irq < 0)
>
> ... as also shown here.
>
> > +             return irq;
> > +
> > +     /* get the nand machine irq */
> > +     nand_irq = platform_get_irq_optional(dev, 1);
> > +     if (nand_irq == -EPROBE_DEFER)
> > +             return nand_irq;
> > +
> >       fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
> >                                       GFP_KERNEL);
> >       if (!fsl_ifc_ctrl_dev)
> > @@ -246,23 +256,13 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
> >               addr += PGOFFSET_4K;
> >       fsl_ifc_ctrl_dev->rregs = addr;
> >
> > -     /* get the Controller level irq */
> > -     fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0);
> > -     if (fsl_ifc_ctrl_dev->irq == 0) {
> > -             dev_err(&dev->dev, "failed to get irq resource for IFC\n");
> > -             ret = -ENODEV;
> > -             goto err;
> > -     }
> > -
> > -     /* get the nand machine irq */
> > -     fsl_ifc_ctrl_dev->nand_irq =
> > -                     irq_of_parse_and_map(dev->dev.of_node, 1);
> > +     fsl_ifc_ctrl_dev->irq = irq;
> >
> >       fsl_ifc_ctrl_dev->dev = &dev->dev;
> >
> >       ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev);
> >       if (ret < 0)
> > -             goto err_unmap_nandirq;
> > +             goto err;
> >
> >       init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait);
> >
> > @@ -271,10 +271,11 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
> >       if (ret != 0) {
> >               dev_err(&dev->dev, "failed to install irq (%d)\n",
> >                       fsl_ifc_ctrl_dev->irq);
> > -             goto err_unmap_nandirq;
> > +             goto err;
> >       }
> >
> > -     if (fsl_ifc_ctrl_dev->nand_irq) {
> > +     fsl_ifc_ctrl_dev->nand_irq = nand_irq;
> > +     if (fsl_ifc_ctrl_dev->nand_irq > 0) {
>
> ...but not here.
Will fix.
>
> >               ret = request_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_nand_irq,
> >                               0, "fsl-ifc-nand", fsl_ifc_ctrl_dev);
> >               if (ret != 0) {
> > @@ -292,12 +293,10 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
> >       return 0;
> >
> >  err_free_nandirq:
> > -     free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
> > +     if (fsl_ifc_ctrl_dev->nand_irq > 0)
> > +             free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
> >  err_free_irq:
> >       free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
> > -err_unmap_nandirq:
> > -     irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq);
> > -     irq_dispose_mapping(fsl_ifc_ctrl_dev->irq);
> >  err:
> >       iounmap(fsl_ifc_ctrl_dev->gregs);
> >       return ret;
>
>
> Best regards,
> Krzysztof

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

* Re: [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API
  2026-09-06 18:34     ` Rosen Penev
@ 2026-09-09  6:00       ` Krzysztof Kozlowski
  2026-09-09 22:33         ` Rosen Penev
  0 siblings, 1 reply; 11+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-09  6:00 UTC (permalink / raw)
  To: Rosen Penev; +Cc: linux-kernel

On 06/09/2026 20:34, Rosen Penev wrote:
> On Tue, Sep 1, 2026 at 8:29 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>>>       dev_set_drvdata(&dev->dev, NULL);
>>> @@ -204,9 +202,21 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>>>       int ret = 0;
>>>       int version, banks;
>>>       void __iomem *addr;
>>> +     int nand_irq;
>>> +     int irq;
>>
>> Why do you need the intermediate variables?
> In order to call platform_get_irq before any allocation happens in probe.
>>

But allocation is the first thing the probe is doing.

Best regards,
Krzysztof

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

* Re: [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API
  2026-09-09  6:00       ` Krzysztof Kozlowski
@ 2026-09-09 22:33         ` Rosen Penev
  2026-09-10  6:28           ` Krzysztof Kozlowski
  0 siblings, 1 reply; 11+ messages in thread
From: Rosen Penev @ 2026-09-09 22:33 UTC (permalink / raw)
  To: Krzysztof Kozlowski; +Cc: linux-kernel

On Tue, Sep 8, 2026 at 11:00 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 06/09/2026 20:34, Rosen Penev wrote:
> > On Tue, Sep 1, 2026 at 8:29 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
> >>>       dev_set_drvdata(&dev->dev, NULL);
> >>> @@ -204,9 +202,21 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
> >>>       int ret = 0;
> >>>       int version, banks;
> >>>       void __iomem *addr;
> >>> +     int nand_irq;
> >>> +     int irq;
> >>
> >> Why do you need the intermediate variables?
> > In order to call platform_get_irq before any allocation happens in probe.
> >>
>
> But allocation is the first thing the probe is doing.
We're going in circles.

It's better to return -EPROBE_DEFER as early as possible to avoid
doing anything.
>
> Best regards,
> Krzysztof

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

* Re: [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API
  2026-09-09 22:33         ` Rosen Penev
@ 2026-09-10  6:28           ` Krzysztof Kozlowski
  0 siblings, 0 replies; 11+ messages in thread
From: Krzysztof Kozlowski @ 2026-09-10  6:28 UTC (permalink / raw)
  To: Rosen Penev; +Cc: linux-kernel

On 10/09/2026 00:33, Rosen Penev wrote:
> On Tue, Sep 8, 2026 at 11:00 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>>
>> On 06/09/2026 20:34, Rosen Penev wrote:
>>> On Tue, Sep 1, 2026 at 8:29 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>>>>>       dev_set_drvdata(&dev->dev, NULL);
>>>>> @@ -204,9 +202,21 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
>>>>>       int ret = 0;
>>>>>       int version, banks;
>>>>>       void __iomem *addr;
>>>>> +     int nand_irq;
>>>>> +     int irq;
>>>>
>>>> Why do you need the intermediate variables?
>>> In order to call platform_get_irq before any allocation happens in probe.
>>>>
>>
>> But allocation is the first thing the probe is doing.
> We're going in circles.
> 
> It's better to return -EPROBE_DEFER as early as possible to avoid
> doing anything.

Then you would be getting all resources like that in every driver... and
we don't. Plus deferred probe on IRQ is highly unlikely.

Best regards,
Krzysztof

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

end of thread, other threads:[~2026-09-10  6:28 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-21 20:24 [PATCHv2 0/4] memory: fsl_ifc: Switch to modern devm and platform IRQ APIs Rosen Penev
2026-07-21 20:24 ` [PATCHv2 1/4] memory: fsl_ifc: Fix optional NAND IRQ handling and migrate to platform IRQ API Rosen Penev
2026-09-01 15:29   ` Krzysztof Kozlowski
2026-09-06 18:34     ` Rosen Penev
2026-09-09  6:00       ` Krzysztof Kozlowski
2026-09-09 22:33         ` Rosen Penev
2026-09-10  6:28           ` Krzysztof Kozlowski
2026-07-21 20:24 ` [PATCHv2 2/4] memory: fsl_ifc: Use devm_platform_ioremap_resource and fix error paths Rosen Penev
2026-09-01 15:34   ` Krzysztof Kozlowski
2026-07-21 20:24 ` [PATCHv2 3/4] memory: fsl_ifc: Use devm_request_irq and simplify remove Rosen Penev
2026-07-21 20:24 ` [PATCHv2 4/4] memory: fsl_ifc: drop simple-bus emulation Rosen Penev

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.