V4L/DVB (12772): tm6000: fix module load/unload
authorMichel Ludwig <michel.ludwig@gmail.com>
Thu, 14 Jun 2007 20:19:59 +0000 (17:19 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 18 May 2010 03:39:25 +0000 (00:39 -0300)
Signed-off-by: Michel Ludwig <michel.ludwig@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/staging/tm6000/tm6000-cards.c
drivers/staging/tm6000/tm6000-video.c

index b0719a52ef4212e53194c292af341d99b2f9499a..81f5ea613d80a5adca5239ae56efd484fdb28004 100644 (file)
@@ -230,6 +230,7 @@ static int tm6000_usb_probe(struct usb_interface *interface,
        /* Increment usage count */
        tm6000_devused|=1<<nr;
 
+       INIT_LIST_HEAD(&dev->tm6000_corelist);
        dev->udev= usbdev;
        dev->model=id->driver_info;
        snprintf(dev->name, 29, "tm6000 #%d", nr);
@@ -354,8 +355,6 @@ static void tm6000_usb_disconnect(struct usb_interface *interface)
        if (!dev)
                return;
 
-       tm6000_i2c_unregister(dev);
-
        printk("tm6000: disconnecting %s\n", dev->name);
 
        mutex_lock(&dev->lock);
@@ -369,6 +368,7 @@ static void tm6000_usb_disconnect(struct usb_interface *interface)
        dev->state |= DEV_DISCONNECTED;
 
        mutex_unlock(&dev->lock);
+       kfree(dev);
 }
 
 static struct usb_driver tm6000_usb_driver = {
index 970f3a11308d91d0b7e48f4a83ee3c0b579a981f..ffd2fe7ed9846455b12433acdf35bcf518dbf054 100644 (file)
@@ -1528,15 +1528,14 @@ int tm6000_v4l2_register(struct tm6000_core *dev)
 int tm6000_v4l2_unregister(struct tm6000_core *dev)
 {
        struct tm6000_core *h;
-       struct list_head *list;
+       struct list_head *pos, *tmp;
 
-       while (!list_empty(&tm6000_corelist)) {
-               list = tm6000_corelist.next;
-               h = list_entry(list, struct tm6000_core, tm6000_corelist);
+       video_unregister_device(&dev->vfd);
+
+       list_for_each_safe(pos, tmp, &tm6000_corelist) {
+               h = list_entry(pos, struct tm6000_core, tm6000_corelist);
                if (h == dev) {
-                       video_unregister_device(&dev->vfd);
                        list_del(list);
-                       kfree (h);
                }
        }