media: i2c: ov7251: Add module param to select ext trig mode
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Thu, 1 Dec 2022 13:54:49 +0000 (13:54 +0000)
committerPhil Elwell <8911409+pelwell@users.noreply.github.com>
Mon, 5 Dec 2022 19:59:49 +0000 (19:59 +0000)
As there isn't currently a defined mechanism for selecting an
external trigger mode on image sensors, copy the imx477
approach of using a module parameter to enable ext trig.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/media/i2c/ov7251.c

index adc8e19..274ce79 100644 (file)
 #include <media/v4l2-fwnode.h>
 #include <media/v4l2-subdev.h>
 
+static int trigger_mode;
+module_param(trigger_mode, int, 0644);
+MODULE_PARM_DESC(trigger_mode, "Set vsync trigger mode: 0=standalone, (1=source - not implemented), 2=sink");
+
 #define OV7251_SC_MODE_SELECT          0x0100
 #define OV7251_SC_MODE_SELECT_SW_STANDBY       0x0
 #define OV7251_SC_MODE_SELECT_STREAMING                0x1
@@ -244,7 +248,6 @@ static const struct reg_value ov7251_setting_vga[] = {
        { 0x3662, 0x01 },
        { 0x3663, 0x70 },
        { 0x3664, 0x50 },
-       { 0x3666, 0x0a },
        { 0x3669, 0x1a },
        { 0x366a, 0x00 },
        { 0x366b, 0x50 },
@@ -309,9 +312,8 @@ static const struct reg_value ov7251_setting_vga[] = {
        { 0x3c00, 0x89 },
        { 0x3c01, 0x63 },
        { 0x3c02, 0x01 },
-       { 0x3c03, 0x00 },
        { 0x3c04, 0x00 },
-       { 0x3c05, 0x03 },
+       { 0x3c05, 0x01 },
        { 0x3c06, 0x00 },
        { 0x3c07, 0x06 },
        { 0x3c0c, 0x01 },
@@ -341,6 +343,16 @@ static const struct reg_value ov7251_setting_vga[] = {
        { 0x5001, 0x80 },
 };
 
+static const struct reg_value ov7251_ext_trig_on[] = {
+       { 0x3666, 0x00 },
+       { 0x3c03, 0x17 },
+};
+
+static const struct reg_value ov7251_ext_trig_off[] = {
+       { 0x3666, 0x0a },
+       { 0x3c03, 0x00 },
+};
+
 static const unsigned long supported_xclk_rates[] = {
        [OV7251_19_2_MHZ] = 19200000,
        [OV7251_24_MHZ] = 24000000,
@@ -1065,6 +1077,23 @@ static int ov7251_s_stream(struct v4l2_subdev *subdev, int enable)
                        dev_err(ov7251->dev, "could not sync v4l2 controls\n");
                        goto err_power_down;
                }
+
+               /* Set vsync trigger mode */
+               switch (trigger_mode) {
+               case 2:
+                       ov7251_set_register_array(ov7251,
+                                                 ov7251_ext_trig_on,
+                                                 ARRAY_SIZE(ov7251_ext_trig_on));
+                       break;
+               case 0:
+               default:
+                       /* case 1 for ext trig source currently not implemented */
+                       ov7251_set_register_array(ov7251,
+                                                 ov7251_ext_trig_off,
+                                                 ARRAY_SIZE(ov7251_ext_trig_off));
+                       break;
+               }
+
                ret = ov7251_write_reg(ov7251, OV7251_SC_MODE_SELECT,
                                       OV7251_SC_MODE_SELECT_STREAMING);
                if (ret)