X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmedia%2Fcommon%2Fsaa7146_fops.c;h=cb826c9adfe7e60124547528f8da72154bbca548;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=a61e91ac7951a5b4bd3773358be95a66cc53c397;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c index a61e91ac7..cb826c9ad 100644 --- a/drivers/media/common/saa7146_fops.c +++ b/drivers/media/common/saa7146_fops.c @@ -1,4 +1,5 @@ #include +#include #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) { -#if 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) { -#if 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)); -#if 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) @@ -469,7 +444,7 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv) memset(vv, 0x0, sizeof(*vv)); DEB_EE(("dev:%p\n",dev)); - + /* set default values for video parts of the saa7146 */ saa7146_write(dev, BCS_CTRL, 0x80400040); @@ -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; }