TTY: HVC, use tty from tty_port
authorJiri Slaby <jslaby@suse.cz>
Mon, 2 Apr 2012 11:54:22 +0000 (13:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Apr 2012 18:28:18 +0000 (11:28 -0700)
The driver already used refcounting. So we just switch it to tty_port
helpers. And switch to tty_port->lock for tty.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/hvc/hvc_console.c
drivers/tty/hvc/hvc_console.h
drivers/tty/hvc/hvsi_lib.c

index 12a42730d3c82f5312b0b28cd23b8492443002cc..92b7f5d5441ff7998e577dc323757c582ef56165 100644 (file)
@@ -323,11 +323,10 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
        } /* else count == 0 */
 
        tty->driver_data = hp;
-
-       hp->tty = tty_kref_get(tty);
-
        spin_unlock_irqrestore(&hp->lock, flags);
 
+       tty_port_tty_set(&hp->port, tty);
+
        if (hp->ops->notifier_add)
                rc = hp->ops->notifier_add(hp, hp->data);
 
@@ -338,9 +337,7 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
         * tty fields and return the kref reference.
         */
        if (rc) {
-               spin_lock_irqsave(&hp->lock, flags);
-               hp->tty = NULL;
-               spin_unlock_irqrestore(&hp->lock, flags);
+               tty_port_tty_set(&hp->port, NULL);
                tty_kref_put(tty);
                tty->driver_data = NULL;
                tty_port_put(&hp->port);
@@ -373,9 +370,9 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
        spin_lock_irqsave(&hp->lock, flags);
 
        if (--hp->count == 0) {
-               /* We are done with the tty pointer now. */
-               hp->tty = NULL;
                spin_unlock_irqrestore(&hp->lock, flags);
+               /* We are done with the tty pointer now. */
+               tty_port_tty_set(&hp->port, NULL);
 
                if (hp->ops->notifier_del)
                        hp->ops->notifier_del(hp, hp->data);
@@ -427,9 +424,8 @@ static void hvc_hangup(struct tty_struct *tty)
        temp_open_count = hp->count;
        hp->count = 0;
        hp->n_outbuf = 0;
-       hp->tty = NULL;
-
        spin_unlock_irqrestore(&hp->lock, flags);
+       tty_port_tty_set(&hp->port, NULL);
 
        if (hp->ops->notifier_hangup)
                hp->ops->notifier_hangup(hp, hp->data);
@@ -526,13 +522,12 @@ static void hvc_set_winsz(struct work_struct *work)
 
        hp = container_of(work, struct hvc_struct, tty_resize);
 
-       spin_lock_irqsave(&hp->lock, hvc_flags);
-       if (!hp->tty) {
-               spin_unlock_irqrestore(&hp->lock, hvc_flags);
+       tty = tty_port_tty_get(&hp->port);
+       if (!tty)
                return;
-       }
-       ws  = hp->ws;
-       tty = tty_kref_get(hp->tty);
+
+       spin_lock_irqsave(&hp->lock, hvc_flags);
+       ws = hp->ws;
        spin_unlock_irqrestore(&hp->lock, hvc_flags);
 
        tty_do_resize(tty, &ws);
@@ -601,7 +596,7 @@ int hvc_poll(struct hvc_struct *hp)
        }
 
        /* No tty attached, just skip */
-       tty = tty_kref_get(hp->tty);
+       tty = tty_port_tty_get(&hp->port);
        if (tty == NULL)
                goto bail;
 
@@ -681,8 +676,7 @@ int hvc_poll(struct hvc_struct *hp)
 
                tty_flip_buffer_push(tty);
        }
-       if (tty)
-               tty_kref_put(tty);
+       tty_kref_put(tty);
 
        return poll_mask;
 }
@@ -880,9 +874,9 @@ int hvc_remove(struct hvc_struct *hp)
        unsigned long flags;
        struct tty_struct *tty;
 
-       spin_lock_irqsave(&hp->lock, flags);
-       tty = tty_kref_get(hp->tty);
+       tty = tty_port_tty_get(&hp->port);
 
+       spin_lock_irqsave(&hp->lock, flags);
        if (hp->index < MAX_NR_HVC_CONSOLES)
                vtermnos[hp->index] = -1;
 
index 926d9e4b6db7aa26b88d1b0639f6fab11425c72b..594a28fe0da0bb5155e1de30b486d8d4b137ad99 100644 (file)
@@ -49,7 +49,6 @@ struct hvc_struct {
        struct tty_port port;
        spinlock_t lock;
        int index;
-       struct tty_struct *tty;
        int count;
        int do_wakeup;
        char *outbuf;
index 6f4dd83d869533a3ff61b3e1b0d0c3d80a0f6c99..59c135dd5d2069ecee49e21480e47e52359fec46 100644 (file)
@@ -377,7 +377,7 @@ int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp)
        pr_devel("HVSI@%x: open !\n", pv->termno);
 
        /* Keep track of the tty data structure */
-       pv->tty = tty_kref_get(hp->tty);
+       pv->tty = tty_port_tty_get(&hp->port);
 
        hvsilib_establish(pv);