TTY: 68328serial, use tty_port_block_til_ready
Since the code is identical, use the tty_port_block_til_ready helper instead of re-implemented variant. The code does not perform rtsdts handling, hence we do not need to provide tty port hooks for them. The default ones will be used instead. The only necessary thing is to provide tty_port_operations. It is empty, but has to be there... Signed-off-by: Jiri Slaby <jslaby@suse.cz> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: linux-m68k@lists.linux-m68k.org Acked-by: Greg Ungerer <gerg@uclinux.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
665569d026
commit
8e32841634
|
@ -1103,96 +1103,6 @@ void rs_hangup(struct tty_struct *tty)
|
||||||
wake_up_interruptible(&info->tport.open_wait);
|
wake_up_interruptible(&info->tport.open_wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* ------------------------------------------------------------
|
|
||||||
* rs_open() and friends
|
|
||||||
* ------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
static int block_til_ready(struct tty_struct *tty, struct file * filp,
|
|
||||||
struct m68k_serial *info)
|
|
||||||
{
|
|
||||||
struct tty_port *port = &info->tport;
|
|
||||||
DECLARE_WAITQUEUE(wait, current);
|
|
||||||
int retval;
|
|
||||||
int do_clocal = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the device is in the middle of being closed, then block
|
|
||||||
* until it's done, and then try again.
|
|
||||||
*/
|
|
||||||
if (port->flags & ASYNC_CLOSING) {
|
|
||||||
interruptible_sleep_on(&port->close_wait);
|
|
||||||
#ifdef SERIAL_DO_RESTART
|
|
||||||
if (port->flags & ASYNC_HUP_NOTIFY)
|
|
||||||
return -EAGAIN;
|
|
||||||
else
|
|
||||||
return -ERESTARTSYS;
|
|
||||||
#else
|
|
||||||
return -EAGAIN;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If non-blocking mode is set, or the port is not enabled,
|
|
||||||
* then make the check up front and then exit.
|
|
||||||
*/
|
|
||||||
if ((filp->f_flags & O_NONBLOCK) ||
|
|
||||||
(tty->flags & (1 << TTY_IO_ERROR))) {
|
|
||||||
port->flags |= ASYNC_NORMAL_ACTIVE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tty->termios->c_cflag & CLOCAL)
|
|
||||||
do_clocal = 1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Block waiting for the carrier detect and the line to become
|
|
||||||
* free (i.e., not in use by the callout). While we are in
|
|
||||||
* this loop, port->count is dropped by one, so that
|
|
||||||
* rs_close() knows when to free things. We restore it upon
|
|
||||||
* exit, either normal or abnormal.
|
|
||||||
*/
|
|
||||||
retval = 0;
|
|
||||||
add_wait_queue(&port->open_wait, &wait);
|
|
||||||
|
|
||||||
port->count--;
|
|
||||||
port->blocked_open++;
|
|
||||||
while (1) {
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
if (tty_hung_up_p(filp) ||
|
|
||||||
!(port->flags & ASYNC_INITIALIZED)) {
|
|
||||||
#ifdef SERIAL_DO_RESTART
|
|
||||||
if (port->flags & ASYNC_HUP_NOTIFY)
|
|
||||||
retval = -EAGAIN;
|
|
||||||
else
|
|
||||||
retval = -ERESTARTSYS;
|
|
||||||
#else
|
|
||||||
retval = -EAGAIN;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!(port->flags & ASYNC_CLOSING) && do_clocal)
|
|
||||||
break;
|
|
||||||
if (signal_pending(current)) {
|
|
||||||
retval = -ERESTARTSYS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tty_unlock();
|
|
||||||
schedule();
|
|
||||||
tty_lock();
|
|
||||||
}
|
|
||||||
current->state = TASK_RUNNING;
|
|
||||||
remove_wait_queue(&port->open_wait, &wait);
|
|
||||||
if (!tty_hung_up_p(filp))
|
|
||||||
port->count++;
|
|
||||||
port->blocked_open--;
|
|
||||||
|
|
||||||
if (retval)
|
|
||||||
return retval;
|
|
||||||
port->flags |= ASYNC_NORMAL_ACTIVE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine is called whenever a serial port is opened. It
|
* This routine is called whenever a serial port is opened. It
|
||||||
* enables interrupts for a serial port, linking in its S structure into
|
* enables interrupts for a serial port, linking in its S structure into
|
||||||
|
@ -1220,7 +1130,7 @@ int rs_open(struct tty_struct *tty, struct file * filp)
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
return block_til_ready(tty, filp, info);
|
return tty_port_block_til_ready(&info->tport, tty, filp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finally, routines used to initialize the serial driver. */
|
/* Finally, routines used to initialize the serial driver. */
|
||||||
|
@ -1248,6 +1158,9 @@ static const struct tty_operations rs_ops = {
|
||||||
.set_ldisc = rs_set_ldisc,
|
.set_ldisc = rs_set_ldisc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct tty_port_operations rs_port_ops = {
|
||||||
|
};
|
||||||
|
|
||||||
/* rs_init inits the driver */
|
/* rs_init inits the driver */
|
||||||
static int __init
|
static int __init
|
||||||
rs68328_init(void)
|
rs68328_init(void)
|
||||||
|
@ -1288,6 +1201,7 @@ rs68328_init(void)
|
||||||
|
|
||||||
info = &m68k_soft[i];
|
info = &m68k_soft[i];
|
||||||
tty_port_init(&info->tport);
|
tty_port_init(&info->tport);
|
||||||
|
info->tport.ops = &rs_port_ops;
|
||||||
info->magic = SERIAL_MAGIC;
|
info->magic = SERIAL_MAGIC;
|
||||||
info->port = (int) &uart_addr[i];
|
info->port = (int) &uart_addr[i];
|
||||||
info->irq = uart_irqs[i];
|
info->irq = uart_irqs[i];
|
||||||
|
|
Loading…
Reference in New Issue