* [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2
@ 2025-11-07 20:44 Frank Li
2025-11-07 20:44 ` [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment Frank Li
` (5 more replies)
0 siblings, 6 replies; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li, Laurent Pinchart
Previous https://lore.kernel.org/imx/20250821-95_cam-v3-0-c9286fbb34b9@nxp.com/
There are too much patches (32) in above thread.
Just extract first 6 cleanup patches to review easily. The overall road
map see above 32 patch serise.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Frank Li (6):
media: staging: media: imx6-mipi-csi2: replace space with tab for alignment
media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code
media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks
media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code
media: staging: media: imx6-mipi-csi2: use guard() to simplify code
media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() simplify code
drivers/staging/media/imx/imx6-mipi-csi2.c | 234 +++++++++++------------------
1 file changed, 89 insertions(+), 145 deletions(-)
---
base-commit: df5d79720b152e7ff058f11ed7e88d5b5c8d2a0c
change-id: 20251106-stage-csi2-cleanup-6db1715fd187
Best regards,
--
Frank Li <Frank.Li@nxp.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
@ 2025-11-07 20:44 ` Frank Li
2025-11-10 8:28 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code Frank Li
` (4 subsequent siblings)
5 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li
Replace space with tab to follow coding convention. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/staging/media/imx/imx6-mipi-csi2.c | 92 +++++++++++++++---------------
1 file changed, 46 insertions(+), 46 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index dd8c7b3233bccfc34b59e0f0ff813b36752e1526..42256441b881d9f132ad7ff899d6f1e35643b4ac 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -23,65 +23,65 @@
* there must be 5 pads: 1 input pad from sensor, and
* the 4 virtual channel output pads
*/
-#define CSI2_SINK_PAD 0
-#define CSI2_NUM_SINK_PADS 1
-#define CSI2_NUM_SRC_PADS 4
-#define CSI2_NUM_PADS 5
+#define CSI2_SINK_PAD 0
+#define CSI2_NUM_SINK_PADS 1
+#define CSI2_NUM_SRC_PADS 4
+#define CSI2_NUM_PADS 5
/*
* The default maximum bit-rate per lane in Mbps, if the
* source subdev does not provide V4L2_CID_LINK_FREQ.
*/
-#define CSI2_DEFAULT_MAX_MBPS 849
+#define CSI2_DEFAULT_MAX_MBPS 849
struct csi2_dev {
- struct device *dev;
- struct v4l2_subdev sd;
- struct v4l2_async_notifier notifier;
- struct media_pad pad[CSI2_NUM_PADS];
- struct clk *dphy_clk;
- struct clk *pllref_clk;
- struct clk *pix_clk; /* what is this? */
- void __iomem *base;
-
- struct v4l2_subdev *remote;
- unsigned int remote_pad;
- unsigned short data_lanes;
+ struct device *dev;
+ struct v4l2_subdev sd;
+ struct v4l2_async_notifier notifier;
+ struct media_pad pad[CSI2_NUM_PADS];
+ struct clk *dphy_clk;
+ struct clk *pllref_clk;
+ struct clk *pix_clk; /* what is this? */
+ void __iomem *base;
+
+ struct v4l2_subdev *remote;
+ unsigned int remote_pad;
+ unsigned short data_lanes;
/* lock to protect all members below */
- struct mutex lock;
+ struct mutex lock;
- struct v4l2_mbus_framefmt format_mbus;
+ struct v4l2_mbus_framefmt format_mbus;
- int stream_count;
- struct v4l2_subdev *src_sd;
- bool sink_linked[CSI2_NUM_SRC_PADS];
+ int stream_count;
+ struct v4l2_subdev *src_sd;
+ bool sink_linked[CSI2_NUM_SRC_PADS];
};
#define DEVICE_NAME "imx6-mipi-csi2"
/* Register offsets */
-#define CSI2_VERSION 0x000
-#define CSI2_N_LANES 0x004
-#define CSI2_PHY_SHUTDOWNZ 0x008
-#define CSI2_DPHY_RSTZ 0x00c
-#define CSI2_RESETN 0x010
-#define CSI2_PHY_STATE 0x014
-#define PHY_STOPSTATEDATA_BIT 4
-#define PHY_STOPSTATEDATA(n) BIT(PHY_STOPSTATEDATA_BIT + (n))
-#define PHY_RXCLKACTIVEHS BIT(8)
-#define PHY_RXULPSCLKNOT BIT(9)
-#define PHY_STOPSTATECLK BIT(10)
-#define CSI2_DATA_IDS_1 0x018
-#define CSI2_DATA_IDS_2 0x01c
-#define CSI2_ERR1 0x020
-#define CSI2_ERR2 0x024
-#define CSI2_MSK1 0x028
-#define CSI2_MSK2 0x02c
-#define CSI2_PHY_TST_CTRL0 0x030
+#define CSI2_VERSION 0x000
+#define CSI2_N_LANES 0x004
+#define CSI2_PHY_SHUTDOWNZ 0x008
+#define CSI2_DPHY_RSTZ 0x00c
+#define CSI2_RESETN 0x010
+#define CSI2_PHY_STATE 0x014
+#define PHY_STOPSTATEDATA_BIT 4
+#define PHY_STOPSTATEDATA(n) BIT(PHY_STOPSTATEDATA_BIT + (n))
+#define PHY_RXCLKACTIVEHS BIT(8)
+#define PHY_RXULPSCLKNOT BIT(9)
+#define PHY_STOPSTATECLK BIT(10)
+#define CSI2_DATA_IDS_1 0x018
+#define CSI2_DATA_IDS_2 0x01c
+#define CSI2_ERR1 0x020
+#define CSI2_ERR2 0x024
+#define CSI2_MSK1 0x028
+#define CSI2_MSK2 0x02c
+#define CSI2_PHY_TST_CTRL0 0x030
#define PHY_TESTCLR BIT(0)
#define PHY_TESTCLK BIT(1)
-#define CSI2_PHY_TST_CTRL1 0x034
+#define CSI2_PHY_TST_CTRL1 0x034
#define PHY_TESTEN BIT(16)
/*
* i.MX CSI2IPU Gasket registers follow. The CSI2IPU gasket is
@@ -106,13 +106,13 @@ static inline struct csi2_dev *notifier_to_dev(struct v4l2_async_notifier *n)
* reference manual is as follows:
*
* 1. Deassert presetn signal (global reset).
- * It's not clear what this "global reset" signal is (maybe APB
- * global reset), but in any case this step would be probably
- * be carried out during driver load in csi2_probe().
+ * It's not clear what this "global reset" signal is (maybe APB
+ * global reset), but in any case this step would be probably
+ * be carried out during driver load in csi2_probe().
*
* 2. Configure MIPI Camera Sensor to put all Tx lanes in LP-11 state.
- * This must be carried out by the MIPI sensor's s_power(ON) subdev
- * op.
+ * This must be carried out by the MIPI sensor's s_power(ON) subdev
+ * op.
*
* 3. D-PHY initialization.
* 4. CSI2 Controller programming (Set N_LANES, deassert PHY_SHUTDOWNZ,
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
2025-11-07 20:44 ` [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment Frank Li
@ 2025-11-07 20:44 ` Frank Li
2025-11-10 8:28 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks Frank Li
` (3 subsequent siblings)
5 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li
Use devm_add_action_or_reset() to simplify the code. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/staging/media/imx/imx6-mipi-csi2.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index 42256441b881d9f132ad7ff899d6f1e35643b4ac..eba9a650030f5e380aa900b94728ad375171c6a5 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -716,6 +716,14 @@ static int csi2_async_register(struct csi2_dev *csi2)
return ret;
}
+static void csi2_nf_cleanup(void *data)
+{
+ struct csi2_dev *csi2 = data;
+
+ v4l2_async_nf_unregister(&csi2->notifier);
+ v4l2_async_nf_cleanup(&csi2->notifier);
+}
+
static int csi2_probe(struct platform_device *pdev)
{
struct csi2_dev *csi2;
@@ -749,6 +757,10 @@ static int csi2_probe(struct platform_device *pdev)
if (ret)
return ret;
+ ret = devm_add_action_or_reset(&pdev->dev, csi2_nf_cleanup, csi2);
+ if (ret)
+ return ret;
+
csi2->pllref_clk = devm_clk_get(&pdev->dev, "ref");
if (IS_ERR(csi2->pllref_clk)) {
v4l2_err(&csi2->sd, "failed to get pll reference clock\n");
@@ -800,8 +812,6 @@ static int csi2_probe(struct platform_device *pdev)
return 0;
clean_notifier:
- v4l2_async_nf_unregister(&csi2->notifier);
- v4l2_async_nf_cleanup(&csi2->notifier);
clk_disable_unprepare(csi2->dphy_clk);
pllref_off:
clk_disable_unprepare(csi2->pllref_clk);
@@ -815,8 +825,6 @@ static void csi2_remove(struct platform_device *pdev)
struct v4l2_subdev *sd = platform_get_drvdata(pdev);
struct csi2_dev *csi2 = sd_to_dev(sd);
- v4l2_async_nf_unregister(&csi2->notifier);
- v4l2_async_nf_cleanup(&csi2->notifier);
v4l2_async_unregister_subdev(sd);
clk_disable_unprepare(csi2->dphy_clk);
clk_disable_unprepare(csi2->pllref_clk);
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
2025-11-07 20:44 ` [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment Frank Li
2025-11-07 20:44 ` [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code Frank Li
@ 2025-11-07 20:44 ` Frank Li
2025-11-10 8:22 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 4/6] media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code Frank Li
` (2 subsequent siblings)
5 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li
Use devm_clk_bulk_get_all_enabled() helper to simplify clock handling.
Defer all clock prepare and enable to csi2_start(), which previous only
enable pix clock here.
Do that safely because there are not register access before csi2_start().
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/staging/media/imx/imx6-mipi-csi2.c | 52 ++++++------------------------
1 file changed, 9 insertions(+), 43 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index eba9a650030f5e380aa900b94728ad375171c6a5..32ddcef7ec8535a44e121754bb621c0d2e226369 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -39,11 +39,11 @@ struct csi2_dev {
struct v4l2_subdev sd;
struct v4l2_async_notifier notifier;
struct media_pad pad[CSI2_NUM_PADS];
- struct clk *dphy_clk;
- struct clk *pllref_clk;
- struct clk *pix_clk; /* what is this? */
void __iomem *base;
+ struct clk_bulk_data *clks;
+ int num_clks;
+
struct v4l2_subdev *remote;
unsigned int remote_pad;
unsigned short data_lanes;
@@ -343,7 +343,7 @@ static int csi2_start(struct csi2_dev *csi2)
unsigned int lanes;
int ret;
- ret = clk_prepare_enable(csi2->pix_clk);
+ ret = clk_bulk_prepare_enable(csi2->num_clks, csi2->clks);
if (ret)
return ret;
@@ -390,7 +390,7 @@ static int csi2_start(struct csi2_dev *csi2)
err_assert_reset:
csi2_enable(csi2, false);
err_disable_clk:
- clk_disable_unprepare(csi2->pix_clk);
+ clk_bulk_disable_unprepare(csi2->num_clks, csi2->clks);
return ret;
}
@@ -401,7 +401,7 @@ static void csi2_stop(struct csi2_dev *csi2)
v4l2_subdev_call(csi2->src_sd, video, post_streamoff);
csi2_enable(csi2, false);
- clk_disable_unprepare(csi2->pix_clk);
+ clk_bulk_disable_unprepare(csi2->num_clks, csi2->clks);
}
/*
@@ -761,24 +761,6 @@ static int csi2_probe(struct platform_device *pdev)
if (ret)
return ret;
- csi2->pllref_clk = devm_clk_get(&pdev->dev, "ref");
- if (IS_ERR(csi2->pllref_clk)) {
- v4l2_err(&csi2->sd, "failed to get pll reference clock\n");
- return PTR_ERR(csi2->pllref_clk);
- }
-
- csi2->dphy_clk = devm_clk_get(&pdev->dev, "dphy");
- if (IS_ERR(csi2->dphy_clk)) {
- v4l2_err(&csi2->sd, "failed to get dphy clock\n");
- return PTR_ERR(csi2->dphy_clk);
- }
-
- csi2->pix_clk = devm_clk_get(&pdev->dev, "pix");
- if (IS_ERR(csi2->pix_clk)) {
- v4l2_err(&csi2->sd, "failed to get pixel clock\n");
- return PTR_ERR(csi2->pix_clk);
- }
-
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
v4l2_err(&csi2->sd, "failed to get platform resources\n");
@@ -791,19 +773,9 @@ static int csi2_probe(struct platform_device *pdev)
mutex_init(&csi2->lock);
- ret = clk_prepare_enable(csi2->pllref_clk);
- if (ret) {
- v4l2_err(&csi2->sd, "failed to enable pllref_clk\n");
- goto rmmutex;
- }
-
- ret = clk_prepare_enable(csi2->dphy_clk);
- if (ret) {
- v4l2_err(&csi2->sd, "failed to enable dphy_clk\n");
- goto pllref_off;
- }
-
- platform_set_drvdata(pdev, &csi2->sd);
+ csi2->num_clks = devm_clk_bulk_get_all(&pdev->dev, &csi2->clks);
+ if (csi2->num_clks < 0)
+ return dev_err_probe(&pdev->dev, csi2->num_clks, "Failed to get clocks\n");
ret = csi2_async_register(csi2);
if (ret)
@@ -812,10 +784,6 @@ static int csi2_probe(struct platform_device *pdev)
return 0;
clean_notifier:
- clk_disable_unprepare(csi2->dphy_clk);
-pllref_off:
- clk_disable_unprepare(csi2->pllref_clk);
-rmmutex:
mutex_destroy(&csi2->lock);
return ret;
}
@@ -826,8 +794,6 @@ static void csi2_remove(struct platform_device *pdev)
struct csi2_dev *csi2 = sd_to_dev(sd);
v4l2_async_unregister_subdev(sd);
- clk_disable_unprepare(csi2->dphy_clk);
- clk_disable_unprepare(csi2->pllref_clk);
mutex_destroy(&csi2->lock);
media_entity_cleanup(&sd->entity);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 4/6] media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
` (2 preceding siblings ...)
2025-11-07 20:44 ` [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks Frank Li
@ 2025-11-07 20:44 ` Frank Li
2025-11-10 8:23 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 5/6] media: staging: media: imx6-mipi-csi2: use guard() " Frank Li
2025-11-07 20:44 ` [PATCH 6/6] media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() " Frank Li
5 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li
Use devm_mutex_init() to simplify the code. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/staging/media/imx/imx6-mipi-csi2.c | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index 32ddcef7ec8535a44e121754bb621c0d2e226369..f8d0b3b8b250774af51f2aba731e639131aceff9 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -771,30 +771,23 @@ static int csi2_probe(struct platform_device *pdev)
if (!csi2->base)
return -ENOMEM;
- mutex_init(&csi2->lock);
+ ret = devm_mutex_init(&pdev->dev, &csi2->lock);
+ if (ret)
+ return ret;
csi2->num_clks = devm_clk_bulk_get_all(&pdev->dev, &csi2->clks);
if (csi2->num_clks < 0)
return dev_err_probe(&pdev->dev, csi2->num_clks, "Failed to get clocks\n");
- ret = csi2_async_register(csi2);
- if (ret)
- goto clean_notifier;
+ return csi2_async_register(csi2);
- return 0;
-
-clean_notifier:
- mutex_destroy(&csi2->lock);
- return ret;
}
static void csi2_remove(struct platform_device *pdev)
{
struct v4l2_subdev *sd = platform_get_drvdata(pdev);
- struct csi2_dev *csi2 = sd_to_dev(sd);
v4l2_async_unregister_subdev(sd);
- mutex_destroy(&csi2->lock);
media_entity_cleanup(&sd->entity);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 5/6] media: staging: media: imx6-mipi-csi2: use guard() to simplify code
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
` (3 preceding siblings ...)
2025-11-07 20:44 ` [PATCH 4/6] media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code Frank Li
@ 2025-11-07 20:44 ` Frank Li
2025-11-10 8:27 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 6/6] media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() " Frank Li
5 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li
Use guard() to simplify mutex locking. No functional change.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/staging/media/imx/imx6-mipi-csi2.c | 54 +++++++++++-------------------
1 file changed, 19 insertions(+), 35 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index f8d0b3b8b250774af51f2aba731e639131aceff9..54e9491d3428686288a5bc9bb58a5a0a25aca696 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -413,21 +413,17 @@ static int csi2_s_stream(struct v4l2_subdev *sd, int enable)
struct csi2_dev *csi2 = sd_to_dev(sd);
int i, ret = 0;
- mutex_lock(&csi2->lock);
+ guard(mutex)(&csi2->lock);
- if (!csi2->src_sd) {
- ret = -EPIPE;
- goto out;
- }
+ if (!csi2->src_sd)
+ return -EPIPE;
for (i = 0; i < CSI2_NUM_SRC_PADS; i++) {
if (csi2->sink_linked[i])
break;
}
- if (i >= CSI2_NUM_SRC_PADS) {
- ret = -EPIPE;
- goto out;
- }
+ if (i >= CSI2_NUM_SRC_PADS)
+ return -EPIPE;
/*
* enable/disable streaming only if stream_count is
@@ -442,14 +438,12 @@ static int csi2_s_stream(struct v4l2_subdev *sd, int enable)
else
csi2_stop(csi2);
if (ret)
- goto out;
+ return ret;
update_count:
csi2->stream_count += enable ? 1 : -1;
if (csi2->stream_count < 0)
csi2->stream_count = 0;
-out:
- mutex_unlock(&csi2->lock);
return ret;
}
@@ -467,32 +461,28 @@ static int csi2_link_setup(struct media_entity *entity,
remote_sd = media_entity_to_v4l2_subdev(remote->entity);
- mutex_lock(&csi2->lock);
+ guard(mutex)(&csi2->lock);
if (local->flags & MEDIA_PAD_FL_SOURCE) {
if (flags & MEDIA_LNK_FL_ENABLED) {
- if (csi2->sink_linked[local->index - 1]) {
- ret = -EBUSY;
- goto out;
- }
+ if (csi2->sink_linked[local->index - 1])
+ return -EBUSY;
+
csi2->sink_linked[local->index - 1] = true;
} else {
csi2->sink_linked[local->index - 1] = false;
}
} else {
if (flags & MEDIA_LNK_FL_ENABLED) {
- if (csi2->src_sd) {
- ret = -EBUSY;
- goto out;
- }
+ if (csi2->src_sd)
+ return -EBUSY;
+
csi2->src_sd = remote_sd;
} else {
csi2->src_sd = NULL;
}
}
-out:
- mutex_unlock(&csi2->lock);
return ret;
}
@@ -513,14 +503,12 @@ static int csi2_get_fmt(struct v4l2_subdev *sd,
struct csi2_dev *csi2 = sd_to_dev(sd);
struct v4l2_mbus_framefmt *fmt;
- mutex_lock(&csi2->lock);
+ guard(mutex)(&csi2->lock);
fmt = __csi2_get_fmt(csi2, sd_state, sdformat->pad, sdformat->which);
sdformat->format = *fmt;
- mutex_unlock(&csi2->lock);
-
return 0;
}
@@ -530,17 +518,14 @@ static int csi2_set_fmt(struct v4l2_subdev *sd,
{
struct csi2_dev *csi2 = sd_to_dev(sd);
struct v4l2_mbus_framefmt *fmt;
- int ret = 0;
if (sdformat->pad >= CSI2_NUM_PADS)
return -EINVAL;
- mutex_lock(&csi2->lock);
+ guard(mutex)(&csi2->lock);
- if (csi2->stream_count > 0) {
- ret = -EBUSY;
- goto out;
- }
+ if (csi2->stream_count > 0)
+ return -EBUSY;
/* Output pads mirror active input pad, no limits on input pads */
if (sdformat->pad != CSI2_SINK_PAD)
@@ -549,9 +534,8 @@ static int csi2_set_fmt(struct v4l2_subdev *sd,
fmt = __csi2_get_fmt(csi2, sd_state, sdformat->pad, sdformat->which);
*fmt = sdformat->format;
-out:
- mutex_unlock(&csi2->lock);
- return ret;
+
+ return 0;
}
static int csi2_registered(struct v4l2_subdev *sd)
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 6/6] media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() simplify code
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
` (4 preceding siblings ...)
2025-11-07 20:44 ` [PATCH 5/6] media: staging: media: imx6-mipi-csi2: use guard() " Frank Li
@ 2025-11-07 20:44 ` Frank Li
2025-11-10 7:59 ` Philipp Zabel
5 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-11-07 20:44 UTC (permalink / raw)
To: Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Frank Li, Laurent Pinchart
Use devm_platform_ioremap_resource() simplify code. No functional change.
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
change in v4
- add Laurent Pinchart's review tags
- return PTR_ERR(csi2->base) directly.
---
drivers/staging/media/imx/imx6-mipi-csi2.c | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index 54e9491d3428686288a5bc9bb58a5a0a25aca696..3d590968483e4f70d284f8abe2e789a7f32e6728 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
@@ -711,7 +711,6 @@ static void csi2_nf_cleanup(void *data)
static int csi2_probe(struct platform_device *pdev)
{
struct csi2_dev *csi2;
- struct resource *res;
int i, ret;
csi2 = devm_kzalloc(&pdev->dev, sizeof(*csi2), GFP_KERNEL);
@@ -745,15 +744,9 @@ static int csi2_probe(struct platform_device *pdev)
if (ret)
return ret;
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- v4l2_err(&csi2->sd, "failed to get platform resources\n");
- return -ENODEV;
- }
-
- csi2->base = devm_ioremap(&pdev->dev, res->start, PAGE_SIZE);
- if (!csi2->base)
- return -ENOMEM;
+ csi2->base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(csi2->base))
+ return PTR_ERR(csi2->base);
ret = devm_mutex_init(&pdev->dev, &csi2->lock);
if (ret)
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 6/6] media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() simplify code
2025-11-07 20:44 ` [PATCH 6/6] media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() " Frank Li
@ 2025-11-10 7:59 ` Philipp Zabel
0 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2025-11-10 7:59 UTC (permalink / raw)
To: Frank Li, Steve Longerbeam, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel,
Laurent Pinchart
On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> Use devm_platform_ioremap_resource() simplify code. No functional change.
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
regards
Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks
2025-11-07 20:44 ` [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks Frank Li
@ 2025-11-10 8:22 ` Philipp Zabel
2025-11-10 15:20 ` Frank Li
0 siblings, 1 reply; 15+ messages in thread
From: Philipp Zabel @ 2025-11-10 8:22 UTC (permalink / raw)
To: Frank Li, Steve Longerbeam, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> Use devm_clk_bulk_get_all_enabled() helper to simplify clock handling.
>
> Defer all clock prepare and enable to csi2_start(), which previous only
> enable pix clock here.
>
> Do that safely because there are not register access before csi2_start().
What about log_status()?
regards
Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 4/6] media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code
2025-11-07 20:44 ` [PATCH 4/6] media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code Frank Li
@ 2025-11-10 8:23 ` Philipp Zabel
0 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2025-11-10 8:23 UTC (permalink / raw)
To: Frank Li, Steve Longerbeam, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> Use devm_mutex_init() to simplify the code. No functional change.
>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Although I think this should come before patches 2 and 3.
regards
Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 5/6] media: staging: media: imx6-mipi-csi2: use guard() to simplify code
2025-11-07 20:44 ` [PATCH 5/6] media: staging: media: imx6-mipi-csi2: use guard() " Frank Li
@ 2025-11-10 8:27 ` Philipp Zabel
0 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2025-11-10 8:27 UTC (permalink / raw)
To: Frank Li, Steve Longerbeam, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> Use guard() to simplify mutex locking. No functional change.
>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
> drivers/staging/media/imx/imx6-mipi-csi2.c | 54 +++++++++++-------------------
> 1 file changed, 19 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> index f8d0b3b8b250774af51f2aba731e639131aceff9..54e9491d3428686288a5bc9bb58a5a0a25aca696 100644
> --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> @@ -413,21 +413,17 @@ static int csi2_s_stream(struct v4l2_subdev *sd, int enable)
> struct csi2_dev *csi2 = sd_to_dev(sd);
> int i, ret = 0;
>
> - mutex_lock(&csi2->lock);
> + guard(mutex)(&csi2->lock);
>
> - if (!csi2->src_sd) {
> - ret = -EPIPE;
> - goto out;
> - }
> + if (!csi2->src_sd)
> + return -EPIPE;
>
> for (i = 0; i < CSI2_NUM_SRC_PADS; i++) {
> if (csi2->sink_linked[i])
> break;
> }
> - if (i >= CSI2_NUM_SRC_PADS) {
> - ret = -EPIPE;
> - goto out;
> - }
> + if (i >= CSI2_NUM_SRC_PADS)
> + return -EPIPE;
>
> /*
> * enable/disable streaming only if stream_count is
> @@ -442,14 +438,12 @@ static int csi2_s_stream(struct v4l2_subdev *sd, int enable)
> else
> csi2_stop(csi2);
> if (ret)
> - goto out;
> + return ret;
>
> update_count:
> csi2->stream_count += enable ? 1 : -1;
> if (csi2->stream_count < 0)
> csi2->stream_count = 0;
> -out:
> - mutex_unlock(&csi2->lock);
> return ret;
This is mixing goto and cleanup in the same function, which the scope-
based cleanup helpers documentation suggests shouldn't be done.
In this case I see no problem because we only jump to update_count from
under the lock, but since issues with gotos around automatic cleanup
are easy to miss, I think it would be better to also turn the
update_count jump into a conditional block.
regards
Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code
2025-11-07 20:44 ` [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code Frank Li
@ 2025-11-10 8:28 ` Philipp Zabel
2025-11-10 15:39 ` Frank Li
0 siblings, 1 reply; 15+ messages in thread
From: Philipp Zabel @ 2025-11-10 8:28 UTC (permalink / raw)
To: Frank Li, Steve Longerbeam, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> Use devm_add_action_or_reset() to simplify the code. No functional change.
>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
> drivers/staging/media/imx/imx6-mipi-csi2.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> index 42256441b881d9f132ad7ff899d6f1e35643b4ac..eba9a650030f5e380aa900b94728ad375171c6a5 100644
> --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> @@ -716,6 +716,14 @@ static int csi2_async_register(struct csi2_dev *csi2)
> return ret;
> }
>
> +static void csi2_nf_cleanup(void *data)
> +{
> + struct csi2_dev *csi2 = data;
> +
> + v4l2_async_nf_unregister(&csi2->notifier);
> + v4l2_async_nf_cleanup(&csi2->notifier);
> +}
> +
> static int csi2_probe(struct platform_device *pdev)
> {
> struct csi2_dev *csi2;
> @@ -749,6 +757,10 @@ static int csi2_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> + ret = devm_add_action_or_reset(&pdev->dev, csi2_nf_cleanup, csi2);
> + if (ret)
> + return ret;
> +
> csi2->pllref_clk = devm_clk_get(&pdev->dev, "ref");
> if (IS_ERR(csi2->pllref_clk)) {
> v4l2_err(&csi2->sd, "failed to get pll reference clock\n");
> @@ -800,8 +812,6 @@ static int csi2_probe(struct platform_device *pdev)
> return 0;
>
> clean_notifier:
> - v4l2_async_nf_unregister(&csi2->notifier);
> - v4l2_async_nf_cleanup(&csi2->notifier);
> clk_disable_unprepare(csi2->dphy_clk);
> pllref_off:
> clk_disable_unprepare(csi2->pllref_clk);
> @@ -815,8 +825,6 @@ static void csi2_remove(struct platform_device *pdev)
> struct v4l2_subdev *sd = platform_get_drvdata(pdev);
> struct csi2_dev *csi2 = sd_to_dev(sd);
>
> - v4l2_async_nf_unregister(&csi2->notifier);
> - v4l2_async_nf_cleanup(&csi2->notifier);
> v4l2_async_unregister_subdev(sd);
This effectively moves the notifier unregister after the subdev
unregister. Is that safe to do?
regards
Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment
2025-11-07 20:44 ` [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment Frank Li
@ 2025-11-10 8:28 ` Philipp Zabel
0 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2025-11-10 8:28 UTC (permalink / raw)
To: Frank Li, Steve Longerbeam, Mauro Carvalho Chehab,
Greg Kroah-Hartman, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam
Cc: imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> Replace space with tab to follow coding convention. No functional change.
Which convention? To be honest, this feels a bit like unnecessary churn
to me.
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
>
> ---
> drivers/staging/media/imx/imx6-mipi-csi2.c | 92 +++++++++++++++---------------
> 1 file changed, 46 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> index dd8c7b3233bccfc34b59e0f0ff813b36752e1526..42256441b881d9f132ad7ff899d6f1e35643b4ac 100644
> --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> @@ -23,65 +23,65 @@
> * there must be 5 pads: 1 input pad from sensor, and
> * the 4 virtual channel output pads
> */
> -#define CSI2_SINK_PAD 0
> -#define CSI2_NUM_SINK_PADS 1
> -#define CSI2_NUM_SRC_PADS 4
> -#define CSI2_NUM_PADS 5
> +#define CSI2_SINK_PAD 0
> +#define CSI2_NUM_SINK_PADS 1
> +#define CSI2_NUM_SRC_PADS 4
> +#define CSI2_NUM_PADS 5
>
> /*
> * The default maximum bit-rate per lane in Mbps, if the
> * source subdev does not provide V4L2_CID_LINK_FREQ.
> */
> -#define CSI2_DEFAULT_MAX_MBPS 849
> +#define CSI2_DEFAULT_MAX_MBPS 849
Personally, I like these changes.
> struct csi2_dev {
> - struct device *dev;
> - struct v4l2_subdev sd;
> - struct v4l2_async_notifier notifier;
> - struct media_pad pad[CSI2_NUM_PADS];
> - struct clk *dphy_clk;
> - struct clk *pllref_clk;
> - struct clk *pix_clk; /* what is this? */
> - void __iomem *base;
> -
> - struct v4l2_subdev *remote;
> - unsigned int remote_pad;
> - unsigned short data_lanes;
> + struct device *dev;
> + struct v4l2_subdev sd;
> + struct v4l2_async_notifier notifier;
> + struct media_pad pad[CSI2_NUM_PADS];
> + struct clk *dphy_clk;
> + struct clk *pllref_clk;
> + struct clk *pix_clk; /* what is this? */
> + void __iomem *base;
> +
> + struct v4l2_subdev *remote;
> + unsigned int remote_pad;
> + unsigned short data_lanes;
>
> /* lock to protect all members below */
> - struct mutex lock;
> + struct mutex lock;
>
> - struct v4l2_mbus_framefmt format_mbus;
> + struct v4l2_mbus_framefmt format_mbus;
>
> - int stream_count;
> - struct v4l2_subdev *src_sd;
> - bool sink_linked[CSI2_NUM_SRC_PADS];
> + int stream_count;
> + struct v4l2_subdev *src_sd;
> + bool sink_linked[CSI2_NUM_SRC_PADS];
> };
Here I'd prefer just a single space between type and identifier.
regards
Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks
2025-11-10 8:22 ` Philipp Zabel
@ 2025-11-10 15:20 ` Frank Li
0 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2025-11-10 15:20 UTC (permalink / raw)
To: Philipp Zabel
Cc: Steve Longerbeam, Mauro Carvalho Chehab, Greg Kroah-Hartman,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Mon, Nov 10, 2025 at 09:22:30AM +0100, Philipp Zabel wrote:
> On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> > Use devm_clk_bulk_get_all_enabled() helper to simplify clock handling.
> >
> > Defer all clock prepare and enable to csi2_start(), which previous only
> > enable pix clock here.
> >
> > Do that safely because there are not register access before csi2_start().
>
> What about log_status()?
Good capture, It should add clk_get/put in log_status(). Plan to change to
use runtime pm to manage clock later.
Frank
>
> regards
> Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code
2025-11-10 8:28 ` Philipp Zabel
@ 2025-11-10 15:39 ` Frank Li
0 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2025-11-10 15:39 UTC (permalink / raw)
To: Philipp Zabel
Cc: Steve Longerbeam, Mauro Carvalho Chehab, Greg Kroah-Hartman,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
imx, linux-media, linux-staging, linux-arm-kernel, linux-kernel
On Mon, Nov 10, 2025 at 09:28:24AM +0100, Philipp Zabel wrote:
> On Fr, 2025-11-07 at 15:44 -0500, Frank Li wrote:
> > Use devm_add_action_or_reset() to simplify the code. No functional change.
> >
> > Signed-off-by: Frank Li <Frank.Li@nxp.com>
> > ---
> > drivers/staging/media/imx/imx6-mipi-csi2.c | 16 ++++++++++++----
> > 1 file changed, 12 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
> > index 42256441b881d9f132ad7ff899d6f1e35643b4ac..eba9a650030f5e380aa900b94728ad375171c6a5 100644
> > --- a/drivers/staging/media/imx/imx6-mipi-csi2.c
> > +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c
> > @@ -716,6 +716,14 @@ static int csi2_async_register(struct csi2_dev *csi2)
> > return ret;
> > }
> >
> > +static void csi2_nf_cleanup(void *data)
> > +{
> > + struct csi2_dev *csi2 = data;
> > +
> > + v4l2_async_nf_unregister(&csi2->notifier);
> > + v4l2_async_nf_cleanup(&csi2->notifier);
> > +}
> > +
> > static int csi2_probe(struct platform_device *pdev)
> > {
> > struct csi2_dev *csi2;
> > @@ -749,6 +757,10 @@ static int csi2_probe(struct platform_device *pdev)
> > if (ret)
> > return ret;
> >
> > + ret = devm_add_action_or_reset(&pdev->dev, csi2_nf_cleanup, csi2);
> > + if (ret)
> > + return ret;
> > +
> > csi2->pllref_clk = devm_clk_get(&pdev->dev, "ref");
> > if (IS_ERR(csi2->pllref_clk)) {
> > v4l2_err(&csi2->sd, "failed to get pll reference clock\n");
> > @@ -800,8 +812,6 @@ static int csi2_probe(struct platform_device *pdev)
> > return 0;
> >
> > clean_notifier:
> > - v4l2_async_nf_unregister(&csi2->notifier);
> > - v4l2_async_nf_cleanup(&csi2->notifier);
> > clk_disable_unprepare(csi2->dphy_clk);
> > pllref_off:
> > clk_disable_unprepare(csi2->pllref_clk);
> > @@ -815,8 +825,6 @@ static void csi2_remove(struct platform_device *pdev)
> > struct v4l2_subdev *sd = platform_get_drvdata(pdev);
> > struct csi2_dev *csi2 = sd_to_dev(sd);
> >
> > - v4l2_async_nf_unregister(&csi2->notifier);
> > - v4l2_async_nf_cleanup(&csi2->notifier);
> > v4l2_async_unregister_subdev(sd);
>
> This effectively moves the notifier unregister after the subdev
> unregister. Is that safe to do?
Good question:
I think, it'd better to provide devm_v4l2_*() helper functions for these.
I am not sure why there are not devm_v4l2*() helper functions now.
Frank
>
>
> regards
> Philipp
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-11-10 15:39 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-07 20:44 [PATCH 0/6] media: staging: media: imx6-mipi-csi2: trivial cleanup to prepare convert to common dw mipi csi2 Frank Li
2025-11-07 20:44 ` [PATCH 1/6] media: staging: media: imx6-mipi-csi2: replace space with tab for alignment Frank Li
2025-11-10 8:28 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 2/6] media: staging: media: imx6-mipi-csi2: use devm_add_action_or_reset() to simplify code Frank Li
2025-11-10 8:28 ` Philipp Zabel
2025-11-10 15:39 ` Frank Li
2025-11-07 20:44 ` [PATCH 3/6] media: staging: media: imx6-mipi-csi2: use devm_clk_bulk_get_all() to fetch clocks Frank Li
2025-11-10 8:22 ` Philipp Zabel
2025-11-10 15:20 ` Frank Li
2025-11-07 20:44 ` [PATCH 4/6] media: staging: media: imx6-mipi-csi2: use devm_mutex_init() to simplify code Frank Li
2025-11-10 8:23 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 5/6] media: staging: media: imx6-mipi-csi2: use guard() " Frank Li
2025-11-10 8:27 ` Philipp Zabel
2025-11-07 20:44 ` [PATCH 6/6] media: staging: media: imx6-mipi-csi2: use devm_platform_ioremap_resource() " Frank Li
2025-11-10 7:59 ` Philipp Zabel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).