Skip to content

Commit 4ea1e0b

Browse files
njhollinghurstpelwell
authored andcommitted
drivers: media: i2c: imx296,imx477: Configure tigger_mode every time
Don't assume the camera has been reset each time we start streaming, but always write registers relating to trigger_mode, even in mode 0. IMX477: Stop driving XVS on stop streaming, to avoid spurious pulses. Signed-off-by: Nick Hollinghurst <[email protected]>
1 parent 2252780 commit 4ea1e0b

File tree

2 files changed

+19
-19
lines changed

2 files changed

+19
-19
lines changed

drivers/media/i2c/imx296.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -583,10 +583,11 @@ static int imx296_stream_on(struct imx296 *sensor)
583583
imx296_write(sensor, IMX296_CTRL00, 0, &ret);
584584
usleep_range(2000, 5000);
585585

586-
if (trigger_mode == 1) {
587-
imx296_write(sensor, IMX296_CTRL0B, IMX296_CTRL0B_TRIGEN, &ret);
588-
imx296_write(sensor, IMX296_LOWLAGTRG, IMX296_LOWLAGTRG_FAST, &ret);
589-
}
586+
/* external trigger mode: 0=normal, 1=triggered */
587+
imx296_write(sensor, IMX296_CTRL0B,
588+
(trigger_mode == 1) ? IMX296_CTRL0B_TRIGEN : 0, &ret);
589+
imx296_write(sensor, IMX296_LOWLAGTRG,
590+
(trigger_mode == 1) ? IMX296_LOWLAGTRG_FAST : 0, &ret);
590591

591592
imx296_write(sensor, IMX296_CTRL0A, 0, &ret);
592593

drivers/media/i2c/imx477.c

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,26 +1742,21 @@ static int imx477_start_streaming(struct imx477 *imx477)
17421742
imx477_write_reg(imx477, 0x0b05, IMX477_REG_VALUE_08BIT, !!dpc_enable);
17431743
imx477_write_reg(imx477, 0x0b06, IMX477_REG_VALUE_08BIT, !!dpc_enable);
17441744

1745-
/* Set vsync trigger mode */
1746-
if (trigger_mode != 0) {
1747-
/* trigger_mode == 1 for source, 2 for sink */
1748-
const u32 val = (trigger_mode == 1) ? 1 : 0;
1749-
1750-
imx477_write_reg(imx477, IMX477_REG_MC_MODE,
1751-
IMX477_REG_VALUE_08BIT, 1);
1752-
imx477_write_reg(imx477, IMX477_REG_MS_SEL,
1753-
IMX477_REG_VALUE_08BIT, val);
1754-
imx477_write_reg(imx477, IMX477_REG_XVS_IO_CTRL,
1755-
IMX477_REG_VALUE_08BIT, val);
1756-
imx477_write_reg(imx477, IMX477_REG_EXTOUT_EN,
1757-
IMX477_REG_VALUE_08BIT, val);
1758-
}
1759-
17601745
/* Apply customized values from user */
17611746
ret = __v4l2_ctrl_handler_setup(imx477->sd.ctrl_handler);
17621747
if (ret)
17631748
return ret;
17641749

1750+
/* Set vsync trigger mode: 0=standalone, 1=source, 2=sink */
1751+
imx477_write_reg(imx477, IMX477_REG_MC_MODE,
1752+
IMX477_REG_VALUE_08BIT, (trigger_mode > 0) ? 1 : 0);
1753+
imx477_write_reg(imx477, IMX477_REG_MS_SEL,
1754+
IMX477_REG_VALUE_08BIT, (trigger_mode <= 1) ? 1 : 0);
1755+
imx477_write_reg(imx477, IMX477_REG_XVS_IO_CTRL,
1756+
IMX477_REG_VALUE_08BIT, (trigger_mode == 1) ? 1 : 0);
1757+
imx477_write_reg(imx477, IMX477_REG_EXTOUT_EN,
1758+
IMX477_REG_VALUE_08BIT, (trigger_mode == 1) ? 1 : 0);
1759+
17651760
/* set stream on register */
17661761
return imx477_write_reg(imx477, IMX477_REG_MODE_SELECT,
17671762
IMX477_REG_VALUE_08BIT, IMX477_MODE_STREAMING);
@@ -1778,6 +1773,10 @@ static void imx477_stop_streaming(struct imx477 *imx477)
17781773
IMX477_REG_VALUE_08BIT, IMX477_MODE_STANDBY);
17791774
if (ret)
17801775
dev_err(&client->dev, "%s failed to set stream\n", __func__);
1776+
1777+
/* Stop driving XVS out (there is still a weak pull-up) */
1778+
imx477_write_reg(imx477, IMX477_REG_EXTOUT_EN,
1779+
IMX477_REG_VALUE_08BIT, 0);
17811780
}
17821781

17831782
static int imx477_set_stream(struct v4l2_subdev *sd, int enable)

0 commit comments

Comments
 (0)