static int debug;
 static struct usb_serial *serial_table[SERIAL_TTY_MINORS];     /* initially all NULL */
-static spinlock_t table_lock;
+static DEFINE_MUTEX(table_lock);
 static LIST_HEAD(usb_serial_driver_list);
 
 struct usb_serial *usb_serial_get_by_index(unsigned index)
 {
        struct usb_serial *serial;
 
-       spin_lock(&table_lock);
+       mutex_lock(&table_lock);
        serial = serial_table[index];
 
        if (serial)
                kref_get(&serial->kref);
-       spin_unlock(&table_lock);
+       mutex_unlock(&table_lock);
        return serial;
 }
 
        dbg("%s %d", __FUNCTION__, num_ports);
 
        *minor = 0;
-       spin_lock(&table_lock);
+       mutex_lock(&table_lock);
        for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
                if (serial_table[i])
                        continue;
                        serial_table[i] = serial;
                        serial->port[j++]->number = i;
                }
-               spin_unlock(&table_lock);
+               mutex_unlock(&table_lock);
                return serial;
        }
-       spin_unlock(&table_lock);
+       mutex_unlock(&table_lock);
        return NULL;
 }
 
 
 void usb_serial_put(struct usb_serial *serial)
 {
-       spin_lock(&table_lock);
+       mutex_lock(&table_lock);
        kref_put(&serial->kref, destroy_serial);
-       spin_unlock(&table_lock);
+       mutex_unlock(&table_lock);
 }
 
 /*****************************************************************************
                return -ENOMEM;
 
        /* Initialize our global data */
-       spin_lock_init(&table_lock);
        for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
                serial_table[i] = NULL;
        }