OSDN Git Service

media: imx-mipi-csis: Implement .init_cfg() using .set_fmt()
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 26 Jan 2023 01:10:01 +0000 (02:10 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Wed, 8 Feb 2023 08:12:24 +0000 (09:12 +0100)
The .set_fmt() handler is responsible for adjusting the requested format
based on the device limitations. Implement .init_cfg() as a wrapper of
.set_fmt(), to ensure that the initial configuration always matches the
rules implemented in .set_fmt(), should they ever change.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Adam Ford <aford173@gmail.com> #imx8mn-beacon
Acked-by: Rui Miguel Silva <rmfrfs@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/nxp/imx-mipi-csis.c

index 9e424cb..e996335 100644 (file)
@@ -989,32 +989,6 @@ err_unlock:
        return ret;
 }
 
-static int mipi_csis_init_cfg(struct v4l2_subdev *sd,
-                             struct v4l2_subdev_state *sd_state)
-{
-       struct v4l2_mbus_framefmt *fmt_sink;
-       struct v4l2_mbus_framefmt *fmt_source;
-
-       fmt_sink = v4l2_subdev_get_pad_format(sd, sd_state, CSIS_PAD_SINK);
-       fmt_source = v4l2_subdev_get_pad_format(sd, sd_state, CSIS_PAD_SOURCE);
-
-       fmt_sink->code = MEDIA_BUS_FMT_UYVY8_1X16;
-       fmt_sink->width = MIPI_CSIS_DEF_PIX_WIDTH;
-       fmt_sink->height = MIPI_CSIS_DEF_PIX_HEIGHT;
-       fmt_sink->field = V4L2_FIELD_NONE;
-
-       fmt_sink->colorspace = V4L2_COLORSPACE_SMPTE170M;
-       fmt_sink->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt_sink->colorspace);
-       fmt_sink->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt_sink->colorspace);
-       fmt_sink->quantization =
-               V4L2_MAP_QUANTIZATION_DEFAULT(false, fmt_sink->colorspace,
-                                             fmt_sink->ycbcr_enc);
-
-       *fmt_source = *fmt_sink;
-
-       return 0;
-}
-
 static int mipi_csis_enum_mbus_code(struct v4l2_subdev *sd,
                                    struct v4l2_subdev_state *sd_state,
                                    struct v4l2_subdev_mbus_code_enum *code)
@@ -1101,6 +1075,7 @@ static int mipi_csis_set_fmt(struct v4l2_subdev *sd,
        fmt->code = csis_fmt->code;
        fmt->width = sdformat->format.width;
        fmt->height = sdformat->format.height;
+       fmt->field = V4L2_FIELD_NONE;
        fmt->colorspace = sdformat->format.colorspace;
        fmt->quantization = sdformat->format.quantization;
        fmt->xfer_func = sdformat->format.xfer_func;
@@ -1147,6 +1122,27 @@ static int mipi_csis_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
        return 0;
 }
 
+static int mipi_csis_init_cfg(struct v4l2_subdev *sd,
+                             struct v4l2_subdev_state *sd_state)
+{
+       struct v4l2_subdev_format fmt = {
+               .pad = CSIS_PAD_SINK,
+       };
+
+       fmt.format.code = mipi_csis_formats[0].code;
+       fmt.format.width = MIPI_CSIS_DEF_PIX_WIDTH;
+       fmt.format.height = MIPI_CSIS_DEF_PIX_HEIGHT;
+
+       fmt.format.colorspace = V4L2_COLORSPACE_SMPTE170M;
+       fmt.format.xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt.format.colorspace);
+       fmt.format.ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt.format.colorspace);
+       fmt.format.quantization =
+               V4L2_MAP_QUANTIZATION_DEFAULT(false, fmt.format.colorspace,
+                                             fmt.format.ycbcr_enc);
+
+       return mipi_csis_set_fmt(sd, sd_state, &fmt);
+}
+
 static int mipi_csis_log_status(struct v4l2_subdev *sd)
 {
        struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);