]> www.infradead.org Git - users/hch/misc.git/commitdiff
media: rkisp1: Refactor clocks initialization
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 16 Jun 2025 01:11:12 +0000 (04:11 +0300)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Sun, 31 Aug 2025 09:10:07 +0000 (11:10 +0200)
ISP instances in different SoCs differ in the number of clocks they use,
but not in the clock names. Refactor clocks initialization to avoid
duplicating the clock names per platform, and lower the total number of
clocks from 8 to 4 as no platform uses more than 4 clocks. Use a static
assert to ensure at build time that the size of the arrays match.

Link: https://lore.kernel.org/r/20250616011115.19515-4-laurent.pinchart@ideasonboard.com
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c

index 5f187f9efc7b5960e545333b98124849e265197b..4bd459edf899b0c575e8e75b1983ae53999a1425 100644 (file)
@@ -55,7 +55,7 @@ struct regmap;
 #define RKISP1_BUS_INFO                                "platform:" RKISP1_DRIVER_NAME
 
 /* maximum number of clocks */
-#define RKISP1_MAX_BUS_CLK                     8
+#define RKISP1_MAX_BUS_CLK                     4
 
 /* a bitmask of the ready stats */
 #define RKISP1_STATS_MEAS_MASK                 (RKISP1_CIF_ISP_AWB_DONE |      \
@@ -139,8 +139,7 @@ enum rkisp1_feature {
 /*
  * struct rkisp1_info - Model-specific ISP Information
  *
- * @clks: array of ISP clock names
- * @clk_size: number of entries in the @clks array
+ * @num_clocks: number of clocks
  * @isrs: array of ISP interrupt descriptors
  * @isr_size: number of entries in the @isrs array
  * @isp_ver: ISP version
@@ -152,8 +151,7 @@ enum rkisp1_feature {
  * ISP model, version, or integration in a particular SoC.
  */
 struct rkisp1_info {
-       const char * const *clks;
-       unsigned int clk_size;
+       unsigned int num_clocks;
        const struct rkisp1_isr_data *isrs;
        unsigned int isr_size;
        enum rkisp1_cif_isp_version isp_ver;
index dc65a7924f8ae6f95e7c93c4339619cd90881a62..0788b7a64ae9c3aa8599e0d1ce6354546b2c60e5 100644 (file)
@@ -8,6 +8,7 @@
  * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
  */
 
+#include <linux/build_bug.h>
 #include <linux/clk.h>
 #include <linux/interrupt.h>
 #include <linux/mfd/syscon.h>
@@ -491,13 +492,6 @@ static irqreturn_t rkisp1_isr(int irq, void *ctx)
        return ret;
 }
 
-static const char * const px30_isp_clks[] = {
-       "isp",
-       "aclk",
-       "hclk",
-       "pclk",
-};
-
 static const struct rkisp1_isr_data px30_isp_isrs[] = {
        { "isp", rkisp1_isp_isr, BIT(RKISP1_IRQ_ISP) },
        { "mi", rkisp1_capture_isr, BIT(RKISP1_IRQ_MI) },
@@ -505,8 +499,7 @@ static const struct rkisp1_isr_data px30_isp_isrs[] = {
 };
 
 static const struct rkisp1_info px30_isp_info = {
-       .clks = px30_isp_clks,
-       .clk_size = ARRAY_SIZE(px30_isp_clks),
+       .num_clocks = 4,
        .isrs = px30_isp_isrs,
        .isr_size = ARRAY_SIZE(px30_isp_isrs),
        .isp_ver = RKISP1_V12,
@@ -518,19 +511,12 @@ static const struct rkisp1_info px30_isp_info = {
        .max_height = 2448,
 };
 
-static const char * const rk3399_isp_clks[] = {
-       "isp",
-       "aclk",
-       "hclk",
-};
-
 static const struct rkisp1_isr_data rk3399_isp_isrs[] = {
        { NULL, rkisp1_isr, BIT(RKISP1_IRQ_ISP) | BIT(RKISP1_IRQ_MI) | BIT(RKISP1_IRQ_MIPI) },
 };
 
 static const struct rkisp1_info rk3399_isp_info = {
-       .clks = rk3399_isp_clks,
-       .clk_size = ARRAY_SIZE(rk3399_isp_clks),
+       .num_clocks = 3,
        .isrs = rk3399_isp_isrs,
        .isr_size = ARRAY_SIZE(rk3399_isp_isrs),
        .isp_ver = RKISP1_V10,
@@ -542,19 +528,12 @@ static const struct rkisp1_info rk3399_isp_info = {
        .max_height = 3312,
 };
 
-static const char * const imx8mp_isp_clks[] = {
-       "isp",
-       "hclk",
-       "aclk",
-};
-
 static const struct rkisp1_isr_data imx8mp_isp_isrs[] = {
        { NULL, rkisp1_isr, BIT(RKISP1_IRQ_ISP) | BIT(RKISP1_IRQ_MI) },
 };
 
 static const struct rkisp1_info imx8mp_isp_info = {
-       .clks = imx8mp_isp_clks,
-       .clk_size = ARRAY_SIZE(imx8mp_isp_clks),
+       .num_clocks = 3,
        .isrs = imx8mp_isp_isrs,
        .isr_size = ARRAY_SIZE(imx8mp_isp_isrs),
        .isp_ver = RKISP1_V_IMX8MP,
@@ -582,6 +561,32 @@ static const struct of_device_id rkisp1_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, rkisp1_of_match);
 
+static const char * const rkisp1_clk_names[] = {
+       "isp",
+       "aclk",
+       "hclk",
+       "pclk",
+};
+
+static int rkisp1_init_clocks(struct rkisp1_device *rkisp1)
+{
+       const struct rkisp1_info *info = rkisp1->info;
+       unsigned int i;
+       int ret;
+
+       static_assert(ARRAY_SIZE(rkisp1_clk_names) == ARRAY_SIZE(rkisp1->clks));
+
+       for (i = 0; i < info->num_clocks; i++)
+               rkisp1->clks[i].id = rkisp1_clk_names[i];
+
+       ret = devm_clk_bulk_get(rkisp1->dev, info->num_clocks, rkisp1->clks);
+       if (ret)
+               return ret;
+
+       rkisp1->clk_size = info->num_clocks;
+       return 0;
+}
+
 static int rkisp1_probe(struct platform_device *pdev)
 {
        const struct rkisp1_info *info;
@@ -639,12 +644,9 @@ static int rkisp1_probe(struct platform_device *pdev)
                }
        }
 
-       for (i = 0; i < info->clk_size; i++)
-               rkisp1->clks[i].id = info->clks[i];
-       ret = devm_clk_bulk_get(dev, info->clk_size, rkisp1->clks);
+       ret = rkisp1_init_clocks(rkisp1);
        if (ret)
                return ret;
-       rkisp1->clk_size = info->clk_size;
 
        if (info->isp_ver == RKISP1_V_IMX8MP) {
                unsigned int id;