media: ov2640: add V4L2_CID_TEST_PATTERN control
authorAkinobu Mita <akinobu.mita@gmail.com>
Mon, 12 Nov 2018 16:00:50 +0000 (11:00 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 23 Nov 2018 09:45:49 +0000 (04:45 -0500)
The ov2640 has the test pattern generator features.  This makes use of
it through V4L2_CID_TEST_PATTERN control.

[Sakari Ailus: Use "Eight Vertical Colour Bars" as the second manu entry]

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/i2c/ov2640.c

index 20a8853ba1e29a815386698c10756a5250c1e098..ca2c27d5e9a211ab16e73507eeb37eb907a0ff5c 100644 (file)
@@ -705,6 +705,11 @@ err:
        return ret;
 }
 
+static const char * const ov2640_test_pattern_menu[] = {
+       "Disabled",
+       "Eight Vertical Colour Bars",
+};
+
 /*
  * functions
  */
@@ -740,6 +745,9 @@ static int ov2640_s_ctrl(struct v4l2_ctrl *ctrl)
        case V4L2_CID_HFLIP:
                val = ctrl->val ? REG04_HFLIP_IMG : 0x00;
                return ov2640_mask_set(client, REG04, REG04_HFLIP_IMG, val);
+       case V4L2_CID_TEST_PATTERN:
+               val = ctrl->val ? COM7_COLOR_BAR_TEST : 0x00;
+               return ov2640_mask_set(client, COM7, COM7_COLOR_BAR_TEST, val);
        }
 
        return -EINVAL;
@@ -1184,12 +1192,16 @@ static int ov2640_probe(struct i2c_client *client,
        v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
        priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
        mutex_init(&priv->lock);
-       v4l2_ctrl_handler_init(&priv->hdl, 2);
+       v4l2_ctrl_handler_init(&priv->hdl, 3);
        priv->hdl.lock = &priv->lock;
        v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,
                        V4L2_CID_VFLIP, 0, 1, 1, 0);
        v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,
                        V4L2_CID_HFLIP, 0, 1, 1, 0);
+       v4l2_ctrl_new_std_menu_items(&priv->hdl, &ov2640_ctrl_ops,
+                       V4L2_CID_TEST_PATTERN,
+                       ARRAY_SIZE(ov2640_test_pattern_menu) - 1, 0, 0,
+                       ov2640_test_pattern_menu);
        priv->subdev.ctrl_handler = &priv->hdl;
        if (priv->hdl.error) {
                ret = priv->hdl.error;