On 08/09/2018 10:16 PM, Mauro Carvalho Chehab wrote: > Em Sat, 4 Aug 2018 14:45:03 +0200 > Hans Verkuil <hverkuil@xxxxxxxxx> escreveu: > >> From: Hans Verkuil <hans.verkuil@xxxxxxxxx> >> >> Embed and initialize a media_request_object in struct v4l2_ctrl_handler. >> >> Add a p_req field to struct v4l2_ctrl_ref that will store the >> request value. >> >> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> >> Signed-off-by: Alexandre Courbot <acourbot@xxxxxxxxxxxx> > > Reviewed-by: Mauro Carvalho Chehab <mchehab+samsung@xxxxxxxxxx> > >> --- >> drivers/media/v4l2-core/v4l2-ctrls.c | 1 + >> include/media/v4l2-ctrls.h | 10 ++++++++++ >> 2 files changed, 11 insertions(+) >> >> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c >> index 404291f00715..b33a8bee82b0 100644 >> --- a/drivers/media/v4l2-core/v4l2-ctrls.c >> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c >> @@ -1901,6 +1901,7 @@ int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl, >> sizeof(hdl->buckets[0]), >> GFP_KERNEL | __GFP_ZERO); >> hdl->error = hdl->buckets ? 0 : -ENOMEM; >> + media_request_object_init(&hdl->req_obj); > > I don't like very much the idea of initializing it even when the > request API won't work, e. g. : > > if (!mdev->ops || !mdev->ops->req_validate || !mdev->ops->req_queue) > > but I guess it would be too early to check it here, right? Correct. Regards, Hans > >> return hdl->error; >> } >> EXPORT_SYMBOL(v4l2_ctrl_handler_init_class); >> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h >> index 192e31c21faf..3f4e062d4e3d 100644 >> --- a/include/media/v4l2-ctrls.h >> +++ b/include/media/v4l2-ctrls.h >> @@ -20,6 +20,7 @@ >> #include <linux/list.h> >> #include <linux/mutex.h> >> #include <linux/videodev2.h> >> +#include <media/media-request.h> >> >> /* forward references */ >> struct file; >> @@ -249,6 +250,11 @@ struct v4l2_ctrl { >> * ``prepare_ext_ctrls`` function at ``v4l2-ctrl.c``. >> * @from_other_dev: If true, then @ctrl was defined in another >> * device than the &struct v4l2_ctrl_handler. >> + * @p_req: If the control handler containing this control reference >> + * is bound to a media request, then this points to the >> + * value of the control that should be applied when the request >> + * is executed, or to the value of the control at the time >> + * that the request was completed. >> * >> * Each control handler has a list of these refs. The list_head is used to >> * keep a sorted-by-control-ID list of all controls, while the next pointer >> @@ -260,6 +266,7 @@ struct v4l2_ctrl_ref { >> struct v4l2_ctrl *ctrl; >> struct v4l2_ctrl_helper *helper; >> bool from_other_dev; >> + union v4l2_ctrl_ptr p_req; >> }; >> >> /** >> @@ -283,6 +290,8 @@ struct v4l2_ctrl_ref { >> * @notify_priv: Passed as argument to the v4l2_ctrl notify callback. >> * @nr_of_buckets: Total number of buckets in the array. >> * @error: The error code of the first failed control addition. >> + * @req_obj: The &struct media_request_object, used to link into a >> + * &struct media_request. This request object has a refcount. >> */ >> struct v4l2_ctrl_handler { >> struct mutex _lock; >> @@ -295,6 +304,7 @@ struct v4l2_ctrl_handler { >> void *notify_priv; >> u16 nr_of_buckets; >> int error; >> + struct media_request_object req_obj; >> }; >> >> /** > > > > Thanks, > Mauro >