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");
        if (i < 0) {
                PWC_DEBUG_OPEN("Failed to allocate buffers memory.\n");
                pwc_free_buffers(pdev);
-               mutex_unlock(&pdev->modlock);
                return i;
        }
 
        if (i) {
                PWC_DEBUG_OPEN("Second attempt at set_video_mode failed.\n");
                pwc_free_buffers(pdev);
-               mutex_unlock(&pdev->modlock);
                return i;
        }
 
 
        pdev->vopen++;
        file->private_data = vdev;
-       mutex_unlock(&pdev->modlock);
        PWC_DEBUG_OPEN("<< video_open() returns 0.\n");
        return 0;
 }
        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");
 
                        if (device_hint[hint].pdev == pdev)
                                device_hint[hint].pdev = NULL;
        }
-       mutex_unlock(&pdev->modlock);
 
        return 0;
 }
        if (pdev == NULL)
                return -EFAULT;
 
-       mutex_lock(&pdev->modlock);
        if (pdev->error_status) {
                rv = -pdev->error_status; /* Something happened, report what. */
                goto err_out;
                                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);
                pdev->image_read_pos = 0;
                pwc_next_image(pdev);
        }
-       mutex_unlock(&pdev->modlock);
        return count;
 err_out:
-       mutex_unlock(&pdev->modlock);
        return rv;
 }
 
                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;
 
                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;
 }
        }
        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);