]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/um/drivers/stdio_console.c
[PATCH] uml: mconsole locking
[mv-sheeva.git] / arch / um / drivers / stdio_console.c
index 005aa6333b6e5ff59d957e201b8a6df15175888b..0b1bca4980496aee6720a003c8650626d0fced96 100644 (file)
@@ -3,7 +3,6 @@
  * Licensed under the GPL
  */
 
-#include "linux/config.h"
 #include "linux/posix_types.h"
 #include "linux/tty.h"
 #include "linux/tty_flip.h"
@@ -31,8 +30,6 @@
 
 #define MAX_TTYS (16)
 
-/* ----------------------------------------------------------------------------- */
-
 /* Referenced only by tty_driver below - presumably it's locked correctly
  * by the tty driver.
  */
@@ -53,14 +50,13 @@ static struct chan_opts opts = {
        .in_kernel      = 1,
 };
 
-static int con_config(char *str);
+static int con_config(char *str, char **error_out);
 static int con_get_config(char *dev, char *str, int size, char **error_out);
-static int con_remove(int n);
+static int con_remove(int n, char **con_remove);
 
 static struct line_driver driver = {
        .name                   = "UML console",
        .device_name            = "tty",
-       .devfs_name             = "vc/",
        .major                  = TTY_MAJOR,
        .minor_start            = 0,
        .type                   = TTY_DRIVER_TYPE_CONSOLE,
@@ -75,7 +71,7 @@ static struct line_driver driver = {
                .name           = "con",
                .config         = con_config,
                .get_config     = con_get_config,
-                .id            = line_id,
+               .id             = line_id,
                .remove         = con_remove,
        },
 };
@@ -85,48 +81,50 @@ static struct lines console_lines = LINES_INIT(MAX_TTYS);
 /* The array is initialized by line_init, which is an initcall.  The 
  * individual elements are protected by individual semaphores.
  */
-struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver),
-                             [ 1 ... MAX_TTYS - 1 ] = 
-                             LINE_INIT(CONFIG_CON_CHAN, &driver) };
+static struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver),
+                                    [ 1 ... MAX_TTYS - 1 ] =
+                                    LINE_INIT(CONFIG_CON_CHAN, &driver) };
 
-static int con_config(char *str)
+static int con_config(char *str, char **error_out)
 {
-       return(line_config(vts, sizeof(vts)/sizeof(vts[0]), str));
+       return line_config(vts, ARRAY_SIZE(vts), str, &opts, error_out);
 }
 
 static int con_get_config(char *dev, char *str, int size, char **error_out)
 {
-       return(line_get_config(dev, vts, sizeof(vts)/sizeof(vts[0]), str, 
-                              size, error_out));
+       return line_get_config(dev, vts, ARRAY_SIZE(vts), str, size, error_out);
 }
 
-static int con_remove(int n)
+static int con_remove(int n, char **error_out)
 {
-        return line_remove(vts, sizeof(vts)/sizeof(vts[0]), n);
+       return line_remove(vts, ARRAY_SIZE(vts), n, error_out);
 }
 
 static int con_open(struct tty_struct *tty, struct file *filp)
 {
-       return line_open(vts, tty, &opts);
+       return line_open(vts, tty);
 }
 
+/* Set in an initcall, checked in an exitcall */
 static int con_init_done = 0;
 
-static struct tty_operations console_ops = {
+static const struct tty_operations console_ops = {
        .open                   = con_open,
        .close                  = line_close,
        .write                  = line_write,
        .put_char               = line_put_char,
-       .write_room             = line_write_room,
+       .write_room             = line_write_room,
        .chars_in_buffer        = line_chars_in_buffer,
        .flush_buffer           = line_flush_buffer,
        .flush_chars            = line_flush_chars,
        .set_termios            = line_set_termios,
        .ioctl                  = line_ioctl,
+       .throttle               = line_throttle,
+       .unthrottle             = line_unthrottle,
 };
 
 static void uml_console_write(struct console *console, const char *string,
-                         unsigned len)
+                             unsigned len)
 {
        struct line *line = &vts[console->index];
        unsigned long flags;
@@ -146,7 +144,7 @@ static int uml_console_setup(struct console *co, char *options)
 {
        struct line *line = &vts[co->index];
 
-       return console_open_chan(line,co,&opts);
+       return console_open_chan(line, co, &opts);
 }
 
 static struct console stdiocons = {
@@ -156,7 +154,7 @@ static struct console stdiocons = {
        .setup          = uml_console_setup,
        .flags          = CON_PRINTBUFFER,
        .index          = -1,
-       .data           = &vts,
+       .data           = &vts,
 };
 
 int stdio_init(void)
@@ -166,11 +164,11 @@ int stdio_init(void)
        console_driver = line_register_devfs(&console_lines, &driver,
                                             &console_ops, vts,
                                             ARRAY_SIZE(vts));
-       if (NULL == console_driver)
+       if (console_driver == NULL)
                return -1;
        printk(KERN_INFO "Initialized stdio console driver\n");
 
-       lines_init(vts, sizeof(vts)/sizeof(vts[0]));
+       lines_init(vts, ARRAY_SIZE(vts), &opts);
 
        new_title = add_xterm_umid(opts.xterm_title);
        if(new_title != NULL)
@@ -178,7 +176,7 @@ int stdio_init(void)
 
        con_init_done = 1;
        register_console(&stdiocons);
-       return(0);
+       return 0;
 }
 late_initcall(stdio_init);
 
@@ -186,13 +184,21 @@ static void console_exit(void)
 {
        if (!con_init_done)
                return;
-       close_lines(vts, sizeof(vts)/sizeof(vts[0]));
+       close_lines(vts, ARRAY_SIZE(vts));
 }
 __uml_exitcall(console_exit);
 
 static int console_chan_setup(char *str)
 {
-       return(line_setup(vts, sizeof(vts)/sizeof(vts[0]), str, 1));
+       char *error;
+       int ret;
+
+       ret = line_setup(vts, ARRAY_SIZE(vts), str, &error);
+       if(ret < 0)
+               printk(KERN_ERR "Failed to set up console with "
+                      "configuration string \"%s\" : %s\n", str, error);
+
+       return 1;
 }
 __setup("con", console_chan_setup);
 __channel_help(console_chan_setup, "con");