aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/v4l2-ctrls.c20
-rw-r--r--include/media/v4l2-ctrls.h20
2 files changed, 40 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,
1013 insertion is an O(1) operation. */ 1013 insertion is an O(1) operation. */
1014 if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) { 1014 if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
1015 list_add_tail(&new_ref->node, &hdl->ctrl_refs); 1015 list_add_tail(&new_ref->node, &hdl->ctrl_refs);
1016 hdl->nr_of_refs++;
1016 goto insert_in_hash; 1017 goto insert_in_hash;
1017 } 1018 }
1018 1019
@@ -2061,3 +2062,22 @@ void v4l2_ctrl_del_fh(struct v4l2_ctrl *ctrl, struct v4l2_fh *fh)
2061 v4l2_ctrl_unlock(ctrl); 2062 v4l2_ctrl_unlock(ctrl);
2062} 2063}
2063EXPORT_SYMBOL(v4l2_ctrl_del_fh); 2064EXPORT_SYMBOL(v4l2_ctrl_del_fh);
2065
2066int v4l2_ctrl_subscribe_fh(struct v4l2_fh *fh,
2067 struct v4l2_event_subscription *sub, unsigned n)
2068{
2069 struct v4l2_ctrl_handler *hdl = fh->ctrl_handler;
2070 int ret = 0;
2071
2072 if (!fh->events)
2073 ret = v4l2_event_init(fh);
2074 if (!ret) {
2075 if (hdl->nr_of_refs * 2 > n)
2076 n = hdl->nr_of_refs * 2;
2077 ret = v4l2_event_alloc(fh, n);
2078 }
2079 if (!ret)
2080 ret = v4l2_event_subscribe(fh, sub);
2081 return ret;
2082}
2083EXPORT_SYMBOL(v4l2_ctrl_subscribe_fh);
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index c45bf40e080d..de68a59c7d84 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -169,6 +169,7 @@ struct v4l2_ctrl_ref {
169 * control is needed multiple times, so this is a simple 169 * control is needed multiple times, so this is a simple
170 * optimization. 170 * optimization.
171 * @buckets: Buckets for the hashing. Allows for quick control lookup. 171 * @buckets: Buckets for the hashing. Allows for quick control lookup.
172 * @nr_of_refs: Total number of control references in the list.
172 * @nr_of_buckets: Total number of buckets in the array. 173 * @nr_of_buckets: Total number of buckets in the array.
173 * @error: The error code of the first failed control addition. 174 * @error: The error code of the first failed control addition.
174 */ 175 */
@@ -178,6 +179,7 @@ struct v4l2_ctrl_handler {
178 struct list_head ctrl_refs; 179 struct list_head ctrl_refs;
179 struct v4l2_ctrl_ref *cached; 180 struct v4l2_ctrl_ref *cached;
180 struct v4l2_ctrl_ref **buckets; 181 struct v4l2_ctrl_ref **buckets;
182 u16 nr_of_refs;
181 u16 nr_of_buckets; 183 u16 nr_of_buckets;
182 int error; 184 int error;
183}; 185};
@@ -494,11 +496,29 @@ s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
494 */ 496 */
495int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val); 497int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
496 498
499/* Internal helper functions that deal with control events. */
497void v4l2_ctrl_add_fh(struct v4l2_ctrl_handler *hdl, 500void v4l2_ctrl_add_fh(struct v4l2_ctrl_handler *hdl,
498 struct v4l2_ctrl_fh *ctrl_fh, 501 struct v4l2_ctrl_fh *ctrl_fh,
499 struct v4l2_event_subscription *sub); 502 struct v4l2_event_subscription *sub);
500void v4l2_ctrl_del_fh(struct v4l2_ctrl *ctrl, struct v4l2_fh *fh); 503void v4l2_ctrl_del_fh(struct v4l2_ctrl *ctrl, struct v4l2_fh *fh);
501 504
505/** v4l2_ctrl_subscribe_fh() - Helper function that subscribes a control event.
506 * @fh: The file handler that subscribed the control event.
507 * @sub: The event to subscribe (type must be V4L2_EVENT_CTRL).
508 * @n: How many events should be allocated? (Passed to v4l2_event_alloc).
509 * Recommended to set to twice the number of controls plus whatever
510 * is needed for other events. This function will set n to
511 * max(n, 2 * fh->ctrl_handler->nr_of_refs).
512 *
513 * A helper function that initializes the fh for events, allocates the
514 * list of events and subscribes the control event.
515 *
516 * Typically called in the handler of VIDIOC_SUBSCRIBE_EVENT in the
517 * V4L2_EVENT_CTRL case.
518 */
519int v4l2_ctrl_subscribe_fh(struct v4l2_fh *fh,
520 struct v4l2_event_subscription *sub, unsigned n);
521
502/* Helpers for ioctl_ops. If hdl == NULL then they will all return -EINVAL. */ 522/* Helpers for ioctl_ops. If hdl == NULL then they will all return -EINVAL. */
503int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc); 523int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc);
504int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm); 524int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm);