static LIST_HEAD(cx8802_devlist);
+static DEFINE_MUTEX(cx8802_mutex);
 /* ------------------------------------------------------------------ */
 
 static int cx8802_start_dma(struct cx8802_dev    *dev,
                return err;
        }
 
+       mutex_lock(&cx8802_mutex);
+
        list_for_each_entry(dev, &cx8802_devlist, devlist) {
                printk(KERN_INFO
                       "%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n",
 
                /* Bring up a new struct for each driver instance */
                driver = kzalloc(sizeof(*drv),GFP_KERNEL);
-               if (driver == NULL)
-                       return -ENOMEM;
+               if (driver == NULL) {
+                       err = -ENOMEM;
+                       goto out;
+               }
 
                /* Snapshot of the driver registration data */
                drv->core = dev->core;
                mutex_unlock(&drv->core->lock);
        }
 
-       return i ? 0 : -ENODEV;
+       err = i ? 0 : -ENODEV;
+out:
+       mutex_unlock(&cx8802_mutex);
+       return err;
 }
 
 int cx8802_unregister_driver(struct cx8802_driver *drv)
               drv->type_id == CX88_MPEG_DVB ? "dvb" : "blackbird",
               drv->hw_access == CX8802_DRVCTL_SHARED ? "shared" : "exclusive");
 
+       mutex_lock(&cx8802_mutex);
+
        list_for_each_entry(dev, &cx8802_devlist, devlist) {
                printk(KERN_INFO
                       "%s/2: subsystem: %04x:%04x, board: %s [card=%d]\n",
                mutex_unlock(&dev->core->lock);
        }
 
+       mutex_unlock(&cx8802_mutex);
+
        return err;
 }
 
                goto fail_free;
 
        INIT_LIST_HEAD(&dev->drvlist);
+       mutex_lock(&cx8802_mutex);
        list_add_tail(&dev->devlist,&cx8802_devlist);
+       mutex_unlock(&cx8802_mutex);
 
        /* now autoload cx88-dvb or cx88-blackbird */
        request_modules(dev);