Commit d9bfbcc0 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] v4l2-dev: vdev->v4l2_dev is always set, so simplify code

These days vdev->v4l2_dev must always be set. This means that some
old code that still tests for a NULL vdev->v4l2_dev can be removed
or simplified.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 872dfcfe
...@@ -194,7 +194,7 @@ static void v4l2_device_release(struct device *cd) ...@@ -194,7 +194,7 @@ static void v4l2_device_release(struct device *cd)
mutex_unlock(&videodev_lock); mutex_unlock(&videodev_lock);
#if defined(CONFIG_MEDIA_CONTROLLER) #if defined(CONFIG_MEDIA_CONTROLLER)
if (v4l2_dev && v4l2_dev->mdev && if (v4l2_dev->mdev &&
vdev->vfl_type != VFL_TYPE_SUBDEV) vdev->vfl_type != VFL_TYPE_SUBDEV)
media_device_unregister_entity(&vdev->entity); media_device_unregister_entity(&vdev->entity);
#endif #endif
...@@ -207,7 +207,7 @@ static void v4l2_device_release(struct device *cd) ...@@ -207,7 +207,7 @@ static void v4l2_device_release(struct device *cd)
* TODO: In the long run all drivers that use v4l2_device should use the * TODO: In the long run all drivers that use v4l2_device should use the
* v4l2_device release callback. This check will then be unnecessary. * v4l2_device release callback. This check will then be unnecessary.
*/ */
if (v4l2_dev && v4l2_dev->release == NULL) if (v4l2_dev->release == NULL)
v4l2_dev = NULL; v4l2_dev = NULL;
/* Release video_device and perform other /* Release video_device and perform other
...@@ -360,27 +360,22 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -360,27 +360,22 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
* hack but it will have to do for those drivers that are not * hack but it will have to do for those drivers that are not
* yet converted to use unlocked_ioctl. * yet converted to use unlocked_ioctl.
* *
* There are two options: if the driver implements struct * All drivers implement struct v4l2_device, so we use the
* v4l2_device, then the lock defined there is used to * lock defined there to serialize the ioctls.
* serialize the ioctls. Otherwise the v4l2 core lock defined
* below is used. This lock is really bad since it serializes
* completely independent devices.
* *
* Both variants suffer from the same problem: if the driver * However, if the driver sleeps, then it blocks all ioctls
* sleeps, then it blocks all ioctls since the lock is still * since the lock is still held. This is very common for
* held. This is very common for VIDIOC_DQBUF since that * VIDIOC_DQBUF since that normally waits for a frame to arrive.
* normally waits for a frame to arrive. As a result any other * As a result any other ioctl calls will proceed very, very
* ioctl calls will proceed very, very slowly since each call * slowly since each call will have to wait for the VIDIOC_QBUF
* will have to wait for the VIDIOC_QBUF to finish. Things that * to finish. Things that should take 0.01s may now take 10-20
* should take 0.01s may now take 10-20 seconds. * seconds.
* *
* The workaround is to *not* take the lock for VIDIOC_DQBUF. * The workaround is to *not* take the lock for VIDIOC_DQBUF.
* This actually works OK for videobuf-based drivers, since * This actually works OK for videobuf-based drivers, since
* videobuf will take its own internal lock. * videobuf will take its own internal lock.
*/ */
static DEFINE_MUTEX(v4l2_ioctl_mutex); struct mutex *m = &vdev->v4l2_dev->ioctl_lock;
struct mutex *m = vdev->v4l2_dev ?
&vdev->v4l2_dev->ioctl_lock : &v4l2_ioctl_mutex;
if (cmd != VIDIOC_DQBUF && mutex_lock_interruptible(m)) if (cmd != VIDIOC_DQBUF && mutex_lock_interruptible(m))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -938,12 +933,11 @@ int __video_register_device(struct video_device *vdev, int type, int nr, ...@@ -938,12 +933,11 @@ int __video_register_device(struct video_device *vdev, int type, int nr,
name_base, nr, video_device_node_name(vdev)); name_base, nr, video_device_node_name(vdev));
/* Increase v4l2_device refcount */ /* Increase v4l2_device refcount */
if (vdev->v4l2_dev) v4l2_device_get(vdev->v4l2_dev);
v4l2_device_get(vdev->v4l2_dev);
#if defined(CONFIG_MEDIA_CONTROLLER) #if defined(CONFIG_MEDIA_CONTROLLER)
/* Part 5: Register the entity. */ /* Part 5: Register the entity. */
if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && if (vdev->v4l2_dev->mdev &&
vdev->vfl_type != VFL_TYPE_SUBDEV) { vdev->vfl_type != VFL_TYPE_SUBDEV) {
vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L; vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L;
vdev->entity.name = vdev->name; vdev->entity.name = vdev->name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment