171c689dcSHans Verkuil /* SPDX-License-Identifier: GPL-2.0-or-later */
271c689dcSHans Verkuil /*
371c689dcSHans Verkuil  * V4L2 controls framework private header.
471c689dcSHans Verkuil  *
571c689dcSHans Verkuil  * Copyright (C) 2010-2021  Hans Verkuil <hverkuil-cisco@xs4all.nl>
671c689dcSHans Verkuil  */
771c689dcSHans Verkuil 
871c689dcSHans Verkuil #ifndef _V4L2_CTRLS_PRIV_H_
971c689dcSHans Verkuil #define _V4L2_CTRLS_PRIV_H_
1071c689dcSHans Verkuil 
1171c689dcSHans Verkuil #define dprintk(vdev, fmt, arg...) do {					\
1271c689dcSHans Verkuil 	if (!WARN_ON(!(vdev)) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
1371c689dcSHans Verkuil 		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
1471c689dcSHans Verkuil 		       __func__, video_device_node_name(vdev), ##arg);	\
1571c689dcSHans Verkuil } while (0)
1671c689dcSHans Verkuil 
1771c689dcSHans Verkuil #define has_op(master, op) \
1871c689dcSHans Verkuil 	((master)->ops && (master)->ops->op)
1971c689dcSHans Verkuil #define call_op(master, op) \
2071c689dcSHans Verkuil 	(has_op(master, op) ? (master)->ops->op(master) : 0)
2171c689dcSHans Verkuil 
node2id(struct list_head * node)2271c689dcSHans Verkuil static inline u32 node2id(struct list_head *node)
2371c689dcSHans Verkuil {
2471c689dcSHans Verkuil 	return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
2571c689dcSHans Verkuil }
2671c689dcSHans Verkuil 
2771c689dcSHans Verkuil /*
2871c689dcSHans Verkuil  * Small helper function to determine if the autocluster is set to manual
2971c689dcSHans Verkuil  * mode.
3071c689dcSHans Verkuil  */
is_cur_manual(const struct v4l2_ctrl * master)3171c689dcSHans Verkuil static inline bool is_cur_manual(const struct v4l2_ctrl *master)
3271c689dcSHans Verkuil {
3371c689dcSHans Verkuil 	return master->is_auto && master->cur.val == master->manual_mode_value;
3471c689dcSHans Verkuil }
3571c689dcSHans Verkuil 
3671c689dcSHans Verkuil /*
3771c689dcSHans Verkuil  * Small helper function to determine if the autocluster will be set to manual
3871c689dcSHans Verkuil  * mode.
3971c689dcSHans Verkuil  */
is_new_manual(const struct v4l2_ctrl * master)4071c689dcSHans Verkuil static inline bool is_new_manual(const struct v4l2_ctrl *master)
4171c689dcSHans Verkuil {
4271c689dcSHans Verkuil 	return master->is_auto && master->val == master->manual_mode_value;
4371c689dcSHans Verkuil }
4471c689dcSHans Verkuil 
user_flags(const struct v4l2_ctrl * ctrl)4571c689dcSHans Verkuil static inline u32 user_flags(const struct v4l2_ctrl *ctrl)
4671c689dcSHans Verkuil {
4771c689dcSHans Verkuil 	u32 flags = ctrl->flags;
4871c689dcSHans Verkuil 
4971c689dcSHans Verkuil 	if (ctrl->is_ptr)
5071c689dcSHans Verkuil 		flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
5171c689dcSHans Verkuil 
5271c689dcSHans Verkuil 	return flags;
5371c689dcSHans Verkuil }
5471c689dcSHans Verkuil 
5571c689dcSHans Verkuil /* v4l2-ctrls-core.c */
5671c689dcSHans Verkuil void cur_to_new(struct v4l2_ctrl *ctrl);
5771c689dcSHans Verkuil void cur_to_req(struct v4l2_ctrl_ref *ref);
5871c689dcSHans Verkuil void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags);
5971c689dcSHans Verkuil void new_to_req(struct v4l2_ctrl_ref *ref);
60*fb582cbaSHans Verkuil int req_to_new(struct v4l2_ctrl_ref *ref);
6171c689dcSHans Verkuil void send_initial_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl);
6271c689dcSHans Verkuil void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes);
6371c689dcSHans Verkuil int handler_new_ref(struct v4l2_ctrl_handler *hdl,
6471c689dcSHans Verkuil 		    struct v4l2_ctrl *ctrl,
6571c689dcSHans Verkuil 		    struct v4l2_ctrl_ref **ctrl_ref,
6671c689dcSHans Verkuil 		    bool from_other_dev, bool allocate_req);
6771c689dcSHans Verkuil struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id);
6871c689dcSHans Verkuil struct v4l2_ctrl_ref *find_ref_lock(struct v4l2_ctrl_handler *hdl, u32 id);
6971c689dcSHans Verkuil int check_range(enum v4l2_ctrl_type type,
7071c689dcSHans Verkuil 		s64 min, s64 max, u64 step, s64 def);
7171c689dcSHans Verkuil void update_from_auto_cluster(struct v4l2_ctrl *master);
7271c689dcSHans Verkuil int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
7371c689dcSHans Verkuil 		       bool set, u32 ch_flags);
7471c689dcSHans Verkuil 
7571c689dcSHans Verkuil /* v4l2-ctrls-api.c */
7671c689dcSHans Verkuil int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
7771c689dcSHans Verkuil 			    struct v4l2_ext_controls *cs,
7871c689dcSHans Verkuil 			    struct video_device *vdev);
7971c689dcSHans Verkuil int try_set_ext_ctrls_common(struct v4l2_fh *fh,
8071c689dcSHans Verkuil 			     struct v4l2_ctrl_handler *hdl,
8171c689dcSHans Verkuil 			     struct v4l2_ext_controls *cs,
8271c689dcSHans Verkuil 			     struct video_device *vdev, bool set);
8371c689dcSHans Verkuil 
8471c689dcSHans Verkuil /* v4l2-ctrls-request.c */
8571c689dcSHans Verkuil void v4l2_ctrl_handler_init_request(struct v4l2_ctrl_handler *hdl);
8671c689dcSHans Verkuil void v4l2_ctrl_handler_free_request(struct v4l2_ctrl_handler *hdl);
8771c689dcSHans Verkuil int v4l2_g_ext_ctrls_request(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
8871c689dcSHans Verkuil 			     struct media_device *mdev, struct v4l2_ext_controls *cs);
8971c689dcSHans Verkuil int try_set_ext_ctrls_request(struct v4l2_fh *fh,
9071c689dcSHans Verkuil 			      struct v4l2_ctrl_handler *hdl,
9171c689dcSHans Verkuil 			      struct video_device *vdev,
9271c689dcSHans Verkuil 			      struct media_device *mdev,
9371c689dcSHans Verkuil 			      struct v4l2_ext_controls *cs, bool set);
9471c689dcSHans Verkuil 
9571c689dcSHans Verkuil #endif
96