struct list_head           vivi_devlist;
 
        struct mutex               lock;
+       spinlock_t                 slock;
 
        int                        users;
 
 
        int bc;
 
+       spin_lock(&dev->slock);
        /* Announces videobuf that all went ok */
        for (bc = 0;; bc++) {
                if (list_empty(&dma_q->active)) {
                /* Nobody is waiting something to be done, just return */
                if (!waitqueue_active(&buf->vb.done)) {
                        mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
+                       spin_unlock(&dev->slock);
                        return;
                }
 
        if (bc != 1)
                dprintk(dev, 1, "%s: %d buffers handled (should be 1)\n",
                        __FUNCTION__, bc);
+       spin_unlock(&dev->slock);
 }
 
 static void vivi_sleep(struct vivi_dmaqueue  *dma_q)
        struct vivi_dmaqueue *vidq = &dev->vidq;
        struct vivi_buffer   *buf;
 
+       spin_lock(&dev->slock);
+
        while (!list_empty(&vidq->active)) {
                buf = list_entry(vidq->active.next,
                                 struct vivi_buffer, vb.queue);
                wake_up(&buf->vb.done);
                printk(KERN_INFO "vivi/0: [%p/%d] timeout\n", buf, buf->vb.i);
        }
-
        restart_video_queue(vidq);
+
+       spin_unlock(&dev->slock);
 }
 
 /* ------------------------------------------------------------------
                        dev->h, dev->m, dev->s, (dev->us + 500) / 1000);
 
        videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
-                       NULL, NULL, fh->type, V4L2_FIELD_INTERLACED,
+                       NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
                        sizeof(struct vivi_buffer), fh);
 
        return 0;
 
                /* initialize locks */
                mutex_init(&dev->lock);
+               spin_lock_init(&dev->slock);
 
                dev->vidq.timeout.function = vivi_vid_timeout;
                dev->vidq.timeout.data     = (unsigned long)dev;