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