media: i2c: ov5647: Add test pattern control
authorValentine Barshak <valentine.barshak@cogentembedded.com>
Tue, 21 Feb 2023 17:10:47 +0000 (18:10 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 20 Mar 2023 07:55:24 +0000 (08:55 +0100)
This adds V4L2_CID_TEST_PATTERN control support.

Signed-off-by: Valentine Barshak <valentine.barshak@cogentembedded.com>
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Tommaso Merciai <tomm.merciai@gmail.com>
Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/i2c/ov5647.c

index 847a7bb..2a9024c 100644 (file)
@@ -58,6 +58,7 @@
 #define OV5647_REG_MIPI_CTRL00         0x4800
 #define OV5647_REG_MIPI_CTRL14         0x4814
 #define OV5647_REG_AWB                 0x5001
+#define OV5647_REG_ISPCTRL3D           0x503d
 
 #define REG_TERM 0xfffe
 #define VAL_TERM 0xfe
@@ -116,6 +117,20 @@ static inline struct ov5647 *to_sensor(struct v4l2_subdev *sd)
        return container_of(sd, struct ov5647, sd);
 }
 
+static const char * const ov5647_test_pattern_menu[] = {
+       "Disabled",
+       "Color Bars",
+       "Color Squares",
+       "Random Data",
+};
+
+static const u8 ov5647_test_pattern_val[] = {
+       0x00,   /* Disabled */
+       0x80,   /* Color Bars */
+       0x82,   /* Color Squares */
+       0x81,   /* Random Data */
+};
+
 static const struct regval_list sensor_oe_disable_regs[] = {
        {0x3000, 0x00},
        {0x3001, 0x00},
@@ -1242,6 +1257,10 @@ static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl)
                ret = ov5647_write16(sd, OV5647_REG_VTS_HI,
                                     sensor->mode->format.height + ctrl->val);
                break;
+       case V4L2_CID_TEST_PATTERN:
+               ret = ov5647_write(sd, OV5647_REG_ISPCTRL3D,
+                                  ov5647_test_pattern_val[ctrl->val]);
+               break;
 
        /* Read-only, but we adjust it based on mode. */
        case V4L2_CID_PIXEL_RATE:
@@ -1270,7 +1289,7 @@ static int ov5647_init_controls(struct ov5647 *sensor)
        struct i2c_client *client = v4l2_get_subdevdata(&sensor->sd);
        int hblank, exposure_max, exposure_def;
 
-       v4l2_ctrl_handler_init(&sensor->ctrls, 8);
+       v4l2_ctrl_handler_init(&sensor->ctrls, 9);
 
        v4l2_ctrl_new_std(&sensor->ctrls, &ov5647_ctrl_ops,
                          V4L2_CID_AUTOGAIN, 0, 1, 1, 0);
@@ -1314,6 +1333,11 @@ static int ov5647_init_controls(struct ov5647 *sensor)
                                           sensor->mode->vts -
                                           sensor->mode->format.height);
 
+       v4l2_ctrl_new_std_menu_items(&sensor->ctrls, &ov5647_ctrl_ops,
+                                    V4L2_CID_TEST_PATTERN,
+                                    ARRAY_SIZE(ov5647_test_pattern_menu) - 1,
+                                    0, 0, ov5647_test_pattern_menu);
+
        if (sensor->ctrls.error)
                goto handler_free;