#include <linux/init.h>
#include <linux/pci.h>
#include <linux/module.h>
+#include <media/v4l2-device.h>
#include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h>
/* pci device */
struct pci_dev *pci_dev;
+ /* v4l2 device */
+ struct v4l2_device v4l2_dev;
+
/* video device parameters */
struct video_device *video_dev0;
struct video_device *video_dev1;
return ret;
}
- ret = -ENOMEM;
svo.pci_dev = pci_dev;
+
+ ret = v4l2_device_register(&pci_dev->dev, &svo.v4l2_dev);
+ if (ret) {
+ printk(KERN_ERR "svo: v4l2_device_register failed!\n");
+ return ret;
+ }
+
+ ret = -ENOMEM;
svo.video_dev0 = video_device_alloc();
if (!svo.video_dev0) {
printk(KERN_ERR "svo0: video_device_alloc() failed!\n");
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
if (!svo.video_dev1) {
printk(KERN_ERR "svo1: video_device_alloc() failed!\n");
video_device_release(svo.video_dev0);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
memcpy(svo.video_dev0, &svo0_template, sizeof(svo0_template));
svo.video_dev0->dev_parent = &svo.pci_dev->dev;
+ svo.video_dev0->v4l2_dev = &svo.v4l2_dev;
memcpy(svo.video_dev1, &svo1_template, sizeof(svo1_template));
svo.video_dev1->dev_parent = &svo.pci_dev->dev;
+ svo.video_dev1->v4l2_dev = &svo.v4l2_dev;
ret = -EIO;
printk(KERN_ERR "svo: pci_enable_device failed\n");
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
if (!request_mem_region(svo.mem_start, svo.mem_size, "svo")) {
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
if (!request_mem_region(svo.reg_start, svo.reg_size, "svo")) {
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
if (video_register_device(svo.video_dev1, VFL_TYPE_GRABBER,
pci_disable_device(svo.pci_dev);
video_device_release(svo.video_dev0);
video_device_release(svo.video_dev1);
+ v4l2_device_unregister(&svo.v4l2_dev);
return ret;
}
return 0;
}
+static void svo_removedev(struct pci_dev *pdev)
+{
+ if (svo.svo_mmreg) {
+ iounmap(svo.svo_mmreg);
+ svo.svo_mmreg = 0;
+ }
+
+ if (svo.reg_start) {
+ release_mem_region(svo.reg_start, svo.reg_size);
+ svo.reg_start = 0;
+ }
+ if (svo.mem_start) {
+ release_mem_region(svo.mem_start, svo.mem_size);
+ svo.mem_start = 0;
+ }
+
+ if (svo.video_dev0) {
+ video_device_release(svo.video_dev0);
+ svo.video_dev0 = NULL;
+ }
+ if (svo.video_dev1) {
+ video_device_release(svo.video_dev1);
+ svo.video_dev1 = NULL;
+ }
+
+ pci_disable_device(svo.pci_dev);
+ v4l2_device_unregister(&svo.v4l2_dev);
+}
+
static struct pci_driver svo_pci_driver = {
.name = "svo",
.id_table = svo_pci_tbl,
.probe = svo_initdev,
-/* .remove = __devexit_p(cx8800_finidev), */
+ .remove = svo_removedev,
#ifdef CONFIG_PM
/* .suspend = cx8800_suspend, */
/* .resume = cx8800_resume, */