Commit 7b188d6b authored by Janusz Krzysztofik's avatar Janusz Krzysztofik Committed by Mauro Carvalho Chehab
Browse files

media: ov6650: Fix crop rectangle alignment not passed back



Commit 4f996594 ("[media] v4l2: make vidioc_s_crop const")
introduced a writable copy of constified user requested crop rectangle
in order to be able to perform hardware alignments on it.  Later
on, commit 10d5509c ("[media] v4l2: remove g/s_crop from video
ops") replaced s_crop() video operation using that const argument with
set_selection() pad operation which had a corresponding argument not
constified, however the original behavior of the driver was not
restored.  Since that time, any hardware alignment applied on a user
requested crop rectangle is not passed back to the user calling
.set_selection() as it should be.

Fix the issue by dropping the copy and replacing all references to it
with references to the crop rectangle embedded in the user argument.

Fixes: 10d5509c ("[media] v4l2: remove g/s_crop from video ops")
Signed-off-by: default avatarJanusz Krzysztofik <jmkrzyszt@gmail.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent c404af95
Loading
Loading
Loading
Loading
+15 −16
Original line number Diff line number Diff line
@@ -465,38 +465,37 @@ static int ov6650_set_selection(struct v4l2_subdev *sd,
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct ov6650 *priv = to_ov6650(client);
	struct v4l2_rect rect = sel->r;
	int ret;

	if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
	    sel->target != V4L2_SEL_TGT_CROP)
		return -EINVAL;

	v4l_bound_align_image(&rect.width, 2, W_CIF, 1,
			      &rect.height, 2, H_CIF, 1, 0);
	v4l_bound_align_image(&rect.left, DEF_HSTRT << 1,
			      (DEF_HSTRT << 1) + W_CIF - (__s32)rect.width, 1,
			      &rect.top, DEF_VSTRT << 1,
			      (DEF_VSTRT << 1) + H_CIF - (__s32)rect.height, 1,
			      0);
	v4l_bound_align_image(&sel->r.width, 2, W_CIF, 1,
			      &sel->r.height, 2, H_CIF, 1, 0);
	v4l_bound_align_image(&sel->r.left, DEF_HSTRT << 1,
			      (DEF_HSTRT << 1) + W_CIF - (__s32)sel->r.width, 1,
			      &sel->r.top, DEF_VSTRT << 1,
			      (DEF_VSTRT << 1) + H_CIF - (__s32)sel->r.height,
			      1, 0);

	ret = ov6650_reg_write(client, REG_HSTRT, rect.left >> 1);
	ret = ov6650_reg_write(client, REG_HSTRT, sel->r.left >> 1);
	if (!ret) {
		priv->rect.left = rect.left;
		priv->rect.left = sel->r.left;
		ret = ov6650_reg_write(client, REG_HSTOP,
				(rect.left + rect.width) >> 1);
				       (sel->r.left + sel->r.width) >> 1);
	}
	if (!ret) {
		priv->rect.width = rect.width;
		ret = ov6650_reg_write(client, REG_VSTRT, rect.top >> 1);
		priv->rect.width = sel->r.width;
		ret = ov6650_reg_write(client, REG_VSTRT, sel->r.top >> 1);
	}
	if (!ret) {
		priv->rect.top = rect.top;
		priv->rect.top = sel->r.top;
		ret = ov6650_reg_write(client, REG_VSTOP,
				(rect.top + rect.height) >> 1);
				       (sel->r.top + sel->r.height) >> 1);
	}
	if (!ret)
		priv->rect.height = rect.height;
		priv->rect.height = sel->r.height;

	return ret;
}