#include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
 #include <media/v4l2-ctrls.h>
+#include <media/v4l2-fh.h>
 #include <media/v4l2-common.h>
 
 #define VIVI_MODULE_NAME "vivi"
        enum v4l2_field            field;
        unsigned int               field_count;
 
-       unsigned int               open_count;
        u8                         bars[9][3];
        u8                         line[MAX_WIDTH * 4];
 };
        File operations for the device
    ------------------------------------------------------------------*/
 
-static int vivi_open(struct file *file)
-{
-       struct vivi_dev *dev = video_drvdata(file);
-
-       dprintk(dev, 1, "%s, %p\n", __func__, file);
-       dev->open_count++;
-       return 0;
-}
-
 static ssize_t
 vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
 {
        dprintk(dev, 1, "close called (dev=%s), file %p\n",
                video_device_node_name(vdev), file);
 
-       if (--dev->open_count == 0)
+       if (v4l2_fh_is_singular_file(file))
                vb2_queue_release(&dev->vb_vidq);
-       return 0;
+       return v4l2_fh_release(file);
 }
 
 static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
 
 static const struct v4l2_file_operations vivi_fops = {
        .owner          = THIS_MODULE,
-       .open           = vivi_open,
+       .open           = v4l2_fh_open,
        .release        = vivi_close,
        .read           = vivi_read,
        .poll           = vivi_poll,