diff options
author | Jiri Slaby <jslaby@suse.cz> | 2012-04-02 07:54:12 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-04-09 14:28:16 -0400 |
commit | 0ea63da2ffa54f6196405010379d56f0c8085b7e (patch) | |
tree | da26d0e3806fd09127d93bb58400e6dd59da6bec /drivers/s390/char/sclp_tty.c | |
parent | fe2fc9ca5d7e5d9144a4039d89a6f1f8967d9263 (diff) |
TTY: sclp_tty, add tty_port
tty_port will hold tty buffers in the future. So we need to have it
even here. The only needed member here is tty, so let us store it in
the structure now.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: linux390@de.ibm.com
Cc: linux-s390@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/s390/char/sclp_tty.c')
-rw-r--r-- | drivers/s390/char/sclp_tty.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c index 40a9d69c898e..e66a75b3822c 100644 --- a/drivers/s390/char/sclp_tty.c +++ b/drivers/s390/char/sclp_tty.c | |||
@@ -48,7 +48,7 @@ static struct sclp_buffer *sclp_ttybuf; | |||
48 | /* Timer for delayed output of console messages. */ | 48 | /* Timer for delayed output of console messages. */ |
49 | static struct timer_list sclp_tty_timer; | 49 | static struct timer_list sclp_tty_timer; |
50 | 50 | ||
51 | static struct tty_struct *sclp_tty; | 51 | static struct tty_port sclp_port; |
52 | static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE]; | 52 | static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE]; |
53 | static unsigned short int sclp_tty_chars_count; | 53 | static unsigned short int sclp_tty_chars_count; |
54 | 54 | ||
@@ -64,7 +64,7 @@ static int sclp_tty_columns = 80; | |||
64 | static int | 64 | static int |
65 | sclp_tty_open(struct tty_struct *tty, struct file *filp) | 65 | sclp_tty_open(struct tty_struct *tty, struct file *filp) |
66 | { | 66 | { |
67 | sclp_tty = tty; | 67 | tty_port_tty_set(&sclp_port, tty); |
68 | tty->driver_data = NULL; | 68 | tty->driver_data = NULL; |
69 | tty->low_latency = 0; | 69 | tty->low_latency = 0; |
70 | return 0; | 70 | return 0; |
@@ -76,7 +76,7 @@ sclp_tty_close(struct tty_struct *tty, struct file *filp) | |||
76 | { | 76 | { |
77 | if (tty->count > 1) | 77 | if (tty->count > 1) |
78 | return; | 78 | return; |
79 | sclp_tty = NULL; | 79 | tty_port_tty_set(&sclp_port, NULL); |
80 | } | 80 | } |
81 | 81 | ||
82 | /* | 82 | /* |
@@ -108,6 +108,7 @@ sclp_tty_write_room (struct tty_struct *tty) | |||
108 | static void | 108 | static void |
109 | sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc) | 109 | sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc) |
110 | { | 110 | { |
111 | struct tty_struct *tty; | ||
111 | unsigned long flags; | 112 | unsigned long flags; |
112 | void *page; | 113 | void *page; |
113 | 114 | ||
@@ -126,8 +127,10 @@ sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc) | |||
126 | spin_unlock_irqrestore(&sclp_tty_lock, flags); | 127 | spin_unlock_irqrestore(&sclp_tty_lock, flags); |
127 | } while (buffer && sclp_emit_buffer(buffer, sclp_ttybuf_callback)); | 128 | } while (buffer && sclp_emit_buffer(buffer, sclp_ttybuf_callback)); |
128 | /* check if the tty needs a wake up call */ | 129 | /* check if the tty needs a wake up call */ |
129 | if (sclp_tty != NULL) { | 130 | tty = tty_port_tty_get(&sclp_port); |
130 | tty_wakeup(sclp_tty); | 131 | if (tty != NULL) { |
132 | tty_wakeup(tty); | ||
133 | tty_kref_put(tty); | ||
131 | } | 134 | } |
132 | } | 135 | } |
133 | 136 | ||
@@ -326,21 +329,22 @@ sclp_tty_flush_buffer(struct tty_struct *tty) | |||
326 | static void | 329 | static void |
327 | sclp_tty_input(unsigned char* buf, unsigned int count) | 330 | sclp_tty_input(unsigned char* buf, unsigned int count) |
328 | { | 331 | { |
332 | struct tty_struct *tty = tty_port_tty_get(&sclp_port); | ||
329 | unsigned int cchar; | 333 | unsigned int cchar; |
330 | 334 | ||
331 | /* | 335 | /* |
332 | * If this tty driver is currently closed | 336 | * If this tty driver is currently closed |
333 | * then throw the received input away. | 337 | * then throw the received input away. |
334 | */ | 338 | */ |
335 | if (sclp_tty == NULL) | 339 | if (tty == NULL) |
336 | return; | 340 | return; |
337 | cchar = ctrlchar_handle(buf, count, sclp_tty); | 341 | cchar = ctrlchar_handle(buf, count, tty); |
338 | switch (cchar & CTRLCHAR_MASK) { | 342 | switch (cchar & CTRLCHAR_MASK) { |
339 | case CTRLCHAR_SYSRQ: | 343 | case CTRLCHAR_SYSRQ: |
340 | break; | 344 | break; |
341 | case CTRLCHAR_CTRL: | 345 | case CTRLCHAR_CTRL: |
342 | tty_insert_flip_char(sclp_tty, cchar, TTY_NORMAL); | 346 | tty_insert_flip_char(tty, cchar, TTY_NORMAL); |
343 | tty_flip_buffer_push(sclp_tty); | 347 | tty_flip_buffer_push(tty); |
344 | break; | 348 | break; |
345 | case CTRLCHAR_NONE: | 349 | case CTRLCHAR_NONE: |
346 | /* send (normal) input to line discipline */ | 350 | /* send (normal) input to line discipline */ |
@@ -348,13 +352,14 @@ sclp_tty_input(unsigned char* buf, unsigned int count) | |||
348 | (strncmp((const char *) buf + count - 2, "^n", 2) && | 352 | (strncmp((const char *) buf + count - 2, "^n", 2) && |
349 | strncmp((const char *) buf + count - 2, "\252n", 2))) { | 353 | strncmp((const char *) buf + count - 2, "\252n", 2))) { |
350 | /* add the auto \n */ | 354 | /* add the auto \n */ |
351 | tty_insert_flip_string(sclp_tty, buf, count); | 355 | tty_insert_flip_string(tty, buf, count); |
352 | tty_insert_flip_char(sclp_tty, '\n', TTY_NORMAL); | 356 | tty_insert_flip_char(tty, '\n', TTY_NORMAL); |
353 | } else | 357 | } else |
354 | tty_insert_flip_string(sclp_tty, buf, count - 2); | 358 | tty_insert_flip_string(tty, buf, count - 2); |
355 | tty_flip_buffer_push(sclp_tty); | 359 | tty_flip_buffer_push(tty); |
356 | break; | 360 | break; |
357 | } | 361 | } |
362 | tty_kref_put(tty); | ||
358 | } | 363 | } |
359 | 364 | ||
360 | /* | 365 | /* |
@@ -543,7 +548,7 @@ sclp_tty_init(void) | |||
543 | sclp_tty_tolower = 1; | 548 | sclp_tty_tolower = 1; |
544 | } | 549 | } |
545 | sclp_tty_chars_count = 0; | 550 | sclp_tty_chars_count = 0; |
546 | sclp_tty = NULL; | 551 | tty_port_init(&sclp_port); |
547 | 552 | ||
548 | rc = sclp_register(&sclp_input_event); | 553 | rc = sclp_register(&sclp_input_event); |
549 | if (rc) { | 554 | if (rc) { |