|| ||Laurent Pinchart <email@example.com> |
|| ||firstname.lastname@example.org |
|| ||[PATCH/RFC] V4L core cleanups |
|| ||Wed, 18 Nov 2009 01:38:41 +0100|
|| ||email@example.com, firstname.lastname@example.org, email@example.com|
|| ||Article, Thread
this patch sets attemp to clean up the V4L core to remove the
video_device::minor and video_device::num references in most drivers.
There are two reasons for this. The first one is that drivers really
shouldn't care about those fields, especially the minor number. This
doesn't mean a driver can't request a specific device number, that
remains a perfectly valid use case, but most use cases of those fields
after device registration shouldn't be needed.
The second reason is that most drivers use those fields in bogus ways,
making it obvious they shouldn't have cared about them in the first
place :-) We've had a video_drvdata function for a long time, but many
drivers still have their own private minor -> data mapping lists for
historical reasons. That code is error prone and completely unneeded.
So this patch sets tries to clean up the V4L core by porting drivers to
the most "recent" APIs (which are actually quite old) and introducing a
new helper function.
The first two patches add and use the video_device_node_name function.
The function returns a const pointer to the video device name. On
systems using udev, the name is passed as a hint to udev and will likely
become the /dev device node name, unless overwritten by udev rules (I've
heard that some distributions put the V4L device nodes in /dev/v4l).
Some drivers erroneously created the name from the video_device::minor
field instead of video_device::num, which is fixed by the second patch.
This is an example video_device_node_name usage typical from what can be
found in the second patch.
- printk(KERN_INFO "bttv%d: registered device radio%d\n",
- btv->c.nr, btv->radio_dev->num);
+ printk(KERN_INFO "bttv%d: registered device %s\n",
+ btv->c.nr, video_device_node_name(btv->radio_dev));
The third patch removes left video_device::num usage from the drivers.
The field was used to create information strings that shouldn't include
the device node name (such as video_device::name) or that should be
created using a stable identifier (such as i2c_adapter::name).
The fourth, fifth and sixth patches replace video_is_unregistered with
video_is_registered and use the new function in device drivers. As
explained in the fourth patch commit message, the rationale behind that
is to have video_is_registered return false when called on an
initialized but not yet registered video_device instance. The function
can be used instead of checking video_device::minor manually, making it
less error-prone as drivers don't need to make sure they
video_device::minor to -1 correctly for all error paths.
A typical use case is
- if (-1 != dev->radio_dev->minor)
+ if (video_is_registered(dev->radio_dev))
The seventh patch replace local minor to data lists by video_drvdata().
The function has been there for a long time but wasn't used by many
drivers, probably because they were written before it was available, or,
for some of them, because they were written based on drivers that were
not using it. This patch removes lots of identical unneeded code blocks,
making the result less bug-prone.
The eight patch removes now unneeded video_device::minor assignments to
-1, as the previous patches made them unneeded.
The last patch removes a few more video_device::minor users. As
explained in the patch description, the field was used either to
- test for error conditions that can't happen anymore with the current
- store the value in a driver private field that isn't used anymore,
- check the video device type where video_device::vfl_type should be
- create the name of a kernel thread that should get a stable name.
There are still two video_device::num users and those can easily be
removed. Hans Verkuil is working on a patch, as one of the drivers is
the ivtv driver and the other one is based on the same code.
There are also still a few video_device::minor users. One of them is
the pvrusb2 driver that creates sysfs attributes storing the minor
numbers of the device nodes created by the driver. I'm not sure what to
do about that one. All the others are V4L1 drivers that need the minor
number for the VIDIOCGUNIT ioctl. Hopefully that will die when the
drivers will be ported to V4L2 :-)
I've split the patches into core and device patches to make them easier
to apply on my work trees. I'll merge the core and device code together
when submitting a pull request to avoid bisection errors.
I'll send a pull request after receiving (and incorporating) your
comments, or in a few days if there's no comments.