media: ov5640: Implement init_cfg
authorJacopo Mondi <jacopo@jmondi.org>
Fri, 13 May 2022 14:14:08 +0000 (15:14 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 8 Jul 2022 14:32:34 +0000 (15:32 +0100)
Implement the init_cfg pad operation to initialize the subdev state
format to the default one.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/i2c/ov5640.c

index 8391e92..cc72ad1 100644 (file)
@@ -411,6 +411,18 @@ static inline bool ov5640_is_csi2(const struct ov5640_dev *sensor)
  * over i2c.
  */
 /* YUV422 UYVY VGA@30fps */
+
+static const struct v4l2_mbus_framefmt ov5640_default_fmt = {
+       .code = MEDIA_BUS_FMT_UYVY8_2X8,
+       .width = 640,
+       .height = 480,
+       .colorspace = V4L2_COLORSPACE_SRGB,
+       .ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(V4L2_COLORSPACE_SRGB),
+       .quantization = V4L2_QUANTIZATION_FULL_RANGE,
+       .xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(V4L2_COLORSPACE_SRGB),
+       .field = V4L2_FIELD_NONE,
+};
+
 static const struct reg_value ov5640_init_setting[] = {
        {0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0},
        {0x3103, 0x03, 0, 0}, {0x3630, 0x36, 0, 0},
@@ -3548,6 +3560,17 @@ out:
        return ret;
 }
 
+static int ov5640_init_cfg(struct v4l2_subdev *sd,
+                          struct v4l2_subdev_state *state)
+{
+       struct v4l2_mbus_framefmt *fmt =
+                               v4l2_subdev_get_try_format(sd, state, 0);
+
+       *fmt = ov5640_default_fmt;
+
+       return 0;
+}
+
 static const struct v4l2_subdev_core_ops ov5640_core_ops = {
        .s_power = ov5640_s_power,
        .log_status = v4l2_ctrl_subdev_log_status,
@@ -3562,6 +3585,7 @@ static const struct v4l2_subdev_video_ops ov5640_video_ops = {
 };
 
 static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
+       .init_cfg = ov5640_init_cfg,
        .enum_mbus_code = ov5640_enum_mbus_code,
        .get_fmt = ov5640_get_fmt,
        .set_fmt = ov5640_set_fmt,
@@ -3620,7 +3644,6 @@ static int ov5640_probe(struct i2c_client *client)
        struct device *dev = &client->dev;
        struct fwnode_handle *endpoint;
        struct ov5640_dev *sensor;
-       struct v4l2_mbus_framefmt *fmt;
        u32 rotation;
        int ret;
 
@@ -3634,15 +3657,7 @@ static int ov5640_probe(struct i2c_client *client)
         * default init sequence initialize sensor to
         * YUV422 UYVY VGA@30fps
         */
-       fmt = &sensor->fmt;
-       fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
-       fmt->colorspace = V4L2_COLORSPACE_SRGB;
-       fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
-       fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
-       fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
-       fmt->width = 640;
-       fmt->height = 480;
-       fmt->field = V4L2_FIELD_NONE;
+       sensor->fmt = ov5640_default_fmt;
        sensor->frame_interval.numerator = 1;
        sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS];
        sensor->current_fr = OV5640_30_FPS;