Merge tag 's390-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux-2.6-microblaze.git] / drivers / s390 / char / con3215.c
index 671efee..1fd5bca 100644 (file)
@@ -85,7 +85,6 @@ struct raw3215_info {
        int written;                  /* number of bytes in write requests */
        struct raw3215_req *queued_read; /* pointer to queued read requests */
        struct raw3215_req *queued_write;/* pointer to queued write requests */
-       struct tasklet_struct tlet;   /* tasklet to invoke tty_wakeup */
        wait_queue_head_t empty_wait; /* wait queue for flushing */
        struct timer_list timer;      /* timer for delayed output */
        int line_pos;                 /* position on the line (for tabs) */
@@ -99,7 +98,7 @@ static DEFINE_SPINLOCK(raw3215_device_lock);
 /* list of free request structures */
 static struct raw3215_req *raw3215_freelist;
 /* spinlock to protect free list */
-static spinlock_t raw3215_freelist_lock;
+static DEFINE_SPINLOCK(raw3215_freelist_lock);
 
 static struct tty_driver *tty3215_driver;
 
@@ -329,21 +328,6 @@ static inline void raw3215_try_io(struct raw3215_info *raw)
        }
 }
 
-/*
- * Call tty_wakeup from tasklet context
- */
-static void raw3215_wakeup(unsigned long data)
-{
-       struct raw3215_info *raw = (struct raw3215_info *) data;
-       struct tty_struct *tty;
-
-       tty = tty_port_tty_get(&raw->port);
-       if (tty) {
-               tty_wakeup(tty);
-               tty_kref_put(tty);
-       }
-}
-
 /*
  * Try to start the next IO and wake up processes waiting on the tty.
  */
@@ -352,7 +336,7 @@ static void raw3215_next_io(struct raw3215_info *raw, struct tty_struct *tty)
        raw3215_mk_write_req(raw);
        raw3215_try_io(raw);
        if (tty && RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE)
-               tasklet_schedule(&raw->tlet);
+               tty_wakeup(tty);
 }
 
 /*
@@ -644,7 +628,6 @@ static struct raw3215_info *raw3215_alloc_info(void)
 
        timer_setup(&info->timer, raw3215_timeout, 0);
        init_waitqueue_head(&info->empty_wait);
-       tasklet_init(&info->tlet, raw3215_wakeup, (unsigned long)info);
        tty_port_init(&info->port);
 
        return info;
@@ -850,7 +833,6 @@ static int __init con3215_init(void)
 
        /* allocate 3215 request structures */
        raw3215_freelist = NULL;
-       spin_lock_init(&raw3215_freelist_lock);
        for (i = 0; i < NR_3215_REQ; i++) {
                req = kzalloc(sizeof(struct raw3215_req), GFP_KERNEL | GFP_DMA);
                if (!req)
@@ -928,15 +910,13 @@ static int tty3215_open(struct tty_struct *tty, struct file * filp)
  */
 static void tty3215_close(struct tty_struct *tty, struct file * filp)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        if (raw == NULL || tty->count > 1)
                return;
        tty->closing = 1;
        /* Shutdown the terminal */
        raw3215_shutdown(raw);
-       tasklet_kill(&raw->tlet);
        tty->closing = 0;
        tty_port_tty_set(&raw->port, NULL);
 }
@@ -946,9 +926,7 @@ static void tty3215_close(struct tty_struct *tty, struct file * filp)
  */
 static int tty3215_write_room(struct tty_struct *tty)
 {
-       struct raw3215_info *raw;
-
-       raw = (struct raw3215_info *) tty->driver_data;
+       struct raw3215_info *raw = tty->driver_data;
 
        /* Subtract TAB_STOP_SIZE to allow for a tab, 8 <<< 64K */
        if ((RAW3215_BUFFER_SIZE - raw->count - TAB_STOP_SIZE) >= 0)
@@ -963,12 +941,9 @@ static int tty3215_write_room(struct tty_struct *tty)
 static int tty3215_write(struct tty_struct * tty,
                         const unsigned char *buf, int count)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
        int i, written;
 
-       if (!tty)
-               return 0;
-       raw = (struct raw3215_info *) tty->driver_data;
        written = count;
        while (count > 0) {
                for (i = 0; i < count; i++)
@@ -991,12 +966,10 @@ static int tty3215_write(struct tty_struct * tty,
  */
 static int tty3215_put_char(struct tty_struct *tty, unsigned char ch)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
 
-       if (!tty)
-               return 0;
-       raw = (struct raw3215_info *) tty->driver_data;
        raw3215_putchar(raw, ch);
+
        return 1;
 }
 
@@ -1009,17 +982,15 @@ static void tty3215_flush_chars(struct tty_struct *tty)
  */
 static int tty3215_chars_in_buffer(struct tty_struct *tty)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        return raw->count;
 }
 
 static void tty3215_flush_buffer(struct tty_struct *tty)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        raw3215_flush_buffer(raw);
        tty_wakeup(tty);
 }
@@ -1029,9 +1000,8 @@ static void tty3215_flush_buffer(struct tty_struct *tty)
  */
 static void tty3215_throttle(struct tty_struct * tty)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        raw->flags |= RAW3215_THROTTLED;
 }
 
@@ -1040,10 +1010,9 @@ static void tty3215_throttle(struct tty_struct * tty)
  */
 static void tty3215_unthrottle(struct tty_struct * tty)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
        unsigned long flags;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        if (raw->flags & RAW3215_THROTTLED) {
                spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
                raw->flags &= ~RAW3215_THROTTLED;
@@ -1057,9 +1026,8 @@ static void tty3215_unthrottle(struct tty_struct * tty)
  */
 static void tty3215_stop(struct tty_struct *tty)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        raw->flags |= RAW3215_STOPPED;
 }
 
@@ -1068,10 +1036,9 @@ static void tty3215_stop(struct tty_struct *tty)
  */
 static void tty3215_start(struct tty_struct *tty)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
        unsigned long flags;
 
-       raw = (struct raw3215_info *) tty->driver_data;
        if (raw->flags & RAW3215_STOPPED) {
                spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
                raw->flags &= ~RAW3215_STOPPED;