diff mbox series

[5/5] media: ov5647: Add support for test patterns

Message ID 20220615151457.415038-6-jacopo@jmondi.org
State New
Headers show
Series [1/5] media: ov5647: Parse and register properties | expand

Commit Message

Jacopo Mondi June 15, 2022, 3:14 p.m. UTC
Add support for V4L2_CID_TEST_PATTERN.

Based on a patch from Renesas R-Car BSP 4.1.0 from
Valentine Barshak <valentine.barshak@cogentembedded.com>

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 drivers/media/i2c/ov5647.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c
index 0a3e4acec036..68e56b0d8153 100644
--- a/drivers/media/i2c/ov5647.c
+++ b/drivers/media/i2c/ov5647.c
@@ -60,6 +60,7 @@ 
 #define OV5647_REG_MIPI_CTRL00		0x4800
 #define OV5647_REG_MIPI_CTRL14		0x4814
 #define OV5647_REG_AWB			0x5001
+#define OV5647_REG_ISP_CTRL3D		0x503d
 
 #define REG_TERM 0xfffe
 #define VAL_TERM 0xfe
@@ -812,6 +813,22 @@  static const struct ov5647_mode ov5647_8_bpp_modes[] = {
 #define OV5647_DEFAULT_MODE	(&ov5647_10_bpp_modes[3])
 #define OV5647_DEFAULT_FORMAT	(ov5647_10_bpp_modes[3].format)
 
+static const char * const ov5647_test_pattern_menu[] = {
+	"Disabled",
+	"Color Bars",
+	"Color Squares",
+	"Random Data",
+	"Input Data"
+};
+
+static u8 ov5647_test_pattern_val[] = {
+	0x00,	/* Disabled */
+	0x80,	/* Color Bars */
+	0x82,	/* Color Squares */
+	0x81,	/* Random Data */
+	0x83,	/* Input Data */
+};
+
 static int ov5647_write16(struct v4l2_subdev *sd, u16 reg, u16 val)
 {
 	unsigned char data[4] = { reg >> 8, reg & 0xff, val >> 8, val & 0xff};
@@ -1582,6 +1599,10 @@  static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl)
 		ov5647_s_flip(sd, OV5647_REG_VFLIP, ctrl->val);
 		break;
 
+	case V4L2_CID_TEST_PATTERN:
+		ret = ov5647_write(sd, OV5647_REG_ISP_CTRL3D,
+				   ov5647_test_pattern_val[ctrl->val]);
+		break;
 	default:
 		dev_info(&client->dev,
 			 "Control (id:0x%x, val:0x%x) not supported\n",
@@ -1604,7 +1625,7 @@  static int ov5647_init_controls(struct ov5647 *sensor, struct device *dev)
 	int hblank, exposure_max, exposure_def;
 	struct v4l2_fwnode_device_properties props;
 
-	v4l2_ctrl_handler_init(&sensor->ctrls, 10);
+	v4l2_ctrl_handler_init(&sensor->ctrls, 11);
 
 	v4l2_ctrl_new_std(&sensor->ctrls, &ov5647_ctrl_ops,
 			  V4L2_CID_AUTOGAIN, 0, 1, 1, 0);
@@ -1658,6 +1679,11 @@  static int ov5647_init_controls(struct ov5647 *sensor, struct device *dev)
 	if (sensor->vflip)
 		sensor->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
 
+	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);
+
 	v4l2_fwnode_device_parse(dev, &props);
 
 	v4l2_ctrl_new_fwnode_properties(&sensor->ctrls, &ov5647_ctrl_ops,