struct cx25821_dev *dev = NULL;
        struct list_head *list;
 
+       mutex_lock(&cx25821_devlist_mutex);
        list_for_each(list, &cx25821_devlist) {
                dev = list_entry(list, struct cx25821_dev, devlist);
                cx25821_audio_initdev(dev);
        }
+       mutex_unlock(&cx25821_devlist_mutex);
 
        if (dev == NULL)
                pr_info("ERROR ALSA: no cx25821 cards found\n");
 
 MODULE_AUTHOR("Shu Lin - Hiep Huynh");
 MODULE_LICENSE("GPL");
 
-struct list_head cx25821_devlist;
-EXPORT_SYMBOL(cx25821_devlist);
-
 static unsigned int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "enable debug messages");
 
 static unsigned int cx25821_devcount;
 
-static DEFINE_MUTEX(devlist);
+DEFINE_MUTEX(cx25821_devlist_mutex);
+EXPORT_SYMBOL(cx25821_devlist_mutex);
 LIST_HEAD(cx25821_devlist);
+EXPORT_SYMBOL(cx25821_devlist);
 
 struct sram_channel cx25821_sram_channels[] = {
        [SRAM_CH00] = {
        dev->nr = ++cx25821_devcount;
        sprintf(dev->name, "cx25821[%d]", dev->nr);
 
-       mutex_lock(&devlist);
+       mutex_lock(&cx25821_devlist_mutex);
        list_add_tail(&dev->devlist, &cx25821_devlist);
-       mutex_unlock(&devlist);
+       mutex_unlock(&cx25821_devlist_mutex);
 
        strcpy(cx25821_boards[UNKNOWN_BOARD].name, "unknown");
        strcpy(cx25821_boards[CX25821_BOARD].name, "cx25821");
        if (pci_dev->irq)
                free_irq(pci_dev->irq, dev);
 
-       mutex_lock(&devlist);
+       mutex_lock(&cx25821_devlist_mutex);
        list_del(&dev->devlist);
-       mutex_unlock(&devlist);
+       mutex_unlock(&cx25821_devlist_mutex);
 
        cx25821_dev_unregister(dev);
        v4l2_device_unregister(v4l2_dev);
 
 static int __init cx25821_init(void)
 {
-       INIT_LIST_HEAD(&cx25821_devlist);
        pr_info("driver version %d.%d.%d loaded\n",
                (CX25821_VERSION_CODE >> 16) & 0xff,
                (CX25821_VERSION_CODE >> 8) & 0xff,
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include "cx25821-video.h"
-#include <linux/smp_lock.h>
 
 MODULE_DESCRIPTION("v4l2 driver module for cx25821 based TV cards");
 MODULE_AUTHOR("Hiep Huynh <hiep.huynh@conexant.com>");
        if (NULL == fh)
               return -ENOMEM;
 
-       lock_kernel();
+       mutex_lock(&cx25821_devlist_mutex);
 
        list_for_each(list, &cx25821_devlist)
        {
        }
 
        if (NULL == dev) {
-              unlock_kernel();
-              return -ENODEV;
+               mutex_unlock(&cx25821_devlist_mutex);
+               return -ENODEV;
        }
 
        file->private_data = fh;
                              sizeof(struct cx25821_buffer), fh, NULL);
 
        dprintk(1, "post videobuf_queue_init()\n");
-       unlock_kernel();
+       mutex_unlock(&cx25821_devlist_mutex);
 
        return 0;
 }
 
 #include <linux/delay.h>
 #include <linux/sched.h>
 #include <linux/kdev_t.h>
-#include <linux/smp_lock.h>
 
 #include <media/v4l2-common.h>
 #include <media/v4l2-device.h>
        v4l2_device_call_all(&dev->v4l2_dev, 0, o, f, ##args)
 
 extern struct list_head cx25821_devlist;
+extern struct mutex cx25821_devlist_mutex;
+
 extern struct cx25821_board cx25821_boards[];
 extern struct cx25821_subid cx25821_subids[];