aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorHans Verkuil2011-06-10 05:56:39 -0300
committerMauro Carvalho Chehab2011-07-27 17:53:20 -0300
commitce7275747bd548e0da7425ba0b7edb6f2c7657a2 (patch)
tree5e230670266e64ed7f4317df5f39700bb92d5825 /drivers
parent6e239399e5807132f86f64af6c659411c6a3d1a5 (diff)
[media] v4l2-ctrls: simplify event subscription
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/v4l2-ctrls.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c
index 5f316667c142..d084cea2b3ba 100644
--- a/drivers/media/video/v4l2-ctrls.c
+++ b/drivers/media/video/v4l2-ctrls.c
@@ -1013,6 +1013,7 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
insertion is an O(1) operation. */
if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
list_add_tail(&new_ref->node, &hdl->ctrl_refs);
+ hdl->nr_of_refs++;
goto insert_in_hash;
}
@@ -2061,3 +2062,22 @@ void v4l2_ctrl_del_fh(struct v4l2_ctrl *ctrl, struct v4l2_fh *fh)
v4l2_ctrl_unlock(ctrl);
}
EXPORT_SYMBOL(v4l2_ctrl_del_fh);
+
+int v4l2_ctrl_subscribe_fh(struct v4l2_fh *fh,
+ struct v4l2_event_subscription *sub, unsigned n)
+{
+ struct v4l2_ctrl_handler *hdl = fh->ctrl_handler;
+ int ret = 0;
+
+ if (!fh->events)
+ ret = v4l2_event_init(fh);
+ if (!ret) {
+ if (hdl->nr_of_refs * 2 > n)
+ n = hdl->nr_of_refs * 2;
+ ret = v4l2_event_alloc(fh, n);
+ }
+ if (!ret)
+ ret = v4l2_event_subscribe(fh, sub);
+ return ret;
+}
+EXPORT_SYMBOL(v4l2_ctrl_subscribe_fh);