Staging: ipack/devices/ipoctal: put ipoctal_channel into tty->driver_data.
authorJens Taprogge <jens.taprogge@taprogge.org>
Wed, 12 Sep 2012 12:55:28 +0000 (14:55 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Sep 2012 16:54:15 +0000 (09:54 -0700)
Each tty's driver_data is now pointing to the channel it is talking to.  struct
ipoctal_channel contains all the information the callbacks require to do their
work.

Signed-off-by: Jens Taprogge <jens.taprogge@taprogge.org>
Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/ipack/devices/ipoctal.c

index c963456..70dc7a2 100644 (file)
@@ -42,6 +42,8 @@ struct ipoctal_channel {
        struct tty_port                 tty_port;
        union scc2698_channel __iomem   *regs;
        union scc2698_block __iomem     *block_regs;
+       unsigned int                    board_id;
+       unsigned char                   *board_write;
 };
 
 struct ipoctal {
@@ -104,7 +106,7 @@ static int ipoctal_open(struct tty_struct *tty, struct file *file)
        if (atomic_read(&channel->open))
                return -EBUSY;
 
-       tty->driver_data = ipoctal;
+       tty->driver_data = channel;
 
        res = tty_port_open(&channel->tty_port, tty, file);
        if (res)
@@ -124,15 +126,8 @@ static void ipoctal_reset_stats(struct ipoctal_stats *stats)
        stats->parity_err = 0;
 }
 
-static void ipoctal_free_channel(struct tty_struct *tty)
+static void ipoctal_free_channel(struct ipoctal_channel *channel)
 {
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel;
-
-       if (ipoctal == NULL)
-               return;
-       channel = &ipoctal->channel[tty->index];
-
        ipoctal_reset_stats(&channel->stats);
        channel->pointer_read = 0;
        channel->pointer_write = 0;
@@ -141,20 +136,18 @@ static void ipoctal_free_channel(struct tty_struct *tty)
 
 static void ipoctal_close(struct tty_struct *tty, struct file *filp)
 {
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel = &ipoctal->channel[tty->index];
+       struct ipoctal_channel *channel = tty->driver_data;
 
        tty_port_close(&channel->tty_port, tty, filp);
 
        if (atomic_dec_and_test(&channel->open))
-               ipoctal_free_channel(tty);
+               ipoctal_free_channel(channel);
 }
 
 static int ipoctal_get_icount(struct tty_struct *tty,
                              struct serial_icounter_struct *icount)
 {
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel = &ipoctal->channel[tty->index];
+       struct ipoctal_channel *channel = tty->driver_data;
 
        icount->cts = 0;
        icount->dsr = 0;
@@ -370,6 +363,8 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
                struct ipoctal_channel *channel = &ipoctal->channel[i];
                channel->regs = chan_regs + i;
                channel->block_regs = block_regs + (i >> 1);
+               channel->board_write = &ipoctal->write;
+               channel->board_id = ipoctal->board_id;
 
                iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr);
                iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr);
@@ -492,17 +487,16 @@ static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
        return i;
 }
 
-static int ipoctal_write(struct ipoctal *ipoctal, unsigned int ichannel,
+static int ipoctal_write(struct ipoctal_channel *channel,
                         const unsigned char *buf, int count)
 {
-       struct ipoctal_channel *channel = &ipoctal->channel[ichannel];
        channel->nb_bytes = 0;
        channel->count_wr = 0;
 
        ipoctal_copy_write_buffer(channel, buf, count);
 
        /* As the IP-OCTAL 485 only supports half duplex, do it manually */
-       if (ipoctal->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) {
+       if (channel->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) {
                iowrite8(CR_DISABLE_RX, &channel->regs->w.cr);
                iowrite8(CR_CMD_ASSERT_RTSN, &channel->regs->w.cr);
        }
@@ -512,33 +506,31 @@ static int ipoctal_write(struct ipoctal *ipoctal, unsigned int ichannel,
         * operations
         */
        iowrite8(CR_ENABLE_TX, &channel->regs->w.cr);
-       wait_event_interruptible(channel->queue, ipoctal->write);
+       wait_event_interruptible(channel->queue, *channel->board_write);
        iowrite8(CR_DISABLE_TX, &channel->regs->w.cr);
 
-       ipoctal->write = 0;
+       *channel->board_write = 0;
        return channel->count_wr;
 }
 
 static int ipoctal_write_tty(struct tty_struct *tty,
                             const unsigned char *buf, int count)
 {
-       struct ipoctal *ipoctal = tty->driver_data;
+       struct ipoctal_channel *channel = tty->driver_data;
 
-       return ipoctal_write(ipoctal, tty->index, buf, count);
+       return ipoctal_write(channel, buf, count);
 }
 
 static int ipoctal_write_room(struct tty_struct *tty)
 {
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel = &ipoctal->channel[tty->index];
+       struct ipoctal_channel *channel = tty->driver_data;
 
        return PAGE_SIZE - channel->nb_bytes;
 }
 
 static int ipoctal_chars_in_buffer(struct tty_struct *tty)
 {
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel = &ipoctal->channel[tty->index];
+       struct ipoctal_channel *channel = tty->driver_data;
 
        return channel->nb_bytes;
 }
@@ -550,8 +542,7 @@ static void ipoctal_set_termios(struct tty_struct *tty,
        unsigned char mr1 = 0;
        unsigned char mr2 = 0;
        unsigned char csr = 0;
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel = &ipoctal->channel[tty->index];
+       struct ipoctal_channel *channel = tty->driver_data;
        speed_t baud;
 
        cflag = tty->termios->c_cflag;
@@ -598,7 +589,7 @@ static void ipoctal_set_termios(struct tty_struct *tty,
                mr2 |= MR2_STOP_BITS_LENGTH_1;
 
        /* Set the flow control */
-       switch (ipoctal->board_id) {
+       switch (channel->board_id) {
        case IPACK1_DEVICE_ID_SBS_OCTAL_232:
                if (cflag & CRTSCTS) {
                        mr1 |= MR1_RxRTS_CONTROL_ON;
@@ -685,10 +676,9 @@ static void ipoctal_set_termios(struct tty_struct *tty,
 static void ipoctal_hangup(struct tty_struct *tty)
 {
        unsigned long flags;
-       struct ipoctal *ipoctal = tty->driver_data;
-       struct ipoctal_channel *channel = &ipoctal->channel[tty->index];
+       struct ipoctal_channel *channel = tty->driver_data;
 
-       if (ipoctal == NULL)
+       if (channel == NULL)
                return;
 
        spin_lock_irqsave(&channel->lock, flags);