#include <media/saa7146_vv.h>
+#include <linux/version.h>
#define BOARD_CAN_DO_VBI(dev) (dev->revision != 0 && dev->vv_data->vbi_minor != -1)
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;
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;
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"));
{
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);
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)
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;
}