media: v4l2-ctrls: add v4l2_ctrl_request_hdl_find/put/ctrl_find functions
If a driver needs to find/inspect the controls set in a request then it can use these functions. E.g. to check if a required control is set in a request use this in the req_validate() implementation: int res = -EINVAL; hdl = v4l2_ctrl_request_hdl_find(req, parent_hdl); if (hdl) { if (v4l2_ctrl_request_hdl_ctrl_find(hdl, ctrl_id)) res = 0; v4l2_ctrl_request_hdl_put(hdl); } return res; Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Reviewed-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
c41e9cff70
commit
5f611d74c2
|
@ -2976,6 +2976,31 @@ static const struct media_request_object_ops req_ops = {
|
|||
.release = v4l2_ctrl_request_release,
|
||||
};
|
||||
|
||||
struct v4l2_ctrl_handler *v4l2_ctrl_request_hdl_find(struct media_request *req,
|
||||
struct v4l2_ctrl_handler *parent)
|
||||
{
|
||||
struct media_request_object *obj;
|
||||
|
||||
if (WARN_ON(req->state != MEDIA_REQUEST_STATE_VALIDATING &&
|
||||
req->state != MEDIA_REQUEST_STATE_QUEUED))
|
||||
return NULL;
|
||||
|
||||
obj = media_request_object_find(req, &req_ops, parent);
|
||||
if (obj)
|
||||
return container_of(obj, struct v4l2_ctrl_handler, req_obj);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_ctrl_request_hdl_find);
|
||||
|
||||
struct v4l2_ctrl *
|
||||
v4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
|
||||
{
|
||||
struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
|
||||
|
||||
return (ref && ref->req == ref) ? ref->ctrl : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_ctrl_request_hdl_ctrl_find);
|
||||
|
||||
static int v4l2_ctrl_request_bind(struct media_request *req,
|
||||
struct v4l2_ctrl_handler *hdl,
|
||||
struct v4l2_ctrl_handler *from)
|
||||
|
|
|
@ -1111,7 +1111,54 @@ void v4l2_ctrl_request_setup(struct media_request *req,
|
|||
* request object.
|
||||
*/
|
||||
void v4l2_ctrl_request_complete(struct media_request *req,
|
||||
struct v4l2_ctrl_handler *hdl);
|
||||
struct v4l2_ctrl_handler *parent);
|
||||
|
||||
/**
|
||||
* v4l2_ctrl_request_hdl_find - Find the control handler in the request
|
||||
*
|
||||
* @req: The request
|
||||
* @parent: The parent control handler ('priv' in media_request_object_find())
|
||||
*
|
||||
* This function finds the control handler in the request. It may return
|
||||
* NULL if not found. When done, you must call v4l2_ctrl_request_put_hdl()
|
||||
* with the returned handler pointer.
|
||||
*
|
||||
* If the request is not in state VALIDATING or QUEUED, then this function
|
||||
* will always return NULL.
|
||||
*
|
||||
* Note that in state VALIDATING the req_queue_mutex is held, so
|
||||
* no objects can be added or deleted from the request.
|
||||
*
|
||||
* In state QUEUED it is the driver that will have to ensure this.
|
||||
*/
|
||||
struct v4l2_ctrl_handler *v4l2_ctrl_request_hdl_find(struct media_request *req,
|
||||
struct v4l2_ctrl_handler *parent);
|
||||
|
||||
/**
|
||||
* v4l2_ctrl_request_hdl_put - Put the control handler
|
||||
*
|
||||
* @hdl: Put this control handler
|
||||
*
|
||||
* This function released the control handler previously obtained from'
|
||||
* v4l2_ctrl_request_hdl_find().
|
||||
*/
|
||||
static inline void v4l2_ctrl_request_hdl_put(struct v4l2_ctrl_handler *hdl)
|
||||
{
|
||||
if (hdl)
|
||||
media_request_object_put(&hdl->req_obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* v4l2_ctrl_request_ctrl_find() - Find a control with the given ID.
|
||||
*
|
||||
* @hdl: The control handler from the request.
|
||||
* @id: The ID of the control to find.
|
||||
*
|
||||
* This function returns a pointer to the control if this control is
|
||||
* part of the request or NULL otherwise.
|
||||
*/
|
||||
struct v4l2_ctrl *
|
||||
v4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id);
|
||||
|
||||
/* Helpers for ioctl_ops */
|
||||
|
||||
|
|
Loading…
Reference in New Issue