From b89e3e9a30a7589975cd56cea9b13853d61cfeb9 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Mon, 10 Dec 2007 04:07:03 -0300 Subject: [PATCH] --- yaml --- r: 76543 b: refs/heads/master c: f905c442e5b19f75fe4e8ce96f2acffa565f2392 h: refs/heads/master i: 76541: 78982e23d067b65f02e84e2f18002fa84826713f 76539: 083eab23906ec8373ee9c14a1e22f4516a419a8d 76535: 3bb969ab00929f61661e4439eb3431a8634eebcd 76527: 3bce82d2cda66ff32472a56436903a5da8945ee0 76511: 6d2d451ec625d47b18344eb3f0e4171b528e5869 76479: 2c704f9d695f8593235da96d6c92becc5b1e512f 76415: 9f23e8a1050a3be3e604b7bed4e491c8ae422509 76287: 9c66f6433b872cd0956a8072fb2ee7b7cc863976 v: v3 --- [refs] | 2 +- trunk/drivers/media/video/vivi.c | 40 +++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index c716f03f7bef..4fb0f8d0a202 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d2761f227162f610d35b9d68564f5c64774be581 +refs/heads/master: f905c442e5b19f75fe4e8ce96f2acffa565f2392 diff --git a/trunk/drivers/media/video/vivi.c b/trunk/drivers/media/video/vivi.c index fe9784a0cc21..5ddaaa370cbc 100644 --- a/trunk/drivers/media/video/vivi.c +++ b/trunk/drivers/media/video/vivi.c @@ -170,7 +170,7 @@ struct vivi_dev { int users; /* various device info */ - struct video_device vfd; + struct video_device *vfd; struct vivi_dmaqueue vidq; @@ -986,7 +986,7 @@ static int vivi_open(struct inode *inode, struct file *file) printk(KERN_DEBUG "vivi: open called (minor=%d)\n",minor); list_for_each_entry(dev, &vivi_devlist, vivi_devlist) - if (dev->vfd.minor == minor) + if (dev->vfd->minor == minor) goto found; return -ENODEV; found: @@ -1067,7 +1067,7 @@ vivi_poll(struct file *file, struct poll_table_struct *wait) return videobuf_poll_stream(file, q, wait); } -static int vivi_release(struct inode *inode, struct file *file) +static int vivi_close(struct inode *inode, struct file *file) { struct vivi_fh *fh = file->private_data; struct vivi_dev *dev = fh->dev; @@ -1088,6 +1088,18 @@ static int vivi_release(struct inode *inode, struct file *file) return 0; } +static int vivi_release(struct vivi_dev *dev) +{ + if (-1 != dev->vfd->minor) + video_unregister_device(dev->vfd); + else + video_device_release(dev->vfd); + + dev->vfd = NULL; + + return 0; +} + static int vivi_mmap(struct file *file, struct vm_area_struct * vma) { @@ -1109,7 +1121,7 @@ vivi_mmap(struct file *file, struct vm_area_struct * vma) static const struct file_operations vivi_fops = { .owner = THIS_MODULE, .open = vivi_open, - .release = vivi_release, + .release = vivi_close, .read = vivi_read, .poll = vivi_poll, .ioctl = video_ioctl2, /* V4L2 ioctl handler */ @@ -1117,12 +1129,12 @@ static const struct file_operations vivi_fops = { .llseek = no_llseek, }; -static struct video_device vivi = { +static struct video_device vivi_template = { .name = "vivi", .type = VID_TYPE_CAPTURE, .fops = &vivi_fops, .minor = -1, -// .release = video_device_release, + .release = video_device_release, .vidioc_querycap = vidioc_querycap, .vidioc_enum_fmt_cap = vidioc_enum_fmt_cap, @@ -1156,6 +1168,7 @@ static int __init vivi_init(void) { int ret; struct vivi_dev *dev; + struct video_device *vfd; dev = kzalloc(sizeof(*dev),GFP_KERNEL); if (NULL == dev) @@ -1174,7 +1187,18 @@ static int __init vivi_init(void) dev->vidq.timeout.data = (unsigned long)dev; init_timer(&dev->vidq.timeout); - ret = video_register_device(&vivi, VFL_TYPE_GRABBER, video_nr); + vfd = video_device_alloc(); + if (NULL == vfd) + return -ENOMEM; + + *vfd = vivi_template; + + ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr); + snprintf(vfd->name, sizeof(vfd->name), "%s (%i)", + vivi_template.name, vfd->minor); + + dev->vfd = vfd; + printk(KERN_INFO "Video Technology Magazine Virtual Video Capture Board (Load status: %d)\n", ret); return ret; } @@ -1188,9 +1212,9 @@ static void __exit vivi_exit(void) list = vivi_devlist.next; list_del(list); h = list_entry(list, struct vivi_dev, vivi_devlist); + vivi_release(h); kfree (h); } - video_unregister_device(&vivi); } module_init(vivi_init);