vserver 1.9.5.x5
[linux-2.6.git] / drivers / media / common / saa7146_fops.c
index a5621d7..817c4a6 100644 (file)
@@ -1,4 +1,5 @@
 #include <media/saa7146_vv.h>
+#include <linux/version.h>
 
 #define BOARD_CAN_DO_VBI(dev)   (dev->revision != 0 && dev->vv_data->vbi_minor != -1) 
 
@@ -32,17 +33,6 @@ int saa7146_res_get(struct saa7146_fh *fh, unsigned int bit)
        return 1;
 }
 
-int saa7146_res_check(struct saa7146_fh *fh, unsigned int bit)
-{
-       return (fh->resources & bit);
-}
-
-int saa7146_res_locked(struct saa7146_dev *dev, unsigned int bit)
-{
-       struct saa7146_vv *vv = dev->vv_data;
-       return (vv->resources & bit);
-}
-
 void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits)
 {
        struct saa7146_dev *dev = fh->dev;
@@ -83,15 +73,10 @@ int saa7146_buffer_queue(struct saa7146_dev *dev,
                         struct saa7146_dmaqueue *q,
                         struct saa7146_buf *buf)
 {
-#ifdef DEBUG_SPINLOCKS
-       BUG_ON(!spin_is_locked(&dev->slock));
-#endif
+       assert_spin_locked(&dev->slock);
        DEB_EE(("dev:%p, dmaq:%p, buf:%p\n", dev, q, buf));
 
-       if( NULL == q ) {
-               ERR(("internal error: fatal NULL pointer for q.\n"));
-               return 0;
-       }
+       BUG_ON(!q);
 
        if (NULL == q->curr) {
                q->curr = buf;
@@ -109,17 +94,12 @@ void saa7146_buffer_finish(struct saa7146_dev *dev,
                           struct saa7146_dmaqueue *q,
                           int state)
 {
-#ifdef DEBUG_SPINLOCKS
-       BUG_ON(!spin_is_locked(&dev->slock));
-#endif
-       if( NULL == q->curr ) {
-               ERR(("internal error: fatal NULL pointer for q->curr.\n"));
-               return;
-       }
-
+       assert_spin_locked(&dev->slock);
        DEB_EE(("dev:%p, dmaq:%p, state:%d\n", dev, q, state));
        DEB_EE(("q->curr:%p\n",q->curr));
 
+       BUG_ON(!q->curr);
+
        /* finish current buffer */
        if (NULL == q->curr) {
                DEB_D(("aiii. no current buffer\n"));
@@ -138,16 +118,11 @@ void saa7146_buffer_next(struct saa7146_dev *dev,
 {
        struct saa7146_buf *buf,*next = NULL;
 
-       if( NULL == q ) {
-               ERR(("internal error: fatal NULL pointer for q.\n"));
-               return;
-       }
+       BUG_ON(!q);
 
        DEB_INT(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
 
-#ifdef DEBUG_SPINLOCKS
-       BUG_ON(!spin_is_locked(&dev->slock));
-#endif
+       assert_spin_locked(&dev->slock);
        if (!list_empty(&q->queue)) {
                /* activate next one from queue */
                buf = list_entry(q->queue.next,struct saa7146_buf,vb.queue);
@@ -358,7 +333,7 @@ static int fops_mmap(struct file *file, struct vm_area_struct * vma)
                BUG();
                return 0;
        }
-       return videobuf_mmap_mapper(vma,q);
+       return videobuf_mmap_mapper(q,vma);
 }
 
 static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
@@ -515,45 +490,58 @@ int saa7146_vv_release(struct saa7146_dev* dev)
        return 0;
 }
 
-int saa7146_register_device(struct video_device *vid, struct saa7146_dev* dev, char *name, int type)
+int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
+                           char *name, int type)
 {
        struct saa7146_vv *vv = dev->vv_data;
+       struct video_device *vfd;
 
        DEB_EE(("dev:%p, name:'%s', type:%d\n",dev,name,type));
  
-       *vid = device_template;
-       strlcpy(vid->name, name, sizeof(vid->name));
-       vid->priv = dev;
+       // released by vfd->release
+       vfd = video_device_alloc();
+       if (vfd == NULL)
+               return -ENOMEM;
+
+       memcpy(vfd, &device_template, sizeof(struct video_device));
+       strlcpy(vfd->name, name, sizeof(vfd->name));
+       vfd->release = video_device_release;
+       vfd->priv = dev;
 
        // fixme: -1 should be an insmod parameter *for the extension* (like "video_nr");
-       if (video_register_device(vid,type,-1) < 0) {
+       if (video_register_device(vfd, type, -1) < 0) {
                ERR(("cannot register v4l2 device. skipping.\n"));
                return -1;
        }
 
        if( VFL_TYPE_GRABBER == type ) {
-               vv->video_minor = vid->minor;
-               INFO(("%s: registered device video%d [v4l2]\n", dev->name,vid->minor & 0x1f));
+               vv->video_minor = vfd->minor;
+               INFO(("%s: registered device video%d [v4l2]\n",
+                       dev->name, vfd->minor & 0x1f));
        } else {
-               vv->vbi_minor = vid->minor;
-               INFO(("%s: registered device vbi%d [v4l2]\n", dev->name,vid->minor & 0x1f));
+               vv->vbi_minor = vfd->minor;
+               INFO(("%s: registered device vbi%d [v4l2]\n",
+                       dev->name, vfd->minor & 0x1f));
        }
 
+       *vid = vfd;
        return 0;
 }
 
-int saa7146_unregister_device(struct video_device *vid, struct saa7146_dev* dev)
+int saa7146_unregister_device(struct video_device **vid, struct saa7146_dev* dev)
 {
        struct saa7146_vv *vv = dev->vv_data;
        
        DEB_EE(("dev:%p\n",dev));
 
-       if( VFL_TYPE_GRABBER == vid->type ) {
+       if( VFL_TYPE_GRABBER == (*vid)->type ) {
                vv->video_minor = -1;
        } else {
                vv->vbi_minor = -1;
        }
-       video_unregister_device(vid);
+
+       video_unregister_device(*vid);
+       *vid = NULL;
 
        return 0;
 }