[media] pwc: convert to core-assisted locking
authorHans Verkuil <hverkuil@xs4all.nl>
Thu, 13 Jan 2011 08:05:36 +0000 (05:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 21 Mar 2011 23:31:51 +0000 (20:31 -0300)
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/pwc/pwc-if.c
drivers/media/video/pwc/pwc-v4l.c

index bd1519a4ecb474ba62dbc3bb55ff49d922e0f727..4aa70faaae8c990dff7288cb7d9585672178ca17 100644 (file)
@@ -1098,7 +1098,6 @@ static int pwc_video_open(struct file *file)
                return -EBUSY;
        }
 
-       mutex_lock(&pdev->modlock);
        pwc_construct(pdev); /* set min/max sizes correct */
        if (!pdev->usb_init) {
                PWC_DEBUG_OPEN("Doing first time initialization.\n");
@@ -1130,7 +1129,6 @@ static int pwc_video_open(struct file *file)
        if (i < 0) {
                PWC_DEBUG_OPEN("Failed to allocate buffers memory.\n");
                pwc_free_buffers(pdev);
-               mutex_unlock(&pdev->modlock);
                return i;
        }
 
@@ -1171,7 +1169,6 @@ static int pwc_video_open(struct file *file)
        if (i) {
                PWC_DEBUG_OPEN("Second attempt at set_video_mode failed.\n");
                pwc_free_buffers(pdev);
-               mutex_unlock(&pdev->modlock);
                return i;
        }
 
@@ -1181,7 +1178,6 @@ static int pwc_video_open(struct file *file)
 
        pdev->vopen++;
        file->private_data = vdev;
-       mutex_unlock(&pdev->modlock);
        PWC_DEBUG_OPEN("<< video_open() returns 0.\n");
        return 0;
 }
@@ -1210,7 +1206,6 @@ static int pwc_video_close(struct file *file)
        PWC_DEBUG_OPEN(">> video_close called(vdev = 0x%p).\n", vdev);
 
        pdev = video_get_drvdata(vdev);
-       mutex_lock(&pdev->modlock);
        if (pdev->vopen == 0)
                PWC_DEBUG_MODULE("video_close() called on closed device?\n");
 
@@ -1248,7 +1243,6 @@ static int pwc_video_close(struct file *file)
                        if (device_hint[hint].pdev == pdev)
                                device_hint[hint].pdev = NULL;
        }
-       mutex_unlock(&pdev->modlock);
 
        return 0;
 }
@@ -1283,7 +1277,6 @@ static ssize_t pwc_video_read(struct file *file, char __user *buf,
        if (pdev == NULL)
                return -EFAULT;
 
-       mutex_lock(&pdev->modlock);
        if (pdev->error_status) {
                rv = -pdev->error_status; /* Something happened, report what. */
                goto err_out;
@@ -1318,8 +1311,10 @@ static ssize_t pwc_video_read(struct file *file, char __user *buf,
                                rv = -ERESTARTSYS;
                                goto err_out;
                        }
+                       mutex_unlock(&pdev->modlock);
                        schedule();
                        set_current_state(TASK_INTERRUPTIBLE);
+                       mutex_lock(&pdev->modlock);
                }
                remove_wait_queue(&pdev->frameq, &wait);
                set_current_state(TASK_RUNNING);
@@ -1352,10 +1347,8 @@ static ssize_t pwc_video_read(struct file *file, char __user *buf,
                pdev->image_read_pos = 0;
                pwc_next_image(pdev);
        }
-       mutex_unlock(&pdev->modlock);
        return count;
 err_out:
-       mutex_unlock(&pdev->modlock);
        return rv;
 }
 
@@ -1372,9 +1365,7 @@ static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
                return -EFAULT;
 
        /* Start the stream (if not already started) */
-       mutex_lock(&pdev->modlock);
        ret = pwc_isoc_init(pdev);
-       mutex_unlock(&pdev->modlock);
        if (ret)
                return ret;
 
@@ -1398,10 +1389,8 @@ static long pwc_video_ioctl(struct file *file,
                goto out;
        pdev = video_get_drvdata(vdev);
 
-       mutex_lock(&pdev->modlock);
        if (!pdev->unplugged)
                r = video_usercopy(file, cmd, arg, pwc_video_do_ioctl);
-       mutex_unlock(&pdev->modlock);
 out:
        return r;
 }
@@ -1754,6 +1743,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
        }
        memcpy(pdev->vdev, &pwc_template, sizeof(pwc_template));
        pdev->vdev->parent = &intf->dev;
+       pdev->vdev->lock = &pdev->modlock;
        strcpy(pdev->vdev->name, name);
        video_set_drvdata(pdev->vdev, pdev);
 
index 8ca4d22b4384f0f496397f9d6307dd01d2ff9a59..8a7e52c3b8f5cf7301ec46e7cc75a2de198e2c6d 100644 (file)
@@ -830,8 +830,10 @@ long pwc_video_do_ioctl(struct file *file, unsigned int cmd, void *arg)
                                        set_current_state(TASK_RUNNING);
                                        return -ERESTARTSYS;
                                }
+                               mutex_unlock(&pdev->modlock);
                                schedule();
                                set_current_state(TASK_INTERRUPTIBLE);
+                               mutex_lock(&pdev->modlock);
                        }
                        remove_wait_queue(&pdev->frameq, &wait);
                        set_current_state(TASK_RUNNING);