162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  V4L2 controls support header.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2010  Hans Verkuil <hverkuil@xs4all.nl>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _V4L2_CTRLS_H
962306a36Sopenharmony_ci#define _V4L2_CTRLS_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/list.h>
1262306a36Sopenharmony_ci#include <linux/mutex.h>
1362306a36Sopenharmony_ci#include <linux/videodev2.h>
1462306a36Sopenharmony_ci#include <media/media-request.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* forward references */
1762306a36Sopenharmony_cistruct file;
1862306a36Sopenharmony_cistruct poll_table_struct;
1962306a36Sopenharmony_cistruct v4l2_ctrl;
2062306a36Sopenharmony_cistruct v4l2_ctrl_handler;
2162306a36Sopenharmony_cistruct v4l2_ctrl_helper;
2262306a36Sopenharmony_cistruct v4l2_fh;
2362306a36Sopenharmony_cistruct v4l2_fwnode_device_properties;
2462306a36Sopenharmony_cistruct v4l2_subdev;
2562306a36Sopenharmony_cistruct v4l2_subscribed_event;
2662306a36Sopenharmony_cistruct video_device;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/**
2962306a36Sopenharmony_ci * union v4l2_ctrl_ptr - A pointer to a control value.
3062306a36Sopenharmony_ci * @p_s32:			Pointer to a 32-bit signed value.
3162306a36Sopenharmony_ci * @p_s64:			Pointer to a 64-bit signed value.
3262306a36Sopenharmony_ci * @p_u8:			Pointer to a 8-bit unsigned value.
3362306a36Sopenharmony_ci * @p_u16:			Pointer to a 16-bit unsigned value.
3462306a36Sopenharmony_ci * @p_u32:			Pointer to a 32-bit unsigned value.
3562306a36Sopenharmony_ci * @p_char:			Pointer to a string.
3662306a36Sopenharmony_ci * @p_mpeg2_sequence:		Pointer to a MPEG2 sequence structure.
3762306a36Sopenharmony_ci * @p_mpeg2_picture:		Pointer to a MPEG2 picture structure.
3862306a36Sopenharmony_ci * @p_mpeg2_quantisation:	Pointer to a MPEG2 quantisation data structure.
3962306a36Sopenharmony_ci * @p_fwht_params:		Pointer to a FWHT stateless parameters structure.
4062306a36Sopenharmony_ci * @p_h264_sps:			Pointer to a struct v4l2_ctrl_h264_sps.
4162306a36Sopenharmony_ci * @p_h264_pps:			Pointer to a struct v4l2_ctrl_h264_pps.
4262306a36Sopenharmony_ci * @p_h264_scaling_matrix:	Pointer to a struct v4l2_ctrl_h264_scaling_matrix.
4362306a36Sopenharmony_ci * @p_h264_slice_params:	Pointer to a struct v4l2_ctrl_h264_slice_params.
4462306a36Sopenharmony_ci * @p_h264_decode_params:	Pointer to a struct v4l2_ctrl_h264_decode_params.
4562306a36Sopenharmony_ci * @p_h264_pred_weights:	Pointer to a struct v4l2_ctrl_h264_pred_weights.
4662306a36Sopenharmony_ci * @p_vp8_frame:		Pointer to a VP8 frame params structure.
4762306a36Sopenharmony_ci * @p_vp9_compressed_hdr_probs:	Pointer to a VP9 frame compressed header probs structure.
4862306a36Sopenharmony_ci * @p_vp9_frame:		Pointer to a VP9 frame params structure.
4962306a36Sopenharmony_ci * @p_hevc_sps:			Pointer to an HEVC sequence parameter set structure.
5062306a36Sopenharmony_ci * @p_hevc_pps:			Pointer to an HEVC picture parameter set structure.
5162306a36Sopenharmony_ci * @p_hevc_slice_params:	Pointer to an HEVC slice parameters structure.
5262306a36Sopenharmony_ci * @p_hdr10_cll:		Pointer to an HDR10 Content Light Level structure.
5362306a36Sopenharmony_ci * @p_hdr10_mastering:		Pointer to an HDR10 Mastering Display structure.
5462306a36Sopenharmony_ci * @p_area:			Pointer to an area.
5562306a36Sopenharmony_ci * @p_av1_sequence:		Pointer to an AV1 sequence structure.
5662306a36Sopenharmony_ci * @p_av1_tile_group_entry:	Pointer to an AV1 tile group entry structure.
5762306a36Sopenharmony_ci * @p_av1_frame:		Pointer to an AV1 frame structure.
5862306a36Sopenharmony_ci * @p_av1_film_grain:		Pointer to an AV1 film grain structure.
5962306a36Sopenharmony_ci * @p:				Pointer to a compound value.
6062306a36Sopenharmony_ci * @p_const:			Pointer to a constant compound value.
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ciunion v4l2_ctrl_ptr {
6362306a36Sopenharmony_ci	s32 *p_s32;
6462306a36Sopenharmony_ci	s64 *p_s64;
6562306a36Sopenharmony_ci	u8 *p_u8;
6662306a36Sopenharmony_ci	u16 *p_u16;
6762306a36Sopenharmony_ci	u32 *p_u32;
6862306a36Sopenharmony_ci	char *p_char;
6962306a36Sopenharmony_ci	struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
7062306a36Sopenharmony_ci	struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
7162306a36Sopenharmony_ci	struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation;
7262306a36Sopenharmony_ci	struct v4l2_ctrl_fwht_params *p_fwht_params;
7362306a36Sopenharmony_ci	struct v4l2_ctrl_h264_sps *p_h264_sps;
7462306a36Sopenharmony_ci	struct v4l2_ctrl_h264_pps *p_h264_pps;
7562306a36Sopenharmony_ci	struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;
7662306a36Sopenharmony_ci	struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
7762306a36Sopenharmony_ci	struct v4l2_ctrl_h264_decode_params *p_h264_decode_params;
7862306a36Sopenharmony_ci	struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights;
7962306a36Sopenharmony_ci	struct v4l2_ctrl_vp8_frame *p_vp8_frame;
8062306a36Sopenharmony_ci	struct v4l2_ctrl_hevc_sps *p_hevc_sps;
8162306a36Sopenharmony_ci	struct v4l2_ctrl_hevc_pps *p_hevc_pps;
8262306a36Sopenharmony_ci	struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params;
8362306a36Sopenharmony_ci	struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs;
8462306a36Sopenharmony_ci	struct v4l2_ctrl_vp9_frame *p_vp9_frame;
8562306a36Sopenharmony_ci	struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll;
8662306a36Sopenharmony_ci	struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
8762306a36Sopenharmony_ci	struct v4l2_area *p_area;
8862306a36Sopenharmony_ci	struct v4l2_ctrl_av1_sequence *p_av1_sequence;
8962306a36Sopenharmony_ci	struct v4l2_ctrl_av1_tile_group_entry *p_av1_tile_group_entry;
9062306a36Sopenharmony_ci	struct v4l2_ctrl_av1_frame *p_av1_frame;
9162306a36Sopenharmony_ci	struct v4l2_ctrl_av1_film_grain *p_av1_film_grain;
9262306a36Sopenharmony_ci	void *p;
9362306a36Sopenharmony_ci	const void *p_const;
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/**
9762306a36Sopenharmony_ci * v4l2_ctrl_ptr_create() - Helper function to return a v4l2_ctrl_ptr from a
9862306a36Sopenharmony_ci * void pointer
9962306a36Sopenharmony_ci * @ptr:	The void pointer
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_cistatic inline union v4l2_ctrl_ptr v4l2_ctrl_ptr_create(void *ptr)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	union v4l2_ctrl_ptr p = { .p = ptr };
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	return p;
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/**
10962306a36Sopenharmony_ci * struct v4l2_ctrl_ops - The control operations that the driver has to provide.
11062306a36Sopenharmony_ci *
11162306a36Sopenharmony_ci * @g_volatile_ctrl: Get a new value for this control. Generally only relevant
11262306a36Sopenharmony_ci *		for volatile (and usually read-only) controls such as a control
11362306a36Sopenharmony_ci *		that returns the current signal strength which changes
11462306a36Sopenharmony_ci *		continuously.
11562306a36Sopenharmony_ci *		If not set, then the currently cached value will be returned.
11662306a36Sopenharmony_ci * @try_ctrl:	Test whether the control's value is valid. Only relevant when
11762306a36Sopenharmony_ci *		the usual min/max/step checks are not sufficient.
11862306a36Sopenharmony_ci * @s_ctrl:	Actually set the new control value. s_ctrl is compulsory. The
11962306a36Sopenharmony_ci *		ctrl->handler->lock is held when these ops are called, so no
12062306a36Sopenharmony_ci *		one else can access controls owned by that handler.
12162306a36Sopenharmony_ci */
12262306a36Sopenharmony_cistruct v4l2_ctrl_ops {
12362306a36Sopenharmony_ci	int (*g_volatile_ctrl)(struct v4l2_ctrl *ctrl);
12462306a36Sopenharmony_ci	int (*try_ctrl)(struct v4l2_ctrl *ctrl);
12562306a36Sopenharmony_ci	int (*s_ctrl)(struct v4l2_ctrl *ctrl);
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/**
12962306a36Sopenharmony_ci * struct v4l2_ctrl_type_ops - The control type operations that the driver
13062306a36Sopenharmony_ci *			       has to provide.
13162306a36Sopenharmony_ci *
13262306a36Sopenharmony_ci * @equal: return true if all ctrl->elems array elements are equal.
13362306a36Sopenharmony_ci * @init: initialize the value for array elements from from_idx to ctrl->elems.
13462306a36Sopenharmony_ci * @log: log the value.
13562306a36Sopenharmony_ci * @validate: validate the value for ctrl->new_elems array elements.
13662306a36Sopenharmony_ci *	Return 0 on success and a negative value otherwise.
13762306a36Sopenharmony_ci */
13862306a36Sopenharmony_cistruct v4l2_ctrl_type_ops {
13962306a36Sopenharmony_ci	bool (*equal)(const struct v4l2_ctrl *ctrl,
14062306a36Sopenharmony_ci		      union v4l2_ctrl_ptr ptr1, union v4l2_ctrl_ptr ptr2);
14162306a36Sopenharmony_ci	void (*init)(const struct v4l2_ctrl *ctrl, u32 from_idx,
14262306a36Sopenharmony_ci		     union v4l2_ctrl_ptr ptr);
14362306a36Sopenharmony_ci	void (*log)(const struct v4l2_ctrl *ctrl);
14462306a36Sopenharmony_ci	int (*validate)(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr ptr);
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/**
14862306a36Sopenharmony_ci * typedef v4l2_ctrl_notify_fnc - typedef for a notify argument with a function
14962306a36Sopenharmony_ci *	that should be called when a control value has changed.
15062306a36Sopenharmony_ci *
15162306a36Sopenharmony_ci * @ctrl: pointer to struct &v4l2_ctrl
15262306a36Sopenharmony_ci * @priv: control private data
15362306a36Sopenharmony_ci *
15462306a36Sopenharmony_ci * This typedef definition is used as an argument to v4l2_ctrl_notify()
15562306a36Sopenharmony_ci * and as an argument at struct &v4l2_ctrl_handler.
15662306a36Sopenharmony_ci */
15762306a36Sopenharmony_citypedef void (*v4l2_ctrl_notify_fnc)(struct v4l2_ctrl *ctrl, void *priv);
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci/**
16062306a36Sopenharmony_ci * struct v4l2_ctrl - The control structure.
16162306a36Sopenharmony_ci *
16262306a36Sopenharmony_ci * @node:	The list node.
16362306a36Sopenharmony_ci * @ev_subs:	The list of control event subscriptions.
16462306a36Sopenharmony_ci * @handler:	The handler that owns the control.
16562306a36Sopenharmony_ci * @cluster:	Point to start of cluster array.
16662306a36Sopenharmony_ci * @ncontrols:	Number of controls in cluster array.
16762306a36Sopenharmony_ci * @done:	Internal flag: set for each processed control.
16862306a36Sopenharmony_ci * @is_new:	Set when the user specified a new value for this control. It
16962306a36Sopenharmony_ci *		is also set when called from v4l2_ctrl_handler_setup(). Drivers
17062306a36Sopenharmony_ci *		should never set this flag.
17162306a36Sopenharmony_ci * @has_changed: Set when the current value differs from the new value. Drivers
17262306a36Sopenharmony_ci *		should never use this flag.
17362306a36Sopenharmony_ci * @is_private: If set, then this control is private to its handler and it
17462306a36Sopenharmony_ci *		will not be added to any other handlers. Drivers can set
17562306a36Sopenharmony_ci *		this flag.
17662306a36Sopenharmony_ci * @is_auto:   If set, then this control selects whether the other cluster
17762306a36Sopenharmony_ci *		members are in 'automatic' mode or 'manual' mode. This is
17862306a36Sopenharmony_ci *		used for autogain/gain type clusters. Drivers should never
17962306a36Sopenharmony_ci *		set this flag directly.
18062306a36Sopenharmony_ci * @is_int:    If set, then this control has a simple integer value (i.e. it
18162306a36Sopenharmony_ci *		uses ctrl->val).
18262306a36Sopenharmony_ci * @is_string: If set, then this control has type %V4L2_CTRL_TYPE_STRING.
18362306a36Sopenharmony_ci * @is_ptr:	If set, then this control is an array and/or has type >=
18462306a36Sopenharmony_ci *		%V4L2_CTRL_COMPOUND_TYPES
18562306a36Sopenharmony_ci *		and/or has type %V4L2_CTRL_TYPE_STRING. In other words, &struct
18662306a36Sopenharmony_ci *		v4l2_ext_control uses field p to point to the data.
18762306a36Sopenharmony_ci * @is_array: If set, then this control contains an N-dimensional array.
18862306a36Sopenharmony_ci * @is_dyn_array: If set, then this control contains a dynamically sized 1-dimensional array.
18962306a36Sopenharmony_ci *		If this is set, then @is_array is also set.
19062306a36Sopenharmony_ci * @has_volatiles: If set, then one or more members of the cluster are volatile.
19162306a36Sopenharmony_ci *		Drivers should never touch this flag.
19262306a36Sopenharmony_ci * @call_notify: If set, then call the handler's notify function whenever the
19362306a36Sopenharmony_ci *		control's value changes.
19462306a36Sopenharmony_ci * @manual_mode_value: If the is_auto flag is set, then this is the value
19562306a36Sopenharmony_ci *		of the auto control that determines if that control is in
19662306a36Sopenharmony_ci *		manual mode. So if the value of the auto control equals this
19762306a36Sopenharmony_ci *		value, then the whole cluster is in manual mode. Drivers should
19862306a36Sopenharmony_ci *		never set this flag directly.
19962306a36Sopenharmony_ci * @ops:	The control ops.
20062306a36Sopenharmony_ci * @type_ops:	The control type ops.
20162306a36Sopenharmony_ci * @id:	The control ID.
20262306a36Sopenharmony_ci * @name:	The control name.
20362306a36Sopenharmony_ci * @type:	The control type.
20462306a36Sopenharmony_ci * @minimum:	The control's minimum value.
20562306a36Sopenharmony_ci * @maximum:	The control's maximum value.
20662306a36Sopenharmony_ci * @default_value: The control's default value.
20762306a36Sopenharmony_ci * @step:	The control's step value for non-menu controls.
20862306a36Sopenharmony_ci * @elems:	The number of elements in the N-dimensional array.
20962306a36Sopenharmony_ci * @elem_size:	The size in bytes of the control.
21062306a36Sopenharmony_ci * @new_elems:	The number of elements in p_new. This is the same as @elems,
21162306a36Sopenharmony_ci *		except for dynamic arrays. In that case it is in the range of
21262306a36Sopenharmony_ci *		1 to @p_array_alloc_elems.
21362306a36Sopenharmony_ci * @dims:	The size of each dimension.
21462306a36Sopenharmony_ci * @nr_of_dims:The number of dimensions in @dims.
21562306a36Sopenharmony_ci * @menu_skip_mask: The control's skip mask for menu controls. This makes it
21662306a36Sopenharmony_ci *		easy to skip menu items that are not valid. If bit X is set,
21762306a36Sopenharmony_ci *		then menu item X is skipped. Of course, this only works for
21862306a36Sopenharmony_ci *		menus with <= 32 menu items. There are no menus that come
21962306a36Sopenharmony_ci *		close to that number, so this is OK. Should we ever need more,
22062306a36Sopenharmony_ci *		then this will have to be extended to a u64 or a bit array.
22162306a36Sopenharmony_ci * @qmenu:	A const char * array for all menu items. Array entries that are
22262306a36Sopenharmony_ci *		empty strings ("") correspond to non-existing menu items (this
22362306a36Sopenharmony_ci *		is in addition to the menu_skip_mask above). The last entry
22462306a36Sopenharmony_ci *		must be NULL.
22562306a36Sopenharmony_ci *		Used only if the @type is %V4L2_CTRL_TYPE_MENU.
22662306a36Sopenharmony_ci * @qmenu_int:	A 64-bit integer array for with integer menu items.
22762306a36Sopenharmony_ci *		The size of array must be equal to the menu size, e. g.:
22862306a36Sopenharmony_ci *		:math:`ceil(\frac{maximum - minimum}{step}) + 1`.
22962306a36Sopenharmony_ci *		Used only if the @type is %V4L2_CTRL_TYPE_INTEGER_MENU.
23062306a36Sopenharmony_ci * @flags:	The control's flags.
23162306a36Sopenharmony_ci * @priv:	The control's private pointer. For use by the driver. It is
23262306a36Sopenharmony_ci *		untouched by the control framework. Note that this pointer is
23362306a36Sopenharmony_ci *		not freed when the control is deleted. Should this be needed
23462306a36Sopenharmony_ci *		then a new internal bitfield can be added to tell the framework
23562306a36Sopenharmony_ci *		to free this pointer.
23662306a36Sopenharmony_ci * @p_array:	Pointer to the allocated array. Only valid if @is_array is true.
23762306a36Sopenharmony_ci * @p_array_alloc_elems: The number of elements in the allocated
23862306a36Sopenharmony_ci *		array for both the cur and new values. So @p_array is actually
23962306a36Sopenharmony_ci *		sized for 2 * @p_array_alloc_elems * @elem_size. Only valid if
24062306a36Sopenharmony_ci *		@is_array is true.
24162306a36Sopenharmony_ci * @cur:	Structure to store the current value.
24262306a36Sopenharmony_ci * @cur.val:	The control's current value, if the @type is represented via
24362306a36Sopenharmony_ci *		a u32 integer (see &enum v4l2_ctrl_type).
24462306a36Sopenharmony_ci * @val:	The control's new s32 value.
24562306a36Sopenharmony_ci * @p_def:	The control's default value represented via a union which
24662306a36Sopenharmony_ci *		provides a standard way of accessing control types
24762306a36Sopenharmony_ci *		through a pointer (for compound controls only).
24862306a36Sopenharmony_ci * @p_cur:	The control's current value represented via a union which
24962306a36Sopenharmony_ci *		provides a standard way of accessing control types
25062306a36Sopenharmony_ci *		through a pointer.
25162306a36Sopenharmony_ci * @p_new:	The control's new value represented via a union which provides
25262306a36Sopenharmony_ci *		a standard way of accessing control types
25362306a36Sopenharmony_ci *		through a pointer.
25462306a36Sopenharmony_ci */
25562306a36Sopenharmony_cistruct v4l2_ctrl {
25662306a36Sopenharmony_ci	/* Administrative fields */
25762306a36Sopenharmony_ci	struct list_head node;
25862306a36Sopenharmony_ci	struct list_head ev_subs;
25962306a36Sopenharmony_ci	struct v4l2_ctrl_handler *handler;
26062306a36Sopenharmony_ci	struct v4l2_ctrl **cluster;
26162306a36Sopenharmony_ci	unsigned int ncontrols;
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	unsigned int done:1;
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	unsigned int is_new:1;
26662306a36Sopenharmony_ci	unsigned int has_changed:1;
26762306a36Sopenharmony_ci	unsigned int is_private:1;
26862306a36Sopenharmony_ci	unsigned int is_auto:1;
26962306a36Sopenharmony_ci	unsigned int is_int:1;
27062306a36Sopenharmony_ci	unsigned int is_string:1;
27162306a36Sopenharmony_ci	unsigned int is_ptr:1;
27262306a36Sopenharmony_ci	unsigned int is_array:1;
27362306a36Sopenharmony_ci	unsigned int is_dyn_array:1;
27462306a36Sopenharmony_ci	unsigned int has_volatiles:1;
27562306a36Sopenharmony_ci	unsigned int call_notify:1;
27662306a36Sopenharmony_ci	unsigned int manual_mode_value:8;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	const struct v4l2_ctrl_ops *ops;
27962306a36Sopenharmony_ci	const struct v4l2_ctrl_type_ops *type_ops;
28062306a36Sopenharmony_ci	u32 id;
28162306a36Sopenharmony_ci	const char *name;
28262306a36Sopenharmony_ci	enum v4l2_ctrl_type type;
28362306a36Sopenharmony_ci	s64 minimum, maximum, default_value;
28462306a36Sopenharmony_ci	u32 elems;
28562306a36Sopenharmony_ci	u32 elem_size;
28662306a36Sopenharmony_ci	u32 new_elems;
28762306a36Sopenharmony_ci	u32 dims[V4L2_CTRL_MAX_DIMS];
28862306a36Sopenharmony_ci	u32 nr_of_dims;
28962306a36Sopenharmony_ci	union {
29062306a36Sopenharmony_ci		u64 step;
29162306a36Sopenharmony_ci		u64 menu_skip_mask;
29262306a36Sopenharmony_ci	};
29362306a36Sopenharmony_ci	union {
29462306a36Sopenharmony_ci		const char * const *qmenu;
29562306a36Sopenharmony_ci		const s64 *qmenu_int;
29662306a36Sopenharmony_ci	};
29762306a36Sopenharmony_ci	unsigned long flags;
29862306a36Sopenharmony_ci	void *priv;
29962306a36Sopenharmony_ci	void *p_array;
30062306a36Sopenharmony_ci	u32 p_array_alloc_elems;
30162306a36Sopenharmony_ci	s32 val;
30262306a36Sopenharmony_ci	struct {
30362306a36Sopenharmony_ci		s32 val;
30462306a36Sopenharmony_ci	} cur;
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	union v4l2_ctrl_ptr p_def;
30762306a36Sopenharmony_ci	union v4l2_ctrl_ptr p_new;
30862306a36Sopenharmony_ci	union v4l2_ctrl_ptr p_cur;
30962306a36Sopenharmony_ci};
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci/**
31262306a36Sopenharmony_ci * struct v4l2_ctrl_ref - The control reference.
31362306a36Sopenharmony_ci *
31462306a36Sopenharmony_ci * @node:	List node for the sorted list.
31562306a36Sopenharmony_ci * @next:	Single-link list node for the hash.
31662306a36Sopenharmony_ci * @ctrl:	The actual control information.
31762306a36Sopenharmony_ci * @helper:	Pointer to helper struct. Used internally in
31862306a36Sopenharmony_ci *		``prepare_ext_ctrls`` function at ``v4l2-ctrl.c``.
31962306a36Sopenharmony_ci * @from_other_dev: If true, then @ctrl was defined in another
32062306a36Sopenharmony_ci *		device than the &struct v4l2_ctrl_handler.
32162306a36Sopenharmony_ci * @req_done:	Internal flag: if the control handler containing this control
32262306a36Sopenharmony_ci *		reference is bound to a media request, then this is set when
32362306a36Sopenharmony_ci *		the control has been applied. This prevents applying controls
32462306a36Sopenharmony_ci *		from a cluster with multiple controls twice (when the first
32562306a36Sopenharmony_ci *		control of a cluster is applied, they all are).
32662306a36Sopenharmony_ci * @p_req_valid: If set, then p_req contains the control value for the request.
32762306a36Sopenharmony_ci * @p_req_array_enomem: If set, then p_req is invalid since allocating space for
32862306a36Sopenharmony_ci *		an array failed. Attempting to read this value shall
32962306a36Sopenharmony_ci *		result in ENOMEM. Only valid if ctrl->is_array is true.
33062306a36Sopenharmony_ci * @p_req_array_alloc_elems: The number of elements allocated for the
33162306a36Sopenharmony_ci *		array. Only valid if @p_req_valid and ctrl->is_array are
33262306a36Sopenharmony_ci *		true.
33362306a36Sopenharmony_ci * @p_req_elems: The number of elements in @p_req. This is the same as
33462306a36Sopenharmony_ci *		ctrl->elems, except for dynamic arrays. In that case it is in
33562306a36Sopenharmony_ci *		the range of 1 to @p_req_array_alloc_elems. Only valid if
33662306a36Sopenharmony_ci *		@p_req_valid is true.
33762306a36Sopenharmony_ci * @p_req:	If the control handler containing this control reference
33862306a36Sopenharmony_ci *		is bound to a media request, then this points to the
33962306a36Sopenharmony_ci *		value of the control that must be applied when the request
34062306a36Sopenharmony_ci *		is executed, or to the value of the control at the time
34162306a36Sopenharmony_ci *		that the request was completed. If @p_req_valid is false,
34262306a36Sopenharmony_ci *		then this control was never set for this request and the
34362306a36Sopenharmony_ci *		control will not be updated when this request is applied.
34462306a36Sopenharmony_ci *
34562306a36Sopenharmony_ci * Each control handler has a list of these refs. The list_head is used to
34662306a36Sopenharmony_ci * keep a sorted-by-control-ID list of all controls, while the next pointer
34762306a36Sopenharmony_ci * is used to link the control in the hash's bucket.
34862306a36Sopenharmony_ci */
34962306a36Sopenharmony_cistruct v4l2_ctrl_ref {
35062306a36Sopenharmony_ci	struct list_head node;
35162306a36Sopenharmony_ci	struct v4l2_ctrl_ref *next;
35262306a36Sopenharmony_ci	struct v4l2_ctrl *ctrl;
35362306a36Sopenharmony_ci	struct v4l2_ctrl_helper *helper;
35462306a36Sopenharmony_ci	bool from_other_dev;
35562306a36Sopenharmony_ci	bool req_done;
35662306a36Sopenharmony_ci	bool p_req_valid;
35762306a36Sopenharmony_ci	bool p_req_array_enomem;
35862306a36Sopenharmony_ci	u32 p_req_array_alloc_elems;
35962306a36Sopenharmony_ci	u32 p_req_elems;
36062306a36Sopenharmony_ci	union v4l2_ctrl_ptr p_req;
36162306a36Sopenharmony_ci};
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci/**
36462306a36Sopenharmony_ci * struct v4l2_ctrl_handler - The control handler keeps track of all the
36562306a36Sopenharmony_ci *	controls: both the controls owned by the handler and those inherited
36662306a36Sopenharmony_ci *	from other handlers.
36762306a36Sopenharmony_ci *
36862306a36Sopenharmony_ci * @_lock:	Default for "lock".
36962306a36Sopenharmony_ci * @lock:	Lock to control access to this handler and its controls.
37062306a36Sopenharmony_ci *		May be replaced by the user right after init.
37162306a36Sopenharmony_ci * @ctrls:	The list of controls owned by this handler.
37262306a36Sopenharmony_ci * @ctrl_refs:	The list of control references.
37362306a36Sopenharmony_ci * @cached:	The last found control reference. It is common that the same
37462306a36Sopenharmony_ci *		control is needed multiple times, so this is a simple
37562306a36Sopenharmony_ci *		optimization.
37662306a36Sopenharmony_ci * @buckets:	Buckets for the hashing. Allows for quick control lookup.
37762306a36Sopenharmony_ci * @notify:	A notify callback that is called whenever the control changes
37862306a36Sopenharmony_ci *		value.
37962306a36Sopenharmony_ci *		Note that the handler's lock is held when the notify function
38062306a36Sopenharmony_ci *		is called!
38162306a36Sopenharmony_ci * @notify_priv: Passed as argument to the v4l2_ctrl notify callback.
38262306a36Sopenharmony_ci * @nr_of_buckets: Total number of buckets in the array.
38362306a36Sopenharmony_ci * @error:	The error code of the first failed control addition.
38462306a36Sopenharmony_ci * @request_is_queued: True if the request was queued.
38562306a36Sopenharmony_ci * @requests:	List to keep track of open control handler request objects.
38662306a36Sopenharmony_ci *		For the parent control handler (@req_obj.ops == NULL) this
38762306a36Sopenharmony_ci *		is the list header. When the parent control handler is
38862306a36Sopenharmony_ci *		removed, it has to unbind and put all these requests since
38962306a36Sopenharmony_ci *		they refer to the parent.
39062306a36Sopenharmony_ci * @requests_queued: List of the queued requests. This determines the order
39162306a36Sopenharmony_ci *		in which these controls are applied. Once the request is
39262306a36Sopenharmony_ci *		completed it is removed from this list.
39362306a36Sopenharmony_ci * @req_obj:	The &struct media_request_object, used to link into a
39462306a36Sopenharmony_ci *		&struct media_request. This request object has a refcount.
39562306a36Sopenharmony_ci */
39662306a36Sopenharmony_cistruct v4l2_ctrl_handler {
39762306a36Sopenharmony_ci	struct mutex _lock;
39862306a36Sopenharmony_ci	struct mutex *lock;
39962306a36Sopenharmony_ci	struct list_head ctrls;
40062306a36Sopenharmony_ci	struct list_head ctrl_refs;
40162306a36Sopenharmony_ci	struct v4l2_ctrl_ref *cached;
40262306a36Sopenharmony_ci	struct v4l2_ctrl_ref **buckets;
40362306a36Sopenharmony_ci	v4l2_ctrl_notify_fnc notify;
40462306a36Sopenharmony_ci	void *notify_priv;
40562306a36Sopenharmony_ci	u16 nr_of_buckets;
40662306a36Sopenharmony_ci	int error;
40762306a36Sopenharmony_ci	bool request_is_queued;
40862306a36Sopenharmony_ci	struct list_head requests;
40962306a36Sopenharmony_ci	struct list_head requests_queued;
41062306a36Sopenharmony_ci	struct media_request_object req_obj;
41162306a36Sopenharmony_ci};
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci/**
41462306a36Sopenharmony_ci * struct v4l2_ctrl_config - Control configuration structure.
41562306a36Sopenharmony_ci *
41662306a36Sopenharmony_ci * @ops:	The control ops.
41762306a36Sopenharmony_ci * @type_ops:	The control type ops. Only needed for compound controls.
41862306a36Sopenharmony_ci * @id:	The control ID.
41962306a36Sopenharmony_ci * @name:	The control name.
42062306a36Sopenharmony_ci * @type:	The control type.
42162306a36Sopenharmony_ci * @min:	The control's minimum value.
42262306a36Sopenharmony_ci * @max:	The control's maximum value.
42362306a36Sopenharmony_ci * @step:	The control's step value for non-menu controls.
42462306a36Sopenharmony_ci * @def:	The control's default value.
42562306a36Sopenharmony_ci * @p_def:	The control's default value for compound controls.
42662306a36Sopenharmony_ci * @dims:	The size of each dimension.
42762306a36Sopenharmony_ci * @elem_size:	The size in bytes of the control.
42862306a36Sopenharmony_ci * @flags:	The control's flags.
42962306a36Sopenharmony_ci * @menu_skip_mask: The control's skip mask for menu controls. This makes it
43062306a36Sopenharmony_ci *		easy to skip menu items that are not valid. If bit X is set,
43162306a36Sopenharmony_ci *		then menu item X is skipped. Of course, this only works for
43262306a36Sopenharmony_ci *		menus with <= 64 menu items. There are no menus that come
43362306a36Sopenharmony_ci *		close to that number, so this is OK. Should we ever need more,
43462306a36Sopenharmony_ci *		then this will have to be extended to a bit array.
43562306a36Sopenharmony_ci * @qmenu:	A const char * array for all menu items. Array entries that are
43662306a36Sopenharmony_ci *		empty strings ("") correspond to non-existing menu items (this
43762306a36Sopenharmony_ci *		is in addition to the menu_skip_mask above). The last entry
43862306a36Sopenharmony_ci *		must be NULL.
43962306a36Sopenharmony_ci * @qmenu_int:	A const s64 integer array for all menu items of the type
44062306a36Sopenharmony_ci *		V4L2_CTRL_TYPE_INTEGER_MENU.
44162306a36Sopenharmony_ci * @is_private: If set, then this control is private to its handler and it
44262306a36Sopenharmony_ci *		will not be added to any other handlers.
44362306a36Sopenharmony_ci */
44462306a36Sopenharmony_cistruct v4l2_ctrl_config {
44562306a36Sopenharmony_ci	const struct v4l2_ctrl_ops *ops;
44662306a36Sopenharmony_ci	const struct v4l2_ctrl_type_ops *type_ops;
44762306a36Sopenharmony_ci	u32 id;
44862306a36Sopenharmony_ci	const char *name;
44962306a36Sopenharmony_ci	enum v4l2_ctrl_type type;
45062306a36Sopenharmony_ci	s64 min;
45162306a36Sopenharmony_ci	s64 max;
45262306a36Sopenharmony_ci	u64 step;
45362306a36Sopenharmony_ci	s64 def;
45462306a36Sopenharmony_ci	union v4l2_ctrl_ptr p_def;
45562306a36Sopenharmony_ci	u32 dims[V4L2_CTRL_MAX_DIMS];
45662306a36Sopenharmony_ci	u32 elem_size;
45762306a36Sopenharmony_ci	u32 flags;
45862306a36Sopenharmony_ci	u64 menu_skip_mask;
45962306a36Sopenharmony_ci	const char * const *qmenu;
46062306a36Sopenharmony_ci	const s64 *qmenu_int;
46162306a36Sopenharmony_ci	unsigned int is_private:1;
46262306a36Sopenharmony_ci};
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci/**
46562306a36Sopenharmony_ci * v4l2_ctrl_fill - Fill in the control fields based on the control ID.
46662306a36Sopenharmony_ci *
46762306a36Sopenharmony_ci * @id: ID of the control
46862306a36Sopenharmony_ci * @name: pointer to be filled with a string with the name of the control
46962306a36Sopenharmony_ci * @type: pointer for storing the type of the control
47062306a36Sopenharmony_ci * @min: pointer for storing the minimum value for the control
47162306a36Sopenharmony_ci * @max: pointer for storing the maximum value for the control
47262306a36Sopenharmony_ci * @step: pointer for storing the control step
47362306a36Sopenharmony_ci * @def: pointer for storing the default value for the control
47462306a36Sopenharmony_ci * @flags: pointer for storing the flags to be used on the control
47562306a36Sopenharmony_ci *
47662306a36Sopenharmony_ci * This works for all standard V4L2 controls.
47762306a36Sopenharmony_ci * For non-standard controls it will only fill in the given arguments
47862306a36Sopenharmony_ci * and @name content will be set to %NULL.
47962306a36Sopenharmony_ci *
48062306a36Sopenharmony_ci * This function will overwrite the contents of @name, @type and @flags.
48162306a36Sopenharmony_ci * The contents of @min, @max, @step and @def may be modified depending on
48262306a36Sopenharmony_ci * the type.
48362306a36Sopenharmony_ci *
48462306a36Sopenharmony_ci * .. note::
48562306a36Sopenharmony_ci *
48662306a36Sopenharmony_ci *    Do not use in drivers! It is used internally for backwards compatibility
48762306a36Sopenharmony_ci *    control handling only. Once all drivers are converted to use the new
48862306a36Sopenharmony_ci *    control framework this function will no longer be exported.
48962306a36Sopenharmony_ci */
49062306a36Sopenharmony_civoid v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
49162306a36Sopenharmony_ci		    s64 *min, s64 *max, u64 *step, s64 *def, u32 *flags);
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci/**
49562306a36Sopenharmony_ci * v4l2_ctrl_handler_init_class() - Initialize the control handler.
49662306a36Sopenharmony_ci * @hdl:	The control handler.
49762306a36Sopenharmony_ci * @nr_of_controls_hint: A hint of how many controls this handler is
49862306a36Sopenharmony_ci *		expected to refer to. This is the total number, so including
49962306a36Sopenharmony_ci *		any inherited controls. It doesn't have to be precise, but if
50062306a36Sopenharmony_ci *		it is way off, then you either waste memory (too many buckets
50162306a36Sopenharmony_ci *		are allocated) or the control lookup becomes slower (not enough
50262306a36Sopenharmony_ci *		buckets are allocated, so there are more slow list lookups).
50362306a36Sopenharmony_ci *		It will always work, though.
50462306a36Sopenharmony_ci * @key:	Used by the lock validator if CONFIG_LOCKDEP is set.
50562306a36Sopenharmony_ci * @name:	Used by the lock validator if CONFIG_LOCKDEP is set.
50662306a36Sopenharmony_ci *
50762306a36Sopenharmony_ci * .. attention::
50862306a36Sopenharmony_ci *
50962306a36Sopenharmony_ci *    Never use this call directly, always use the v4l2_ctrl_handler_init()
51062306a36Sopenharmony_ci *    macro that hides the @key and @name arguments.
51162306a36Sopenharmony_ci *
51262306a36Sopenharmony_ci * Return: returns an error if the buckets could not be allocated. This
51362306a36Sopenharmony_ci * error will also be stored in @hdl->error.
51462306a36Sopenharmony_ci */
51562306a36Sopenharmony_ciint v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
51662306a36Sopenharmony_ci				 unsigned int nr_of_controls_hint,
51762306a36Sopenharmony_ci				 struct lock_class_key *key, const char *name);
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci#ifdef CONFIG_LOCKDEP
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci/**
52262306a36Sopenharmony_ci * v4l2_ctrl_handler_init - helper function to create a static struct
52362306a36Sopenharmony_ci *	 &lock_class_key and calls v4l2_ctrl_handler_init_class()
52462306a36Sopenharmony_ci *
52562306a36Sopenharmony_ci * @hdl:	The control handler.
52662306a36Sopenharmony_ci * @nr_of_controls_hint: A hint of how many controls this handler is
52762306a36Sopenharmony_ci *		expected to refer to. This is the total number, so including
52862306a36Sopenharmony_ci *		any inherited controls. It doesn't have to be precise, but if
52962306a36Sopenharmony_ci *		it is way off, then you either waste memory (too many buckets
53062306a36Sopenharmony_ci *		are allocated) or the control lookup becomes slower (not enough
53162306a36Sopenharmony_ci *		buckets are allocated, so there are more slow list lookups).
53262306a36Sopenharmony_ci *		It will always work, though.
53362306a36Sopenharmony_ci *
53462306a36Sopenharmony_ci * This helper function creates a static struct &lock_class_key and
53562306a36Sopenharmony_ci * calls v4l2_ctrl_handler_init_class(), providing a proper name for the lock
53662306a36Sopenharmony_ci * validador.
53762306a36Sopenharmony_ci *
53862306a36Sopenharmony_ci * Use this helper function to initialize a control handler.
53962306a36Sopenharmony_ci */
54062306a36Sopenharmony_ci#define v4l2_ctrl_handler_init(hdl, nr_of_controls_hint)		\
54162306a36Sopenharmony_ci(									\
54262306a36Sopenharmony_ci	({								\
54362306a36Sopenharmony_ci		static struct lock_class_key _key;			\
54462306a36Sopenharmony_ci		v4l2_ctrl_handler_init_class(hdl, nr_of_controls_hint,	\
54562306a36Sopenharmony_ci					&_key,				\
54662306a36Sopenharmony_ci					KBUILD_BASENAME ":"		\
54762306a36Sopenharmony_ci					__stringify(__LINE__) ":"	\
54862306a36Sopenharmony_ci					"(" #hdl ")->_lock");		\
54962306a36Sopenharmony_ci	})								\
55062306a36Sopenharmony_ci)
55162306a36Sopenharmony_ci#else
55262306a36Sopenharmony_ci#define v4l2_ctrl_handler_init(hdl, nr_of_controls_hint)		\
55362306a36Sopenharmony_ci	v4l2_ctrl_handler_init_class(hdl, nr_of_controls_hint, NULL, NULL)
55462306a36Sopenharmony_ci#endif
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci/**
55762306a36Sopenharmony_ci * v4l2_ctrl_handler_free() - Free all controls owned by the handler and free
55862306a36Sopenharmony_ci * the control list.
55962306a36Sopenharmony_ci * @hdl:	The control handler.
56062306a36Sopenharmony_ci *
56162306a36Sopenharmony_ci * Does nothing if @hdl == NULL.
56262306a36Sopenharmony_ci */
56362306a36Sopenharmony_civoid v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl);
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_ci/**
56662306a36Sopenharmony_ci * v4l2_ctrl_lock() - Helper function to lock the handler
56762306a36Sopenharmony_ci * associated with the control.
56862306a36Sopenharmony_ci * @ctrl:	The control to lock.
56962306a36Sopenharmony_ci */
57062306a36Sopenharmony_cistatic inline void v4l2_ctrl_lock(struct v4l2_ctrl *ctrl)
57162306a36Sopenharmony_ci{
57262306a36Sopenharmony_ci	mutex_lock(ctrl->handler->lock);
57362306a36Sopenharmony_ci}
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci/**
57662306a36Sopenharmony_ci * v4l2_ctrl_unlock() - Helper function to unlock the handler
57762306a36Sopenharmony_ci * associated with the control.
57862306a36Sopenharmony_ci * @ctrl:	The control to unlock.
57962306a36Sopenharmony_ci */
58062306a36Sopenharmony_cistatic inline void v4l2_ctrl_unlock(struct v4l2_ctrl *ctrl)
58162306a36Sopenharmony_ci{
58262306a36Sopenharmony_ci	mutex_unlock(ctrl->handler->lock);
58362306a36Sopenharmony_ci}
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci/**
58662306a36Sopenharmony_ci * __v4l2_ctrl_handler_setup() - Call the s_ctrl op for all controls belonging
58762306a36Sopenharmony_ci * to the handler to initialize the hardware to the current control values. The
58862306a36Sopenharmony_ci * caller is responsible for acquiring the control handler mutex on behalf of
58962306a36Sopenharmony_ci * __v4l2_ctrl_handler_setup().
59062306a36Sopenharmony_ci * @hdl:	The control handler.
59162306a36Sopenharmony_ci *
59262306a36Sopenharmony_ci * Button controls will be skipped, as are read-only controls.
59362306a36Sopenharmony_ci *
59462306a36Sopenharmony_ci * If @hdl == NULL, then this just returns 0.
59562306a36Sopenharmony_ci */
59662306a36Sopenharmony_ciint __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl);
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci/**
59962306a36Sopenharmony_ci * v4l2_ctrl_handler_setup() - Call the s_ctrl op for all controls belonging
60062306a36Sopenharmony_ci * to the handler to initialize the hardware to the current control values.
60162306a36Sopenharmony_ci * @hdl:	The control handler.
60262306a36Sopenharmony_ci *
60362306a36Sopenharmony_ci * Button controls will be skipped, as are read-only controls.
60462306a36Sopenharmony_ci *
60562306a36Sopenharmony_ci * If @hdl == NULL, then this just returns 0.
60662306a36Sopenharmony_ci */
60762306a36Sopenharmony_ciint v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl);
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci/**
61062306a36Sopenharmony_ci * v4l2_ctrl_handler_log_status() - Log all controls owned by the handler.
61162306a36Sopenharmony_ci * @hdl:	The control handler.
61262306a36Sopenharmony_ci * @prefix:	The prefix to use when logging the control values. If the
61362306a36Sopenharmony_ci *		prefix does not end with a space, then ": " will be added
61462306a36Sopenharmony_ci *		after the prefix. If @prefix == NULL, then no prefix will be
61562306a36Sopenharmony_ci *		used.
61662306a36Sopenharmony_ci *
61762306a36Sopenharmony_ci * For use with VIDIOC_LOG_STATUS.
61862306a36Sopenharmony_ci *
61962306a36Sopenharmony_ci * Does nothing if @hdl == NULL.
62062306a36Sopenharmony_ci */
62162306a36Sopenharmony_civoid v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
62262306a36Sopenharmony_ci				  const char *prefix);
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci/**
62562306a36Sopenharmony_ci * v4l2_ctrl_new_custom() - Allocate and initialize a new custom V4L2
62662306a36Sopenharmony_ci *	control.
62762306a36Sopenharmony_ci *
62862306a36Sopenharmony_ci * @hdl:	The control handler.
62962306a36Sopenharmony_ci * @cfg:	The control's configuration data.
63062306a36Sopenharmony_ci * @priv:	The control's driver-specific private data.
63162306a36Sopenharmony_ci *
63262306a36Sopenharmony_ci * If the &v4l2_ctrl struct could not be allocated then NULL is returned
63362306a36Sopenharmony_ci * and @hdl->error is set to the error code (if it wasn't set already).
63462306a36Sopenharmony_ci */
63562306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
63662306a36Sopenharmony_ci				       const struct v4l2_ctrl_config *cfg,
63762306a36Sopenharmony_ci				       void *priv);
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ci/**
64062306a36Sopenharmony_ci * v4l2_ctrl_new_std() - Allocate and initialize a new standard V4L2 non-menu
64162306a36Sopenharmony_ci *	control.
64262306a36Sopenharmony_ci *
64362306a36Sopenharmony_ci * @hdl:	The control handler.
64462306a36Sopenharmony_ci * @ops:	The control ops.
64562306a36Sopenharmony_ci * @id:		The control ID.
64662306a36Sopenharmony_ci * @min:	The control's minimum value.
64762306a36Sopenharmony_ci * @max:	The control's maximum value.
64862306a36Sopenharmony_ci * @step:	The control's step value
64962306a36Sopenharmony_ci * @def:	The control's default value.
65062306a36Sopenharmony_ci *
65162306a36Sopenharmony_ci * If the &v4l2_ctrl struct could not be allocated, or the control
65262306a36Sopenharmony_ci * ID is not known, then NULL is returned and @hdl->error is set to the
65362306a36Sopenharmony_ci * appropriate error code (if it wasn't set already).
65462306a36Sopenharmony_ci *
65562306a36Sopenharmony_ci * If @id refers to a menu control, then this function will return NULL.
65662306a36Sopenharmony_ci *
65762306a36Sopenharmony_ci * Use v4l2_ctrl_new_std_menu() when adding menu controls.
65862306a36Sopenharmony_ci */
65962306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
66062306a36Sopenharmony_ci				    const struct v4l2_ctrl_ops *ops,
66162306a36Sopenharmony_ci				    u32 id, s64 min, s64 max, u64 step,
66262306a36Sopenharmony_ci				    s64 def);
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci/**
66562306a36Sopenharmony_ci * v4l2_ctrl_new_std_menu() - Allocate and initialize a new standard V4L2
66662306a36Sopenharmony_ci *	menu control.
66762306a36Sopenharmony_ci *
66862306a36Sopenharmony_ci * @hdl:	The control handler.
66962306a36Sopenharmony_ci * @ops:	The control ops.
67062306a36Sopenharmony_ci * @id:		The control ID.
67162306a36Sopenharmony_ci * @max:	The control's maximum value.
67262306a36Sopenharmony_ci * @mask:	The control's skip mask for menu controls. This makes it
67362306a36Sopenharmony_ci *		easy to skip menu items that are not valid. If bit X is set,
67462306a36Sopenharmony_ci *		then menu item X is skipped. Of course, this only works for
67562306a36Sopenharmony_ci *		menus with <= 64 menu items. There are no menus that come
67662306a36Sopenharmony_ci *		close to that number, so this is OK. Should we ever need more,
67762306a36Sopenharmony_ci *		then this will have to be extended to a bit array.
67862306a36Sopenharmony_ci * @def:	The control's default value.
67962306a36Sopenharmony_ci *
68062306a36Sopenharmony_ci * Same as v4l2_ctrl_new_std(), but @min is set to 0 and the @mask value
68162306a36Sopenharmony_ci * determines which menu items are to be skipped.
68262306a36Sopenharmony_ci *
68362306a36Sopenharmony_ci * If @id refers to a non-menu control, then this function will return NULL.
68462306a36Sopenharmony_ci */
68562306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
68662306a36Sopenharmony_ci					 const struct v4l2_ctrl_ops *ops,
68762306a36Sopenharmony_ci					 u32 id, u8 max, u64 mask, u8 def);
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci/**
69062306a36Sopenharmony_ci * v4l2_ctrl_new_std_menu_items() - Create a new standard V4L2 menu control
69162306a36Sopenharmony_ci *	with driver specific menu.
69262306a36Sopenharmony_ci *
69362306a36Sopenharmony_ci * @hdl:	The control handler.
69462306a36Sopenharmony_ci * @ops:	The control ops.
69562306a36Sopenharmony_ci * @id:	The control ID.
69662306a36Sopenharmony_ci * @max:	The control's maximum value.
69762306a36Sopenharmony_ci * @mask:	The control's skip mask for menu controls. This makes it
69862306a36Sopenharmony_ci *		easy to skip menu items that are not valid. If bit X is set,
69962306a36Sopenharmony_ci *		then menu item X is skipped. Of course, this only works for
70062306a36Sopenharmony_ci *		menus with <= 64 menu items. There are no menus that come
70162306a36Sopenharmony_ci *		close to that number, so this is OK. Should we ever need more,
70262306a36Sopenharmony_ci *		then this will have to be extended to a bit array.
70362306a36Sopenharmony_ci * @def:	The control's default value.
70462306a36Sopenharmony_ci * @qmenu:	The new menu.
70562306a36Sopenharmony_ci *
70662306a36Sopenharmony_ci * Same as v4l2_ctrl_new_std_menu(), but @qmenu will be the driver specific
70762306a36Sopenharmony_ci * menu of this control.
70862306a36Sopenharmony_ci *
70962306a36Sopenharmony_ci */
71062306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
71162306a36Sopenharmony_ci					       const struct v4l2_ctrl_ops *ops,
71262306a36Sopenharmony_ci					       u32 id, u8 max,
71362306a36Sopenharmony_ci					       u64 mask, u8 def,
71462306a36Sopenharmony_ci					       const char * const *qmenu);
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci/**
71762306a36Sopenharmony_ci * v4l2_ctrl_new_std_compound() - Allocate and initialize a new standard V4L2
71862306a36Sopenharmony_ci *      compound control.
71962306a36Sopenharmony_ci *
72062306a36Sopenharmony_ci * @hdl:       The control handler.
72162306a36Sopenharmony_ci * @ops:       The control ops.
72262306a36Sopenharmony_ci * @id:        The control ID.
72362306a36Sopenharmony_ci * @p_def:     The control's default value.
72462306a36Sopenharmony_ci *
72562306a36Sopenharmony_ci * Sames as v4l2_ctrl_new_std(), but with support to compound controls, thanks
72662306a36Sopenharmony_ci * to the @p_def field. Use v4l2_ctrl_ptr_create() to create @p_def from a
72762306a36Sopenharmony_ci * pointer. Use v4l2_ctrl_ptr_create(NULL) if the default value of the
72862306a36Sopenharmony_ci * compound control should be all zeroes.
72962306a36Sopenharmony_ci *
73062306a36Sopenharmony_ci */
73162306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl,
73262306a36Sopenharmony_ci					     const struct v4l2_ctrl_ops *ops,
73362306a36Sopenharmony_ci					     u32 id,
73462306a36Sopenharmony_ci					     const union v4l2_ctrl_ptr p_def);
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci/**
73762306a36Sopenharmony_ci * v4l2_ctrl_new_int_menu() - Create a new standard V4L2 integer menu control.
73862306a36Sopenharmony_ci *
73962306a36Sopenharmony_ci * @hdl:	The control handler.
74062306a36Sopenharmony_ci * @ops:	The control ops.
74162306a36Sopenharmony_ci * @id:	The control ID.
74262306a36Sopenharmony_ci * @max:	The control's maximum value.
74362306a36Sopenharmony_ci * @def:	The control's default value.
74462306a36Sopenharmony_ci * @qmenu_int:	The control's menu entries.
74562306a36Sopenharmony_ci *
74662306a36Sopenharmony_ci * Same as v4l2_ctrl_new_std_menu(), but @mask is set to 0 and it additionally
74762306a36Sopenharmony_ci * takes as an argument an array of integers determining the menu items.
74862306a36Sopenharmony_ci *
74962306a36Sopenharmony_ci * If @id refers to a non-integer-menu control, then this function will
75062306a36Sopenharmony_ci * return %NULL.
75162306a36Sopenharmony_ci */
75262306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
75362306a36Sopenharmony_ci					 const struct v4l2_ctrl_ops *ops,
75462306a36Sopenharmony_ci					 u32 id, u8 max, u8 def,
75562306a36Sopenharmony_ci					 const s64 *qmenu_int);
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci/**
75862306a36Sopenharmony_ci * typedef v4l2_ctrl_filter - Typedef to define the filter function to be
75962306a36Sopenharmony_ci *	used when adding a control handler.
76062306a36Sopenharmony_ci *
76162306a36Sopenharmony_ci * @ctrl: pointer to struct &v4l2_ctrl.
76262306a36Sopenharmony_ci */
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_citypedef bool (*v4l2_ctrl_filter)(const struct v4l2_ctrl *ctrl);
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_ci/**
76762306a36Sopenharmony_ci * v4l2_ctrl_add_handler() - Add all controls from handler @add to
76862306a36Sopenharmony_ci *	handler @hdl.
76962306a36Sopenharmony_ci *
77062306a36Sopenharmony_ci * @hdl:	The control handler.
77162306a36Sopenharmony_ci * @add:	The control handler whose controls you want to add to
77262306a36Sopenharmony_ci *		the @hdl control handler.
77362306a36Sopenharmony_ci * @filter:	This function will filter which controls should be added.
77462306a36Sopenharmony_ci * @from_other_dev: If true, then the controls in @add were defined in another
77562306a36Sopenharmony_ci *		device than @hdl.
77662306a36Sopenharmony_ci *
77762306a36Sopenharmony_ci * Does nothing if either of the two handlers is a NULL pointer.
77862306a36Sopenharmony_ci * If @filter is NULL, then all controls are added. Otherwise only those
77962306a36Sopenharmony_ci * controls for which @filter returns true will be added.
78062306a36Sopenharmony_ci * In case of an error @hdl->error will be set to the error code (if it
78162306a36Sopenharmony_ci * wasn't set already).
78262306a36Sopenharmony_ci */
78362306a36Sopenharmony_ciint v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
78462306a36Sopenharmony_ci			  struct v4l2_ctrl_handler *add,
78562306a36Sopenharmony_ci			  v4l2_ctrl_filter filter,
78662306a36Sopenharmony_ci			  bool from_other_dev);
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci/**
78962306a36Sopenharmony_ci * v4l2_ctrl_radio_filter() - Standard filter for radio controls.
79062306a36Sopenharmony_ci *
79162306a36Sopenharmony_ci * @ctrl:	The control that is filtered.
79262306a36Sopenharmony_ci *
79362306a36Sopenharmony_ci * This will return true for any controls that are valid for radio device
79462306a36Sopenharmony_ci * nodes. Those are all of the V4L2_CID_AUDIO_* user controls and all FM
79562306a36Sopenharmony_ci * transmitter class controls.
79662306a36Sopenharmony_ci *
79762306a36Sopenharmony_ci * This function is to be used with v4l2_ctrl_add_handler().
79862306a36Sopenharmony_ci */
79962306a36Sopenharmony_cibool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl);
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci/**
80262306a36Sopenharmony_ci * v4l2_ctrl_cluster() - Mark all controls in the cluster as belonging
80362306a36Sopenharmony_ci *	to that cluster.
80462306a36Sopenharmony_ci *
80562306a36Sopenharmony_ci * @ncontrols:	The number of controls in this cluster.
80662306a36Sopenharmony_ci * @controls:	The cluster control array of size @ncontrols.
80762306a36Sopenharmony_ci */
80862306a36Sopenharmony_civoid v4l2_ctrl_cluster(unsigned int ncontrols, struct v4l2_ctrl **controls);
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_ci/**
81262306a36Sopenharmony_ci * v4l2_ctrl_auto_cluster() - Mark all controls in the cluster as belonging
81362306a36Sopenharmony_ci *	to that cluster and set it up for autofoo/foo-type handling.
81462306a36Sopenharmony_ci *
81562306a36Sopenharmony_ci * @ncontrols:	The number of controls in this cluster.
81662306a36Sopenharmony_ci * @controls:	The cluster control array of size @ncontrols. The first control
81762306a36Sopenharmony_ci *		must be the 'auto' control (e.g. autogain, autoexposure, etc.)
81862306a36Sopenharmony_ci * @manual_val: The value for the first control in the cluster that equals the
81962306a36Sopenharmony_ci *		manual setting.
82062306a36Sopenharmony_ci * @set_volatile: If true, then all controls except the first auto control will
82162306a36Sopenharmony_ci *		be volatile.
82262306a36Sopenharmony_ci *
82362306a36Sopenharmony_ci * Use for control groups where one control selects some automatic feature and
82462306a36Sopenharmony_ci * the other controls are only active whenever the automatic feature is turned
82562306a36Sopenharmony_ci * off (manual mode). Typical examples: autogain vs gain, auto-whitebalance vs
82662306a36Sopenharmony_ci * red and blue balance, etc.
82762306a36Sopenharmony_ci *
82862306a36Sopenharmony_ci * The behavior of such controls is as follows:
82962306a36Sopenharmony_ci *
83062306a36Sopenharmony_ci * When the autofoo control is set to automatic, then any manual controls
83162306a36Sopenharmony_ci * are set to inactive and any reads will call g_volatile_ctrl (if the control
83262306a36Sopenharmony_ci * was marked volatile).
83362306a36Sopenharmony_ci *
83462306a36Sopenharmony_ci * When the autofoo control is set to manual, then any manual controls will
83562306a36Sopenharmony_ci * be marked active, and any reads will just return the current value without
83662306a36Sopenharmony_ci * going through g_volatile_ctrl.
83762306a36Sopenharmony_ci *
83862306a36Sopenharmony_ci * In addition, this function will set the %V4L2_CTRL_FLAG_UPDATE flag
83962306a36Sopenharmony_ci * on the autofoo control and %V4L2_CTRL_FLAG_INACTIVE on the foo control(s)
84062306a36Sopenharmony_ci * if autofoo is in auto mode.
84162306a36Sopenharmony_ci */
84262306a36Sopenharmony_civoid v4l2_ctrl_auto_cluster(unsigned int ncontrols,
84362306a36Sopenharmony_ci			    struct v4l2_ctrl **controls,
84462306a36Sopenharmony_ci			    u8 manual_val, bool set_volatile);
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci/**
84862306a36Sopenharmony_ci * v4l2_ctrl_find() - Find a control with the given ID.
84962306a36Sopenharmony_ci *
85062306a36Sopenharmony_ci * @hdl:	The control handler.
85162306a36Sopenharmony_ci * @id:	The control ID to find.
85262306a36Sopenharmony_ci *
85362306a36Sopenharmony_ci * If @hdl == NULL this will return NULL as well. Will lock the handler so
85462306a36Sopenharmony_ci * do not use from inside &v4l2_ctrl_ops.
85562306a36Sopenharmony_ci */
85662306a36Sopenharmony_cistruct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id);
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci/**
85962306a36Sopenharmony_ci * v4l2_ctrl_activate() - Make the control active or inactive.
86062306a36Sopenharmony_ci * @ctrl:	The control to (de)activate.
86162306a36Sopenharmony_ci * @active:	True if the control should become active.
86262306a36Sopenharmony_ci *
86362306a36Sopenharmony_ci * This sets or clears the V4L2_CTRL_FLAG_INACTIVE flag atomically.
86462306a36Sopenharmony_ci * Does nothing if @ctrl == NULL.
86562306a36Sopenharmony_ci * This will usually be called from within the s_ctrl op.
86662306a36Sopenharmony_ci * The V4L2_EVENT_CTRL event will be generated afterwards.
86762306a36Sopenharmony_ci *
86862306a36Sopenharmony_ci * This function assumes that the control handler is locked.
86962306a36Sopenharmony_ci */
87062306a36Sopenharmony_civoid v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_ci/**
87362306a36Sopenharmony_ci * __v4l2_ctrl_grab() - Unlocked variant of v4l2_ctrl_grab.
87462306a36Sopenharmony_ci *
87562306a36Sopenharmony_ci * @ctrl:	The control to (de)activate.
87662306a36Sopenharmony_ci * @grabbed:	True if the control should become grabbed.
87762306a36Sopenharmony_ci *
87862306a36Sopenharmony_ci * This sets or clears the V4L2_CTRL_FLAG_GRABBED flag atomically.
87962306a36Sopenharmony_ci * Does nothing if @ctrl == NULL.
88062306a36Sopenharmony_ci * The V4L2_EVENT_CTRL event will be generated afterwards.
88162306a36Sopenharmony_ci * This will usually be called when starting or stopping streaming in the
88262306a36Sopenharmony_ci * driver.
88362306a36Sopenharmony_ci *
88462306a36Sopenharmony_ci * This function assumes that the control handler is locked by the caller.
88562306a36Sopenharmony_ci */
88662306a36Sopenharmony_civoid __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci/**
88962306a36Sopenharmony_ci * v4l2_ctrl_grab() - Mark the control as grabbed or not grabbed.
89062306a36Sopenharmony_ci *
89162306a36Sopenharmony_ci * @ctrl:	The control to (de)activate.
89262306a36Sopenharmony_ci * @grabbed:	True if the control should become grabbed.
89362306a36Sopenharmony_ci *
89462306a36Sopenharmony_ci * This sets or clears the V4L2_CTRL_FLAG_GRABBED flag atomically.
89562306a36Sopenharmony_ci * Does nothing if @ctrl == NULL.
89662306a36Sopenharmony_ci * The V4L2_EVENT_CTRL event will be generated afterwards.
89762306a36Sopenharmony_ci * This will usually be called when starting or stopping streaming in the
89862306a36Sopenharmony_ci * driver.
89962306a36Sopenharmony_ci *
90062306a36Sopenharmony_ci * This function assumes that the control handler is not locked and will
90162306a36Sopenharmony_ci * take the lock itself.
90262306a36Sopenharmony_ci */
90362306a36Sopenharmony_cistatic inline void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
90462306a36Sopenharmony_ci{
90562306a36Sopenharmony_ci	if (!ctrl)
90662306a36Sopenharmony_ci		return;
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
90962306a36Sopenharmony_ci	__v4l2_ctrl_grab(ctrl, grabbed);
91062306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
91162306a36Sopenharmony_ci}
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci/**
91462306a36Sopenharmony_ci *__v4l2_ctrl_modify_range() - Unlocked variant of v4l2_ctrl_modify_range()
91562306a36Sopenharmony_ci *
91662306a36Sopenharmony_ci * @ctrl:	The control to update.
91762306a36Sopenharmony_ci * @min:	The control's minimum value.
91862306a36Sopenharmony_ci * @max:	The control's maximum value.
91962306a36Sopenharmony_ci * @step:	The control's step value
92062306a36Sopenharmony_ci * @def:	The control's default value.
92162306a36Sopenharmony_ci *
92262306a36Sopenharmony_ci * Update the range of a control on the fly. This works for control types
92362306a36Sopenharmony_ci * INTEGER, BOOLEAN, MENU, INTEGER MENU and BITMASK. For menu controls the
92462306a36Sopenharmony_ci * @step value is interpreted as a menu_skip_mask.
92562306a36Sopenharmony_ci *
92662306a36Sopenharmony_ci * An error is returned if one of the range arguments is invalid for this
92762306a36Sopenharmony_ci * control type.
92862306a36Sopenharmony_ci *
92962306a36Sopenharmony_ci * The caller is responsible for acquiring the control handler mutex on behalf
93062306a36Sopenharmony_ci * of __v4l2_ctrl_modify_range().
93162306a36Sopenharmony_ci */
93262306a36Sopenharmony_ciint __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
93362306a36Sopenharmony_ci			     s64 min, s64 max, u64 step, s64 def);
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci/**
93662306a36Sopenharmony_ci * v4l2_ctrl_modify_range() - Update the range of a control.
93762306a36Sopenharmony_ci *
93862306a36Sopenharmony_ci * @ctrl:	The control to update.
93962306a36Sopenharmony_ci * @min:	The control's minimum value.
94062306a36Sopenharmony_ci * @max:	The control's maximum value.
94162306a36Sopenharmony_ci * @step:	The control's step value
94262306a36Sopenharmony_ci * @def:	The control's default value.
94362306a36Sopenharmony_ci *
94462306a36Sopenharmony_ci * Update the range of a control on the fly. This works for control types
94562306a36Sopenharmony_ci * INTEGER, BOOLEAN, MENU, INTEGER MENU and BITMASK. For menu controls the
94662306a36Sopenharmony_ci * @step value is interpreted as a menu_skip_mask.
94762306a36Sopenharmony_ci *
94862306a36Sopenharmony_ci * An error is returned if one of the range arguments is invalid for this
94962306a36Sopenharmony_ci * control type.
95062306a36Sopenharmony_ci *
95162306a36Sopenharmony_ci * This function assumes that the control handler is not locked and will
95262306a36Sopenharmony_ci * take the lock itself.
95362306a36Sopenharmony_ci */
95462306a36Sopenharmony_cistatic inline int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
95562306a36Sopenharmony_ci					 s64 min, s64 max, u64 step, s64 def)
95662306a36Sopenharmony_ci{
95762306a36Sopenharmony_ci	int rval;
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
96062306a36Sopenharmony_ci	rval = __v4l2_ctrl_modify_range(ctrl, min, max, step, def);
96162306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci	return rval;
96462306a36Sopenharmony_ci}
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ci/**
96762306a36Sopenharmony_ci *__v4l2_ctrl_modify_dimensions() - Unlocked variant of v4l2_ctrl_modify_dimensions()
96862306a36Sopenharmony_ci *
96962306a36Sopenharmony_ci * @ctrl:	The control to update.
97062306a36Sopenharmony_ci * @dims:	The control's new dimensions.
97162306a36Sopenharmony_ci *
97262306a36Sopenharmony_ci * Update the dimensions of an array control on the fly. The elements of the
97362306a36Sopenharmony_ci * array are reset to their default value, even if the dimensions are
97462306a36Sopenharmony_ci * unchanged.
97562306a36Sopenharmony_ci *
97662306a36Sopenharmony_ci * An error is returned if @dims is invalid for this control.
97762306a36Sopenharmony_ci *
97862306a36Sopenharmony_ci * The caller is responsible for acquiring the control handler mutex on behalf
97962306a36Sopenharmony_ci * of __v4l2_ctrl_modify_dimensions().
98062306a36Sopenharmony_ci *
98162306a36Sopenharmony_ci * Note: calling this function when the same control is used in pending requests
98262306a36Sopenharmony_ci * is untested. It should work (a request with the wrong size of the control
98362306a36Sopenharmony_ci * will drop that control silently), but it will be very confusing.
98462306a36Sopenharmony_ci */
98562306a36Sopenharmony_ciint __v4l2_ctrl_modify_dimensions(struct v4l2_ctrl *ctrl,
98662306a36Sopenharmony_ci				  u32 dims[V4L2_CTRL_MAX_DIMS]);
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci/**
98962306a36Sopenharmony_ci * v4l2_ctrl_modify_dimensions() - Update the dimensions of an array control.
99062306a36Sopenharmony_ci *
99162306a36Sopenharmony_ci * @ctrl:	The control to update.
99262306a36Sopenharmony_ci * @dims:	The control's new dimensions.
99362306a36Sopenharmony_ci *
99462306a36Sopenharmony_ci * Update the dimensions of an array control on the fly. The elements of the
99562306a36Sopenharmony_ci * array are reset to their default value, even if the dimensions are
99662306a36Sopenharmony_ci * unchanged.
99762306a36Sopenharmony_ci *
99862306a36Sopenharmony_ci * An error is returned if @dims is invalid for this control type.
99962306a36Sopenharmony_ci *
100062306a36Sopenharmony_ci * This function assumes that the control handler is not locked and will
100162306a36Sopenharmony_ci * take the lock itself.
100262306a36Sopenharmony_ci *
100362306a36Sopenharmony_ci * Note: calling this function when the same control is used in pending requests
100462306a36Sopenharmony_ci * is untested. It should work (a request with the wrong size of the control
100562306a36Sopenharmony_ci * will drop that control silently), but it will be very confusing.
100662306a36Sopenharmony_ci */
100762306a36Sopenharmony_cistatic inline int v4l2_ctrl_modify_dimensions(struct v4l2_ctrl *ctrl,
100862306a36Sopenharmony_ci					      u32 dims[V4L2_CTRL_MAX_DIMS])
100962306a36Sopenharmony_ci{
101062306a36Sopenharmony_ci	int rval;
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
101362306a36Sopenharmony_ci	rval = __v4l2_ctrl_modify_dimensions(ctrl, dims);
101462306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci	return rval;
101762306a36Sopenharmony_ci}
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci/**
102062306a36Sopenharmony_ci * v4l2_ctrl_notify() - Function to set a notify callback for a control.
102162306a36Sopenharmony_ci *
102262306a36Sopenharmony_ci * @ctrl:	The control.
102362306a36Sopenharmony_ci * @notify:	The callback function.
102462306a36Sopenharmony_ci * @priv:	The callback private handle, passed as argument to the callback.
102562306a36Sopenharmony_ci *
102662306a36Sopenharmony_ci * This function sets a callback function for the control. If @ctrl is NULL,
102762306a36Sopenharmony_ci * then it will do nothing. If @notify is NULL, then the notify callback will
102862306a36Sopenharmony_ci * be removed.
102962306a36Sopenharmony_ci *
103062306a36Sopenharmony_ci * There can be only one notify. If another already exists, then a WARN_ON
103162306a36Sopenharmony_ci * will be issued and the function will do nothing.
103262306a36Sopenharmony_ci */
103362306a36Sopenharmony_civoid v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify,
103462306a36Sopenharmony_ci		      void *priv);
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci/**
103762306a36Sopenharmony_ci * v4l2_ctrl_get_name() - Get the name of the control
103862306a36Sopenharmony_ci *
103962306a36Sopenharmony_ci * @id:		The control ID.
104062306a36Sopenharmony_ci *
104162306a36Sopenharmony_ci * This function returns the name of the given control ID or NULL if it isn't
104262306a36Sopenharmony_ci * a known control.
104362306a36Sopenharmony_ci */
104462306a36Sopenharmony_ciconst char *v4l2_ctrl_get_name(u32 id);
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_ci/**
104762306a36Sopenharmony_ci * v4l2_ctrl_get_menu() - Get the menu string array of the control
104862306a36Sopenharmony_ci *
104962306a36Sopenharmony_ci * @id:		The control ID.
105062306a36Sopenharmony_ci *
105162306a36Sopenharmony_ci * This function returns the NULL-terminated menu string array name of the
105262306a36Sopenharmony_ci * given control ID or NULL if it isn't a known menu control.
105362306a36Sopenharmony_ci */
105462306a36Sopenharmony_ciconst char * const *v4l2_ctrl_get_menu(u32 id);
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_ci/**
105762306a36Sopenharmony_ci * v4l2_ctrl_get_int_menu() - Get the integer menu array of the control
105862306a36Sopenharmony_ci *
105962306a36Sopenharmony_ci * @id:		The control ID.
106062306a36Sopenharmony_ci * @len:	The size of the integer array.
106162306a36Sopenharmony_ci *
106262306a36Sopenharmony_ci * This function returns the integer array of the given control ID or NULL if it
106362306a36Sopenharmony_ci * if it isn't a known integer menu control.
106462306a36Sopenharmony_ci */
106562306a36Sopenharmony_ciconst s64 *v4l2_ctrl_get_int_menu(u32 id, u32 *len);
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci/**
106862306a36Sopenharmony_ci * v4l2_ctrl_g_ctrl() - Helper function to get the control's value from
106962306a36Sopenharmony_ci *	within a driver.
107062306a36Sopenharmony_ci *
107162306a36Sopenharmony_ci * @ctrl:	The control.
107262306a36Sopenharmony_ci *
107362306a36Sopenharmony_ci * This returns the control's value safely by going through the control
107462306a36Sopenharmony_ci * framework. This function will lock the control's handler, so it cannot be
107562306a36Sopenharmony_ci * used from within the &v4l2_ctrl_ops functions.
107662306a36Sopenharmony_ci *
107762306a36Sopenharmony_ci * This function is for integer type controls only.
107862306a36Sopenharmony_ci */
107962306a36Sopenharmony_cis32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
108062306a36Sopenharmony_ci
108162306a36Sopenharmony_ci/**
108262306a36Sopenharmony_ci * __v4l2_ctrl_s_ctrl() - Unlocked variant of v4l2_ctrl_s_ctrl().
108362306a36Sopenharmony_ci *
108462306a36Sopenharmony_ci * @ctrl:	The control.
108562306a36Sopenharmony_ci * @val:	The new value.
108662306a36Sopenharmony_ci *
108762306a36Sopenharmony_ci * This sets the control's new value safely by going through the control
108862306a36Sopenharmony_ci * framework. This function assumes the control's handler is already locked,
108962306a36Sopenharmony_ci * allowing it to be used from within the &v4l2_ctrl_ops functions.
109062306a36Sopenharmony_ci *
109162306a36Sopenharmony_ci * This function is for integer type controls only.
109262306a36Sopenharmony_ci */
109362306a36Sopenharmony_ciint __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci/**
109662306a36Sopenharmony_ci * v4l2_ctrl_s_ctrl() - Helper function to set the control's value from
109762306a36Sopenharmony_ci *	within a driver.
109862306a36Sopenharmony_ci * @ctrl:	The control.
109962306a36Sopenharmony_ci * @val:	The new value.
110062306a36Sopenharmony_ci *
110162306a36Sopenharmony_ci * This sets the control's new value safely by going through the control
110262306a36Sopenharmony_ci * framework. This function will lock the control's handler, so it cannot be
110362306a36Sopenharmony_ci * used from within the &v4l2_ctrl_ops functions.
110462306a36Sopenharmony_ci *
110562306a36Sopenharmony_ci * This function is for integer type controls only.
110662306a36Sopenharmony_ci */
110762306a36Sopenharmony_cistatic inline int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
110862306a36Sopenharmony_ci{
110962306a36Sopenharmony_ci	int rval;
111062306a36Sopenharmony_ci
111162306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
111262306a36Sopenharmony_ci	rval = __v4l2_ctrl_s_ctrl(ctrl, val);
111362306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci	return rval;
111662306a36Sopenharmony_ci}
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_ci/**
111962306a36Sopenharmony_ci * v4l2_ctrl_g_ctrl_int64() - Helper function to get a 64-bit control's value
112062306a36Sopenharmony_ci *	from within a driver.
112162306a36Sopenharmony_ci *
112262306a36Sopenharmony_ci * @ctrl:	The control.
112362306a36Sopenharmony_ci *
112462306a36Sopenharmony_ci * This returns the control's value safely by going through the control
112562306a36Sopenharmony_ci * framework. This function will lock the control's handler, so it cannot be
112662306a36Sopenharmony_ci * used from within the &v4l2_ctrl_ops functions.
112762306a36Sopenharmony_ci *
112862306a36Sopenharmony_ci * This function is for 64-bit integer type controls only.
112962306a36Sopenharmony_ci */
113062306a36Sopenharmony_cis64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl);
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci/**
113362306a36Sopenharmony_ci * __v4l2_ctrl_s_ctrl_int64() - Unlocked variant of v4l2_ctrl_s_ctrl_int64().
113462306a36Sopenharmony_ci *
113562306a36Sopenharmony_ci * @ctrl:	The control.
113662306a36Sopenharmony_ci * @val:	The new value.
113762306a36Sopenharmony_ci *
113862306a36Sopenharmony_ci * This sets the control's new value safely by going through the control
113962306a36Sopenharmony_ci * framework. This function assumes the control's handler is already locked,
114062306a36Sopenharmony_ci * allowing it to be used from within the &v4l2_ctrl_ops functions.
114162306a36Sopenharmony_ci *
114262306a36Sopenharmony_ci * This function is for 64-bit integer type controls only.
114362306a36Sopenharmony_ci */
114462306a36Sopenharmony_ciint __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val);
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci/**
114762306a36Sopenharmony_ci * v4l2_ctrl_s_ctrl_int64() - Helper function to set a 64-bit control's value
114862306a36Sopenharmony_ci *	from within a driver.
114962306a36Sopenharmony_ci *
115062306a36Sopenharmony_ci * @ctrl:	The control.
115162306a36Sopenharmony_ci * @val:	The new value.
115262306a36Sopenharmony_ci *
115362306a36Sopenharmony_ci * This sets the control's new value safely by going through the control
115462306a36Sopenharmony_ci * framework. This function will lock the control's handler, so it cannot be
115562306a36Sopenharmony_ci * used from within the &v4l2_ctrl_ops functions.
115662306a36Sopenharmony_ci *
115762306a36Sopenharmony_ci * This function is for 64-bit integer type controls only.
115862306a36Sopenharmony_ci */
115962306a36Sopenharmony_cistatic inline int v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
116062306a36Sopenharmony_ci{
116162306a36Sopenharmony_ci	int rval;
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
116462306a36Sopenharmony_ci	rval = __v4l2_ctrl_s_ctrl_int64(ctrl, val);
116562306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_ci	return rval;
116862306a36Sopenharmony_ci}
116962306a36Sopenharmony_ci
117062306a36Sopenharmony_ci/**
117162306a36Sopenharmony_ci * __v4l2_ctrl_s_ctrl_string() - Unlocked variant of v4l2_ctrl_s_ctrl_string().
117262306a36Sopenharmony_ci *
117362306a36Sopenharmony_ci * @ctrl:	The control.
117462306a36Sopenharmony_ci * @s:		The new string.
117562306a36Sopenharmony_ci *
117662306a36Sopenharmony_ci * This sets the control's new string safely by going through the control
117762306a36Sopenharmony_ci * framework. This function assumes the control's handler is already locked,
117862306a36Sopenharmony_ci * allowing it to be used from within the &v4l2_ctrl_ops functions.
117962306a36Sopenharmony_ci *
118062306a36Sopenharmony_ci * This function is for string type controls only.
118162306a36Sopenharmony_ci */
118262306a36Sopenharmony_ciint __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s);
118362306a36Sopenharmony_ci
118462306a36Sopenharmony_ci/**
118562306a36Sopenharmony_ci * v4l2_ctrl_s_ctrl_string() - Helper function to set a control's string value
118662306a36Sopenharmony_ci *	 from within a driver.
118762306a36Sopenharmony_ci *
118862306a36Sopenharmony_ci * @ctrl:	The control.
118962306a36Sopenharmony_ci * @s:		The new string.
119062306a36Sopenharmony_ci *
119162306a36Sopenharmony_ci * This sets the control's new string safely by going through the control
119262306a36Sopenharmony_ci * framework. This function will lock the control's handler, so it cannot be
119362306a36Sopenharmony_ci * used from within the &v4l2_ctrl_ops functions.
119462306a36Sopenharmony_ci *
119562306a36Sopenharmony_ci * This function is for string type controls only.
119662306a36Sopenharmony_ci */
119762306a36Sopenharmony_cistatic inline int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
119862306a36Sopenharmony_ci{
119962306a36Sopenharmony_ci	int rval;
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
120262306a36Sopenharmony_ci	rval = __v4l2_ctrl_s_ctrl_string(ctrl, s);
120362306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	return rval;
120662306a36Sopenharmony_ci}
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci/**
120962306a36Sopenharmony_ci * __v4l2_ctrl_s_ctrl_compound() - Unlocked variant to set a compound control
121062306a36Sopenharmony_ci *
121162306a36Sopenharmony_ci * @ctrl: The control.
121262306a36Sopenharmony_ci * @type: The type of the data.
121362306a36Sopenharmony_ci * @p:    The new compound payload.
121462306a36Sopenharmony_ci *
121562306a36Sopenharmony_ci * This sets the control's new compound payload safely by going through the
121662306a36Sopenharmony_ci * control framework. This function assumes the control's handler is already
121762306a36Sopenharmony_ci * locked, allowing it to be used from within the &v4l2_ctrl_ops functions.
121862306a36Sopenharmony_ci *
121962306a36Sopenharmony_ci * This function is for compound type controls only.
122062306a36Sopenharmony_ci */
122162306a36Sopenharmony_ciint __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
122262306a36Sopenharmony_ci				enum v4l2_ctrl_type type, const void *p);
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci/**
122562306a36Sopenharmony_ci * v4l2_ctrl_s_ctrl_compound() - Helper function to set a compound control
122662306a36Sopenharmony_ci *	from within a driver.
122762306a36Sopenharmony_ci *
122862306a36Sopenharmony_ci * @ctrl: The control.
122962306a36Sopenharmony_ci * @type: The type of the data.
123062306a36Sopenharmony_ci * @p:    The new compound payload.
123162306a36Sopenharmony_ci *
123262306a36Sopenharmony_ci * This sets the control's new compound payload safely by going through the
123362306a36Sopenharmony_ci * control framework. This function will lock the control's handler, so it
123462306a36Sopenharmony_ci * cannot be used from within the &v4l2_ctrl_ops functions.
123562306a36Sopenharmony_ci *
123662306a36Sopenharmony_ci * This function is for compound type controls only.
123762306a36Sopenharmony_ci */
123862306a36Sopenharmony_cistatic inline int v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
123962306a36Sopenharmony_ci					    enum v4l2_ctrl_type type,
124062306a36Sopenharmony_ci					    const void *p)
124162306a36Sopenharmony_ci{
124262306a36Sopenharmony_ci	int rval;
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci	v4l2_ctrl_lock(ctrl);
124562306a36Sopenharmony_ci	rval = __v4l2_ctrl_s_ctrl_compound(ctrl, type, p);
124662306a36Sopenharmony_ci	v4l2_ctrl_unlock(ctrl);
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_ci	return rval;
124962306a36Sopenharmony_ci}
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci/* Helper defines for area type controls */
125262306a36Sopenharmony_ci#define __v4l2_ctrl_s_ctrl_area(ctrl, area) \
125362306a36Sopenharmony_ci	__v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
125462306a36Sopenharmony_ci#define v4l2_ctrl_s_ctrl_area(ctrl, area) \
125562306a36Sopenharmony_ci	v4l2_ctrl_s_ctrl_compound((ctrl), V4L2_CTRL_TYPE_AREA, (area))
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci/* Internal helper functions that deal with control events. */
125862306a36Sopenharmony_ciextern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;
125962306a36Sopenharmony_ci
126062306a36Sopenharmony_ci/**
126162306a36Sopenharmony_ci * v4l2_ctrl_replace - Function to be used as a callback to
126262306a36Sopenharmony_ci *	&struct v4l2_subscribed_event_ops replace\(\)
126362306a36Sopenharmony_ci *
126462306a36Sopenharmony_ci * @old: pointer to struct &v4l2_event with the reported
126562306a36Sopenharmony_ci *	 event;
126662306a36Sopenharmony_ci * @new: pointer to struct &v4l2_event with the modified
126762306a36Sopenharmony_ci *	 event;
126862306a36Sopenharmony_ci */
126962306a36Sopenharmony_civoid v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new);
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci/**
127262306a36Sopenharmony_ci * v4l2_ctrl_merge - Function to be used as a callback to
127362306a36Sopenharmony_ci *	&struct v4l2_subscribed_event_ops merge(\)
127462306a36Sopenharmony_ci *
127562306a36Sopenharmony_ci * @old: pointer to struct &v4l2_event with the reported
127662306a36Sopenharmony_ci *	 event;
127762306a36Sopenharmony_ci * @new: pointer to struct &v4l2_event with the merged
127862306a36Sopenharmony_ci *	 event;
127962306a36Sopenharmony_ci */
128062306a36Sopenharmony_civoid v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new);
128162306a36Sopenharmony_ci
128262306a36Sopenharmony_ci/**
128362306a36Sopenharmony_ci * v4l2_ctrl_log_status - helper function to implement %VIDIOC_LOG_STATUS ioctl
128462306a36Sopenharmony_ci *
128562306a36Sopenharmony_ci * @file: pointer to struct file
128662306a36Sopenharmony_ci * @fh: unused. Kept just to be compatible to the arguments expected by
128762306a36Sopenharmony_ci *	&struct v4l2_ioctl_ops.vidioc_log_status.
128862306a36Sopenharmony_ci *
128962306a36Sopenharmony_ci * Can be used as a vidioc_log_status function that just dumps all controls
129062306a36Sopenharmony_ci * associated with the filehandle.
129162306a36Sopenharmony_ci */
129262306a36Sopenharmony_ciint v4l2_ctrl_log_status(struct file *file, void *fh);
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_ci/**
129562306a36Sopenharmony_ci * v4l2_ctrl_subscribe_event - Subscribes to an event
129662306a36Sopenharmony_ci *
129762306a36Sopenharmony_ci *
129862306a36Sopenharmony_ci * @fh: pointer to struct v4l2_fh
129962306a36Sopenharmony_ci * @sub: pointer to &struct v4l2_event_subscription
130062306a36Sopenharmony_ci *
130162306a36Sopenharmony_ci * Can be used as a vidioc_subscribe_event function that just subscribes
130262306a36Sopenharmony_ci * control events.
130362306a36Sopenharmony_ci */
130462306a36Sopenharmony_ciint v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
130562306a36Sopenharmony_ci				const struct v4l2_event_subscription *sub);
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_ci/**
130862306a36Sopenharmony_ci * v4l2_ctrl_poll - function to be used as a callback to the poll()
130962306a36Sopenharmony_ci *	That just polls for control events.
131062306a36Sopenharmony_ci *
131162306a36Sopenharmony_ci * @file: pointer to struct file
131262306a36Sopenharmony_ci * @wait: pointer to struct poll_table_struct
131362306a36Sopenharmony_ci */
131462306a36Sopenharmony_ci__poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait);
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_ci/**
131762306a36Sopenharmony_ci * v4l2_ctrl_request_setup - helper function to apply control values in a request
131862306a36Sopenharmony_ci *
131962306a36Sopenharmony_ci * @req: The request
132062306a36Sopenharmony_ci * @parent: The parent control handler ('priv' in media_request_object_find())
132162306a36Sopenharmony_ci *
132262306a36Sopenharmony_ci * This is a helper function to call the control handler's s_ctrl callback with
132362306a36Sopenharmony_ci * the control values contained in the request. Do note that this approach of
132462306a36Sopenharmony_ci * applying control values in a request is only applicable to memory-to-memory
132562306a36Sopenharmony_ci * devices.
132662306a36Sopenharmony_ci */
132762306a36Sopenharmony_ciint v4l2_ctrl_request_setup(struct media_request *req,
132862306a36Sopenharmony_ci			     struct v4l2_ctrl_handler *parent);
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ci/**
133162306a36Sopenharmony_ci * v4l2_ctrl_request_complete - Complete a control handler request object
133262306a36Sopenharmony_ci *
133362306a36Sopenharmony_ci * @req: The request
133462306a36Sopenharmony_ci * @parent: The parent control handler ('priv' in media_request_object_find())
133562306a36Sopenharmony_ci *
133662306a36Sopenharmony_ci * This function is to be called on each control handler that may have had a
133762306a36Sopenharmony_ci * request object associated with it, i.e. control handlers of a driver that
133862306a36Sopenharmony_ci * supports requests.
133962306a36Sopenharmony_ci *
134062306a36Sopenharmony_ci * The function first obtains the values of any volatile controls in the control
134162306a36Sopenharmony_ci * handler and attach them to the request. Then, the function completes the
134262306a36Sopenharmony_ci * request object.
134362306a36Sopenharmony_ci */
134462306a36Sopenharmony_civoid v4l2_ctrl_request_complete(struct media_request *req,
134562306a36Sopenharmony_ci				struct v4l2_ctrl_handler *parent);
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_ci/**
134862306a36Sopenharmony_ci * v4l2_ctrl_request_hdl_find - Find the control handler in the request
134962306a36Sopenharmony_ci *
135062306a36Sopenharmony_ci * @req: The request
135162306a36Sopenharmony_ci * @parent: The parent control handler ('priv' in media_request_object_find())
135262306a36Sopenharmony_ci *
135362306a36Sopenharmony_ci * This function finds the control handler in the request. It may return
135462306a36Sopenharmony_ci * NULL if not found. When done, you must call v4l2_ctrl_request_hdl_put()
135562306a36Sopenharmony_ci * with the returned handler pointer.
135662306a36Sopenharmony_ci *
135762306a36Sopenharmony_ci * If the request is not in state VALIDATING or QUEUED, then this function
135862306a36Sopenharmony_ci * will always return NULL.
135962306a36Sopenharmony_ci *
136062306a36Sopenharmony_ci * Note that in state VALIDATING the req_queue_mutex is held, so
136162306a36Sopenharmony_ci * no objects can be added or deleted from the request.
136262306a36Sopenharmony_ci *
136362306a36Sopenharmony_ci * In state QUEUED it is the driver that will have to ensure this.
136462306a36Sopenharmony_ci */
136562306a36Sopenharmony_cistruct v4l2_ctrl_handler *v4l2_ctrl_request_hdl_find(struct media_request *req,
136662306a36Sopenharmony_ci					struct v4l2_ctrl_handler *parent);
136762306a36Sopenharmony_ci
136862306a36Sopenharmony_ci/**
136962306a36Sopenharmony_ci * v4l2_ctrl_request_hdl_put - Put the control handler
137062306a36Sopenharmony_ci *
137162306a36Sopenharmony_ci * @hdl: Put this control handler
137262306a36Sopenharmony_ci *
137362306a36Sopenharmony_ci * This function released the control handler previously obtained from'
137462306a36Sopenharmony_ci * v4l2_ctrl_request_hdl_find().
137562306a36Sopenharmony_ci */
137662306a36Sopenharmony_cistatic inline void v4l2_ctrl_request_hdl_put(struct v4l2_ctrl_handler *hdl)
137762306a36Sopenharmony_ci{
137862306a36Sopenharmony_ci	if (hdl)
137962306a36Sopenharmony_ci		media_request_object_put(&hdl->req_obj);
138062306a36Sopenharmony_ci}
138162306a36Sopenharmony_ci
138262306a36Sopenharmony_ci/**
138362306a36Sopenharmony_ci * v4l2_ctrl_request_hdl_ctrl_find() - Find a control with the given ID.
138462306a36Sopenharmony_ci *
138562306a36Sopenharmony_ci * @hdl: The control handler from the request.
138662306a36Sopenharmony_ci * @id: The ID of the control to find.
138762306a36Sopenharmony_ci *
138862306a36Sopenharmony_ci * This function returns a pointer to the control if this control is
138962306a36Sopenharmony_ci * part of the request or NULL otherwise.
139062306a36Sopenharmony_ci */
139162306a36Sopenharmony_cistruct v4l2_ctrl *
139262306a36Sopenharmony_civ4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id);
139362306a36Sopenharmony_ci
139462306a36Sopenharmony_ci/* Helpers for ioctl_ops */
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_ci/**
139762306a36Sopenharmony_ci * v4l2_queryctrl - Helper function to implement
139862306a36Sopenharmony_ci *	:ref:`VIDIOC_QUERYCTRL <vidioc_queryctrl>` ioctl
139962306a36Sopenharmony_ci *
140062306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
140162306a36Sopenharmony_ci * @qc: pointer to &struct v4l2_queryctrl
140262306a36Sopenharmony_ci *
140362306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
140462306a36Sopenharmony_ci */
140562306a36Sopenharmony_ciint v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc);
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_ci/**
140862306a36Sopenharmony_ci * v4l2_query_ext_ctrl - Helper function to implement
140962306a36Sopenharmony_ci *	 :ref:`VIDIOC_QUERY_EXT_CTRL <vidioc_queryctrl>` ioctl
141062306a36Sopenharmony_ci *
141162306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
141262306a36Sopenharmony_ci * @qc: pointer to &struct v4l2_query_ext_ctrl
141362306a36Sopenharmony_ci *
141462306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
141562306a36Sopenharmony_ci */
141662306a36Sopenharmony_ciint v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl,
141762306a36Sopenharmony_ci			struct v4l2_query_ext_ctrl *qc);
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci/**
142062306a36Sopenharmony_ci * v4l2_querymenu - Helper function to implement
142162306a36Sopenharmony_ci *	:ref:`VIDIOC_QUERYMENU <vidioc_queryctrl>` ioctl
142262306a36Sopenharmony_ci *
142362306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
142462306a36Sopenharmony_ci * @qm: pointer to &struct v4l2_querymenu
142562306a36Sopenharmony_ci *
142662306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
142762306a36Sopenharmony_ci */
142862306a36Sopenharmony_ciint v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm);
142962306a36Sopenharmony_ci
143062306a36Sopenharmony_ci/**
143162306a36Sopenharmony_ci * v4l2_g_ctrl - Helper function to implement
143262306a36Sopenharmony_ci *	:ref:`VIDIOC_G_CTRL <vidioc_g_ctrl>` ioctl
143362306a36Sopenharmony_ci *
143462306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
143562306a36Sopenharmony_ci * @ctrl: pointer to &struct v4l2_control
143662306a36Sopenharmony_ci *
143762306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
143862306a36Sopenharmony_ci */
143962306a36Sopenharmony_ciint v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *ctrl);
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_ci/**
144262306a36Sopenharmony_ci * v4l2_s_ctrl - Helper function to implement
144362306a36Sopenharmony_ci *	:ref:`VIDIOC_S_CTRL <vidioc_g_ctrl>` ioctl
144462306a36Sopenharmony_ci *
144562306a36Sopenharmony_ci * @fh: pointer to &struct v4l2_fh
144662306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
144762306a36Sopenharmony_ci *
144862306a36Sopenharmony_ci * @ctrl: pointer to &struct v4l2_control
144962306a36Sopenharmony_ci *
145062306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
145162306a36Sopenharmony_ci */
145262306a36Sopenharmony_ciint v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
145362306a36Sopenharmony_ci		struct v4l2_control *ctrl);
145462306a36Sopenharmony_ci
145562306a36Sopenharmony_ci/**
145662306a36Sopenharmony_ci * v4l2_g_ext_ctrls - Helper function to implement
145762306a36Sopenharmony_ci *	:ref:`VIDIOC_G_EXT_CTRLS <vidioc_g_ext_ctrls>` ioctl
145862306a36Sopenharmony_ci *
145962306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
146062306a36Sopenharmony_ci * @vdev: pointer to &struct video_device
146162306a36Sopenharmony_ci * @mdev: pointer to &struct media_device
146262306a36Sopenharmony_ci * @c: pointer to &struct v4l2_ext_controls
146362306a36Sopenharmony_ci *
146462306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
146562306a36Sopenharmony_ci */
146662306a36Sopenharmony_ciint v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
146762306a36Sopenharmony_ci		     struct media_device *mdev, struct v4l2_ext_controls *c);
146862306a36Sopenharmony_ci
146962306a36Sopenharmony_ci/**
147062306a36Sopenharmony_ci * v4l2_try_ext_ctrls - Helper function to implement
147162306a36Sopenharmony_ci *	:ref:`VIDIOC_TRY_EXT_CTRLS <vidioc_g_ext_ctrls>` ioctl
147262306a36Sopenharmony_ci *
147362306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
147462306a36Sopenharmony_ci * @vdev: pointer to &struct video_device
147562306a36Sopenharmony_ci * @mdev: pointer to &struct media_device
147662306a36Sopenharmony_ci * @c: pointer to &struct v4l2_ext_controls
147762306a36Sopenharmony_ci *
147862306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
147962306a36Sopenharmony_ci */
148062306a36Sopenharmony_ciint v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl,
148162306a36Sopenharmony_ci		       struct video_device *vdev,
148262306a36Sopenharmony_ci		       struct media_device *mdev,
148362306a36Sopenharmony_ci		       struct v4l2_ext_controls *c);
148462306a36Sopenharmony_ci
148562306a36Sopenharmony_ci/**
148662306a36Sopenharmony_ci * v4l2_s_ext_ctrls - Helper function to implement
148762306a36Sopenharmony_ci *	:ref:`VIDIOC_S_EXT_CTRLS <vidioc_g_ext_ctrls>` ioctl
148862306a36Sopenharmony_ci *
148962306a36Sopenharmony_ci * @fh: pointer to &struct v4l2_fh
149062306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler
149162306a36Sopenharmony_ci * @vdev: pointer to &struct video_device
149262306a36Sopenharmony_ci * @mdev: pointer to &struct media_device
149362306a36Sopenharmony_ci * @c: pointer to &struct v4l2_ext_controls
149462306a36Sopenharmony_ci *
149562306a36Sopenharmony_ci * If hdl == NULL then they will all return -EINVAL.
149662306a36Sopenharmony_ci */
149762306a36Sopenharmony_ciint v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
149862306a36Sopenharmony_ci		     struct video_device *vdev,
149962306a36Sopenharmony_ci		     struct media_device *mdev,
150062306a36Sopenharmony_ci		     struct v4l2_ext_controls *c);
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci/**
150362306a36Sopenharmony_ci * v4l2_ctrl_subdev_subscribe_event - Helper function to implement
150462306a36Sopenharmony_ci *	as a &struct v4l2_subdev_core_ops subscribe_event function
150562306a36Sopenharmony_ci *	that just subscribes control events.
150662306a36Sopenharmony_ci *
150762306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev
150862306a36Sopenharmony_ci * @fh: pointer to &struct v4l2_fh
150962306a36Sopenharmony_ci * @sub: pointer to &struct v4l2_event_subscription
151062306a36Sopenharmony_ci */
151162306a36Sopenharmony_ciint v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
151262306a36Sopenharmony_ci				     struct v4l2_event_subscription *sub);
151362306a36Sopenharmony_ci
151462306a36Sopenharmony_ci/**
151562306a36Sopenharmony_ci * v4l2_ctrl_subdev_log_status - Log all controls owned by subdev's control
151662306a36Sopenharmony_ci *	 handler.
151762306a36Sopenharmony_ci *
151862306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev
151962306a36Sopenharmony_ci */
152062306a36Sopenharmony_ciint v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd);
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_ci/**
152362306a36Sopenharmony_ci * v4l2_ctrl_new_fwnode_properties() - Register controls for the device
152462306a36Sopenharmony_ci *				       properties
152562306a36Sopenharmony_ci *
152662306a36Sopenharmony_ci * @hdl: pointer to &struct v4l2_ctrl_handler to register controls on
152762306a36Sopenharmony_ci * @ctrl_ops: pointer to &struct v4l2_ctrl_ops to register controls with
152862306a36Sopenharmony_ci * @p: pointer to &struct v4l2_fwnode_device_properties
152962306a36Sopenharmony_ci *
153062306a36Sopenharmony_ci * This function registers controls associated to device properties, using the
153162306a36Sopenharmony_ci * property values contained in @p parameter, if the property has been set to
153262306a36Sopenharmony_ci * a value.
153362306a36Sopenharmony_ci *
153462306a36Sopenharmony_ci * Currently the following v4l2 controls are parsed and registered:
153562306a36Sopenharmony_ci * - V4L2_CID_CAMERA_ORIENTATION
153662306a36Sopenharmony_ci * - V4L2_CID_CAMERA_SENSOR_ROTATION;
153762306a36Sopenharmony_ci *
153862306a36Sopenharmony_ci * Controls already registered by the caller with the @hdl control handler are
153962306a36Sopenharmony_ci * not overwritten. Callers should register the controls they want to handle
154062306a36Sopenharmony_ci * themselves before calling this function.
154162306a36Sopenharmony_ci *
154262306a36Sopenharmony_ci * Return: 0 on success, a negative error code on failure.
154362306a36Sopenharmony_ci */
154462306a36Sopenharmony_ciint v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler *hdl,
154562306a36Sopenharmony_ci				    const struct v4l2_ctrl_ops *ctrl_ops,
154662306a36Sopenharmony_ci				    const struct v4l2_fwnode_device_properties *p);
154762306a36Sopenharmony_ci
154862306a36Sopenharmony_ci/**
154962306a36Sopenharmony_ci * v4l2_ctrl_type_op_equal - Default v4l2_ctrl_type_ops equal callback.
155062306a36Sopenharmony_ci *
155162306a36Sopenharmony_ci * @ctrl: The v4l2_ctrl pointer.
155262306a36Sopenharmony_ci * @ptr1: A v4l2 control value.
155362306a36Sopenharmony_ci * @ptr2: A v4l2 control value.
155462306a36Sopenharmony_ci *
155562306a36Sopenharmony_ci * Return: true if values are equal, otherwise false.
155662306a36Sopenharmony_ci */
155762306a36Sopenharmony_cibool v4l2_ctrl_type_op_equal(const struct v4l2_ctrl *ctrl,
155862306a36Sopenharmony_ci			     union v4l2_ctrl_ptr ptr1, union v4l2_ctrl_ptr ptr2);
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci/**
156162306a36Sopenharmony_ci * v4l2_ctrl_type_op_init - Default v4l2_ctrl_type_ops init callback.
156262306a36Sopenharmony_ci *
156362306a36Sopenharmony_ci * @ctrl: The v4l2_ctrl pointer.
156462306a36Sopenharmony_ci * @from_idx: Starting element index.
156562306a36Sopenharmony_ci * @ptr: The v4l2 control value.
156662306a36Sopenharmony_ci *
156762306a36Sopenharmony_ci * Return: void
156862306a36Sopenharmony_ci */
156962306a36Sopenharmony_civoid v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctrl, u32 from_idx,
157062306a36Sopenharmony_ci			    union v4l2_ctrl_ptr ptr);
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ci/**
157362306a36Sopenharmony_ci * v4l2_ctrl_type_op_log - Default v4l2_ctrl_type_ops log callback.
157462306a36Sopenharmony_ci *
157562306a36Sopenharmony_ci * @ctrl: The v4l2_ctrl pointer.
157662306a36Sopenharmony_ci *
157762306a36Sopenharmony_ci * Return: void
157862306a36Sopenharmony_ci */
157962306a36Sopenharmony_civoid v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl);
158062306a36Sopenharmony_ci
158162306a36Sopenharmony_ci/**
158262306a36Sopenharmony_ci * v4l2_ctrl_type_op_validate - Default v4l2_ctrl_type_ops validate callback.
158362306a36Sopenharmony_ci *
158462306a36Sopenharmony_ci * @ctrl: The v4l2_ctrl pointer.
158562306a36Sopenharmony_ci * @ptr: The v4l2 control value.
158662306a36Sopenharmony_ci *
158762306a36Sopenharmony_ci * Return: 0 on success, a negative error code on failure.
158862306a36Sopenharmony_ci */
158962306a36Sopenharmony_ciint v4l2_ctrl_type_op_validate(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr ptr);
159062306a36Sopenharmony_ci
159162306a36Sopenharmony_ci#endif
1592