| From 9cac9d2fb2fe0e0cadacdb94415b3fe49e3f724f Mon Sep 17 00:00:00 2001 |
| From: Ricardo Ribalda <ricardo.ribalda@gmail.com> |
| Date: Tue, 17 Oct 2017 11:48:50 -0400 |
| Subject: media: v4l2-ctrl: Fix flags field on Control events |
| |
| From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> |
| |
| commit 9cac9d2fb2fe0e0cadacdb94415b3fe49e3f724f upstream. |
| |
| VIDIOC_DQEVENT and VIDIOC_QUERY_EXT_CTRL should give the same output for |
| the control flags field. |
| |
| This patch creates a new function user_flags(), that calculates the user |
| exported flags value (which is different than the kernel internal flags |
| structure). This function is then used by all the code that exports the |
| internal flags to userspace. |
| |
| Reported-by: Dimitrios Katsaros <patcherwork@gmail.com> |
| Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> |
| Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/v4l2-core/v4l2-ctrls.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/media/v4l2-core/v4l2-ctrls.c |
| +++ b/drivers/media/v4l2-core/v4l2-ctrls.c |
| @@ -1196,6 +1196,16 @@ void v4l2_ctrl_fill(u32 id, const char * |
| } |
| EXPORT_SYMBOL(v4l2_ctrl_fill); |
| |
| +static u32 user_flags(const struct v4l2_ctrl *ctrl) |
| +{ |
| + u32 flags = ctrl->flags; |
| + |
| + if (ctrl->is_ptr) |
| + flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; |
| + |
| + return flags; |
| +} |
| + |
| static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes) |
| { |
| memset(ev->reserved, 0, sizeof(ev->reserved)); |
| @@ -1203,7 +1213,7 @@ static void fill_event(struct v4l2_event |
| ev->id = ctrl->id; |
| ev->u.ctrl.changes = changes; |
| ev->u.ctrl.type = ctrl->type; |
| - ev->u.ctrl.flags = ctrl->flags; |
| + ev->u.ctrl.flags = user_flags(ctrl); |
| if (ctrl->is_ptr) |
| ev->u.ctrl.value64 = 0; |
| else |
| @@ -2540,10 +2550,8 @@ int v4l2_query_ext_ctrl(struct v4l2_ctrl |
| else |
| qc->id = ctrl->id; |
| strlcpy(qc->name, ctrl->name, sizeof(qc->name)); |
| - qc->flags = ctrl->flags; |
| + qc->flags = user_flags(ctrl); |
| qc->type = ctrl->type; |
| - if (ctrl->is_ptr) |
| - qc->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; |
| qc->elem_size = ctrl->elem_size; |
| qc->elems = ctrl->elems; |
| qc->nr_of_dims = ctrl->nr_of_dims; |