greybus: uart: Update uart.c to register tty ports
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Tue, 2 Jun 2015 12:40:47 +0000 (13:40 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 4 Jun 2015 05:08:22 +0000 (14:08 +0900)
For each new UART connection we need to do a tty_port_init else
we'll crash when trying to access the tty mutex later on.
Base the TTY major/minor numbers on non-zero values.
Supply an empty operations structure for the newly regitered port.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/uart.c

index 4cad629..c47667d 100644 (file)
@@ -522,6 +522,7 @@ static const struct tty_operations gb_ops = {
        .tiocmset =             gb_tty_tiocmset,
 };
 
+static struct tty_port_operations null_ops = { };
 
 static int gb_tty_init(void);
 static void gb_tty_exit(void);
@@ -545,6 +546,7 @@ static int gb_uart_connection_init(struct gb_connection *connection)
        gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
        if (!gb_tty)
                return -ENOMEM;
+
        gb_tty->connection = connection;
        connection->private = gb_tty;
 
@@ -571,6 +573,9 @@ static int gb_uart_connection_init(struct gb_connection *connection)
        init_waitqueue_head(&gb_tty->wioctl);
        mutex_init(&gb_tty->mutex);
 
+       tty_port_init(&gb_tty->port);
+       gb_tty->port.ops = &null_ops;
+
        send_control(gb_tty, gb_tty->ctrlout);
 
        /* initialize the uart to be 9600n81 */
@@ -589,6 +594,7 @@ static int gb_uart_connection_init(struct gb_connection *connection)
 
        return 0;
 error:
+       tty_port_destroy(&gb_tty->port);
        release_minor(gb_tty);
 error_version:
        connection->private = NULL;
@@ -623,7 +629,7 @@ static void gb_uart_connection_exit(struct gb_connection *connection)
        /* FIXME - free transmit / receive buffers */
 
        tty_port_put(&gb_tty->port);
-
+       tty_port_destroy(&gb_tty->port);
        kfree(gb_tty);
 
        /* If last device is gone, tear down the tty structures */