public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH 0/4] media: platform: nxp: Trivial cleanup pathces
@ 2025-11-17 18:58 Frank Li
  2025-11-17 18:58 ` [PATCH 1/4] media: nxp: use devm_mutex_init() simple code Frank Li
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Frank Li @ 2025-11-17 18:58 UTC (permalink / raw)
  To: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Laurent Pinchart, Martin Kepplinger-Novakovic, Purism Kernel Team
  Cc: linux-media, imx, linux-arm-kernel, linux-kernel, Frank Li

Some trivial patch to reduce goto at probe functions.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Frank Li (4):
      media: nxp: use devm_mutex_init() simple code
      media: nxp: use dev_err_probe() to simplify code
      media: nxp: imx8-isi: use devm_pm_runtime_enable() to simplify code
      media: nxp: use cleanup  __free(fwnode_handle) simplify code

 drivers/media/platform/nxp/imx-mipi-csis.c         | 37 ++++--------
 drivers/media/platform/nxp/imx-pxp.c               |  5 +-
 drivers/media/platform/nxp/imx7-media-csi.c        | 13 ++--
 .../media/platform/nxp/imx8-isi/imx8-isi-core.c    | 16 +++--
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c      | 70 +++++++++-------------
 drivers/media/platform/nxp/mx2_emmaprp.c           |  7 +--
 6 files changed, 57 insertions(+), 91 deletions(-)
---
base-commit: 0f2995693867bfb26197b117cd55624ddc57582f
change-id: 20250807-cam_cleanup-b6d90ba9dac3

Best regards,
--
Frank Li <Frank.Li@nxp.com>



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

* [PATCH 1/4] media: nxp: use devm_mutex_init() simple code
  2025-11-17 18:58 [PATCH 0/4] media: platform: nxp: Trivial cleanup pathces Frank Li
@ 2025-11-17 18:58 ` Frank Li
  2025-11-19  4:22   ` Laurent Pinchart
  2025-11-17 18:58 ` [PATCH 2/4] media: nxp: use dev_err_probe() to simplify code Frank Li
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Frank Li @ 2025-11-17 18:58 UTC (permalink / raw)
  To: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Laurent Pinchart, Martin Kepplinger-Novakovic, Purism Kernel Team
  Cc: linux-media, imx, linux-arm-kernel, linux-kernel, Frank Li

Use devm_mutex_init() simple code. No functional change.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
 drivers/media/platform/nxp/imx-pxp.c          |  5 ++++-
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 11 +++++------
 drivers/media/platform/nxp/mx2_emmaprp.c      |  7 +++----
 3 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/media/platform/nxp/imx-pxp.c b/drivers/media/platform/nxp/imx-pxp.c
index 3f9a67a6bd4d268841f85f9b69af03138300d188..32d39c8013c7eef1f9629f971cc74afecd463ac7 100644
--- a/drivers/media/platform/nxp/imx-pxp.c
+++ b/drivers/media/platform/nxp/imx-pxp.c
@@ -1805,6 +1805,10 @@ static int pxp_probe(struct platform_device *pdev)
 
 	spin_lock_init(&dev->irqlock);
 
+	ret = devm_mutex_init(&pdev->dev, &dev->dev_mutex);
+	if (ret)
+		return ret;
+
 	ret = devm_request_irq(&pdev->dev, irq, pxp_irq_handler, 0,
 			       dev_name(&pdev->dev), dev);
 	if (ret < 0) {
@@ -1831,7 +1835,6 @@ static int pxp_probe(struct platform_device *pdev)
 		goto err_clk;
 
 	atomic_set(&dev->num_inst, 0);
-	mutex_init(&dev->dev_mutex);
 
 	dev->vfd = pxp_videodev;
 	vfd = &dev->vfd;
diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
index 371b4e81328c107269f89da23818ab0abd0179da..0851f4a9ae52d3096f454da643cfdc5017e000b1 100644
--- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
+++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
@@ -1033,15 +1033,17 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, &state->sd);
 
-	mutex_init(&state->lock);
+	ret = devm_mutex_init(dev, &state->lock);
+	if (ret)
+		return ret;
 
 	ret = imx8mq_mipi_csi_subdev_init(state);
 	if (ret < 0)
-		goto mutex;
+		return ret;
 
 	ret = imx8mq_mipi_csi_init_icc(pdev);
 	if (ret)
-		goto mutex;
+		return ret;
 
 	/* Enable runtime PM. */
 	pm_runtime_enable(dev);
@@ -1068,8 +1070,6 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
 	v4l2_async_unregister_subdev(&state->sd);
 icc:
 	imx8mq_mipi_csi_release_icc(pdev);
-mutex:
-	mutex_destroy(&state->lock);
 
 	return ret;
 }
@@ -1087,7 +1087,6 @@ static void imx8mq_mipi_csi_remove(struct platform_device *pdev)
 	imx8mq_mipi_csi_runtime_suspend(&pdev->dev);
 	media_entity_cleanup(&state->sd.entity);
 	v4l2_subdev_cleanup(&state->sd);
-	mutex_destroy(&state->lock);
 	pm_runtime_set_suspended(&pdev->dev);
 	imx8mq_mipi_csi_release_icc(pdev);
 }
diff --git a/drivers/media/platform/nxp/mx2_emmaprp.c b/drivers/media/platform/nxp/mx2_emmaprp.c
index 02d57229b9b3a600303cc0429e102139385071d6..384a2672884e96d17cca542ef51fbef62328b66a 100644
--- a/drivers/media/platform/nxp/mx2_emmaprp.c
+++ b/drivers/media/platform/nxp/mx2_emmaprp.c
@@ -824,7 +824,9 @@ static int emmaprp_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	mutex_init(&pcdev->dev_mutex);
+	ret = devm_mutex_init(&pdev->dev, &pcdev->dev_mutex);
+	if (ret)
+		return ret;
 
 	vfd = video_device_alloc();
 	if (!vfd) {
@@ -878,8 +880,6 @@ static int emmaprp_probe(struct platform_device *pdev)
 unreg_dev:
 	v4l2_device_unregister(&pcdev->v4l2_dev);
 
-	mutex_destroy(&pcdev->dev_mutex);
-
 	return ret;
 }
 
@@ -892,7 +892,6 @@ static void emmaprp_remove(struct platform_device *pdev)
 	video_unregister_device(pcdev->vfd);
 	v4l2_m2m_release(pcdev->m2m_dev);
 	v4l2_device_unregister(&pcdev->v4l2_dev);
-	mutex_destroy(&pcdev->dev_mutex);
 }
 
 static struct platform_driver emmaprp_pdrv = {

-- 
2.34.1



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

* [PATCH 2/4] media: nxp: use dev_err_probe() to simplify code
  2025-11-17 18:58 [PATCH 0/4] media: platform: nxp: Trivial cleanup pathces Frank Li
  2025-11-17 18:58 ` [PATCH 1/4] media: nxp: use devm_mutex_init() simple code Frank Li
@ 2025-11-17 18:58 ` Frank Li
  2025-11-19  4:33   ` Laurent Pinchart
  2025-11-17 18:58 ` [PATCH 3/4] media: nxp: imx8-isi: use devm_pm_runtime_enable() " Frank Li
  2025-11-17 18:58 ` [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) " Frank Li
  3 siblings, 1 reply; 12+ messages in thread
From: Frank Li @ 2025-11-17 18:58 UTC (permalink / raw)
  To: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Laurent Pinchart, Martin Kepplinger-Novakovic, Purism Kernel Team
  Cc: linux-media, imx, linux-arm-kernel, linux-kernel, Frank Li

Use dev_err_probe() to simplify code. No functional change.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
 drivers/media/platform/nxp/imx-mipi-csis.c    |  6 ++----
 drivers/media/platform/nxp/imx7-media-csi.c   | 13 ++++---------
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 28 ++++++++++++---------------
 3 files changed, 18 insertions(+), 29 deletions(-)

diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
index 088b2945aee33731c565f049dd17721356300b84..ce93d868746f002c22e2f86b1e0aa84ec1a76061 100644
--- a/drivers/media/platform/nxp/imx-mipi-csis.c
+++ b/drivers/media/platform/nxp/imx-mipi-csis.c
@@ -1547,10 +1547,8 @@ static int mipi_csis_probe(struct platform_device *pdev)
 	/* Now that the hardware is initialized, request the interrupt. */
 	ret = devm_request_irq(dev, irq, mipi_csis_irq_handler, 0,
 			       dev_name(dev), csis);
-	if (ret) {
-		dev_err(dev, "Interrupt request failed\n");
-		return ret;
-	}
+	if (ret)
+		return dev_err_probe(dev, ret, "Interrupt request failed\n");
 
 	/* Initialize and register the subdev. */
 	ret = mipi_csis_subdev_init(csis);
diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c
index 933a5f39f9f4c9b43ca8d2a1819d0145981266e6..82109e6884a4d931a84ef02e2bde41d0d7248511 100644
--- a/drivers/media/platform/nxp/imx7-media-csi.c
+++ b/drivers/media/platform/nxp/imx7-media-csi.c
@@ -2218,11 +2218,8 @@ static int imx7_csi_probe(struct platform_device *pdev)
 
 	/* Acquire resources and install interrupt handler. */
 	csi->mclk = devm_clk_get(&pdev->dev, "mclk");
-	if (IS_ERR(csi->mclk)) {
-		ret = PTR_ERR(csi->mclk);
-		dev_err(dev, "Failed to get mclk: %d", ret);
-		return ret;
-	}
+	if (IS_ERR(csi->mclk))
+		return dev_err_probe(dev, PTR_ERR(csi->mclk), "Failed to get mclk\n");
 
 	csi->irq = platform_get_irq(pdev, 0);
 	if (csi->irq < 0)
@@ -2236,10 +2233,8 @@ static int imx7_csi_probe(struct platform_device *pdev)
 
 	ret = devm_request_irq(dev, csi->irq, imx7_csi_irq_handler, 0, "csi",
 			       (void *)csi);
-	if (ret < 0) {
-		dev_err(dev, "Request CSI IRQ failed.\n");
-		return ret;
-	}
+	if (ret < 0)
+		return dev_err_probe(dev, ret, "Request CSI IRQ failed.\n");
 
 	/* Initialize all the media device infrastructure. */
 	ret = imx7_csi_media_init(csi);
diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
index 0851f4a9ae52d3096f454da643cfdc5017e000b1..75709161fb26a61239b94430365849e022fdc14f 100644
--- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
+++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
@@ -951,10 +951,9 @@ static int imx8mq_mipi_csi_parse_dt(struct csi_state *state)
 	int ret = 0;
 
 	state->rst = devm_reset_control_array_get_exclusive(dev);
-	if (IS_ERR(state->rst)) {
-		dev_err(dev, "Failed to get reset: %pe\n", state->rst);
-		return PTR_ERR(state->rst);
-	}
+	if (IS_ERR(state->rst))
+		return dev_err_probe(dev, PTR_ERR(state->rst),
+				     "Failed to get reset: %pe\n", state->rst);
 
 	if (state->pdata->use_reg_csr) {
 		const struct regmap_config regmap_config = {
@@ -977,24 +976,21 @@ static int imx8mq_mipi_csi_parse_dt(struct csi_state *state)
 
 	ret = of_property_read_u32_array(np, "fsl,mipi-phy-gpr", out_val,
 					 ARRAY_SIZE(out_val));
-	if (ret) {
-		dev_err(dev, "no fsl,mipi-phy-gpr property found: %d\n", ret);
-		return ret;
-	}
+	if (ret)
+		return dev_err_probe(dev, ret,
+				     "no fsl,mipi-phy-gpr property found: %d\n", ret);
 
 	ph = *out_val;
 
 	node = of_find_node_by_phandle(ph);
-	if (!node) {
-		dev_err(dev, "Error finding node by phandle\n");
-		return -ENODEV;
-	}
+	if (!node)
+		return dev_err_probe(dev, -ENODEV, "Error finding node by phandle\n");
+
 	state->phy_gpr = syscon_node_to_regmap(node);
 	of_node_put(node);
-	if (IS_ERR(state->phy_gpr)) {
-		dev_err(dev, "failed to get gpr regmap: %pe\n", state->phy_gpr);
-		return PTR_ERR(state->phy_gpr);
-	}
+	if (IS_ERR(state->phy_gpr))
+		return dev_err_probe(dev, PTR_ERR(state->phy_gpr),
+				     "failed to get gpr regmap: %pe\n", state->phy_gpr);
 
 	state->phy_gpr_reg = out_val[1];
 	dev_dbg(dev, "phy gpr register set to 0x%x\n", state->phy_gpr_reg);

-- 
2.34.1



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

* [PATCH 3/4] media: nxp: imx8-isi: use devm_pm_runtime_enable() to simplify code
  2025-11-17 18:58 [PATCH 0/4] media: platform: nxp: Trivial cleanup pathces Frank Li
  2025-11-17 18:58 ` [PATCH 1/4] media: nxp: use devm_mutex_init() simple code Frank Li
  2025-11-17 18:58 ` [PATCH 2/4] media: nxp: use dev_err_probe() to simplify code Frank Li
@ 2025-11-17 18:58 ` Frank Li
  2025-11-19  4:24   ` Laurent Pinchart
  2025-11-17 18:58 ` [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) " Frank Li
  3 siblings, 1 reply; 12+ messages in thread
From: Frank Li @ 2025-11-17 18:58 UTC (permalink / raw)
  To: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Laurent Pinchart, Martin Kepplinger-Novakovic, Purism Kernel Team
  Cc: linux-media, imx, linux-arm-kernel, linux-kernel, Frank Li

Use devm_pm_runtime_enable() to simplify code. Change to use
dev_err_probe() because previous goto change to return.

No functional change.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
 drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
index c3d411ddf492eb27b372763ce5d344a90c6ec524..a884976ac8f8295120c404941f7ee19b90723924 100644
--- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
+++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
@@ -499,13 +499,14 @@ static int mxc_isi_probe(struct platform_device *pdev)
 	dma_size = isi->pdata->has_36bit_dma ? 36 : 32;
 	dma_set_mask_and_coherent(dev, DMA_BIT_MASK(dma_size));
 
-	pm_runtime_enable(dev);
+	ret = devm_pm_runtime_enable(dev);
+	if (ret)
+		return ret;
 
 	ret = mxc_isi_crossbar_init(isi);
-	if (ret) {
-		dev_err(dev, "Failed to initialize crossbar: %d\n", ret);
-		goto err_pm;
-	}
+	if (ret)
+		return dev_err_probe(dev, ret,
+				     "Failed to initialize crossbar: %d\n", ret);
 
 	for (i = 0; i < isi->pdata->num_channels; ++i) {
 		ret = mxc_isi_pipe_init(isi, i);
@@ -528,8 +529,7 @@ static int mxc_isi_probe(struct platform_device *pdev)
 
 err_xbar:
 	mxc_isi_crossbar_cleanup(&isi->crossbar);
-err_pm:
-	pm_runtime_disable(isi->dev);
+
 	return ret;
 }
 
@@ -548,8 +548,6 @@ static void mxc_isi_remove(struct platform_device *pdev)
 
 	mxc_isi_crossbar_cleanup(&isi->crossbar);
 	mxc_isi_v4l2_cleanup(isi);
-
-	pm_runtime_disable(isi->dev);
 }
 
 static const struct of_device_id mxc_isi_of_match[] = {

-- 
2.34.1



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

* [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) simplify code
  2025-11-17 18:58 [PATCH 0/4] media: platform: nxp: Trivial cleanup pathces Frank Li
                   ` (2 preceding siblings ...)
  2025-11-17 18:58 ` [PATCH 3/4] media: nxp: imx8-isi: use devm_pm_runtime_enable() " Frank Li
@ 2025-11-17 18:58 ` Frank Li
  2025-11-19  4:25   ` Laurent Pinchart
  3 siblings, 1 reply; 12+ messages in thread
From: Frank Li @ 2025-11-17 18:58 UTC (permalink / raw)
  To: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Laurent Pinchart, Martin Kepplinger-Novakovic, Purism Kernel Team
  Cc: linux-media, imx, linux-arm-kernel, linux-kernel, Frank Li

Use cleanup __free(fwnode_handle) simplify code. Change to dev_err_probe()
because replace goto with return.

Add missed "\n" at error message.

No functional change.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
 drivers/media/platform/nxp/imx-mipi-csis.c    | 31 +++++++++------------------
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 31 +++++++++------------------
 2 files changed, 20 insertions(+), 42 deletions(-)

diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
index ce93d868746f002c22e2f86b1e0aa84ec1a76061..d924adb406a30797b66f0094ab17e98ad44fefac 100644
--- a/drivers/media/platform/nxp/imx-mipi-csis.c
+++ b/drivers/media/platform/nxp/imx-mipi-csis.c
@@ -12,6 +12,7 @@
  *
  */
 
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/debugfs.h>
 #include <linux/delay.h>
@@ -1349,28 +1350,25 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
 		.bus_type = V4L2_MBUS_CSI2_DPHY,
 	};
 	struct v4l2_async_connection *asd;
-	struct fwnode_handle *ep;
 	unsigned int i;
 	int ret;
 
 	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
 
-	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
-					     FWNODE_GRAPH_ENDPOINT_NEXT);
+	struct fwnode_handle *ep __free(fwnode_handle) =
+		fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
+						FWNODE_GRAPH_ENDPOINT_NEXT);
 	if (!ep)
 		return -ENOTCONN;
 
 	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
 	if (ret)
-		goto err_parse;
+		return ret;
 
 	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
-		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
-			dev_err(csis->dev,
-				"data lanes reordering is not supported");
-			ret = -EINVAL;
-			goto err_parse;
-		}
+		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
+			return dev_err_probe(csis->dev, -EINVAL,
+					     "data lanes reordering is not supported\n");
 	}
 
 	csis->bus = vep.bus.mipi_csi2;
@@ -1381,12 +1379,8 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
 
 	asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
 					      struct v4l2_async_connection);
-	if (IS_ERR(asd)) {
-		ret = PTR_ERR(asd);
-		goto err_parse;
-	}
-
-	fwnode_handle_put(ep);
+	if (IS_ERR(asd))
+		return PTR_ERR(asd);
 
 	csis->notifier.ops = &mipi_csis_notify_ops;
 
@@ -1395,11 +1389,6 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
 		return ret;
 
 	return v4l2_async_register_subdev(&csis->sd);
-
-err_parse:
-	fwnode_handle_put(ep);
-
-	return ret;
 }
 
 /* -----------------------------------------------------------------------------
diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
index 75709161fb26a61239b94430365849e022fdc14f..94882568405db55593c5c51722db2233a64d53e4 100644
--- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
+++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
@@ -6,6 +6,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/delay.h>
@@ -717,28 +718,25 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
 		.bus_type = V4L2_MBUS_CSI2_DPHY,
 	};
 	struct v4l2_async_connection *asd;
-	struct fwnode_handle *ep;
 	unsigned int i;
 	int ret;
 
 	v4l2_async_subdev_nf_init(&state->notifier, &state->sd);
 
-	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
-					     FWNODE_GRAPH_ENDPOINT_NEXT);
+	struct fwnode_handle *ep __free(fwnode_handle) =
+		fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
+						FWNODE_GRAPH_ENDPOINT_NEXT);
 	if (!ep)
 		return -ENOTCONN;
 
 	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
 	if (ret)
-		goto err_parse;
+		return ret;
 
 	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
-		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
-			dev_err(state->dev,
-				"data lanes reordering is not supported");
-			ret = -EINVAL;
-			goto err_parse;
-		}
+		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
+			return dev_err_probe(state->dev, -EINVAL,
+					     "data lanes reordering is not supported\n");
 	}
 
 	state->bus = vep.bus.mipi_csi2;
@@ -749,12 +747,8 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
 
 	asd = v4l2_async_nf_add_fwnode_remote(&state->notifier, ep,
 					      struct v4l2_async_connection);
-	if (IS_ERR(asd)) {
-		ret = PTR_ERR(asd);
-		goto err_parse;
-	}
-
-	fwnode_handle_put(ep);
+	if (IS_ERR(asd))
+		return PTR_ERR(asd);
 
 	state->notifier.ops = &imx8mq_mipi_csi_notify_ops;
 
@@ -763,11 +757,6 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
 		return ret;
 
 	return v4l2_async_register_subdev(&state->sd);
-
-err_parse:
-	fwnode_handle_put(ep);
-
-	return ret;
 }
 
 /* -----------------------------------------------------------------------------

-- 
2.34.1



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

* Re: [PATCH 1/4] media: nxp: use devm_mutex_init() simple code
  2025-11-17 18:58 ` [PATCH 1/4] media: nxp: use devm_mutex_init() simple code Frank Li
@ 2025-11-19  4:22   ` Laurent Pinchart
  2025-11-19 16:17     ` Frank Li
  0 siblings, 1 reply; 12+ messages in thread
From: Laurent Pinchart @ 2025-11-19  4:22 UTC (permalink / raw)
  To: Frank Li
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

Hi Frank,

Thank you for the patch.

On Mon, Nov 17, 2025 at 01:58:11PM -0500, Frank Li wrote:
> Use devm_mutex_init() simple code. No functional change.
> 
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
>  drivers/media/platform/nxp/imx-pxp.c          |  5 ++++-
>  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 11 +++++------
>  drivers/media/platform/nxp/mx2_emmaprp.c      |  7 +++----
>  3 files changed, 12 insertions(+), 11 deletions(-)

Given the diffstat, and the fact that devm_mutex_init() performs dynamic
memory allocation, I'm not convinced by this change. I won't block it
though, as I don't maintain the above drivers.

> 
> diff --git a/drivers/media/platform/nxp/imx-pxp.c b/drivers/media/platform/nxp/imx-pxp.c
> index 3f9a67a6bd4d268841f85f9b69af03138300d188..32d39c8013c7eef1f9629f971cc74afecd463ac7 100644
> --- a/drivers/media/platform/nxp/imx-pxp.c
> +++ b/drivers/media/platform/nxp/imx-pxp.c
> @@ -1805,6 +1805,10 @@ static int pxp_probe(struct platform_device *pdev)
>  
>  	spin_lock_init(&dev->irqlock);
>  
> +	ret = devm_mutex_init(&pdev->dev, &dev->dev_mutex);
> +	if (ret)
> +		return ret;
> +
>  	ret = devm_request_irq(&pdev->dev, irq, pxp_irq_handler, 0,
>  			       dev_name(&pdev->dev), dev);
>  	if (ret < 0) {
> @@ -1831,7 +1835,6 @@ static int pxp_probe(struct platform_device *pdev)
>  		goto err_clk;
>  
>  	atomic_set(&dev->num_inst, 0);
> -	mutex_init(&dev->dev_mutex);
>  
>  	dev->vfd = pxp_videodev;
>  	vfd = &dev->vfd;
> diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> index 371b4e81328c107269f89da23818ab0abd0179da..0851f4a9ae52d3096f454da643cfdc5017e000b1 100644
> --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> @@ -1033,15 +1033,17 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
>  
>  	platform_set_drvdata(pdev, &state->sd);
>  
> -	mutex_init(&state->lock);
> +	ret = devm_mutex_init(dev, &state->lock);
> +	if (ret)
> +		return ret;
>  
>  	ret = imx8mq_mipi_csi_subdev_init(state);
>  	if (ret < 0)
> -		goto mutex;
> +		return ret;
>  
>  	ret = imx8mq_mipi_csi_init_icc(pdev);
>  	if (ret)
> -		goto mutex;
> +		return ret;
>  
>  	/* Enable runtime PM. */
>  	pm_runtime_enable(dev);
> @@ -1068,8 +1070,6 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
>  	v4l2_async_unregister_subdev(&state->sd);
>  icc:
>  	imx8mq_mipi_csi_release_icc(pdev);
> -mutex:
> -	mutex_destroy(&state->lock);
>  
>  	return ret;
>  }
> @@ -1087,7 +1087,6 @@ static void imx8mq_mipi_csi_remove(struct platform_device *pdev)
>  	imx8mq_mipi_csi_runtime_suspend(&pdev->dev);
>  	media_entity_cleanup(&state->sd.entity);
>  	v4l2_subdev_cleanup(&state->sd);
> -	mutex_destroy(&state->lock);
>  	pm_runtime_set_suspended(&pdev->dev);
>  	imx8mq_mipi_csi_release_icc(pdev);
>  }
> diff --git a/drivers/media/platform/nxp/mx2_emmaprp.c b/drivers/media/platform/nxp/mx2_emmaprp.c
> index 02d57229b9b3a600303cc0429e102139385071d6..384a2672884e96d17cca542ef51fbef62328b66a 100644
> --- a/drivers/media/platform/nxp/mx2_emmaprp.c
> +++ b/drivers/media/platform/nxp/mx2_emmaprp.c
> @@ -824,7 +824,9 @@ static int emmaprp_probe(struct platform_device *pdev)
>  	if (ret)
>  		return ret;
>  
> -	mutex_init(&pcdev->dev_mutex);
> +	ret = devm_mutex_init(&pdev->dev, &pcdev->dev_mutex);
> +	if (ret)
> +		return ret;
>  
>  	vfd = video_device_alloc();
>  	if (!vfd) {
> @@ -878,8 +880,6 @@ static int emmaprp_probe(struct platform_device *pdev)
>  unreg_dev:
>  	v4l2_device_unregister(&pcdev->v4l2_dev);
>  
> -	mutex_destroy(&pcdev->dev_mutex);
> -
>  	return ret;
>  }
>  
> @@ -892,7 +892,6 @@ static void emmaprp_remove(struct platform_device *pdev)
>  	video_unregister_device(pcdev->vfd);
>  	v4l2_m2m_release(pcdev->m2m_dev);
>  	v4l2_device_unregister(&pcdev->v4l2_dev);
> -	mutex_destroy(&pcdev->dev_mutex);
>  }
>  
>  static struct platform_driver emmaprp_pdrv = {

-- 
Regards,

Laurent Pinchart


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

* Re: [PATCH 3/4] media: nxp: imx8-isi: use devm_pm_runtime_enable() to simplify code
  2025-11-17 18:58 ` [PATCH 3/4] media: nxp: imx8-isi: use devm_pm_runtime_enable() " Frank Li
@ 2025-11-19  4:24   ` Laurent Pinchart
  0 siblings, 0 replies; 12+ messages in thread
From: Laurent Pinchart @ 2025-11-19  4:24 UTC (permalink / raw)
  To: Frank Li
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

On Mon, Nov 17, 2025 at 01:58:13PM -0500, Frank Li wrote:
> Use devm_pm_runtime_enable() to simplify code. Change to use
> dev_err_probe() because previous goto change to return.
> 
> No functional change.
> 
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
>  drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c | 16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
> index c3d411ddf492eb27b372763ce5d344a90c6ec524..a884976ac8f8295120c404941f7ee19b90723924 100644
> --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
> +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
> @@ -499,13 +499,14 @@ static int mxc_isi_probe(struct platform_device *pdev)
>  	dma_size = isi->pdata->has_36bit_dma ? 36 : 32;
>  	dma_set_mask_and_coherent(dev, DMA_BIT_MASK(dma_size));
>  
> -	pm_runtime_enable(dev);
> +	ret = devm_pm_runtime_enable(dev);
> +	if (ret)
> +		return ret;
>  
>  	ret = mxc_isi_crossbar_init(isi);
> -	if (ret) {
> -		dev_err(dev, "Failed to initialize crossbar: %d\n", ret);
> -		goto err_pm;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				     "Failed to initialize crossbar: %d\n", ret);

No need to print the error value anymore.

>  
>  	for (i = 0; i < isi->pdata->num_channels; ++i) {
>  		ret = mxc_isi_pipe_init(isi, i);
> @@ -528,8 +529,7 @@ static int mxc_isi_probe(struct platform_device *pdev)
>  
>  err_xbar:
>  	mxc_isi_crossbar_cleanup(&isi->crossbar);
> -err_pm:
> -	pm_runtime_disable(isi->dev);
> +
>  	return ret;
>  }
>  
> @@ -548,8 +548,6 @@ static void mxc_isi_remove(struct platform_device *pdev)
>  
>  	mxc_isi_crossbar_cleanup(&isi->crossbar);
>  	mxc_isi_v4l2_cleanup(isi);
> -
> -	pm_runtime_disable(isi->dev);
>  }
>  
>  static const struct of_device_id mxc_isi_of_match[] = {
> 
> -- 
> 2.34.1
> 

-- 
Regards,

Laurent Pinchart


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

* Re: [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) simplify code
  2025-11-17 18:58 ` [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) " Frank Li
@ 2025-11-19  4:25   ` Laurent Pinchart
  2025-11-19  5:02     ` Laurent Pinchart
  0 siblings, 1 reply; 12+ messages in thread
From: Laurent Pinchart @ 2025-11-19  4:25 UTC (permalink / raw)
  To: Frank Li
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

Hi Frank,

Thank you for the patch.

On Mon, Nov 17, 2025 at 01:58:14PM -0500, Frank Li wrote:
> Use cleanup __free(fwnode_handle) simplify code. Change to dev_err_probe()
> because replace goto with return.
> 
> Add missed "\n" at error message.
> 
> No functional change.
> 
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
>  drivers/media/platform/nxp/imx-mipi-csis.c    | 31 +++++++++------------------
>  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 31 +++++++++------------------
>  2 files changed, 20 insertions(+), 42 deletions(-)
> 
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index ce93d868746f002c22e2f86b1e0aa84ec1a76061..d924adb406a30797b66f0094ab17e98ad44fefac 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -12,6 +12,7 @@
>   *
>   */
>  
> +#include <linux/cleanup.h>
>  #include <linux/clk.h>
>  #include <linux/debugfs.h>
>  #include <linux/delay.h>
> @@ -1349,28 +1350,25 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
>  		.bus_type = V4L2_MBUS_CSI2_DPHY,
>  	};
>  	struct v4l2_async_connection *asd;
uuu> -	struct fwnode_handle *ep;
>  	unsigned int i;
>  	int ret;
>  
>  	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
>  
> -	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> -					     FWNODE_GRAPH_ENDPOINT_NEXT);
> +	struct fwnode_handle *ep __free(fwnode_handle) =
> +		fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> +						FWNODE_GRAPH_ENDPOINT_NEXT);

Let's avoid mixing variable declarations and code, this is a style
change that is not widely accepted (yet). You can write

	struct fwnode_handle *ep __free(fwnode_handle) = NULL;
 	struct v4l2_async_connection *asd;
	unsigned int i;
	int ret;

  	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);

	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
					     FWNODE_GRAPH_ENDPOINT_NEXT);

>  	if (!ep)
>  		return -ENOTCONN;
>  
>  	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
>  	if (ret)
> -		goto err_parse;
> +		return ret;
>  
>  	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
> -		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
> -			dev_err(csis->dev,
> -				"data lanes reordering is not supported");
> -			ret = -EINVAL;
> -			goto err_parse;
> -		}
> +		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
> +			return dev_err_probe(csis->dev, -EINVAL,
> +					     "data lanes reordering is not supported\n");

To switch to dev_err_probe(), we should drop the error message in the
probe() function when mipi_csis_async_register() fails, and make sure
every error path in this function prints a message. I'd prefer splitting
that to a separate patch.

>  	}
>  
>  	csis->bus = vep.bus.mipi_csi2;
> @@ -1381,12 +1379,8 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
>  					      struct v4l2_async_connection);
> -	if (IS_ERR(asd)) {
> -		ret = PTR_ERR(asd);
> -		goto err_parse;
> -	}
> -
> -	fwnode_handle_put(ep);
> +	if (IS_ERR(asd))
> +		return PTR_ERR(asd);
>  
>  	csis->notifier.ops = &mipi_csis_notify_ops;
>  
> @@ -1395,11 +1389,6 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
>  		return ret;
>  
>  	return v4l2_async_register_subdev(&csis->sd);
> -
> -err_parse:
> -	fwnode_handle_put(ep);
> -
> -	return ret;
>  }
>  
>  /* -----------------------------------------------------------------------------
> diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> index 75709161fb26a61239b94430365849e022fdc14f..94882568405db55593c5c51722db2233a64d53e4 100644
> --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> @@ -6,6 +6,7 @@
>   */
>  
>  #include <linux/bitfield.h>
> +#include <linux/cleanup.h>
>  #include <linux/clk.h>
>  #include <linux/clk-provider.h>
>  #include <linux/delay.h>
> @@ -717,28 +718,25 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
>  		.bus_type = V4L2_MBUS_CSI2_DPHY,
>  	};
>  	struct v4l2_async_connection *asd;
> -	struct fwnode_handle *ep;
>  	unsigned int i;
>  	int ret;
>  
>  	v4l2_async_subdev_nf_init(&state->notifier, &state->sd);
>  
> -	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
> -					     FWNODE_GRAPH_ENDPOINT_NEXT);
> +	struct fwnode_handle *ep __free(fwnode_handle) =
> +		fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
> +						FWNODE_GRAPH_ENDPOINT_NEXT);

Same comment as above.

>  	if (!ep)
>  		return -ENOTCONN;
>  
>  	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
>  	if (ret)
> -		goto err_parse;
> +		return ret;
>  
>  	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
> -		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
> -			dev_err(state->dev,
> -				"data lanes reordering is not supported");
> -			ret = -EINVAL;
> -			goto err_parse;
> -		}
> +		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
> +			return dev_err_probe(state->dev, -EINVAL,
> +					     "data lanes reordering is not supported\n");

And here too.

Usage of __free(fwnode_handle) looks good, it just needs to be split to
a patch of its own.

>  	}
>  
>  	state->bus = vep.bus.mipi_csi2;
> @@ -749,12 +747,8 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
>  
>  	asd = v4l2_async_nf_add_fwnode_remote(&state->notifier, ep,
>  					      struct v4l2_async_connection);
> -	if (IS_ERR(asd)) {
> -		ret = PTR_ERR(asd);
> -		goto err_parse;
> -	}
> -
> -	fwnode_handle_put(ep);
> +	if (IS_ERR(asd))
> +		return PTR_ERR(asd);
>  
>  	state->notifier.ops = &imx8mq_mipi_csi_notify_ops;
>  
> @@ -763,11 +757,6 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
>  		return ret;
>  
>  	return v4l2_async_register_subdev(&state->sd);
> -
> -err_parse:
> -	fwnode_handle_put(ep);
> -
> -	return ret;
>  }
>  
>  /* -----------------------------------------------------------------------------

-- 
Regards,

Laurent Pinchart


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

* Re: [PATCH 2/4] media: nxp: use dev_err_probe() to simplify code
  2025-11-17 18:58 ` [PATCH 2/4] media: nxp: use dev_err_probe() to simplify code Frank Li
@ 2025-11-19  4:33   ` Laurent Pinchart
  0 siblings, 0 replies; 12+ messages in thread
From: Laurent Pinchart @ 2025-11-19  4:33 UTC (permalink / raw)
  To: Frank Li
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

Hi Frank,

Thank you for the patch.

On Mon, Nov 17, 2025 at 01:58:12PM -0500, Frank Li wrote:
> Use dev_err_probe() to simplify code. No functional change.
> 
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
>  drivers/media/platform/nxp/imx-mipi-csis.c    |  6 ++----
>  drivers/media/platform/nxp/imx7-media-csi.c   | 13 ++++---------
>  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 28 ++++++++++++---------------
>  3 files changed, 18 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index 088b2945aee33731c565f049dd17721356300b84..ce93d868746f002c22e2f86b1e0aa84ec1a76061 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -1547,10 +1547,8 @@ static int mipi_csis_probe(struct platform_device *pdev)
>  	/* Now that the hardware is initialized, request the interrupt. */
>  	ret = devm_request_irq(dev, irq, mipi_csis_irq_handler, 0,
>  			       dev_name(dev), csis);
> -	if (ret) {
> -		dev_err(dev, "Interrupt request failed\n");
> -		return ret;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret, "Interrupt request failed\n");
>  
>  	/* Initialize and register the subdev. */
>  	ret = mipi_csis_subdev_init(csis);
> diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c
> index 933a5f39f9f4c9b43ca8d2a1819d0145981266e6..82109e6884a4d931a84ef02e2bde41d0d7248511 100644
> --- a/drivers/media/platform/nxp/imx7-media-csi.c
> +++ b/drivers/media/platform/nxp/imx7-media-csi.c
> @@ -2218,11 +2218,8 @@ static int imx7_csi_probe(struct platform_device *pdev)
>  
>  	/* Acquire resources and install interrupt handler. */
>  	csi->mclk = devm_clk_get(&pdev->dev, "mclk");
> -	if (IS_ERR(csi->mclk)) {
> -		ret = PTR_ERR(csi->mclk);
> -		dev_err(dev, "Failed to get mclk: %d", ret);
> -		return ret;
> -	}
> +	if (IS_ERR(csi->mclk))
> +		return dev_err_probe(dev, PTR_ERR(csi->mclk), "Failed to get mclk\n");

		return dev_err_probe(dev, PTR_ERR(csi->mclk),
				     "Failed to get mclk\n");

>  
>  	csi->irq = platform_get_irq(pdev, 0);
>  	if (csi->irq < 0)
> @@ -2236,10 +2233,8 @@ static int imx7_csi_probe(struct platform_device *pdev)
>  
>  	ret = devm_request_irq(dev, csi->irq, imx7_csi_irq_handler, 0, "csi",
>  			       (void *)csi);
> -	if (ret < 0) {
> -		dev_err(dev, "Request CSI IRQ failed.\n");
> -		return ret;
> -	}
> +	if (ret < 0)
> +		return dev_err_probe(dev, ret, "Request CSI IRQ failed.\n");
>  
>  	/* Initialize all the media device infrastructure. */
>  	ret = imx7_csi_media_init(csi);
> diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> index 0851f4a9ae52d3096f454da643cfdc5017e000b1..75709161fb26a61239b94430365849e022fdc14f 100644
> --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> @@ -951,10 +951,9 @@ static int imx8mq_mipi_csi_parse_dt(struct csi_state *state)
>  	int ret = 0;
>  
>  	state->rst = devm_reset_control_array_get_exclusive(dev);
> -	if (IS_ERR(state->rst)) {
> -		dev_err(dev, "Failed to get reset: %pe\n", state->rst);
> -		return PTR_ERR(state->rst);
> -	}
> +	if (IS_ERR(state->rst))
> +		return dev_err_probe(dev, PTR_ERR(state->rst),
> +				     "Failed to get reset: %pe\n", state->rst);

		return dev_err_probe(dev, PTR_ERR(state->rst),
				     "Failed to get reset\n");

as dev_err_probe() prints the error already.

>  
>  	if (state->pdata->use_reg_csr) {
>  		const struct regmap_config regmap_config = {
> @@ -977,24 +976,21 @@ static int imx8mq_mipi_csi_parse_dt(struct csi_state *state)
>  
>  	ret = of_property_read_u32_array(np, "fsl,mipi-phy-gpr", out_val,
>  					 ARRAY_SIZE(out_val));
> -	if (ret) {
> -		dev_err(dev, "no fsl,mipi-phy-gpr property found: %d\n", ret);
> -		return ret;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				     "no fsl,mipi-phy-gpr property found: %d\n", ret);

		return dev_err_probe(dev, ret,
				     "no fsl,mipi-phy-gpr property found\n");

or possibly

		return dev_err_probe(dev, ret, "no %s property found\n",
				     "fsl,mipi-phy-gpr");

to enable string de-duplication (assuming it's worth it).

>  
>  	ph = *out_val;
>  
>  	node = of_find_node_by_phandle(ph);
> -	if (!node) {
> -		dev_err(dev, "Error finding node by phandle\n");
> -		return -ENODEV;
> -	}
> +	if (!node)
> +		return dev_err_probe(dev, -ENODEV, "Error finding node by phandle\n");

Line wrap here too.

> +
>  	state->phy_gpr = syscon_node_to_regmap(node);
>  	of_node_put(node);
> -	if (IS_ERR(state->phy_gpr)) {
> -		dev_err(dev, "failed to get gpr regmap: %pe\n", state->phy_gpr);
> -		return PTR_ERR(state->phy_gpr);
> -	}
> +	if (IS_ERR(state->phy_gpr))
> +		return dev_err_probe(dev, PTR_ERR(state->phy_gpr),
> +				     "failed to get gpr regmap: %pe\n", state->phy_gpr);

		return dev_err_probe(dev, PTR_ERR(state->phy_gpr),
				     "failed to get gpr regmap\n");

I think you can also drop the error message upon
imx8mq_mipi_csi_parse_dt() failure in imx8mq_mipi_csi_probe().

With those changes,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  
>  	state->phy_gpr_reg = out_val[1];
>  	dev_dbg(dev, "phy gpr register set to 0x%x\n", state->phy_gpr_reg);

-- 
Regards,

Laurent Pinchart


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

* Re: [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) simplify code
  2025-11-19  4:25   ` Laurent Pinchart
@ 2025-11-19  5:02     ` Laurent Pinchart
  2025-12-03 21:31       ` Frank Li
  0 siblings, 1 reply; 12+ messages in thread
From: Laurent Pinchart @ 2025-11-19  5:02 UTC (permalink / raw)
  To: Frank Li
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

On Wed, Nov 19, 2025 at 01:25:29PM +0900, Laurent Pinchart wrote:
> On Mon, Nov 17, 2025 at 01:58:14PM -0500, Frank Li wrote:
> > Use cleanup __free(fwnode_handle) simplify code. Change to dev_err_probe()
> > because replace goto with return.
> > 
> > Add missed "\n" at error message.
> > 
> > No functional change.
> > 
> > Signed-off-by: Frank Li <Frank.Li@nxp.com>
> > ---
> >  drivers/media/platform/nxp/imx-mipi-csis.c    | 31 +++++++++------------------
> >  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 31 +++++++++------------------
> >  2 files changed, 20 insertions(+), 42 deletions(-)
> > 
> > diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> > index ce93d868746f002c22e2f86b1e0aa84ec1a76061..d924adb406a30797b66f0094ab17e98ad44fefac 100644
> > --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> > +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> > @@ -12,6 +12,7 @@
> >   *
> >   */
> >  
> > +#include <linux/cleanup.h>
> >  #include <linux/clk.h>
> >  #include <linux/debugfs.h>
> >  #include <linux/delay.h>
> > @@ -1349,28 +1350,25 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
> >  		.bus_type = V4L2_MBUS_CSI2_DPHY,
> >  	};
> >  	struct v4l2_async_connection *asd;
> uuu> -	struct fwnode_handle *ep;
> >  	unsigned int i;
> >  	int ret;
> >  
> >  	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
> >  
> > -	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> > -					     FWNODE_GRAPH_ENDPOINT_NEXT);
> > +	struct fwnode_handle *ep __free(fwnode_handle) =
> > +		fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> > +						FWNODE_GRAPH_ENDPOINT_NEXT);
> 
> Let's avoid mixing variable declarations and code, this is a style
> change that is not widely accepted (yet). You can write
> 
> 	struct fwnode_handle *ep __free(fwnode_handle) = NULL;
>  	struct v4l2_async_connection *asd;
> 	unsigned int i;
> 	int ret;
> 
>   	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
> 
> 	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> 					     FWNODE_GRAPH_ENDPOINT_NEXT);

Quite a coincidence, there's an ongoing mail thread on LKML about this
topic:

http://lore.kernel.org/r/CAHk-=whPZoi03ZwphxiW6cuWPtC3nyKYS8_BThgztCdgPWP1WA@mail.gmail.com

> >  	if (!ep)
> >  		return -ENOTCONN;
> >  
> >  	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
> >  	if (ret)
> > -		goto err_parse;
> > +		return ret;
> >  
> >  	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
> > -		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
> > -			dev_err(csis->dev,
> > -				"data lanes reordering is not supported");
> > -			ret = -EINVAL;
> > -			goto err_parse;
> > -		}
> > +		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
> > +			return dev_err_probe(csis->dev, -EINVAL,
> > +					     "data lanes reordering is not supported\n");
> 
> To switch to dev_err_probe(), we should drop the error message in the
> probe() function when mipi_csis_async_register() fails, and make sure
> every error path in this function prints a message. I'd prefer splitting
> that to a separate patch.
> 
> >  	}
> >  
> >  	csis->bus = vep.bus.mipi_csi2;
> > @@ -1381,12 +1379,8 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
> >  
> >  	asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
> >  					      struct v4l2_async_connection);
> > -	if (IS_ERR(asd)) {
> > -		ret = PTR_ERR(asd);
> > -		goto err_parse;
> > -	}
> > -
> > -	fwnode_handle_put(ep);
> > +	if (IS_ERR(asd))
> > +		return PTR_ERR(asd);
> >  
> >  	csis->notifier.ops = &mipi_csis_notify_ops;
> >  
> > @@ -1395,11 +1389,6 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
> >  		return ret;
> >  
> >  	return v4l2_async_register_subdev(&csis->sd);
> > -
> > -err_parse:
> > -	fwnode_handle_put(ep);
> > -
> > -	return ret;
> >  }
> >  
> >  /* -----------------------------------------------------------------------------
> > diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > index 75709161fb26a61239b94430365849e022fdc14f..94882568405db55593c5c51722db2233a64d53e4 100644
> > --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > @@ -6,6 +6,7 @@
> >   */
> >  
> >  #include <linux/bitfield.h>
> > +#include <linux/cleanup.h>
> >  #include <linux/clk.h>
> >  #include <linux/clk-provider.h>
> >  #include <linux/delay.h>
> > @@ -717,28 +718,25 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
> >  		.bus_type = V4L2_MBUS_CSI2_DPHY,
> >  	};
> >  	struct v4l2_async_connection *asd;
> > -	struct fwnode_handle *ep;
> >  	unsigned int i;
> >  	int ret;
> >  
> >  	v4l2_async_subdev_nf_init(&state->notifier, &state->sd);
> >  
> > -	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
> > -					     FWNODE_GRAPH_ENDPOINT_NEXT);
> > +	struct fwnode_handle *ep __free(fwnode_handle) =
> > +		fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
> > +						FWNODE_GRAPH_ENDPOINT_NEXT);
> 
> Same comment as above.
> 
> >  	if (!ep)
> >  		return -ENOTCONN;
> >  
> >  	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
> >  	if (ret)
> > -		goto err_parse;
> > +		return ret;
> >  
> >  	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
> > -		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
> > -			dev_err(state->dev,
> > -				"data lanes reordering is not supported");
> > -			ret = -EINVAL;
> > -			goto err_parse;
> > -		}
> > +		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
> > +			return dev_err_probe(state->dev, -EINVAL,
> > +					     "data lanes reordering is not supported\n");
> 
> And here too.
> 
> Usage of __free(fwnode_handle) looks good, it just needs to be split to
> a patch of its own.
> 
> >  	}
> >  
> >  	state->bus = vep.bus.mipi_csi2;
> > @@ -749,12 +747,8 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
> >  
> >  	asd = v4l2_async_nf_add_fwnode_remote(&state->notifier, ep,
> >  					      struct v4l2_async_connection);
> > -	if (IS_ERR(asd)) {
> > -		ret = PTR_ERR(asd);
> > -		goto err_parse;
> > -	}
> > -
> > -	fwnode_handle_put(ep);
> > +	if (IS_ERR(asd))
> > +		return PTR_ERR(asd);
> >  
> >  	state->notifier.ops = &imx8mq_mipi_csi_notify_ops;
> >  
> > @@ -763,11 +757,6 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
> >  		return ret;
> >  
> >  	return v4l2_async_register_subdev(&state->sd);
> > -
> > -err_parse:
> > -	fwnode_handle_put(ep);
> > -
> > -	return ret;
> >  }
> >  
> >  /* -----------------------------------------------------------------------------

-- 
Regards,

Laurent Pinchart


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

* Re: [PATCH 1/4] media: nxp: use devm_mutex_init() simple code
  2025-11-19  4:22   ` Laurent Pinchart
@ 2025-11-19 16:17     ` Frank Li
  0 siblings, 0 replies; 12+ messages in thread
From: Frank Li @ 2025-11-19 16:17 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

On Wed, Nov 19, 2025 at 01:22:47PM +0900, Laurent Pinchart wrote:
> Hi Frank,
>
> Thank you for the patch.
>
> On Mon, Nov 17, 2025 at 01:58:11PM -0500, Frank Li wrote:
> > Use devm_mutex_init() simple code. No functional change.
> >
> > Signed-off-by: Frank Li <Frank.Li@nxp.com>
> > ---
> >  drivers/media/platform/nxp/imx-pxp.c          |  5 ++++-
> >  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 11 +++++------
> >  drivers/media/platform/nxp/mx2_emmaprp.c      |  7 +++----
> >  3 files changed, 12 insertions(+), 11 deletions(-)
>
> Given the diffstat, and the fact that devm_mutex_init() performs dynamic
> memory allocation, I'm not convinced by this change. I won't block it
> though, as I don't maintain the above drivers.

The major target is that reduce goto, which cause unneccessary complex.

it is too easy to make mistake miss placed label

Frank

>
> >
> > diff --git a/drivers/media/platform/nxp/imx-pxp.c b/drivers/media/platform/nxp/imx-pxp.c
> > index 3f9a67a6bd4d268841f85f9b69af03138300d188..32d39c8013c7eef1f9629f971cc74afecd463ac7 100644
> > --- a/drivers/media/platform/nxp/imx-pxp.c
> > +++ b/drivers/media/platform/nxp/imx-pxp.c
> > @@ -1805,6 +1805,10 @@ static int pxp_probe(struct platform_device *pdev)
> >
> >  	spin_lock_init(&dev->irqlock);
> >
> > +	ret = devm_mutex_init(&pdev->dev, &dev->dev_mutex);
> > +	if (ret)
> > +		return ret;
> > +
> >  	ret = devm_request_irq(&pdev->dev, irq, pxp_irq_handler, 0,
> >  			       dev_name(&pdev->dev), dev);
> >  	if (ret < 0) {
> > @@ -1831,7 +1835,6 @@ static int pxp_probe(struct platform_device *pdev)
> >  		goto err_clk;
> >
> >  	atomic_set(&dev->num_inst, 0);
> > -	mutex_init(&dev->dev_mutex);
> >
> >  	dev->vfd = pxp_videodev;
> >  	vfd = &dev->vfd;
> > diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > index 371b4e81328c107269f89da23818ab0abd0179da..0851f4a9ae52d3096f454da643cfdc5017e000b1 100644
> > --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > @@ -1033,15 +1033,17 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
> >
> >  	platform_set_drvdata(pdev, &state->sd);
> >
> > -	mutex_init(&state->lock);
> > +	ret = devm_mutex_init(dev, &state->lock);
> > +	if (ret)
> > +		return ret;
> >
> >  	ret = imx8mq_mipi_csi_subdev_init(state);
> >  	if (ret < 0)
> > -		goto mutex;
> > +		return ret;
> >
> >  	ret = imx8mq_mipi_csi_init_icc(pdev);
> >  	if (ret)
> > -		goto mutex;
> > +		return ret;
> >
> >  	/* Enable runtime PM. */
> >  	pm_runtime_enable(dev);
> > @@ -1068,8 +1070,6 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
> >  	v4l2_async_unregister_subdev(&state->sd);
> >  icc:
> >  	imx8mq_mipi_csi_release_icc(pdev);
> > -mutex:
> > -	mutex_destroy(&state->lock);
> >
> >  	return ret;
> >  }
> > @@ -1087,7 +1087,6 @@ static void imx8mq_mipi_csi_remove(struct platform_device *pdev)
> >  	imx8mq_mipi_csi_runtime_suspend(&pdev->dev);
> >  	media_entity_cleanup(&state->sd.entity);
> >  	v4l2_subdev_cleanup(&state->sd);
> > -	mutex_destroy(&state->lock);
> >  	pm_runtime_set_suspended(&pdev->dev);
> >  	imx8mq_mipi_csi_release_icc(pdev);
> >  }
> > diff --git a/drivers/media/platform/nxp/mx2_emmaprp.c b/drivers/media/platform/nxp/mx2_emmaprp.c
> > index 02d57229b9b3a600303cc0429e102139385071d6..384a2672884e96d17cca542ef51fbef62328b66a 100644
> > --- a/drivers/media/platform/nxp/mx2_emmaprp.c
> > +++ b/drivers/media/platform/nxp/mx2_emmaprp.c
> > @@ -824,7 +824,9 @@ static int emmaprp_probe(struct platform_device *pdev)
> >  	if (ret)
> >  		return ret;
> >
> > -	mutex_init(&pcdev->dev_mutex);
> > +	ret = devm_mutex_init(&pdev->dev, &pcdev->dev_mutex);
> > +	if (ret)
> > +		return ret;
> >
> >  	vfd = video_device_alloc();
> >  	if (!vfd) {
> > @@ -878,8 +880,6 @@ static int emmaprp_probe(struct platform_device *pdev)
> >  unreg_dev:
> >  	v4l2_device_unregister(&pcdev->v4l2_dev);
> >
> > -	mutex_destroy(&pcdev->dev_mutex);
> > -
> >  	return ret;
> >  }
> >
> > @@ -892,7 +892,6 @@ static void emmaprp_remove(struct platform_device *pdev)
> >  	video_unregister_device(pcdev->vfd);
> >  	v4l2_m2m_release(pcdev->m2m_dev);
> >  	v4l2_device_unregister(&pcdev->v4l2_dev);
> > -	mutex_destroy(&pcdev->dev_mutex);
> >  }
> >
> >  static struct platform_driver emmaprp_pdrv = {
>
> --
> Regards,
>
> Laurent Pinchart


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

* Re: [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) simplify code
  2025-11-19  5:02     ` Laurent Pinchart
@ 2025-12-03 21:31       ` Frank Li
  0 siblings, 0 replies; 12+ messages in thread
From: Frank Li @ 2025-12-03 21:31 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Philipp Zabel, Mauro Carvalho Chehab, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Rui Miguel Silva,
	Martin Kepplinger-Novakovic, Purism Kernel Team, linux-media, imx,
	linux-arm-kernel, linux-kernel

On Wed, Nov 19, 2025 at 02:02:39PM +0900, Laurent Pinchart wrote:
> On Wed, Nov 19, 2025 at 01:25:29PM +0900, Laurent Pinchart wrote:
> > On Mon, Nov 17, 2025 at 01:58:14PM -0500, Frank Li wrote:
> > > Use cleanup __free(fwnode_handle) simplify code. Change to dev_err_probe()
> > > because replace goto with return.
> > >
> > > Add missed "\n" at error message.
> > >
> > > No functional change.
> > >
> > > Signed-off-by: Frank Li <Frank.Li@nxp.com>
> > > ---
> > >  drivers/media/platform/nxp/imx-mipi-csis.c    | 31 +++++++++------------------
> > >  drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 31 +++++++++------------------
> > >  2 files changed, 20 insertions(+), 42 deletions(-)
> > >
> > > diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> > > index ce93d868746f002c22e2f86b1e0aa84ec1a76061..d924adb406a30797b66f0094ab17e98ad44fefac 100644
> > > --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> > > +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> > > @@ -12,6 +12,7 @@
> > >   *
> > >   */
> > >
> > > +#include <linux/cleanup.h>
> > >  #include <linux/clk.h>
> > >  #include <linux/debugfs.h>
> > >  #include <linux/delay.h>
> > > @@ -1349,28 +1350,25 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
> > >  		.bus_type = V4L2_MBUS_CSI2_DPHY,
> > >  	};
> > >  	struct v4l2_async_connection *asd;
> > uuu> -	struct fwnode_handle *ep;
> > >  	unsigned int i;
> > >  	int ret;
> > >
> > >  	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
> > >
> > > -	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> > > -					     FWNODE_GRAPH_ENDPOINT_NEXT);
> > > +	struct fwnode_handle *ep __free(fwnode_handle) =
> > > +		fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> > > +						FWNODE_GRAPH_ENDPOINT_NEXT);
> >
> > Let's avoid mixing variable declarations and code, this is a style
> > change that is not widely accepted (yet). You can write
> >
> > 	struct fwnode_handle *ep __free(fwnode_handle) = NULL;
> >  	struct v4l2_async_connection *asd;
> > 	unsigned int i;
> > 	int ret;
> >
> >   	v4l2_async_subdev_nf_init(&csis->notifier, &csis->sd);
> >
> > 	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csis->dev), 0, 0,
> > 					     FWNODE_GRAPH_ENDPOINT_NEXT);
>
> Quite a coincidence, there's an ongoing mail thread on LKML about this
> topic:
>
> http://lore.kernel.org/r/CAHk-=whPZoi03ZwphxiW6cuWPtC3nyKYS8_BThgztCdgPWP1WA@mail.gmail.com

Laurent:

	After read above thread and cleanup.h.

	Look like my method is prefered.

Frank

>
> > >  	if (!ep)
> > >  		return -ENOTCONN;
> > >
> > >  	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
> > >  	if (ret)
> > > -		goto err_parse;
> > > +		return ret;
> > >
> > >  	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
> > > -		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
> > > -			dev_err(csis->dev,
> > > -				"data lanes reordering is not supported");
> > > -			ret = -EINVAL;
> > > -			goto err_parse;
> > > -		}
> > > +		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
> > > +			return dev_err_probe(csis->dev, -EINVAL,
> > > +					     "data lanes reordering is not supported\n");
> >
> > To switch to dev_err_probe(), we should drop the error message in the
> > probe() function when mipi_csis_async_register() fails, and make sure
> > every error path in this function prints a message. I'd prefer splitting
> > that to a separate patch.
> >
> > >  	}
> > >
> > >  	csis->bus = vep.bus.mipi_csi2;
> > > @@ -1381,12 +1379,8 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
> > >
> > >  	asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
> > >  					      struct v4l2_async_connection);
> > > -	if (IS_ERR(asd)) {
> > > -		ret = PTR_ERR(asd);
> > > -		goto err_parse;
> > > -	}
> > > -
> > > -	fwnode_handle_put(ep);
> > > +	if (IS_ERR(asd))
> > > +		return PTR_ERR(asd);
> > >
> > >  	csis->notifier.ops = &mipi_csis_notify_ops;
> > >
> > > @@ -1395,11 +1389,6 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
> > >  		return ret;
> > >
> > >  	return v4l2_async_register_subdev(&csis->sd);
> > > -
> > > -err_parse:
> > > -	fwnode_handle_put(ep);
> > > -
> > > -	return ret;
> > >  }
> > >
> > >  /* -----------------------------------------------------------------------------
> > > diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > > index 75709161fb26a61239b94430365849e022fdc14f..94882568405db55593c5c51722db2233a64d53e4 100644
> > > --- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > > +++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
> > > @@ -6,6 +6,7 @@
> > >   */
> > >
> > >  #include <linux/bitfield.h>
> > > +#include <linux/cleanup.h>
> > >  #include <linux/clk.h>
> > >  #include <linux/clk-provider.h>
> > >  #include <linux/delay.h>
> > > @@ -717,28 +718,25 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
> > >  		.bus_type = V4L2_MBUS_CSI2_DPHY,
> > >  	};
> > >  	struct v4l2_async_connection *asd;
> > > -	struct fwnode_handle *ep;
> > >  	unsigned int i;
> > >  	int ret;
> > >
> > >  	v4l2_async_subdev_nf_init(&state->notifier, &state->sd);
> > >
> > > -	ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
> > > -					     FWNODE_GRAPH_ENDPOINT_NEXT);
> > > +	struct fwnode_handle *ep __free(fwnode_handle) =
> > > +		fwnode_graph_get_endpoint_by_id(dev_fwnode(state->dev), 0, 0,
> > > +						FWNODE_GRAPH_ENDPOINT_NEXT);
> >
> > Same comment as above.
> >
> > >  	if (!ep)
> > >  		return -ENOTCONN;
> > >
> > >  	ret = v4l2_fwnode_endpoint_parse(ep, &vep);
> > >  	if (ret)
> > > -		goto err_parse;
> > > +		return ret;
> > >
> > >  	for (i = 0; i < vep.bus.mipi_csi2.num_data_lanes; ++i) {
> > > -		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1) {
> > > -			dev_err(state->dev,
> > > -				"data lanes reordering is not supported");
> > > -			ret = -EINVAL;
> > > -			goto err_parse;
> > > -		}
> > > +		if (vep.bus.mipi_csi2.data_lanes[i] != i + 1)
> > > +			return dev_err_probe(state->dev, -EINVAL,
> > > +					     "data lanes reordering is not supported\n");
> >
> > And here too.
> >
> > Usage of __free(fwnode_handle) looks good, it just needs to be split to
> > a patch of its own.
> >
> > >  	}
> > >
> > >  	state->bus = vep.bus.mipi_csi2;
> > > @@ -749,12 +747,8 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
> > >
> > >  	asd = v4l2_async_nf_add_fwnode_remote(&state->notifier, ep,
> > >  					      struct v4l2_async_connection);
> > > -	if (IS_ERR(asd)) {
> > > -		ret = PTR_ERR(asd);
> > > -		goto err_parse;
> > > -	}
> > > -
> > > -	fwnode_handle_put(ep);
> > > +	if (IS_ERR(asd))
> > > +		return PTR_ERR(asd);
> > >
> > >  	state->notifier.ops = &imx8mq_mipi_csi_notify_ops;
> > >
> > > @@ -763,11 +757,6 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
> > >  		return ret;
> > >
> > >  	return v4l2_async_register_subdev(&state->sd);
> > > -
> > > -err_parse:
> > > -	fwnode_handle_put(ep);
> > > -
> > > -	return ret;
> > >  }
> > >
> > >  /* -----------------------------------------------------------------------------
>
> --
> Regards,
>
> Laurent Pinchart


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

end of thread, other threads:[~2025-12-03 21:32 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-17 18:58 [PATCH 0/4] media: platform: nxp: Trivial cleanup pathces Frank Li
2025-11-17 18:58 ` [PATCH 1/4] media: nxp: use devm_mutex_init() simple code Frank Li
2025-11-19  4:22   ` Laurent Pinchart
2025-11-19 16:17     ` Frank Li
2025-11-17 18:58 ` [PATCH 2/4] media: nxp: use dev_err_probe() to simplify code Frank Li
2025-11-19  4:33   ` Laurent Pinchart
2025-11-17 18:58 ` [PATCH 3/4] media: nxp: imx8-isi: use devm_pm_runtime_enable() " Frank Li
2025-11-19  4:24   ` Laurent Pinchart
2025-11-17 18:58 ` [PATCH 4/4] media: nxp: use cleanup __free(fwnode_handle) " Frank Li
2025-11-19  4:25   ` Laurent Pinchart
2025-11-19  5:02     ` Laurent Pinchart
2025-12-03 21:31       ` Frank Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox