]>
Commit | Line | Data |
---|---|---|
f71f4658 GKH |
1 | From 9cac9d2fb2fe0e0cadacdb94415b3fe49e3f724f Mon Sep 17 00:00:00 2001 |
2 | From: Ricardo Ribalda <ricardo.ribalda@gmail.com> | |
3 | Date: Tue, 17 Oct 2017 11:48:50 -0400 | |
4 | Subject: media: v4l2-ctrl: Fix flags field on Control events | |
5 | ||
6 | From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | |
7 | ||
8 | commit 9cac9d2fb2fe0e0cadacdb94415b3fe49e3f724f upstream. | |
9 | ||
10 | VIDIOC_DQEVENT and VIDIOC_QUERY_EXT_CTRL should give the same output for | |
11 | the control flags field. | |
12 | ||
13 | This patch creates a new function user_flags(), that calculates the user | |
14 | exported flags value (which is different than the kernel internal flags | |
15 | structure). This function is then used by all the code that exports the | |
16 | internal flags to userspace. | |
17 | ||
18 | Reported-by: Dimitrios Katsaros <patcherwork@gmail.com> | |
19 | Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | |
20 | Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> | |
21 | Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> | |
22 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
23 | ||
24 | --- | |
25 | drivers/media/v4l2-core/v4l2-ctrls.c | 16 ++++++++++++---- | |
26 | 1 file changed, 12 insertions(+), 4 deletions(-) | |
27 | ||
28 | --- a/drivers/media/v4l2-core/v4l2-ctrls.c | |
29 | +++ b/drivers/media/v4l2-core/v4l2-ctrls.c | |
30 | @@ -1196,6 +1196,16 @@ void v4l2_ctrl_fill(u32 id, const char * | |
31 | } | |
32 | EXPORT_SYMBOL(v4l2_ctrl_fill); | |
33 | ||
34 | +static u32 user_flags(const struct v4l2_ctrl *ctrl) | |
35 | +{ | |
36 | + u32 flags = ctrl->flags; | |
37 | + | |
38 | + if (ctrl->is_ptr) | |
39 | + flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; | |
40 | + | |
41 | + return flags; | |
42 | +} | |
43 | + | |
44 | static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes) | |
45 | { | |
46 | memset(ev->reserved, 0, sizeof(ev->reserved)); | |
47 | @@ -1203,7 +1213,7 @@ static void fill_event(struct v4l2_event | |
48 | ev->id = ctrl->id; | |
49 | ev->u.ctrl.changes = changes; | |
50 | ev->u.ctrl.type = ctrl->type; | |
51 | - ev->u.ctrl.flags = ctrl->flags; | |
52 | + ev->u.ctrl.flags = user_flags(ctrl); | |
53 | if (ctrl->is_ptr) | |
54 | ev->u.ctrl.value64 = 0; | |
55 | else | |
56 | @@ -2540,10 +2550,8 @@ int v4l2_query_ext_ctrl(struct v4l2_ctrl | |
57 | else | |
58 | qc->id = ctrl->id; | |
59 | strlcpy(qc->name, ctrl->name, sizeof(qc->name)); | |
60 | - qc->flags = ctrl->flags; | |
61 | + qc->flags = user_flags(ctrl); | |
62 | qc->type = ctrl->type; | |
63 | - if (ctrl->is_ptr) | |
64 | - qc->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; | |
65 | qc->elem_size = ctrl->elem_size; | |
66 | qc->elems = ctrl->elems; | |
67 | qc->nr_of_dims = ctrl->nr_of_dims; |