]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
[media] sh-vou: use v4l2_fh
authorHans Verkuil <hans.verkuil@cisco.com>
Sun, 7 Jun 2015 08:57:58 +0000 (05:57 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 6 Jul 2015 11:26:10 +0000 (08:26 -0300)
This allows us to drop the use_count and you get free G/S_PRIORITY support.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/sh_vou.c

index d7a72a9ba90b739e5812b28e91a517f9c07df221..4994b7ba9236a3b941f177916c0978990d469e85 100644 (file)
@@ -63,7 +63,6 @@ enum sh_vou_status {
 struct sh_vou_device {
        struct v4l2_device v4l2_dev;
        struct video_device vdev;
-       atomic_t use_count;
        struct sh_vou_pdata *pdata;
        spinlock_t lock;
        void __iomem *base;
@@ -79,6 +78,7 @@ struct sh_vou_device {
 };
 
 struct sh_vou_file {
+       struct v4l2_fh fh;
        struct videobuf_queue vbq;
 };
 
@@ -1173,20 +1173,24 @@ static int sh_vou_open(struct file *file)
 
        dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
 
+       v4l2_fh_init(&vou_file->fh, &vou_dev->vdev);
        if (mutex_lock_interruptible(&vou_dev->fop_lock)) {
                kfree(vou_file);
                return -ERESTARTSYS;
        }
-       if (atomic_inc_return(&vou_dev->use_count) == 1) {
+       v4l2_fh_add(&vou_file->fh);
+       if (v4l2_fh_is_singular(&vou_file->fh)) {
                int ret;
+
                /* First open */
                vou_dev->status = SH_VOU_INITIALISING;
                pm_runtime_get_sync(vou_dev->v4l2_dev.dev);
                ret = sh_vou_hw_init(vou_dev);
                if (ret < 0) {
-                       atomic_dec(&vou_dev->use_count);
                        pm_runtime_put(vou_dev->v4l2_dev.dev);
                        vou_dev->status = SH_VOU_IDLE;
+                       v4l2_fh_del(&vou_file->fh);
+                       v4l2_fh_exit(&vou_file->fh);
                        mutex_unlock(&vou_dev->fop_lock);
                        kfree(vou_file);
                        return ret;
@@ -1213,14 +1217,16 @@ static int sh_vou_release(struct file *file)
 
        dev_dbg(vou_dev->v4l2_dev.dev, "%s()\n", __func__);
 
-       if (!atomic_dec_return(&vou_dev->use_count)) {
-               mutex_lock(&vou_dev->fop_lock);
+       mutex_lock(&vou_dev->fop_lock);
+       if (v4l2_fh_is_singular(&vou_file->fh)) {
                /* Last close */
                vou_dev->status = SH_VOU_IDLE;
                sh_vou_reg_a_set(vou_dev, VOUER, 0, 0x101);
                pm_runtime_put(vou_dev->v4l2_dev.dev);
-               mutex_unlock(&vou_dev->fop_lock);
        }
+       v4l2_fh_del(&vou_file->fh);
+       v4l2_fh_exit(&vou_file->fh);
+       mutex_unlock(&vou_dev->fop_lock);
 
        file->private_data = NULL;
        kfree(vou_file);
@@ -1321,7 +1327,6 @@ static int sh_vou_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&vou_dev->queue);
        spin_lock_init(&vou_dev->lock);
        mutex_init(&vou_dev->fop_lock);
-       atomic_set(&vou_dev->use_count, 0);
        vou_dev->pdata = vou_pdata;
        vou_dev->status = SH_VOU_IDLE;