maru : Enable overlay driver 12/19312/2
authorjinhyung.jo <jinhyung.jo@samsung.com>
Thu, 10 Apr 2014 08:10:24 +0000 (17:10 +0900)
committerjinhyung.jo <jinhyung.jo@samsung.com>
Thu, 10 Apr 2014 08:28:09 +0000 (17:28 +0900)
Fix the problem that video_device is being registered
without v4l2_device.

Change-Id: I5a17c741f9e8796777d9d5feb9261c4a7de9f350
Signed-off-by: Jinhyung Jo <jinhyung.jo@samsung.com>
arch/x86/configs/i386_tizen_emul_defconfig
drivers/maru/maru_overlay.c

index 651b50e34f2bfb51acb0cc21fc3db9b162826671..a047a5a790567a70356859265e2ebef6c30e405c 100644 (file)
@@ -3084,7 +3084,7 @@ CONFIG_MARU_VIRTIO_TOUCHSCREEN=y
 CONFIG_MARU_FB=y
 CONFIG_MARU_CAMERA=y
 CONFIG_MARU_BACKLIGHT=y
-# CONFIG_MARU_OVERLAY is not set
+CONFIG_MARU_OVERLAY=y
 CONFIG_MARU_VIRTIO_EVDI=y
 CONFIG_MARU_VIRTIO_NFC=y
 CONFIG_MARU_VIRTIO_SENSOR=y
index 4bc8ebb6f5db2c4bdfc8dc8df64387cd9ebb0497..efdf1612af686ff1c44363dcf78b6acda5b3005f 100644 (file)
@@ -30,6 +30,7 @@
 #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>
 
@@ -52,6 +53,9 @@ struct svo {
        /* 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;
@@ -425,11 +429,19 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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;
        }
 
@@ -437,13 +449,16 @@ static int svo_initdev(struct pci_dev *pci_dev,
        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;
 
@@ -452,6 +467,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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;
        }
 
@@ -462,6 +478,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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")) {
@@ -469,6 +486,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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;
        }
 
@@ -480,6 +498,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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")) {
@@ -488,6 +507,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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;
        }
 
@@ -499,6 +519,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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;
        }
 
@@ -519,6 +540,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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,
@@ -531,6 +553,7 @@ static int svo_initdev(struct pci_dev *pci_dev,
                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;
        }
 
@@ -540,11 +563,40 @@ static int svo_initdev(struct pci_dev *pci_dev,
        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, */