diff options
Diffstat (limited to 'drivers/char/ttyprintk.c')
-rw-r--r-- | drivers/char/ttyprintk.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c index 46b77ede84c0..af98f6d6509b 100644 --- a/drivers/char/ttyprintk.c +++ b/drivers/char/ttyprintk.c | |||
@@ -67,7 +67,7 @@ static int tpk_printk(const unsigned char *buf, int count) | |||
67 | tmp[tpk_curr + 1] = '\0'; | 67 | tmp[tpk_curr + 1] = '\0'; |
68 | printk(KERN_INFO "%s%s", tpk_tag, tmp); | 68 | printk(KERN_INFO "%s%s", tpk_tag, tmp); |
69 | tpk_curr = 0; | 69 | tpk_curr = 0; |
70 | if (buf[i + 1] == '\n') | 70 | if ((i + 1) < count && buf[i + 1] == '\n') |
71 | i++; | 71 | i++; |
72 | break; | 72 | break; |
73 | case '\n': | 73 | case '\n': |
@@ -178,11 +178,17 @@ static struct tty_driver *ttyprintk_driver; | |||
178 | static int __init ttyprintk_init(void) | 178 | static int __init ttyprintk_init(void) |
179 | { | 179 | { |
180 | int ret = -ENOMEM; | 180 | int ret = -ENOMEM; |
181 | void *rp; | ||
182 | 181 | ||
183 | ttyprintk_driver = alloc_tty_driver(1); | 182 | tty_port_init(&tpk_port.port); |
184 | if (!ttyprintk_driver) | 183 | tpk_port.port.ops = &null_ops; |
185 | return ret; | 184 | mutex_init(&tpk_port.port_write_mutex); |
185 | |||
186 | ttyprintk_driver = tty_alloc_driver(1, | ||
187 | TTY_DRIVER_RESET_TERMIOS | | ||
188 | TTY_DRIVER_REAL_RAW | | ||
189 | TTY_DRIVER_UNNUMBERED_NODE); | ||
190 | if (IS_ERR(ttyprintk_driver)) | ||
191 | return PTR_ERR(ttyprintk_driver); | ||
186 | 192 | ||
187 | ttyprintk_driver->driver_name = "ttyprintk"; | 193 | ttyprintk_driver->driver_name = "ttyprintk"; |
188 | ttyprintk_driver->name = "ttyprintk"; | 194 | ttyprintk_driver->name = "ttyprintk"; |
@@ -191,9 +197,8 @@ static int __init ttyprintk_init(void) | |||
191 | ttyprintk_driver->type = TTY_DRIVER_TYPE_CONSOLE; | 197 | ttyprintk_driver->type = TTY_DRIVER_TYPE_CONSOLE; |
192 | ttyprintk_driver->init_termios = tty_std_termios; | 198 | ttyprintk_driver->init_termios = tty_std_termios; |
193 | ttyprintk_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET; | 199 | ttyprintk_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET; |
194 | ttyprintk_driver->flags = TTY_DRIVER_RESET_TERMIOS | | ||
195 | TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; | ||
196 | tty_set_operations(ttyprintk_driver, &ttyprintk_ops); | 200 | tty_set_operations(ttyprintk_driver, &ttyprintk_ops); |
201 | tty_port_link_device(&tpk_port.port, ttyprintk_driver, 0); | ||
197 | 202 | ||
198 | ret = tty_register_driver(ttyprintk_driver); | 203 | ret = tty_register_driver(ttyprintk_driver); |
199 | if (ret < 0) { | 204 | if (ret < 0) { |
@@ -201,22 +206,10 @@ static int __init ttyprintk_init(void) | |||
201 | goto error; | 206 | goto error; |
202 | } | 207 | } |
203 | 208 | ||
204 | /* create our unnumbered device */ | ||
205 | rp = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 3), NULL, | ||
206 | ttyprintk_driver->name); | ||
207 | if (IS_ERR(rp)) { | ||
208 | printk(KERN_ERR "Couldn't create ttyprintk device\n"); | ||
209 | ret = PTR_ERR(rp); | ||
210 | goto error; | ||
211 | } | ||
212 | |||
213 | tty_port_init(&tpk_port.port); | ||
214 | tpk_port.port.ops = &null_ops; | ||
215 | mutex_init(&tpk_port.port_write_mutex); | ||
216 | |||
217 | return 0; | 209 | return 0; |
218 | 210 | ||
219 | error: | 211 | error: |
212 | tty_unregister_driver(ttyprintk_driver); | ||
220 | put_tty_driver(ttyprintk_driver); | 213 | put_tty_driver(ttyprintk_driver); |
221 | ttyprintk_driver = NULL; | 214 | ttyprintk_driver = NULL; |
222 | return ret; | 215 | return ret; |