]> Pileus Git - ~andy/linux/blobdiff - drivers/s390/char/sclp_tty.c
s390/headers: replace __s390x__ with CONFIG_64BIT where possible
[~andy/linux] / drivers / s390 / char / sclp_tty.c
index 40a9d69c898e13fc1dc489d221647bce25bcfacd..e66a75b3822cbf24f09c0824c87b7f0c81089749 100644 (file)
@@ -48,7 +48,7 @@ static struct sclp_buffer *sclp_ttybuf;
 /* Timer for delayed output of console messages. */
 static struct timer_list sclp_tty_timer;
 
-static struct tty_struct *sclp_tty;
+static struct tty_port sclp_port;
 static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE];
 static unsigned short int sclp_tty_chars_count;
 
@@ -64,7 +64,7 @@ static int sclp_tty_columns = 80;
 static int
 sclp_tty_open(struct tty_struct *tty, struct file *filp)
 {
-       sclp_tty = tty;
+       tty_port_tty_set(&sclp_port, tty);
        tty->driver_data = NULL;
        tty->low_latency = 0;
        return 0;
@@ -76,7 +76,7 @@ sclp_tty_close(struct tty_struct *tty, struct file *filp)
 {
        if (tty->count > 1)
                return;
-       sclp_tty = NULL;
+       tty_port_tty_set(&sclp_port, NULL);
 }
 
 /*
@@ -108,6 +108,7 @@ sclp_tty_write_room (struct tty_struct *tty)
 static void
 sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc)
 {
+       struct tty_struct *tty;
        unsigned long flags;
        void *page;
 
@@ -126,8 +127,10 @@ sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc)
                spin_unlock_irqrestore(&sclp_tty_lock, flags);
        } while (buffer && sclp_emit_buffer(buffer, sclp_ttybuf_callback));
        /* check if the tty needs a wake up call */
-       if (sclp_tty != NULL) {
-               tty_wakeup(sclp_tty);
+       tty = tty_port_tty_get(&sclp_port);
+       if (tty != NULL) {
+               tty_wakeup(tty);
+               tty_kref_put(tty);
        }
 }
 
@@ -326,21 +329,22 @@ sclp_tty_flush_buffer(struct tty_struct *tty)
 static void
 sclp_tty_input(unsigned char* buf, unsigned int count)
 {
+       struct tty_struct *tty = tty_port_tty_get(&sclp_port);
        unsigned int cchar;
 
        /*
         * If this tty driver is currently closed
         * then throw the received input away.
         */
-       if (sclp_tty == NULL)
+       if (tty == NULL)
                return;
-       cchar = ctrlchar_handle(buf, count, sclp_tty);
+       cchar = ctrlchar_handle(buf, count, tty);
        switch (cchar & CTRLCHAR_MASK) {
        case CTRLCHAR_SYSRQ:
                break;
        case CTRLCHAR_CTRL:
-               tty_insert_flip_char(sclp_tty, cchar, TTY_NORMAL);
-               tty_flip_buffer_push(sclp_tty);
+               tty_insert_flip_char(tty, cchar, TTY_NORMAL);
+               tty_flip_buffer_push(tty);
                break;
        case CTRLCHAR_NONE:
                /* send (normal) input to line discipline */
@@ -348,13 +352,14 @@ sclp_tty_input(unsigned char* buf, unsigned int count)
                    (strncmp((const char *) buf + count - 2, "^n", 2) &&
                     strncmp((const char *) buf + count - 2, "\252n", 2))) {
                        /* add the auto \n */
-                       tty_insert_flip_string(sclp_tty, buf, count);
-                       tty_insert_flip_char(sclp_tty, '\n', TTY_NORMAL);
+                       tty_insert_flip_string(tty, buf, count);
+                       tty_insert_flip_char(tty, '\n', TTY_NORMAL);
                } else
-                       tty_insert_flip_string(sclp_tty, buf, count - 2);
-               tty_flip_buffer_push(sclp_tty);
+                       tty_insert_flip_string(tty, buf, count - 2);
+               tty_flip_buffer_push(tty);
                break;
        }
+       tty_kref_put(tty);
 }
 
 /*
@@ -543,7 +548,7 @@ sclp_tty_init(void)
                sclp_tty_tolower = 1;
        }
        sclp_tty_chars_count = 0;
-       sclp_tty = NULL;
+       tty_port_init(&sclp_port);
 
        rc = sclp_register(&sclp_input_event);
        if (rc) {