[v2,1/2] media: i2c: ov5647: Add test pattern control
Commit Message
From: Valentine Barshak <valentine.barshak@cogentembedded.com>
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>
---
drivers/media/i2c/ov5647.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
Comments
Hi Jacopo,
Thank you for the patch.
On Tue, Feb 21, 2023 at 06:10:47PM +0100, Jacopo Mondi wrote:
> From: Valentine Barshak <valentine.barshak@cogentembedded.com>
>
> 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>
> ---
> drivers/media/i2c/ov5647.c | 26 +++++++++++++++++++++++++-
> 1 file changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c
> index 847a7bbb69c5..bde287e00c87 100644
> --- a/drivers/media/i2c/ov5647.c
> +++ b/drivers/media/i2c/ov5647.c
> @@ -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 u8 ov5647_test_pattern_val[] = {
static const
> + 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;
>
@@ -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 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;