]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: imx8mq-mipi-csi2: Use devm_clk_bulk_get_all() to fetch clocks
authorGuoniu Zhou <guoniu.zhou@nxp.com>
Fri, 5 Dec 2025 09:07:44 +0000 (17:07 +0800)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 24 Mar 2026 21:14:44 +0000 (22:14 +0100)
Use devm_clk_bulk_get_all() helper to simplify clock handle code.

No functional changes intended.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Guoniu Zhou <guoniu.zhou@nxp.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patch.msgid.link/20251205-csi2_imx8ulp-v10-2-190cdadb20a3@nxp.com
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/nxp/imx8mq-mipi-csi2.c

index 0d056021113aa48e6e640b92f2db8e35c29277e4..be945da9bb5eb5830671ea73e9f8fe009a34c1cc 100644 (file)
@@ -72,21 +72,6 @@ enum {
        ST_SUSPENDED    = 4,
 };
 
-enum imx8mq_mipi_csi_clk {
-       CSI2_CLK_CORE,
-       CSI2_CLK_ESC,
-       CSI2_CLK_UI,
-       CSI2_NUM_CLKS,
-};
-
-static const char * const imx8mq_mipi_csi_clk_id[CSI2_NUM_CLKS] = {
-       [CSI2_CLK_CORE] = "core",
-       [CSI2_CLK_ESC] = "esc",
-       [CSI2_CLK_UI] = "ui",
-};
-
-#define CSI2_NUM_CLKS  ARRAY_SIZE(imx8mq_mipi_csi_clk_id)
-
 struct imx8mq_plat_data {
        int (*enable)(struct csi_state *state, u32 hs_settle);
        void (*disable)(struct csi_state *state);
@@ -112,7 +97,9 @@ struct csi_state {
        struct device *dev;
        const struct imx8mq_plat_data *pdata;
        void __iomem *regs;
-       struct clk_bulk_data clks[CSI2_NUM_CLKS];
+       struct clk_bulk_data *clks;
+       struct clk *esc_clk;
+       u32 num_clks;
        struct reset_control *rst;
        struct regulator *mipi_phy_regulator;
 
@@ -385,24 +372,16 @@ static void imx8mq_mipi_csi_set_params(struct csi_state *state)
                              CSI2RX_SEND_LEVEL);
 }
 
-static int imx8mq_mipi_csi_clk_enable(struct csi_state *state)
-{
-       return clk_bulk_prepare_enable(CSI2_NUM_CLKS, state->clks);
-}
-
-static void imx8mq_mipi_csi_clk_disable(struct csi_state *state)
-{
-       clk_bulk_disable_unprepare(CSI2_NUM_CLKS, state->clks);
-}
-
-static int imx8mq_mipi_csi_clk_get(struct csi_state *state)
+static struct clk *imx8mq_mipi_csi_find_esc_clk(struct csi_state *state)
 {
        unsigned int i;
 
-       for (i = 0; i < CSI2_NUM_CLKS; i++)
-               state->clks[i].id = imx8mq_mipi_csi_clk_id[i];
+       for (i = 0; i < state->num_clks; i++) {
+               if (!strcmp(state->clks[i].id, "esc"))
+                       return state->clks[i].clk;
+       }
 
-       return devm_clk_bulk_get(state->dev, CSI2_NUM_CLKS, state->clks);
+       return ERR_PTR(-ENODEV);
 }
 
 static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state,
@@ -457,7 +436,7 @@ static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state,
         * documentation recommends picking a value away from the boundaries.
         * Let's pick the average.
         */
-       esc_clk_rate = clk_get_rate(state->clks[CSI2_CLK_ESC].clk);
+       esc_clk_rate = clk_get_rate(state->esc_clk);
        if (!esc_clk_rate) {
                dev_err(state->dev, "Could not get esc clock rate.\n");
                return -EINVAL;
@@ -781,7 +760,7 @@ static void imx8mq_mipi_csi_pm_suspend(struct device *dev)
 
        if (state->state & ST_POWERED) {
                imx8mq_mipi_csi_stop_stream(state);
-               imx8mq_mipi_csi_clk_disable(state);
+               clk_bulk_disable_unprepare(state->num_clks, state->clks);
                state->state &= ~ST_POWERED;
        }
 
@@ -799,7 +778,7 @@ static int imx8mq_mipi_csi_pm_resume(struct device *dev)
 
        if (!(state->state & ST_POWERED)) {
                state->state |= ST_POWERED;
-               ret = imx8mq_mipi_csi_clk_enable(state);
+               ret = clk_bulk_prepare_enable(state->num_clks, state->clks);
        }
        if (state->state & ST_STREAMING) {
                sd_state = v4l2_subdev_lock_and_get_active_state(sd);
@@ -1020,9 +999,16 @@ static int imx8mq_mipi_csi_probe(struct platform_device *pdev)
        if (IS_ERR(state->regs))
                return PTR_ERR(state->regs);
 
-       ret = imx8mq_mipi_csi_clk_get(state);
+       ret = devm_clk_bulk_get_all(dev, &state->clks);
        if (ret < 0)
-               return ret;
+               return dev_err_probe(dev, ret, "Failed to get clocks\n");
+
+       state->num_clks = ret;
+
+       state->esc_clk = imx8mq_mipi_csi_find_esc_clk(state);
+       if (IS_ERR(state->esc_clk))
+               return dev_err_probe(dev, PTR_ERR(state->esc_clk),
+                                    "Couldn't find esc clock\n");
 
        platform_set_drvdata(pdev, &state->sd);