@@ -831,6 +831,22 @@ int v4l2_ctrl_handler_init(struct v4l2_ctrl_handler *hdl,
}
EXPORT_SYMBOL(v4l2_ctrl_handler_init);
+/* Count the number of controls */
+unsigned v4l2_ctrl_handler_cnt(struct v4l2_ctrl_handler *hdl)
+{
+ struct v4l2_ctrl_ref *ref;
+ unsigned cnt = 0;
+
+ if (hdl == NULL)
+ return 0;
+ mutex_lock(&hdl->lock);
+ list_for_each_entry(ref, &hdl->ctrl_refs, node)
+ cnt++;
+ mutex_unlock(&hdl->lock);
+ return cnt;
+}
+EXPORT_SYMBOL(v4l2_ctrl_handler_cnt);
+
/* Free all controls and control refs */
void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
{
@@ -1999,3 +2015,18 @@ 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_sub_fh(struct v4l2_fh *fh, struct v4l2_event_subscription *sub,
+ unsigned n)
+{
+ int ret = 0;
+
+ if (!fh->events)
+ ret = v4l2_event_init(fh);
+ if (!ret)
+ ret = v4l2_event_alloc(fh, n);
+ if (!ret)
+ ret = v4l2_event_subscribe(fh, sub);
+ return ret;
+}
+EXPORT_SYMBOL(v4l2_ctrl_sub_fh);
@@ -252,6 +252,14 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
int v4l2_ctrl_handler_init(struct v4l2_ctrl_handler *hdl,
unsigned nr_of_controls_hint);
+/** v4l2_ctrl_handler_cnt() - Count the number of controls in the handler.
+ * @hdl: The control handler.
+ *
+ * Returns the number of controls referenced by this handler.
+ * Returns 0 if @hdl == NULL.
+ */
+unsigned v4l2_ctrl_handler_cnt(struct v4l2_ctrl_handler *hdl);
+
/** v4l2_ctrl_handler_free() - Free all controls owned by the handler and free
* the control list.
* @hdl: The control handler.
@@ -446,11 +454,28 @@ s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
*/
int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
+/* Internal helper functions that deal with control events. */
void v4l2_ctrl_add_fh(struct v4l2_ctrl_handler *hdl,
struct v4l2_ctrl_fh *ctrl_fh,
struct v4l2_event_subscription *sub);
void v4l2_ctrl_del_fh(struct v4l2_ctrl *ctrl, struct v4l2_fh *fh);
+/** v4l2_ctrl_sub_fh() - Helper function that subscribes a control event.
+ * @fh: The file handler that subscribed the control event.
+ * @sub: The event to subscribe (type must be V4L2_EVENT_CTRL).
+ * @n: How many events should be allocated? (Passed to v4l2_event_alloc).
+ * Recommended to set to twice the number of controls plus whatever
+ * is needed for other events.
+ *
+ * A helper function that initializes the fh for events, allocates the
+ * list of events and subscribes the control event.
+ *
+ * Typically called in the handler of VIDIOC_SUBSCRIBE_EVENT in the
+ * V4L2_EVENT_CTRL case.
+ */
+int v4l2_ctrl_sub_fh(struct v4l2_fh *fh, struct v4l2_event_subscription *sub,
+ unsigned n);
+
/* Helpers for ioctl_ops. If hdl == NULL then they will all return -EINVAL. */
int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc);
int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm);