V4L/DVB (3599): Implement new routing commands for wm8775 and cs53l32a.
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / usb / media / vicam.c
index 4a5857c53f112dc53eed4e0794f8f2fd8a62994d..1d06e53ec7c59269f0b1ca4a5bda550af7d34f3f 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
 #include <linux/proc_fs.h>
+#include <linux/mutex.h>
 #include "usbvideo.h"
 
 // #define VICAM_DEBUG
@@ -407,7 +408,7 @@ struct vicam_camera {
        struct usb_device *udev;        // usb device
 
        /* guard against simultaneous accesses to the camera */
-       struct semaphore cam_lock;
+       struct mutex cam_lock;
 
        int is_initialized;
        u8 open_count;
@@ -461,12 +462,12 @@ static int send_control_msg(struct vicam_camera *cam,
                            u16 size)
 {
        int status = -ENODEV;
-       down(&cam->cam_lock);
+       mutex_lock(&cam->cam_lock);
        if (cam->udev) {
                status = __send_control_msg(cam, request, value,
                                            index, cp, size);
        }
-       up(&cam->cam_lock);
+       mutex_unlock(&cam->cam_lock);
        return status;
 }
 static int
@@ -763,6 +764,7 @@ vicam_open(struct inode *inode, struct file *file)
        if (!cam) {
                printk(KERN_ERR
                       "vicam video_device improperly initialized");
+               return -EINVAL;
        }
 
        /* the videodev_lock held above us protects us from
@@ -831,13 +833,13 @@ vicam_close(struct inode *inode, struct file *file)
        rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
        kfree(cam->cntrlbuf);
 
-       down(&cam->cam_lock);
+       mutex_lock(&cam->cam_lock);
 
        cam->open_count--;
        open_count = cam->open_count;
        udev = cam->udev;
 
-       up(&cam->cam_lock);
+       mutex_unlock(&cam->cam_lock);
 
        if (!open_count && !udev) {
                kfree(cam);
@@ -960,7 +962,7 @@ read_frame(struct vicam_camera *cam, int framenum)
        request[8] = 0;
        // bytes 9-15 do not seem to affect exposure or image quality
 
-       down(&cam->cam_lock);
+       mutex_lock(&cam->cam_lock);
 
        if (!cam->udev) {
                goto done;
@@ -985,7 +987,7 @@ read_frame(struct vicam_camera *cam, int framenum)
        }
 
  done:
-       up(&cam->cam_lock);
+       mutex_unlock(&cam->cam_lock);
 }
 
 static ssize_t
@@ -1148,7 +1150,7 @@ vicam_write_proc_gain(struct file *file, const char *buffer,
 static void
 vicam_create_proc_root(void)
 {
-       vicam_proc_root = create_proc_entry("video/vicam", S_IFDIR, 0);
+       vicam_proc_root = proc_mkdir("video/vicam", NULL);
 
        if (vicam_proc_root)
                vicam_proc_root->owner = THIS_MODULE;
@@ -1181,7 +1183,7 @@ vicam_create_proc_entry(struct vicam_camera *cam)
 
        sprintf(name, "video%d", cam->vdev.minor);
 
-       cam->proc_dir = create_proc_entry(name, S_IFDIR, vicam_proc_root);
+       cam->proc_dir = proc_mkdir(name, vicam_proc_root);
 
        if ( !cam->proc_dir )
                return; // FIXME: We should probably return an error here
@@ -1236,6 +1238,7 @@ static struct file_operations vicam_fops = {
        .read           = vicam_read,
        .mmap           = vicam_mmap,
        .ioctl          = vicam_ioctl,
+       .compat_ioctl   = v4l_compat_ioctl32,
        .llseek         = no_llseek,
 };
 
@@ -1257,7 +1260,6 @@ static struct usb_device_id vicam_table[] = {
 MODULE_DEVICE_TABLE(usb, vicam_table);
 
 static struct usb_driver vicam_driver = {
-       .owner          = THIS_MODULE,
        .name           = "vicam",
        .probe          = vicam_probe,
        .disconnect     = vicam_disconnect,
@@ -1309,7 +1311,7 @@ vicam_probe( struct usb_interface *intf, const struct usb_device_id *id)
 
        cam->shutter_speed = 15;
 
-       init_MUTEX(&cam->cam_lock);
+       mutex_init(&cam->cam_lock);
 
        memcpy(&cam->vdev, &vicam_template,
               sizeof (vicam_template));
@@ -1351,7 +1353,7 @@ vicam_disconnect(struct usb_interface *intf)
 
        /* stop the camera from being used */
 
-       down(&cam->cam_lock);
+       mutex_lock(&cam->cam_lock);
 
        /* mark the camera as gone */
 
@@ -1368,7 +1370,7 @@ vicam_disconnect(struct usb_interface *intf)
 
        open_count = cam->open_count;
 
-       up(&cam->cam_lock);
+       mutex_unlock(&cam->cam_lock);
 
        if (!open_count) {
                kfree(cam);