Export V4L2 APIs to support early camera.
[profile/ivi/kernel-x86-ivi.git] / drivers / media / usb / uvc / uvc_v4l2.c
index b2dc326..734cde6 100644 (file)
@@ -498,16 +498,20 @@ static int uvc_v4l2_open(struct file *file)
                return -ENOMEM;
        }
 
-       if (atomic_inc_return(&stream->dev->users) == 1) {
-               ret = uvc_status_start(stream->dev);
+       mutex_lock(&stream->dev->lock);
+       if (stream->dev->users == 0) {
+               ret = uvc_status_start(stream->dev, GFP_KERNEL);
                if (ret < 0) {
-                       atomic_dec(&stream->dev->users);
+                       mutex_unlock(&stream->dev->lock);
                        usb_autopm_put_interface(stream->dev->intf);
                        kfree(handle);
                        return ret;
                }
        }
 
+       stream->dev->users++;
+       mutex_unlock(&stream->dev->lock);
+
        v4l2_fh_init(&handle->vfh, stream->vdev);
        v4l2_fh_add(&handle->vfh);
        handle->chain = stream->chain;
@@ -538,8 +542,10 @@ static int uvc_v4l2_release(struct file *file)
        kfree(handle);
        file->private_data = NULL;
 
-       if (atomic_dec_return(&stream->dev->users) == 0)
+       mutex_lock(&stream->dev->lock);
+       if (--stream->dev->users == 0)
                uvc_status_stop(stream->dev);
+       mutex_unlock(&stream->dev->lock);
 
        usb_autopm_put_interface(stream->dev->intf);
        return 0;
@@ -1107,6 +1113,12 @@ static long uvc_v4l2_ioctl(struct file *file,
        return video_usercopy(file, cmd, arg, uvc_v4l2_do_ioctl);
 }
 
+long uvc_v4l2_ioctl_kernel(struct file *file, unsigned int cmd, void *arg)
+{
+       return uvc_v4l2_do_ioctl(file, cmd, arg);
+}
+EXPORT_SYMBOL(uvc_v4l2_ioctl_kernel);
+
 #ifdef CONFIG_COMPAT
 struct uvc_xu_control_mapping32 {
        __u32 id;