diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2007-06-16 23:21:48 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2007-06-16 23:21:48 -0300 |
commit | 493fb20bed3583c2980a82628995db8d4a89b10f (patch) | |
tree | f0f8c53905027f0a1cdd04b2f941183ebb20a13c | |
parent | f4b8fea24f4e75503f30976ccc21429a49accc66 (diff) | |
download | mediapointer-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.c | 6 | ||||
-rw-r--r-- | linux/drivers/staging/tm6000/tm6000-video.c | 31 | ||||
-rw-r--r-- | linux/drivers/staging/tm6000/tm6000.h | 2 |
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; |