Signed-off-by: Hans Verkuil <[email protected]>
---
drivers/media/video/v4l2-ctrls.c | 25 ++++++++++++++++++++++++-
drivers/media/video/v4l2-event.c | 2 +-
include/linux/videodev2.h | 5 ++++-
include/media/v4l2-ctrls.h | 4 +++-
4 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c
index 122c6da..e6fa9be 100644
--- a/drivers/media/video/v4l2-ctrls.c
+++ b/drivers/media/video/v4l2-ctrls.c
@@ -1912,10 +1912,33 @@ int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
}
EXPORT_SYMBOL(v4l2_ctrl_s_ctrl);
-void v4l2_ctrl_add_fh(struct v4l2_ctrl *ctrl, struct v4l2_ctrl_fh *ctrl_fh)
+void v4l2_ctrl_add_fh(struct v4l2_ctrl *ctrl, struct v4l2_ctrl_fh *ctrl_fh,
+ struct v4l2_event_subscription *sub)
{
v4l2_ctrl_lock(ctrl);
list_add_tail(&ctrl_fh->node, &ctrl->fhs);
+ if (sub->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL) {
+ struct v4l2_event ev;
+
+ ev.type = sub->type;
+ ev.id = ctrl->id;
+ switch (ev.type) {
+ case V4L2_EVENT_CTRL_CH_VALUE:
+ /* TODO: shouldn't be done for write-only or
button/ctrl_class
+ controls. */
+ if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
+ ev.u.ctrl_ch_value.value64 = ctrl->cur.val64;
+ else
+ ev.u.ctrl_ch_value.value = ctrl->cur.val;
+ v4l2_event_queue_fh(ctrl_fh->fh, &ev);
+ break;
+ case V4L2_EVENT_CTRL_CH_STATE:
+ ev.u.ctrl_ch_state.flags = ctrl->flags;
+ v4l2_event_queue_fh(ctrl_fh->fh, &ev);
+ default:
+ break;
+ }
+ }
v4l2_ctrl_unlock(ctrl);
}
EXPORT_SYMBOL(v4l2_ctrl_add_fh);
diff --git a/drivers/media/video/v4l2-event.c b/drivers/media/video/v4l2-event.c
index 9b503aa..06608e7 100644
--- a/drivers/media/video/v4l2-event.c
+++ b/drivers/media/video/v4l2-event.c
@@ -293,7 +293,7 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
/* v4l2_ctrl_add_fh uses a mutex, so do this outside the spin lock */
if (!found_ev && ctrl)
- v4l2_ctrl_add_fh(ctrl, ctrl_fh);
+ v4l2_ctrl_add_fh(ctrl, ctrl_fh, sub);
kfree(sev);
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index eb56685..2a20dd9 100644
--- a/include/linux/videodev2.h
+++ b/include/linux/videodev2.h
@@ -1827,10 +1827,13 @@ struct v4l2_event {
__u32 reserved[8];
};
+#define V4L2_EVENT_SUB_FL_SEND_INITIAL (1 << 0)
+
struct v4l2_event_subscription {
__u32 type;
__u32 id;
- __u32 reserved[6];
+ __u32 flags;
+ __u32 reserved[5];
};
/*
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index e6917f4..27714c9 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -30,6 +30,7 @@ struct v4l2_ctrl_handler;
struct v4l2_ctrl;
struct video_device;
struct v4l2_subdev;
+struct v4l2_event_subscription;
struct v4l2_fh;
/** struct v4l2_ctrl_ops - The control operations that the driver has to
provide.
@@ -445,7 +446,8 @@ s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
*/
int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
-void v4l2_ctrl_add_fh(struct v4l2_ctrl *ctrl, struct v4l2_ctrl_fh *ctrl_fh);
+void v4l2_ctrl_add_fh(struct v4l2_ctrl *ctrl, struct v4l2_ctrl_fh *ctrl_fh,
+ struct v4l2_event_subscription *sub);
void v4l2_ctrl_del_fh(struct v4l2_ctrl *ctrl, struct v4l2_fh *fh);
/* Helpers for ioctl_ops. If hdl == NULL then they will all return -EINVAL. */
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html