summaryrefslogtreecommitdiffstats
path: root/arch/um/drivers/line.h
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-09-10 01:45:42 +0200
committerRichard Weinberger <richard@nod.at>2012-03-25 00:29:53 +0100
commitcfe6b7c79daa0efa27f474f1fe2a88fd7af5cc47 (patch)
tree5030f25d83451e3b3e579bac4b9a2e561990048d /arch/um/drivers/line.h
parentum: fix races between line_open() and line_config() (diff)
downloadlinux-cfe6b7c79daa0efa27f474f1fe2a88fd7af5cc47.tar.xz
linux-cfe6b7c79daa0efa27f474f1fe2a88fd7af5cc47.zip
um: switch line.c tty drivers to dynamic device creation
Current code doesn't update the symlinks in /sys/dev/char when we add/remove tty lines. Fixing that allows to stop messing with ->valid before the driver registration, which is a Good Thing(tm) - we shouldn't have it set before we really have the things set up and ready for line_open(). We need tty_driver available to call tty_{un,}register_device(), so we just stash a reference to it into struct line_driver. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/um/drivers/line.h')
-rw-r--r--arch/um/drivers/line.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/um/drivers/line.h b/arch/um/drivers/line.h
index 471f477b271e..e3f86065e049 100644
--- a/arch/um/drivers/line.h
+++ b/arch/um/drivers/line.h
@@ -15,7 +15,7 @@
#include "chan_user.h"
#include "mconsole_kern.h"
-/* There's only one modifiable field in this - .mc.list */
+/* There's only two modifiable fields in this - .mc.list and .driver */
struct line_driver {
const char *name;
const char *device_name;
@@ -28,6 +28,7 @@ struct line_driver {
const int write_irq;
const char *write_irq_name;
struct mc_device mc;
+ struct tty_driver *driver;
};
struct line {
@@ -78,9 +79,9 @@ extern char *add_xterm_umid(char *base);
extern int line_setup_irq(int fd, int input, int output, struct line *line,
void *data);
extern void line_close_chan(struct line *line);
-extern struct tty_driver *register_lines(struct line_driver *line_driver,
- const struct tty_operations *driver,
- struct line *lines, int nlines);
+extern int register_lines(struct line_driver *line_driver,
+ const struct tty_operations *driver,
+ struct line *lines, int nlines);
extern void lines_init(struct line *lines, int nlines, struct chan_opts *opts);
extern void close_lines(struct line *lines, int nlines);