| From 0d82bae0ddefb015e2a671cd3271024bac0a4084 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 3 Sep 2019 17:11:41 -0300 |
| Subject: media: ov6650: Fix .get_fmt() V4L2_SUBDEV_FORMAT_TRY support |
| |
| From: Janusz Krzysztofik <jmkrzyszt@gmail.com> |
| |
| [ Upstream commit 39034bb0c26b76a2c3abc54aa28c185f18b40c2f ] |
| |
| Commit da298c6d98d5 ("[media] v4l2: replace video op g_mbus_fmt by pad |
| op get_fmt") converted a former ov6650_g_fmt() video operation callback |
| to an ov6650_get_fmt() pad operation callback. However, the converted |
| function disregards a format->which flag that pad operations should |
| obey and always returns active frame format settings. |
| |
| That can be fixed by always responding to V4L2_SUBDEV_FORMAT_TRY with |
| -EINVAL, or providing the response from a pad config argument, likely |
| updated by a former user call to V4L2_SUBDEV_FORMAT_TRY .set_fmt(). |
| Since implementation of the latter is trivial, go for it. |
| |
| Fixes: da298c6d98d5 ("[media] v4l2: replace video op g_mbus_fmt by pad op get_fmt") |
| Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com> |
| Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/i2c/soc_camera/ov6650.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/media/i2c/soc_camera/ov6650.c b/drivers/media/i2c/soc_camera/ov6650.c |
| index 3b118d45d433b..3c959e48855c3 100644 |
| --- a/drivers/media/i2c/soc_camera/ov6650.c |
| +++ b/drivers/media/i2c/soc_camera/ov6650.c |
| @@ -526,10 +526,16 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd, |
| *mf = ov6650_def_fmt; |
| |
| /* update media bus format code and frame size */ |
| - mf->width = priv->rect.width >> priv->half_scale; |
| - mf->height = priv->rect.height >> priv->half_scale; |
| - mf->code = priv->code; |
| + if (format->which == V4L2_SUBDEV_FORMAT_TRY) { |
| + mf->width = cfg->try_fmt.width; |
| + mf->height = cfg->try_fmt.height; |
| + mf->code = cfg->try_fmt.code; |
| |
| + } else { |
| + mf->width = priv->rect.width >> priv->half_scale; |
| + mf->height = priv->rect.height >> priv->half_scale; |
| + mf->code = priv->code; |
| + } |
| return 0; |
| } |
| |
| -- |
| 2.20.1 |
| |