Hi Prabhakar, Thanks for your patches, good to see one more OV5640 stakeholder upstreaming some fixes/features. I'm also using a parallel setup with OV5640 connected on STM32 DCMI camera interface. First basic tests have not shown any regressions on my side but I would like to better understand the problem you encountered and the way you solve it, see below my comments. On 9/4/20 10:18 PM, Lad Prabhakar wrote: > During testing this sensor on iW-RainboW-G21D-Qseven platform in 8-bit DVP > mode with rcar-vin bridge noticed the capture worked fine for the first run > (with yavta), but for subsequent runs the bridge driver waited for the > frame to be captured. Debugging further noticed the data lines were > enabled/disabled in stream on/off callback and dumping the register > contents 0x3017/0x3018 in ov5640_set_stream_dvp() reported the correct > values, but yet frame capturing failed. Could you show the sequence of V4L2 calls which lead to freeze ? Reading the patch you proposed, my guess is that issue is coming when multiple S_STREAM(on)/S_STREAM(off) are made while power remains, is that true ? I have added some traces in code and tried to reproduce with yavta, v4l2-ctl and GStreamer but I'm not able to generate such sequence, here is what I got everytime: [ 809.113790] ov5640 0-003c: ov5640_s_power> [ 809.116431] ov5640 0-003c: ov5640_set_power> [ 809.120788] ov5640 0-003c: ov5640_set_power_on> [ 809.622047] ov5640 0-003c: ov5640_set_power_dvp> [ 809.862734] ov5640 0-003c: ov5640_s_stream> [ 809.865462] ov5640 0-003c: ov5640_set_stream_dvp on> <capturing here> [ 828.549531] ov5640 0-003c: ov5640_s_stream> [ 828.552265] ov5640 0-003c: ov5640_set_stream_dvp off> [ 828.580970] ov5640 0-003c: ov5640_s_power> [ 828.583613] ov5640 0-003c: ov5640_set_power> [ 828.587921] ov5640 0-003c: ov5640_set_power_dvp> [ 828.620346] ov5640 0-003c: ov5640_set_power_off> Which application/command line are you using to reproduce your problem ? > > To get around this issue data lines are enabled in s_power callback. > (Also the sensor remains in power down mode if not streaming so power > consumption shouldn't be affected) For the time being, I really don't understand why this patch is fixing capture freeze. > > Fixes: f22996db44e2d ("media: ov5640: add support of DVP parallel interface") > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> > Reviewed-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> > Tested-by: Jacopo Mondi <jacopo@xxxxxxxxxx> > --- > drivers/media/i2c/ov5640.c | 73 +++++++++++++++++++++----------------- > 1 file changed, 40 insertions(+), 33 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 8af11d532699..8288728d8704 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -276,8 +276,7 @@ static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) > /* YUV422 UYVY VGA@30fps */ > static const struct reg_value ov5640_init_setting_30fps_VGA[] = { > {0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0}, > - {0x3103, 0x03, 0, 0}, {0x3017, 0x00, 0, 0}, {0x3018, 0x00, 0, 0}, > - {0x3630, 0x36, 0, 0}, > + {0x3103, 0x03, 0, 0}, {0x3630, 0x36, 0, 0}, > {0x3631, 0x0e, 0, 0}, {0x3632, 0xe2, 0, 0}, {0x3633, 0x12, 0, 0}, > {0x3621, 0xe0, 0, 0}, {0x3704, 0xa0, 0, 0}, {0x3703, 0x5a, 0, 0}, > {0x3715, 0x78, 0, 0}, {0x3717, 0x01, 0, 0}, {0x370b, 0x60, 0, 0}, > @@ -1283,33 +1282,6 @@ static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on) > if (ret) > return ret; > > - /* > - * enable VSYNC/HREF/PCLK DVP control lines > - * & D[9:6] DVP data lines > - * > - * PAD OUTPUT ENABLE 01 > - * - 6: VSYNC output enable > - * - 5: HREF output enable > - * - 4: PCLK output enable > - * - [3:0]: D[9:6] output enable > - */ > - ret = ov5640_write_reg(sensor, > - OV5640_REG_PAD_OUTPUT_ENABLE01, > - on ? 0x7f : 0); > - if (ret) > - return ret; > - > - /* > - * enable D[5:0] DVP data lines > - * > - * PAD OUTPUT ENABLE 02 > - * - [7:2]: D[5:0] output enable > - */ > - ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, > - on ? 0xfc : 0); > - if (ret) > - return ret; > - > return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ? > OV5640_REG_SYS_CTRL0_SW_PWUP : > OV5640_REG_SYS_CTRL0_SW_PWDN); > @@ -2069,6 +2041,40 @@ static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on) > return 0; > } > > +static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on) > +{ > + int ret; > + > + if (!on) { > + /* Reset settings to their default values. */ > + ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00); > + ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00); > + return 0; > + } > + > + /* > + * enable VSYNC/HREF/PCLK DVP control lines > + * & D[9:6] DVP data lines > + * > + * PAD OUTPUT ENABLE 01 > + * - 6: VSYNC output enable > + * - 5: HREF output enable > + * - 4: PCLK output enable > + * - [3:0]: D[9:6] output enable > + */ > + ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x7f); > + if (ret) > + return ret; > + > + /* > + * enable D[5:0] DVP data lines > + * > + * PAD OUTPUT ENABLE 02 > + * - [7:2]: D[5:0] output enable > + */ > + return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc); > +} > + > static int ov5640_set_power(struct ov5640_dev *sensor, bool on) > { > int ret = 0; > @@ -2083,11 +2089,12 @@ static int ov5640_set_power(struct ov5640_dev *sensor, bool on) > goto power_off; > } > > - if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) { > + if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) > ret = ov5640_set_power_mipi(sensor, on); > - if (ret) > - goto power_off; > - } > + else > + ret = ov5640_set_power_dvp(sensor, on); > + if (ret) > + goto power_off; > > if (!on) > ov5640_set_power_off(sensor); > Best regards, Hugues.