#include <linux/videodev2.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
+#include <media/v4l2-event.h>
 
 #include "stk-webcam.h"
 
 
 static int v4l_stk_open(struct file *fp)
 {
-       static int first_init = 1; /* webcam LED management */
        struct stk_camera *dev = video_drvdata(fp);
+       int err;
 
        if (dev == NULL || !is_present(dev))
                return -ENXIO;
 
-       if (!first_init)
+       if (!dev->first_init)
                stk_camera_write_reg(dev, 0x0, 0x24);
        else
-               first_init = 0;
-
-       usb_autopm_get_interface(dev->interface);
+               dev->first_init = 0;
 
-       return 0;
+       err = v4l2_fh_open(fp);
+       if (!err)
+               usb_autopm_get_interface(dev->interface);
+       return err;
 }
 
 static int v4l_stk_release(struct file *fp)
 
        if (is_present(dev))
                usb_autopm_put_interface(dev->interface);
-
-       return 0;
+       return v4l2_fh_release(fp);
 }
 
 static ssize_t v4l_stk_read(struct file *fp, char __user *buf,
 static unsigned int v4l_stk_poll(struct file *fp, poll_table *wait)
 {
        struct stk_camera *dev = video_drvdata(fp);
+       unsigned res = v4l2_ctrl_poll(fp, wait);
 
        poll_wait(fp, &dev->wait_frame, wait);
 
                return POLLERR;
 
        if (!list_empty(&dev->sio_full))
-               return POLLIN | POLLRDNORM;
+               return res | POLLIN | POLLRDNORM;
 
-       return 0;
+       return res;
 }
 
 
        .vidioc_streamoff = stk_vidioc_streamoff,
        .vidioc_g_parm = stk_vidioc_g_parm,
        .vidioc_enum_framesizes = stk_vidioc_enum_framesizes,
+       .vidioc_log_status = v4l2_ctrl_log_status,
+       .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
+       .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
 };
 
 static void stk_v4l_dev_release(struct video_device *vd)
        dev->vdev = stk_v4l_data;
        dev->vdev.debug = debug;
        dev->vdev.v4l2_dev = &dev->v4l2_dev;
+       set_bit(V4L2_FL_USE_FH_PRIO, &dev->vdev.flags);
        video_set_drvdata(&dev->vdev, dev);
        err = video_register_device(&dev->vdev, VFL_TYPE_GRABBER, -1);
        if (err)
 
        spin_lock_init(&dev->spinlock);
        init_waitqueue_head(&dev->wait_frame);
+       dev->first_init = 1; /* webcam LED management */
 
        dev->udev = udev;
        dev->interface = interface;