Commit | Line | Data |
---|---|---|
1802d0be | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
1babcb46 SA |
2 | /* |
3 | * v4l2-fh.h | |
4 | * | |
5 | * V4L2 file handle. Store per file handle data for the V4L2 | |
6 | * framework. Using file handles is optional for the drivers. | |
7 | * | |
8 | * Copyright (C) 2009--2010 Nokia Corporation. | |
9 | * | |
8c5dff90 | 10 | * Contact: Sakari Ailus <sakari.ailus@iki.fi> |
1babcb46 SA |
11 | */ |
12 | ||
13 | #ifndef V4L2_FH_H | |
14 | #define V4L2_FH_H | |
15 | ||
4f1af2a3 | 16 | #include <linux/fs.h> |
14351d44 | 17 | #include <linux/kconfig.h> |
1babcb46 | 18 | #include <linux/list.h> |
c8d185ce | 19 | #include <linux/videodev2.h> |
1babcb46 SA |
20 | |
21 | struct video_device; | |
2d28b686 | 22 | struct v4l2_ctrl_handler; |
1babcb46 | 23 | |
4ada120e MCC |
24 | /** |
25 | * struct v4l2_fh - Describes a V4L2 file handler | |
26 | * | |
27 | * @list: list of file handlers | |
28 | * @vdev: pointer to &struct video_device | |
29 | * @ctrl_handler: pointer to &struct v4l2_ctrl_handler | |
30 | * @prio: priority of the file handler, as defined by &enum v4l2_priority | |
31 | * | |
32 | * @wait: event' s wait queue | |
ad608fbc SA |
33 | * @subscribe_lock: serialise changes to the subscribed list; guarantee that |
34 | * the add and del event callbacks are orderly called | |
4ada120e MCC |
35 | * @subscribed: list of subscribed events |
36 | * @available: list of events waiting to be dequeued | |
37 | * @navailable: number of available events at @available list | |
38 | * @sequence: event sequence number | |
ad608fbc | 39 | * |
4ada120e MCC |
40 | * @m2m_ctx: pointer to &struct v4l2_m2m_ctx |
41 | */ | |
1babcb46 SA |
42 | struct v4l2_fh { |
43 | struct list_head list; | |
44 | struct video_device *vdev; | |
2d28b686 | 45 | struct v4l2_ctrl_handler *ctrl_handler; |
fc5602be | 46 | enum v4l2_priority prio; |
523f46d6 HV |
47 | |
48 | /* Events */ | |
49 | wait_queue_head_t wait; | |
ad608fbc | 50 | struct mutex subscribe_lock; |
4ada120e MCC |
51 | struct list_head subscribed; |
52 | struct list_head available; | |
523f46d6 | 53 | unsigned int navailable; |
523f46d6 | 54 | u32 sequence; |
8e6e8f93 | 55 | |
8e6e8f93 | 56 | struct v4l2_m2m_ctx *m2m_ctx; |
1babcb46 SA |
57 | }; |
58 | ||
4ada120e MCC |
59 | /** |
60 | * v4l2_fh_init - Initialise the file handle. | |
61 | * | |
62 | * @fh: pointer to &struct v4l2_fh | |
63 | * @vdev: pointer to &struct video_device | |
64 | * | |
65 | * Parts of the V4L2 framework using the | |
1babcb46 | 66 | * file handles should be initialised in this function. Must be called |
4ada120e MCC |
67 | * from driver's v4l2_file_operations->open\(\) handler if the driver |
68 | * uses &struct v4l2_fh. | |
1babcb46 | 69 | */ |
523f46d6 | 70 | void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev); |
4ada120e MCC |
71 | |
72 | /** | |
73 | * v4l2_fh_add - Add the fh to the list of file handles on a video_device. | |
74 | * | |
75 | * @fh: pointer to &struct v4l2_fh | |
76 | * | |
77 | * .. note:: | |
78 | * The @fh file handle must be initialised first. | |
1babcb46 SA |
79 | */ |
80 | void v4l2_fh_add(struct v4l2_fh *fh); | |
4ada120e MCC |
81 | |
82 | /** | |
83 | * v4l2_fh_open - Ancillary routine that can be used as the open\(\) op | |
84 | * of v4l2_file_operations. | |
85 | * | |
86 | * @filp: pointer to struct file | |
87 | * | |
88 | * It allocates a v4l2_fh and inits and adds it to the &struct video_device | |
89 | * associated with the file pointer. | |
73cb4206 HV |
90 | */ |
91 | int v4l2_fh_open(struct file *filp); | |
4ada120e MCC |
92 | |
93 | /** | |
94 | * v4l2_fh_del - Remove file handle from the list of file handles. | |
95 | * | |
96 | * @fh: pointer to &struct v4l2_fh | |
97 | * | |
98 | * On error filp->private_data will be %NULL, otherwise it will point to | |
99 | * the &struct v4l2_fh. | |
100 | * | |
101 | * .. note:: | |
102 | * Must be called in v4l2_file_operations->release\(\) handler if the driver | |
103 | * uses &struct v4l2_fh. | |
1babcb46 SA |
104 | */ |
105 | void v4l2_fh_del(struct v4l2_fh *fh); | |
4ada120e MCC |
106 | |
107 | /** | |
108 | * v4l2_fh_exit - Release resources related to a file handle. | |
109 | * | |
110 | * @fh: pointer to &struct v4l2_fh | |
111 | * | |
112 | * Parts of the V4L2 framework using the v4l2_fh must release their | |
113 | * resources here, too. | |
114 | * | |
115 | * .. note:: | |
116 | * Must be called in v4l2_file_operations->release\(\) handler if the | |
117 | * driver uses &struct v4l2_fh. | |
1babcb46 SA |
118 | */ |
119 | void v4l2_fh_exit(struct v4l2_fh *fh); | |
4ada120e MCC |
120 | |
121 | /** | |
122 | * v4l2_fh_release - Ancillary routine that can be used as the release\(\) op | |
123 | * of v4l2_file_operations. | |
124 | * | |
125 | * @filp: pointer to struct file | |
126 | * | |
73cb4206 HV |
127 | * It deletes and exits the v4l2_fh associated with the file pointer and |
128 | * frees it. It will do nothing if filp->private_data (the pointer to the | |
4ada120e MCC |
129 | * v4l2_fh struct) is %NULL. |
130 | * | |
131 | * This function always returns 0. | |
73cb4206 HV |
132 | */ |
133 | int v4l2_fh_release(struct file *filp); | |
4ada120e MCC |
134 | |
135 | /** | |
136 | * v4l2_fh_is_singular - Returns 1 if this filehandle is the only filehandle | |
137 | * opened for the associated video_device. | |
138 | * | |
139 | * @fh: pointer to &struct v4l2_fh | |
140 | * | |
141 | * If @fh is NULL, then it returns 0. | |
dfddb244 HV |
142 | */ |
143 | int v4l2_fh_is_singular(struct v4l2_fh *fh); | |
4ada120e MCC |
144 | |
145 | /** | |
146 | * v4l2_fh_is_singular_file - Returns 1 if this filehandle is the only | |
147 | * filehandle opened for the associated video_device. | |
148 | * | |
149 | * @filp: pointer to struct file | |
150 | * | |
151 | * This is a helper function variant of v4l2_fh_is_singular() with uses | |
152 | * struct file as argument. | |
153 | * | |
154 | * If filp->private_data is %NULL, then it will return 0. | |
dfddb244 HV |
155 | */ |
156 | static inline int v4l2_fh_is_singular_file(struct file *filp) | |
157 | { | |
158 | return v4l2_fh_is_singular(filp->private_data); | |
159 | } | |
1babcb46 SA |
160 | |
161 | #endif /* V4L2_EVENT_H */ |