{
unsigned int ret = 0;
- if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
ret = readl(svo.svo_mmreg + OVERLAY_POSITION);
svo.w0.left = ret & 0xFFFF;
{
unsigned int ret = 0;
- if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
ret = readl(svo.svo_mmreg + svo.reg_size / 2 + OVERLAY_POSITION);
svo.w1.left = ret & 0xFFFF;
{
unsigned int arg;
- if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
- if (f->fmt.win.w.left < 0)
+ if (f->fmt.win.w.left < 0) {
return -EINVAL;
- if (f->fmt.win.w.top < 0)
+ }
+ if (f->fmt.win.w.top < 0) {
return -EINVAL;
+ }
- if (f->fmt.win.w.width < 0)
+ if (f->fmt.win.w.width < 0) {
return -EINVAL;
- if (f->fmt.win.w.height < 0)
+ }
+ if (f->fmt.win.w.height < 0) {
return -EINVAL;
+ }
svo.w0.left = f->fmt.win.w.left;
svo.w0.top = f->fmt.win.w.top;
{
unsigned int arg;
- if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (f->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
- if (f->fmt.win.w.left < 0)
+ if (f->fmt.win.w.left < 0) {
return -EINVAL;
- if (f->fmt.win.w.top < 0)
+ }
+ if (f->fmt.win.w.top < 0) {
return -EINVAL;
+ }
- if (f->fmt.win.w.width < 0)
+ if (f->fmt.win.w.width < 0) {
return -EINVAL;
- if (f->fmt.win.w.height < 0)
+ }
+ if (f->fmt.win.w.height < 0) {
return -EINVAL;
+ }
svo.w1.left = f->fmt.win.w.left;
svo.w1.top = f->fmt.win.w.top;
static int svo_reqbufs(struct file *file, void *priv,
struct v4l2_requestbuffers *p)
{
- if (p->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (p->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
- if (p->count > 1)
+ if (p->count > 1) {
return -EINVAL;
+ }
- if (p->memory != V4L2_MEMORY_MMAP)
+ if (p->memory != V4L2_MEMORY_MMAP) {
return -EINVAL;
+ }
return 0;
}
static int svo0_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
- if (p->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (p->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
- if (p->index)
+ if (p->index) {
return -EINVAL;
+ }
p->length = svo.mem_size / 2;
p->m.offset = svo.mem_start;
static int svo1_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
- if (p->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+ if (p->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {
return -EINVAL;
+ }
- if (p->index)
+ if (p->index) {
return -EINVAL;
+ }
p->length = svo.mem_size / 2;
p->m.offset = svo.mem_start + p->length;
static int svo0_open(struct file *file)
{
- if (test_and_set_bit(0, &svo.in_use0))
+ if (test_and_set_bit(0, &svo.in_use0)) {
return -EBUSY;
+ }
return 0;
}
static int svo1_open(struct file *file)
{
- if (test_and_set_bit(0, &svo.in_use1))
+ if (test_and_set_bit(0, &svo.in_use1)) {
return -EBUSY;
+ }
return 0;
}
{
unsigned long size = vma->vm_end - vma->vm_start;
- if (size > svo.mem_size)
+ if (size > svo.mem_size) {
return -EINVAL;
+ }
if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
- size, PAGE_SHARED))
+ size, PAGE_SHARED)) {
return -EAGAIN;
+ }
vma->vm_ops = &svo_vm_ops;
vma->vm_flags &= ~VM_IO; /* not I/O memory */
if (svo.pci_dev != NULL) {
printk(KERN_ERR "svo: only one device allowed!\n");
- goto outnotdev;
+ return ret;
}
ret = -ENOMEM;
svo.video_dev0 = video_device_alloc();
if (!svo.video_dev0) {
printk(KERN_ERR "svo0: video_device_alloc() failed!\n");
- goto outnotdev;
+ return ret;
}
svo.video_dev1 = video_device_alloc();
if (!svo.video_dev1) {
printk(KERN_ERR "svo1: video_device_alloc() failed!\n");
- goto outnotdev;
+ video_device_release(svo.video_dev0);
+ return ret;
}
memcpy(svo.video_dev0, &svo0_template, sizeof(svo0_template));
ret = pci_enable_device(svo.pci_dev);
if (ret) {
printk(KERN_ERR "svo: pci_enable_device failed\n");
- goto outnotdev;
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
svo.mem_start = pci_resource_start(svo.pci_dev, 0);
svo.mem_size = pci_resource_len(svo.pci_dev, 0);
if (!svo.mem_start) {
printk(KERN_ERR "svo: svo has no device base address\n");
- goto outregions;
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
- if (!request_mem_region(pci_resource_start(svo.pci_dev, 0),
- pci_resource_len(svo.pci_dev, 0),
- "svo")) {
+ if (!request_mem_region(svo.mem_start, svo.mem_size, "svo")) {
printk(KERN_ERR "svo: request_mem_region failed\n");
- goto outregions;
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
svo.reg_start = pci_resource_start(svo.pci_dev, 1);
svo.reg_size = pci_resource_len(svo.pci_dev, 1);
if (!svo.reg_start) {
printk(KERN_ERR "svo: svo has no device base address\n");
- goto outregions;
+ release_mem_region(svo.mem_start, svo.mem_size);
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
- if (!request_mem_region(pci_resource_start(svo.pci_dev, 1),
- pci_resource_len(svo.pci_dev, 1),
- "svo")) {
+ if (!request_mem_region(svo.reg_start, svo.reg_size, "svo")) {
printk(KERN_ERR "svo: request_mem_region failed\n");
- goto outregions;
+ release_mem_region(svo.mem_start, svo.mem_size);
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
svo.svo_mmreg = ioremap(svo.reg_start, svo.reg_size);
if (!svo.svo_mmreg) {
printk(KERN_ERR "svo: ioremap failed\n");
- goto outremap;
+ release_mem_region(svo.reg_start, svo.reg_size);
+ release_mem_region(svo.mem_start, svo.mem_size);
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
pci_write_config_byte(svo.pci_dev, PCI_CACHE_LINE_SIZE, 8);
if (video_register_device(svo.video_dev0, VFL_TYPE_GRABBER,
1) < 0) { /* set to /dev/video1 */
printk(KERN_ERR "svo: video_register_device failed\n");
- goto outreqirq;
+ iounmap(svo.svo_mmreg);
+ release_mem_region(svo.reg_start, svo.reg_size);
+ release_mem_region(svo.mem_start, svo.mem_size);
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
if (video_register_device(svo.video_dev1, VFL_TYPE_GRABBER,
2) < 0) { /* set to /dev/video2 */
printk(KERN_ERR "svo: video_register_device failed\n");
- goto outreqirq;
+ video_unregister_device(svo.video_dev0);
+ iounmap(svo.svo_mmreg);
+ release_mem_region(svo.reg_start, svo.reg_size);
+ release_mem_region(svo.mem_start, svo.mem_size);
+ pci_disable_device(svo.pci_dev);
+ video_device_release(svo.video_dev0);
+ video_device_release(svo.video_dev1);
+ return ret;
}
printk(KERN_INFO "svo: Tizen Virtual Overlay Driver v%d.%d\n",
SVO_DRIVER_MAJORVERSION, SVO_DRIVER_MINORVERSION);
return 0;
-
-outreqirq:
- iounmap(svo.svo_mmreg);
-outremap:
- release_mem_region(pci_resource_start(svo.pci_dev, 0),
- pci_resource_len(svo.pci_dev, 0));
- release_mem_region(pci_resource_start(svo.pci_dev, 1),
- pci_resource_len(svo.pci_dev, 1));
-outregions:
- pci_disable_device(svo.pci_dev);
- video_device_release(svo.video_dev0);
- video_device_release(svo.video_dev1);
-outnotdev:
- return ret;
}
static struct pci_driver svo_pci_driver = {