Commit 07115449 authored by Jacopo Mondi's avatar Jacopo Mondi Committed by Mauro Carvalho Chehab

media: ov5640: Fix set format regression

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: 6949d864 ("media: ov5640: do not change mode if format or frame interval is unchanged")
Signed-off-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@bootlin.com>
Tested-by: Adam Ford <aford173@gmail.com> #imx6 w/ CSI2 interface on 4.19.6 and 4.20-RC5
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 98480d65
...@@ -2021,6 +2021,7 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd, ...@@ -2021,6 +2021,7 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
struct ov5640_dev *sensor = to_ov5640_dev(sd); struct ov5640_dev *sensor = to_ov5640_dev(sd);
const struct ov5640_mode_info *new_mode; const struct ov5640_mode_info *new_mode;
struct v4l2_mbus_framefmt *mbus_fmt = &format->format; struct v4l2_mbus_framefmt *mbus_fmt = &format->format;
struct v4l2_mbus_framefmt *fmt;
int ret; int ret;
if (format->pad != 0) if (format->pad != 0)
...@@ -2038,22 +2039,20 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd, ...@@ -2038,22 +2039,20 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
if (ret) if (ret)
goto out; goto out;
if (format->which == V4L2_SUBDEV_FORMAT_TRY) { if (format->which == V4L2_SUBDEV_FORMAT_TRY)
struct v4l2_mbus_framefmt *fmt = fmt = v4l2_subdev_get_try_format(sd, cfg, 0);
v4l2_subdev_get_try_format(sd, cfg, 0); else
fmt = &sensor->fmt;
*fmt = *mbus_fmt; *fmt = *mbus_fmt;
goto out;
}
if (new_mode != sensor->current_mode) { if (new_mode != sensor->current_mode) {
sensor->current_mode = new_mode; sensor->current_mode = new_mode;
sensor->pending_mode_change = true; sensor->pending_mode_change = true;
} }
if (mbus_fmt->code != sensor->fmt.code) { if (mbus_fmt->code != sensor->fmt.code)
sensor->fmt = *mbus_fmt;
sensor->pending_fmt_change = true; sensor->pending_fmt_change = true;
}
out: out:
mutex_unlock(&sensor->lock); mutex_unlock(&sensor->lock);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment