On Thu, Nov 29, 2018 at 8:48 AM Jacopo Mondi <jacopo+renesas@xxxxxxxxxx> wrote: > > The set_fmt operations updates the sensor format only when the image format > is changed. When only the image sizes gets changed, the format do not get > updated causing the sensor to always report the one that was previously in > use. > > Without this patch, updating frame size only fails: > [fmt:UYVY8_2X8/640x480@1/30 field:none colorspace:srgb xfer:srgb ...] > > With this patch applied: > [fmt:UYVY8_2X8/1024x768@1/30 field:none colorspace:srgb xfer:srgb ...] > > Fixes: 6949d864776e ("media: ov5640: do not change mode if format or frame > interval is unchanged") > Signed-off-by: Jacopo Mondi <jacopo+renesas@xxxxxxxxxx> For patch 1 of 2 only, Tested-by: Adam Ford <aford173@xxxxxxxxx> #imx6d with CSI2 interface on 4.19.6 and 4.20-RC5 It would be great if this could be applied to 4.19+ adam > --- > drivers/media/i2c/ov5640.c | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 03a031a42b3e..c659efe918a4 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -2160,6 +2160,7 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd, > struct ov5640_dev *sensor = to_ov5640_dev(sd); > const struct ov5640_mode_info *new_mode; > struct v4l2_mbus_framefmt *mbus_fmt = &format->format; > + struct v4l2_mbus_framefmt *fmt; > int ret; > > if (format->pad != 0) > @@ -2177,22 +2178,20 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd, > if (ret) > goto out; > > - if (format->which == V4L2_SUBDEV_FORMAT_TRY) { > - struct v4l2_mbus_framefmt *fmt = > - v4l2_subdev_get_try_format(sd, cfg, 0); > + if (format->which == V4L2_SUBDEV_FORMAT_TRY) > + fmt = v4l2_subdev_get_try_format(sd, cfg, 0); > + else > + fmt = &sensor->fmt; > > - *fmt = *mbus_fmt; > - goto out; > - } > + *fmt = *mbus_fmt; > > if (new_mode != sensor->current_mode) { > sensor->current_mode = new_mode; > sensor->pending_mode_change = true; > } > - if (mbus_fmt->code != sensor->fmt.code) { > - sensor->fmt = *mbus_fmt; > + if (mbus_fmt->code != sensor->fmt.code) > sensor->pending_fmt_change = true; > - } > + > out: > mutex_unlock(&sensor->lock); > return ret; > -- > 2.7.4 >