Commit 6fa6f831 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: v4l2-ctrls: add core request support

Integrate the request support. This adds the v4l2_ctrl_request_complete
and v4l2_ctrl_request_setup functions to complete a request and (as a
helper function) to apply a request to the hardware.

It takes care of queuing requests and correctly chaining control values
in the request queue.

Note that when a request is marked completed it will copy control values
to the internal request state. This can be optimized in the future since
this is sub-optimal when dealing with large compound and/or array controls.

For the initial 'stateless codec' use-case the current implementation is
sufficient.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Reviewed-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent dcea5601
This diff is collapsed.
......@@ -250,6 +250,12 @@ 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.
* @req_done: Internal flag: if the control handler containing this control
* reference is bound to a media request, then this is set when
* the control has been applied. This prevents applying controls
* from a cluster with multiple controls twice (when the first
* control of a cluster is applied, they all are).
* @req: If set, this refers to another request that sets this control.
* @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
......@@ -266,6 +272,8 @@ struct v4l2_ctrl_ref {
struct v4l2_ctrl *ctrl;
struct v4l2_ctrl_helper *helper;
bool from_other_dev;
bool req_done;
struct v4l2_ctrl_ref *req;
union v4l2_ctrl_ptr p_req;
};
......@@ -290,6 +298,15 @@ 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.
* @request_is_queued: True if the request was queued.
* @requests: List to keep track of open control handler request objects.
* For the parent control handler (@req_obj.req == NULL) this
* is the list header. When the parent control handler is
* removed, it has to unbind and put all these requests since
* they refer to the parent.
* @requests_queued: List of the queued requests. This determines the order
* in which these controls are applied. Once the request is
* completed it is removed from this list.
* @req_obj: The &struct media_request_object, used to link into a
* &struct media_request. This request object has a refcount.
*/
......@@ -304,6 +321,9 @@ struct v4l2_ctrl_handler {
void *notify_priv;
u16 nr_of_buckets;
int error;
bool request_is_queued;
struct list_head requests;
struct list_head requests_queued;
struct media_request_object req_obj;
};
......@@ -1062,6 +1082,37 @@ int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
*/
__poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait);
/**
* v4l2_ctrl_request_setup - helper function to apply control values in a request
*
* @req: The request
* @parent: The parent control handler ('priv' in media_request_object_find())
*
* This is a helper function to call the control handler's s_ctrl callback with
* the control values contained in the request. Do note that this approach of
* applying control values in a request is only applicable to memory-to-memory
* devices.
*/
void v4l2_ctrl_request_setup(struct media_request *req,
struct v4l2_ctrl_handler *parent);
/**
* v4l2_ctrl_request_complete - Complete a control handler request object
*
* @req: The request
* @parent: The parent control handler ('priv' in media_request_object_find())
*
* This function is to be called on each control handler that may have had a
* request object associated with it, i.e. control handlers of a driver that
* supports requests.
*
* The function first obtains the values of any volatile controls in the control
* handler and attach them to the request. Then, the function completes the
* request object.
*/
void v4l2_ctrl_request_complete(struct media_request *req,
struct v4l2_ctrl_handler *hdl);
/* Helpers for ioctl_ops */
/**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment