1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*
3   * V4L2 controls framework private header.
4   *
5   * Copyright (C) 2010-2021  Hans Verkuil <hverkuil-cisco@xs4all.nl>
6   */
7  
8  #ifndef _V4L2_CTRLS_PRIV_H_
9  #define _V4L2_CTRLS_PRIV_H_
10  
11  #define dprintk(vdev, fmt, arg...) do {					\
12  	if (!WARN_ON(!(vdev)) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
13  		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
14  		       __func__, video_device_node_name(vdev), ##arg);	\
15  } while (0)
16  
17  #define has_op(master, op) \
18  	((master)->ops && (master)->ops->op)
19  #define call_op(master, op) \
20  	(has_op(master, op) ? (master)->ops->op(master) : 0)
21  
node2id(struct list_head * node)22  static inline u32 node2id(struct list_head *node)
23  {
24  	return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
25  }
26  
27  /*
28   * Small helper function to determine if the autocluster is set to manual
29   * mode.
30   */
is_cur_manual(const struct v4l2_ctrl * master)31  static inline bool is_cur_manual(const struct v4l2_ctrl *master)
32  {
33  	return master->is_auto && master->cur.val == master->manual_mode_value;
34  }
35  
36  /*
37   * Small helper function to determine if the autocluster will be set to manual
38   * mode.
39   */
is_new_manual(const struct v4l2_ctrl * master)40  static inline bool is_new_manual(const struct v4l2_ctrl *master)
41  {
42  	return master->is_auto && master->val == master->manual_mode_value;
43  }
44  
user_flags(const struct v4l2_ctrl * ctrl)45  static inline u32 user_flags(const struct v4l2_ctrl *ctrl)
46  {
47  	u32 flags = ctrl->flags;
48  
49  	if (ctrl->is_ptr)
50  		flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
51  
52  	return flags;
53  }
54  
55  /* v4l2-ctrls-core.c */
56  void cur_to_new(struct v4l2_ctrl *ctrl);
57  void cur_to_req(struct v4l2_ctrl_ref *ref);
58  void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags);
59  void new_to_req(struct v4l2_ctrl_ref *ref);
60  int req_to_new(struct v4l2_ctrl_ref *ref);
61  void send_initial_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl);
62  void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes);
63  int handler_new_ref(struct v4l2_ctrl_handler *hdl,
64  		    struct v4l2_ctrl *ctrl,
65  		    struct v4l2_ctrl_ref **ctrl_ref,
66  		    bool from_other_dev, bool allocate_req);
67  struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id);
68  struct v4l2_ctrl_ref *find_ref_lock(struct v4l2_ctrl_handler *hdl, u32 id);
69  int check_range(enum v4l2_ctrl_type type,
70  		s64 min, s64 max, u64 step, s64 def);
71  void update_from_auto_cluster(struct v4l2_ctrl *master);
72  int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
73  		       bool set, u32 ch_flags);
74  
75  /* v4l2-ctrls-api.c */
76  int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
77  			    struct v4l2_ext_controls *cs,
78  			    struct video_device *vdev);
79  int try_set_ext_ctrls_common(struct v4l2_fh *fh,
80  			     struct v4l2_ctrl_handler *hdl,
81  			     struct v4l2_ext_controls *cs,
82  			     struct video_device *vdev, bool set);
83  
84  /* v4l2-ctrls-request.c */
85  void v4l2_ctrl_handler_init_request(struct v4l2_ctrl_handler *hdl);
86  void v4l2_ctrl_handler_free_request(struct v4l2_ctrl_handler *hdl);
87  int v4l2_g_ext_ctrls_request(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
88  			     struct media_device *mdev, struct v4l2_ext_controls *cs);
89  int try_set_ext_ctrls_request(struct v4l2_fh *fh,
90  			      struct v4l2_ctrl_handler *hdl,
91  			      struct video_device *vdev,
92  			      struct media_device *mdev,
93  			      struct v4l2_ext_controls *cs, bool set);
94  
95  #endif
96