Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 32 additions & 3 deletions drivers/media/i2c/ov7251.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
#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
Expand Down Expand Up @@ -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 },
Expand Down Expand Up @@ -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 },
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down