1.6. V4L2 File handlers¶
struct v4l2_fh
provides a way to easily keep file handle specific
data that is used by the V4L2 framework.
Attention
New drivers must use struct v4l2_fh
since it is also used to implement priority handling
(ioctl VIDIOC_G_PRIORITY, VIDIOC_S_PRIORITY).
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.
This bit is set whenever v4l2_fh_init()
is called.
struct v4l2_fh
is allocated as a part of the driver’s own file handle
structure and file->private_data
is set to it in the driver’s open()
function by the driver.
In many cases the struct v4l2_fh
will be embedded in a larger
structure. In that case you should call:
v4l2_fh_init()
andv4l2_fh_add()
inopen()
v4l2_fh_del()
andv4l2_fh_exit()
inrelease()
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;
...
my_fh = kzalloc(sizeof(*my_fh), GFP_KERNEL);
...
v4l2_fh_init(&my_fh->fh, vfd);
...
file->private_data = &my_fh->fh;
v4l2_fh_add(&my_fh->fh);
return 0;
}
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);
...
v4l2_fh_del(&my_fh->fh);
v4l2_fh_exit(&my_fh->fh);
kfree(my_fh);
return 0;
}
Below is a short description of the v4l2_fh
functions used:
v4l2_fh_init
(fh
, vdev
)
- Initialise the file handle. This MUST be performed in the driver’s
v4l2_file_operations
->open() handler.
v4l2_fh_add
(fh
)
- Add a
v4l2_fh
tovideo_device
file handle list. Must be called once the file handle is completely initialized.
v4l2_fh_del
(fh
)
- Unassociate the file handle from
video_device
. The file handle exit function may now be called.
v4l2_fh_exit
(fh
)
- Uninitialise the file handle. After uninitialisation the
v4l2_fh
memory can be freed.
If struct v4l2_fh
is not embedded, then you can use these helper functions:
v4l2_fh_open
(struct file *filp)
- This allocates a struct
v4l2_fh
, initializes it and adds it to the structvideo_device
associated with the file struct.
v4l2_fh_release
(struct file *filp)
- This deletes it from the struct
video_device
associated with the file struct, uninitialised thev4l2_fh
and frees it.
These two functions can be plugged into the v4l2_file_operation’s open()
and release()
ops.
Several drivers need to do something when the first file handle is opened and
when the last file handle closes. Two helper functions were added to check
whether the v4l2_fh
struct is the only open filehandle of the
associated device node:
v4l2_fh_is_singular
(fh
)
- Returns 1 if the file handle is the only open file handle, else 0.
v4l2_fh_is_singular_file
(struct file *filp)
- Same, but it calls v4l2_fh_is_singular with filp->private_data.
1.6.1. V4L2 fh functions and data structures¶
Error
kernel-doc missing