summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2007-06-16 23:21:48 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2007-06-16 23:21:48 -0300
commit493fb20bed3583c2980a82628995db8d4a89b10f (patch)
treef0f8c53905027f0a1cdd04b2f941183ebb20a13c
parentf4b8fea24f4e75503f30976ccc21429a49accc66 (diff)
downloadmediapointer-dvb-s2-493fb20bed3583c2980a82628995db8d4a89b10f.tar.gz
mediapointer-dvb-s2-493fb20bed3583c2980a82628995db8d4a89b10f.tar.bz2
Fix tm6000 module load/unload
From: Michel Ludwig <michel.ludwig@gmail.com> Signed-off-by: Michel Ludwig <michel.ludwig@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--linux/drivers/staging/tm6000/tm6000-cards.c6
-rw-r--r--linux/drivers/staging/tm6000/tm6000-video.c31
-rw-r--r--linux/drivers/staging/tm6000/tm6000.h2
3 files changed, 27 insertions, 12 deletions
diff --git a/linux/drivers/staging/tm6000/tm6000-cards.c b/linux/drivers/staging/tm6000/tm6000-cards.c
index d90bb6270..b4a3d251a 100644
--- a/linux/drivers/staging/tm6000/tm6000-cards.c
+++ b/linux/drivers/staging/tm6000/tm6000-cards.c
@@ -379,14 +379,16 @@ static void tm6000_usb_disconnect(struct usb_interface *interface)
mutex_lock(&dev->lock);
- tm6000_i2c_unregister(dev);
-
tm6000_v4l2_unregister(dev);
+ tm6000_i2c_unregister(dev);
+
// wake_up_interruptible_all(&dev->open);
dev->state |= DEV_DISCONNECTED;
+ usb_put_dev(dev->udev);
+
mutex_unlock(&dev->lock);
kfree(dev);
}
diff --git a/linux/drivers/staging/tm6000/tm6000-video.c b/linux/drivers/staging/tm6000/tm6000-video.c
index 6b5dca230..e70e8be5c 100644
--- a/linux/drivers/staging/tm6000/tm6000-video.c
+++ b/linux/drivers/staging/tm6000/tm6000-video.c
@@ -3,6 +3,9 @@
Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org>
+ Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com>
+ - Fixed module load/unload
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2
@@ -1199,7 +1202,7 @@ static int vidioc_s_input (struct file *file, void *priv, unsigned int i)
if (!rc) {
dev->input=i;
- rc=vidioc_s_std (file, priv, &dev->vfd.current_norm);
+ rc=vidioc_s_std (file, priv, &dev->vfd->current_norm);
}
return (rc);
@@ -1363,12 +1366,15 @@ static int tm6000_open(struct inode *inode, struct file *file)
enum v4l2_buf_type type = 0;
int i,rc;
+ printk(KERN_INFO "tm6000: open called (minor=%d)\n",minor);
+
+
dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: open called "
"(minor=%d)\n",minor);
list_for_each(list,&tm6000_corelist) {
h = list_entry(list, struct tm6000_core, tm6000_corelist);
- if (h->vfd.minor == minor) {
+ if (h->vfd->minor == minor) {
dev = h;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
}
@@ -1494,13 +1500,13 @@ static int tm6000_release(struct inode *inode, struct file *file)
struct tm6000_dmaqueue *vidq = &dev->vidq;
int minor = iminor(inode);
+ dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: close called (minor=%d, users=%d)\n",minor,dev->users);
+
tm6000_stop_thread(vidq);
videobuf_mmap_free(&fh->vb_vidq);
kfree (fh);
- dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: close called (minor=%d, users=%d)\n",minor,dev->users);
-
return 0;
}
@@ -1566,7 +1572,14 @@ static struct video_device tm6000_template = {
int tm6000_v4l2_register(struct tm6000_core *dev)
{
- int ret;
+ int ret = -1;
+ struct video_device *vfd;
+
+ vfd = video_device_alloc();
+ if(!vfd) {
+ return -ENOMEM;
+ }
+ dev->vfd = vfd;
list_add_tail(&dev->tm6000_corelist,&tm6000_corelist);
@@ -1578,10 +1591,10 @@ int tm6000_v4l2_register(struct tm6000_core *dev)
dev->vidq.timeout.data = (unsigned long)dev;
init_timer(&dev->vidq.timeout);
- memcpy (&dev->vfd, &tm6000_template, sizeof(dev->vfd));
- dev->vfd.debug=tm6000_debug;
+ memcpy (dev->vfd, &tm6000_template, sizeof(*(dev->vfd)));
+ dev->vfd->debug=tm6000_debug;
- ret = video_register_device(&dev->vfd, VFL_TYPE_GRABBER, video_nr);
+ ret = video_register_device(dev->vfd, VFL_TYPE_GRABBER, video_nr);
printk(KERN_INFO "Trident TVMaster TM5600/TM6000 USB2 board (Load status: %d)\n", ret);
return ret;
}
@@ -1591,7 +1604,7 @@ int tm6000_v4l2_unregister(struct tm6000_core *dev)
struct tm6000_core *h;
struct list_head *pos, *tmp;
- video_unregister_device(&dev->vfd);
+ video_unregister_device(dev->vfd);
list_for_each_safe(pos, tmp, &tm6000_corelist) {
h = list_entry(pos, struct tm6000_core, tm6000_corelist);
diff --git a/linux/drivers/staging/tm6000/tm6000.h b/linux/drivers/staging/tm6000/tm6000.h
index efb6820df..7d3b0c3d7 100644
--- a/linux/drivers/staging/tm6000/tm6000.h
+++ b/linux/drivers/staging/tm6000/tm6000.h
@@ -128,7 +128,7 @@ struct tm6000_core {
/* various device info */
unsigned int resources;
- struct video_device vfd;
+ struct video_device *vfd;
struct tm6000_dmaqueue vidq;
int input;