V4L/DVB: V4L: File handles: Add documentation
authorSakari Ailus <sakari.ailus@maxwell.research.nokia.com>
Sat, 20 Mar 2010 21:28:48 +0000 (18:28 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 19 May 2010 15:58:05 +0000 (12:58 -0300)
Add documentation on using V4L2 file handles (v4l2_fh) in V4L2 drivers.

Signed-off-by: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

Documentation/video4linux/v4l2-framework.txt

index 5b9205a..48f0adf 100644 (file)
@@ -608,3 +608,75 @@ scatter/gather method (videobuf-dma-sg), DMA with linear access
 
 Please see Documentation/video4linux/videobuf for more information on how
 to use the videobuf layer.
+
+struct v4l2_fh
+--------------
+
+struct v4l2_fh provides a way to easily keep file handle specific data
+that is used by the V4L2 framework. Using v4l2_fh is optional for
+drivers.
+
+The users of v4l2_fh (in the V4L2 framework, not the driver) know
+whether a driver uses v4l2_fh as its file->private_data pointer by
+testing the V4L2_FL_USES_V4L2_FH bit in video_device->flags.
+
+Useful functions:
+
+- v4l2_fh_init()
+
+  Initialise the file handle. This *MUST* be performed in the driver's
+  v4l2_file_operations->open() handler.
+
+- v4l2_fh_add()
+
+  Add a v4l2_fh to video_device file handle list. May be called after
+  initialising the file handle.
+
+- v4l2_fh_del()
+
+  Unassociate the file handle from video_device(). The file handle
+  exit function may now be called.
+
+- v4l2_fh_exit()
+
+  Uninitialise the file handle. After uninitialisation the v4l2_fh
+  memory can be freed.
+
+struct v4l2_fh is allocated as a part of the driver's own file handle
+structure and is set to file->private_data in the driver's open
+function by the driver. Drivers can extract their own file handle
+structure by using the container_of macro. Example:
+
+struct my_fh {
+       int blah;
+       struct v4l2_fh fh;
+};
+
+...
+
+int my_open(struct file *file)
+{
+       struct my_fh *my_fh;
+       struct video_device *vfd;
+       int ret;
+
+       ...
+
+       ret = v4l2_fh_init(&my_fh->fh, vfd);
+       if (ret)
+               return ret;
+
+       v4l2_fh_add(&my_fh->fh);
+
+       file->private_data = &my_fh->fh;
+
+       ...
+}
+
+int my_release(struct file *file)
+{
+       struct v4l2_fh *fh = file->private_data;
+       struct my_fh *my_fh = container_of(fh, struct my_fh, fh);
+
+       ...
+}