struct line *line = &lines[tty->index];
        int err = -ENODEV;
 
-       spin_lock(&line->count_lock);
+       mutex_lock(&line->count_lock);
        if (!line->valid)
                goto out_unlock;
 
        tty->driver_data = line;
        line->tty = tty;
 
-       spin_unlock(&line->count_lock);
        err = enable_chan(line);
        if (err) /* line_close() will be called by our caller */
-               return err;
+               goto out_unlock;
 
        INIT_DELAYED_WORK(&line->task, line_timer_cb);
 
 
        chan_window_size(&line->chan_list, &tty->winsize.ws_row,
                         &tty->winsize.ws_col);
-
-       return 0;
-
 out_unlock:
-       spin_unlock(&line->count_lock);
+       mutex_unlock(&line->count_lock);
        return err;
 }
 
        /* We ignore the error anyway! */
        flush_buffer(line);
 
-       spin_lock(&line->count_lock);
+       mutex_lock(&line->count_lock);
        BUG_ON(!line->valid);
 
        if (--line->count)
        line->tty = NULL;
        tty->driver_data = NULL;
 
-       spin_unlock(&line->count_lock);
-
        if (line->sigio) {
                unregister_winch(tty);
                line->sigio = 0;
        }
 
-       return;
-
 out_unlock:
-       spin_unlock(&line->count_lock);
+       mutex_unlock(&line->count_lock);
 }
 
 void close_lines(struct line *lines, int nlines)
        struct line *line = &lines[n];
        int err = -EINVAL;
 
-       spin_lock(&line->count_lock);
+       mutex_lock(&line->count_lock);
 
        if (line->count) {
                *error_out = "Device is already open";
        }
        err = 0;
 out:
-       spin_unlock(&line->count_lock);
+       mutex_unlock(&line->count_lock);
        return err;
 }
 
 
        line = &lines[dev];
 
-       spin_lock(&line->count_lock);
+       mutex_lock(&line->count_lock);
        if (!line->valid)
                CONFIG_CHUNK(str, size, n, "none", 1);
        else if (line->tty == NULL)
                CONFIG_CHUNK(str, size, n, line->init_str, 1);
        else n = chan_config_string(&line->chan_list, str, size, error_out);
-       spin_unlock(&line->count_lock);
+       mutex_unlock(&line->count_lock);
 
        return n;
 }
 
                        serial_lines[i].valid = 1;
                }
                spin_lock_init(&serial_lines[i].lock);
-               spin_lock_init(&serial_lines[i].count_lock);
+               mutex_init(&serial_lines[i].count_lock);
                serial_lines[i].driver = &driver;
        }
        ssl_driver = register_lines(&driver, &ssl_ops, serial_lines,