]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: rzg2l-cru: csi-2: Support RZ/V2H input sizes
authorJacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
Fri, 29 Aug 2025 11:12:14 +0000 (13:12 +0200)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 6 Jan 2026 09:14:13 +0000 (10:14 +0100)
The CRU version on the RZ/V2H SoC supports larger input sizes
(4096x4096) compared to the version on the RZ/G2L (2800x4095).

Store the per-SoC min/max sizes in the device match info and use them
in place of the hardcoded ones.

While at it, use the min sizes reported by the info structure to replace
the RZG2L_CSI2_DEFAULT_WIDTH/HEIGHT macros.

Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
Tested-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c

index 0fbdae280fdc49f963269a4bdaea38ff2e51884e..6dc4b53607b4c615f3c3896e15f60bbe7a983ace 100644 (file)
 
 #define VSRSTS_RETRIES                 20
 
-#define RZG2L_CSI2_MIN_WIDTH           320
-#define RZG2L_CSI2_MIN_HEIGHT          240
-#define RZG2L_CSI2_MAX_WIDTH           2800
-#define RZG2L_CSI2_MAX_HEIGHT          4095
-
-#define RZG2L_CSI2_DEFAULT_WIDTH       RZG2L_CSI2_MIN_WIDTH
-#define RZG2L_CSI2_DEFAULT_HEIGHT      RZG2L_CSI2_MIN_HEIGHT
 #define RZG2L_CSI2_DEFAULT_FMT         MEDIA_BUS_FMT_UYVY8_1X16
 
 enum rzg2l_csi2_pads {
@@ -137,6 +130,10 @@ struct rzg2l_csi2_info {
        int (*dphy_enable)(struct rzg2l_csi2 *csi2);
        int (*dphy_disable)(struct rzg2l_csi2 *csi2);
        bool has_system_clk;
+       unsigned int min_width;
+       unsigned int min_height;
+       unsigned int max_width;
+       unsigned int max_height;
 };
 
 struct rzg2l_csi2_timings {
@@ -418,6 +415,10 @@ static const struct rzg2l_csi2_info rzg2l_csi2_info = {
        .dphy_enable = rzg2l_csi2_dphy_enable,
        .dphy_disable = rzg2l_csi2_dphy_disable,
        .has_system_clk = true,
+       .min_width = 320,
+       .min_height = 240,
+       .max_width = 2800,
+       .max_height = 4095,
 };
 
 static int rzg2l_csi2_dphy_setting(struct v4l2_subdev *sd, bool on)
@@ -542,6 +543,10 @@ static const struct rzg2l_csi2_info rzv2h_csi2_info = {
        .dphy_enable = rzv2h_csi2_dphy_enable,
        .dphy_disable = rzv2h_csi2_dphy_disable,
        .has_system_clk = false,
+       .min_width = 320,
+       .min_height = 240,
+       .max_width = 4096,
+       .max_height = 4096,
 };
 
 static int rzg2l_csi2_mipi_link_setting(struct v4l2_subdev *sd, bool on)
@@ -631,6 +636,7 @@ static int rzg2l_csi2_set_format(struct v4l2_subdev *sd,
                                 struct v4l2_subdev_state *state,
                                 struct v4l2_subdev_format *fmt)
 {
+       struct rzg2l_csi2 *csi2 = sd_to_csi2(sd);
        struct v4l2_mbus_framefmt *src_format;
        struct v4l2_mbus_framefmt *sink_format;
 
@@ -653,9 +659,11 @@ static int rzg2l_csi2_set_format(struct v4l2_subdev *sd,
        sink_format->ycbcr_enc = fmt->format.ycbcr_enc;
        sink_format->quantization = fmt->format.quantization;
        sink_format->width = clamp_t(u32, fmt->format.width,
-                                    RZG2L_CSI2_MIN_WIDTH, RZG2L_CSI2_MAX_WIDTH);
+                                    csi2->info->min_width,
+                                    csi2->info->max_width);
        sink_format->height = clamp_t(u32, fmt->format.height,
-                                     RZG2L_CSI2_MIN_HEIGHT, RZG2L_CSI2_MAX_HEIGHT);
+                                    csi2->info->min_height,
+                                    csi2->info->max_height);
        fmt->format = *sink_format;
 
        /* propagate format to source pad */
@@ -668,9 +676,10 @@ static int rzg2l_csi2_init_state(struct v4l2_subdev *sd,
                                 struct v4l2_subdev_state *sd_state)
 {
        struct v4l2_subdev_format fmt = { .pad = RZG2L_CSI2_SINK, };
+       struct rzg2l_csi2 *csi2 = sd_to_csi2(sd);
 
-       fmt.format.width = RZG2L_CSI2_DEFAULT_WIDTH;
-       fmt.format.height = RZG2L_CSI2_DEFAULT_HEIGHT;
+       fmt.format.width = csi2->info->min_width;
+       fmt.format.height = csi2->info->min_height;
        fmt.format.field = V4L2_FIELD_NONE;
        fmt.format.code = RZG2L_CSI2_DEFAULT_FMT;
        fmt.format.colorspace = V4L2_COLORSPACE_SRGB;
@@ -697,16 +706,18 @@ static int rzg2l_csi2_enum_frame_size(struct v4l2_subdev *sd,
                                      struct v4l2_subdev_state *sd_state,
                                      struct v4l2_subdev_frame_size_enum *fse)
 {
+       struct rzg2l_csi2 *csi2 = sd_to_csi2(sd);
+
        if (fse->index != 0)
                return -EINVAL;
 
        if (!rzg2l_csi2_code_to_fmt(fse->code))
                return -EINVAL;
 
-       fse->min_width = RZG2L_CSI2_MIN_WIDTH;
-       fse->min_height = RZG2L_CSI2_MIN_HEIGHT;
-       fse->max_width = RZG2L_CSI2_MAX_WIDTH;
-       fse->max_height = RZG2L_CSI2_MAX_HEIGHT;
+       fse->min_width = csi2->info->min_width;
+       fse->min_height = csi2->info->min_height;
+       fse->max_width = csi2->info->max_width;
+       fse->max_height = csi2->info->max_height;
 
        return 0;
 }