Commit 005759613b95264fba9138010f112bc138c857c2

Authored by Hans Verkuil
Committed by Mauro Carvalho Chehab
1 parent afd96668d8

V4L/DVB (10988): v4l2-dev: use parent field if the v4l2_device has no parent set.

Normally the parent device of v4l2_device is used as the video device
node's parent. But if it was not set, then use the parent field in the
video_device struct.

This is needed in the cx88 driver, which has one core v4l2_device but
creates multiple pci devices (one each for raw and mpeg video).

So you cannot associate the core v4l2_device with a particular PCI device,
but you can do that for each video_device.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

Showing 2 changed files with 12 additions and 2 deletions Side-by-side Diff

Documentation/video4linux/v4l2-framework.txt
... ... @@ -91,7 +91,8 @@
91 91  
92 92 The first 'dev' argument is normally the struct device pointer of a pci_dev,
93 93 usb_device or platform_device. It is rare for dev to be NULL, but it happens
94   -with ISA devices, for example.
  94 +with ISA devices or when one device creates multiple PCI devices, thus making
  95 +it impossible to associate v4l2_dev with a particular parent.
95 96  
96 97 You unregister with:
97 98  
... ... @@ -414,6 +415,15 @@
414 415 - ioctl_ops: if you use the v4l2_ioctl_ops to simplify ioctl maintenance
415 416 (highly recommended to use this and it might become compulsory in the
416 417 future!), then set this to your v4l2_ioctl_ops struct.
  418 +- parent: you only set this if v4l2_device was registered with NULL as
  419 + the parent device struct. This only happens in cases where one hardware
  420 + device has multiple PCI devices that all share the same v4l2_device core.
  421 +
  422 + The cx88 driver is an example of this: one core v4l2_device struct, but
  423 + it is used by both an raw video PCI device (cx8800) and a MPEG PCI device
  424 + (cx8802). Since the v4l2_device cannot be associated with a particular
  425 + PCI device it is setup without a parent device. But when the struct
  426 + video_device is setup you do know which parent PCI device to use.
417 427  
418 428 If you use v4l2_ioctl_ops, then you should set either .unlocked_ioctl or
419 429 .ioctl to video_ioctl2 in your v4l2_file_operations struct.
drivers/media/video/v4l2-dev.c
... ... @@ -395,7 +395,7 @@
395 395  
396 396 vdev->vfl_type = type;
397 397 vdev->cdev = NULL;
398   - if (vdev->v4l2_dev)
  398 + if (vdev->v4l2_dev && vdev->v4l2_dev->dev)
399 399 vdev->parent = vdev->v4l2_dev->dev;
400 400  
401 401 /* Part 2: find a free minor, kernel number and device index. */