media: ov6650: Fix crop rectangle alignment not passed back
Commit4f996594ce
("[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, commit10d5509c8d
("[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:10d5509c8d
("[media] v4l2: remove g/s_crop from video ops") 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>
This commit is contained in:
parent
c404af950d
commit
7b188d6ba2
@ -465,38 +465,37 @@ static int ov6650_set_selection(struct v4l2_subdev *sd,
|
|||||||
{
|
{
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
struct ov6650 *priv = to_ov6650(client);
|
struct ov6650 *priv = to_ov6650(client);
|
||||||
struct v4l2_rect rect = sel->r;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
|
if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
|
||||||
sel->target != V4L2_SEL_TGT_CROP)
|
sel->target != V4L2_SEL_TGT_CROP)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
v4l_bound_align_image(&rect.width, 2, W_CIF, 1,
|
v4l_bound_align_image(&sel->r.width, 2, W_CIF, 1,
|
||||||
&rect.height, 2, H_CIF, 1, 0);
|
&sel->r.height, 2, H_CIF, 1, 0);
|
||||||
v4l_bound_align_image(&rect.left, DEF_HSTRT << 1,
|
v4l_bound_align_image(&sel->r.left, DEF_HSTRT << 1,
|
||||||
(DEF_HSTRT << 1) + W_CIF - (__s32)rect.width, 1,
|
(DEF_HSTRT << 1) + W_CIF - (__s32)sel->r.width, 1,
|
||||||
&rect.top, DEF_VSTRT << 1,
|
&sel->r.top, DEF_VSTRT << 1,
|
||||||
(DEF_VSTRT << 1) + H_CIF - (__s32)rect.height, 1,
|
(DEF_VSTRT << 1) + H_CIF - (__s32)sel->r.height,
|
||||||
0);
|
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) {
|
if (!ret) {
|
||||||
priv->rect.left = rect.left;
|
priv->rect.left = sel->r.left;
|
||||||
ret = ov6650_reg_write(client, REG_HSTOP,
|
ret = ov6650_reg_write(client, REG_HSTOP,
|
||||||
(rect.left + rect.width) >> 1);
|
(sel->r.left + sel->r.width) >> 1);
|
||||||
}
|
}
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
priv->rect.width = rect.width;
|
priv->rect.width = sel->r.width;
|
||||||
ret = ov6650_reg_write(client, REG_VSTRT, rect.top >> 1);
|
ret = ov6650_reg_write(client, REG_VSTRT, sel->r.top >> 1);
|
||||||
}
|
}
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
priv->rect.top = rect.top;
|
priv->rect.top = sel->r.top;
|
||||||
ret = ov6650_reg_write(client, REG_VSTOP,
|
ret = ov6650_reg_write(client, REG_VSTOP,
|
||||||
(rect.top + rect.height) >> 1);
|
(sel->r.top + sel->r.height) >> 1);
|
||||||
}
|
}
|
||||||
if (!ret)
|
if (!ret)
|
||||||
priv->rect.height = rect.height;
|
priv->rect.height = sel->r.height;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user