media: v4l2-ctrl: Fix flags field on Control events 75/175675/1
authorRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Tue, 17 Oct 2017 15:48:50 +0000 (11:48 -0400)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 11 Apr 2018 09:34:04 +0000 (18:34 +0900)
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>
[sw0312.kim: cherry-pick from linux-3.18.y]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I7ce4c954bdf559e7cf60816202e4fb1f2fa2ad90

drivers/media/v4l2-core/v4l2-ctrls.c

index 86012140923fcf57526952c975a9516084f174f1..7905ad9ffa35217017d93d2bb60f1cda34dd23d7 100644 (file)
@@ -1196,6 +1196,16 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
 }
 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, struct v4l2_ctrl *ctrl, u32 change
        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_handler *hdl, struct v4l2_query_ext_ctr
        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;