Commit 467712c9 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman

TTY: 68328serial, propagate tty

We need tty at some places, but info->tty might be NULL at those. Let
us propagate tty from callers where we know we have a valid tty. This
will make a switch to tty refcounting simpler.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: linux-m68k@lists.linux-m68k.org
Acked-by: default avatarGreg Ungerer <gerg@uclinux.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a85dd82c
...@@ -140,7 +140,7 @@ m68328_uart *uart_addr = (m68328_uart *)USTCNT_ADDR; ...@@ -140,7 +140,7 @@ m68328_uart *uart_addr = (m68328_uart *)USTCNT_ADDR;
struct tty_driver *serial_driver; struct tty_driver *serial_driver;
static void change_speed(struct m68k_serial *info); static void change_speed(struct m68k_serial *info, struct tty_struct *tty);
/* /*
* Setup for console. Argument comes from the boot command line. * Setup for console. Argument comes from the boot command line.
...@@ -263,9 +263,9 @@ static void rs_start(struct tty_struct *tty) ...@@ -263,9 +263,9 @@ static void rs_start(struct tty_struct *tty)
local_irq_restore(flags); local_irq_restore(flags);
} }
static void receive_chars(struct m68k_serial *info, unsigned short rx) static void receive_chars(struct m68k_serial *info, struct tty_struct *tty,
unsigned short rx)
{ {
struct tty_struct *tty = info->tty;
m68328_uart *uart = &uart_addr[info->line]; m68328_uart *uart = &uart_addr[info->line];
unsigned char ch, flag; unsigned char ch, flag;
...@@ -317,7 +317,7 @@ static void receive_chars(struct m68k_serial *info, unsigned short rx) ...@@ -317,7 +317,7 @@ static void receive_chars(struct m68k_serial *info, unsigned short rx)
return; return;
} }
static void transmit_chars(struct m68k_serial *info) static void transmit_chars(struct m68k_serial *info, struct tty_struct *tty)
{ {
m68328_uart *uart = &uart_addr[info->line]; m68328_uart *uart = &uart_addr[info->line];
...@@ -328,7 +328,7 @@ static void transmit_chars(struct m68k_serial *info) ...@@ -328,7 +328,7 @@ static void transmit_chars(struct m68k_serial *info)
goto clear_and_return; goto clear_and_return;
} }
if((info->xmit_cnt <= 0) || info->tty->stopped) { if ((info->xmit_cnt <= 0) || !tty || tty->stopped) {
/* That's peculiar... TX ints off */ /* That's peculiar... TX ints off */
uart->ustcnt &= ~USTCNT_TX_INTR_MASK; uart->ustcnt &= ~USTCNT_TX_INTR_MASK;
goto clear_and_return; goto clear_and_return;
...@@ -356,6 +356,7 @@ static void transmit_chars(struct m68k_serial *info) ...@@ -356,6 +356,7 @@ static void transmit_chars(struct m68k_serial *info)
irqreturn_t rs_interrupt(int irq, void *dev_id) irqreturn_t rs_interrupt(int irq, void *dev_id)
{ {
struct m68k_serial *info = dev_id; struct m68k_serial *info = dev_id;
struct tty_struct *tty = info->tty;
m68328_uart *uart; m68328_uart *uart;
unsigned short rx; unsigned short rx;
unsigned short tx; unsigned short tx;
...@@ -366,15 +367,17 @@ irqreturn_t rs_interrupt(int irq, void *dev_id) ...@@ -366,15 +367,17 @@ irqreturn_t rs_interrupt(int irq, void *dev_id)
#ifdef USE_INTS #ifdef USE_INTS
tx = uart->utx.w; tx = uart->utx.w;
if (rx & URX_DATA_READY) receive_chars(info, rx); if (rx & URX_DATA_READY)
if (tx & UTX_TX_AVAIL) transmit_chars(info); receive_chars(info, tty, rx);
if (tx & UTX_TX_AVAIL)
transmit_chars(info, tty);
#else #else
receive_chars(info, rx); receive_chars(info, tty, rx);
#endif #endif
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int startup(struct m68k_serial * info) static int startup(struct m68k_serial *info, struct tty_struct *tty)
{ {
m68328_uart *uart = &uart_addr[info->line]; m68328_uart *uart = &uart_addr[info->line];
unsigned long flags; unsigned long flags;
...@@ -409,15 +412,15 @@ static int startup(struct m68k_serial * info) ...@@ -409,15 +412,15 @@ static int startup(struct m68k_serial * info)
uart->ustcnt = USTCNT_UEN | USTCNT_RXEN | USTCNT_RX_INTR_MASK; uart->ustcnt = USTCNT_UEN | USTCNT_RXEN | USTCNT_RX_INTR_MASK;
#endif #endif
if (info->tty) if (tty)
clear_bit(TTY_IO_ERROR, &info->tty->flags); clear_bit(TTY_IO_ERROR, &tty->flags);
info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
/* /*
* and set the speed of the serial port * and set the speed of the serial port
*/ */
change_speed(info); change_speed(info, tty);
info->tport.flags |= ASYNC_INITIALIZED; info->tport.flags |= ASYNC_INITIALIZED;
local_irq_restore(flags); local_irq_restore(flags);
...@@ -428,7 +431,7 @@ static int startup(struct m68k_serial * info) ...@@ -428,7 +431,7 @@ static int startup(struct m68k_serial * info)
* This routine will shutdown a serial port; interrupts are disabled, and * This routine will shutdown a serial port; interrupts are disabled, and
* DTR is dropped if the hangup on close termio flag is on. * DTR is dropped if the hangup on close termio flag is on.
*/ */
static void shutdown(struct m68k_serial * info) static void shutdown(struct m68k_serial *info, struct tty_struct *tty)
{ {
m68328_uart *uart = &uart_addr[info->line]; m68328_uart *uart = &uart_addr[info->line];
unsigned long flags; unsigned long flags;
...@@ -444,8 +447,8 @@ static void shutdown(struct m68k_serial * info) ...@@ -444,8 +447,8 @@ static void shutdown(struct m68k_serial * info)
info->xmit_buf = 0; info->xmit_buf = 0;
} }
if (info->tty) if (tty)
set_bit(TTY_IO_ERROR, &info->tty->flags); set_bit(TTY_IO_ERROR, &tty->flags);
info->tport.flags &= ~ASYNC_INITIALIZED; info->tport.flags &= ~ASYNC_INITIALIZED;
local_irq_restore(flags); local_irq_restore(flags);
...@@ -503,7 +506,7 @@ struct { ...@@ -503,7 +506,7 @@ struct {
* This routine is called to set the UART divisor registers to match * This routine is called to set the UART divisor registers to match
* the specified baud rate for a serial port. * the specified baud rate for a serial port.
*/ */
static void change_speed(struct m68k_serial *info) static void change_speed(struct m68k_serial *info, struct tty_struct *tty)
{ {
m68328_uart *uart = &uart_addr[info->line]; m68328_uart *uart = &uart_addr[info->line];
unsigned short port; unsigned short port;
...@@ -511,9 +514,7 @@ static void change_speed(struct m68k_serial *info) ...@@ -511,9 +514,7 @@ static void change_speed(struct m68k_serial *info)
unsigned cflag; unsigned cflag;
int i; int i;
if (!info->tty || !info->tty->termios) cflag = tty->termios->c_cflag;
return;
cflag = info->tty->termios->c_cflag;
if (!(port = info->port)) if (!(port = info->port))
return; return;
...@@ -832,7 +833,7 @@ static int get_serial_info(struct m68k_serial * info, ...@@ -832,7 +833,7 @@ static int get_serial_info(struct m68k_serial * info,
return 0; return 0;
} }
static int set_serial_info(struct m68k_serial * info, static int set_serial_info(struct m68k_serial *info, struct tty_struct *tty,
struct serial_struct * new_info) struct serial_struct * new_info)
{ {
struct tty_port *port = &info->tport; struct tty_port *port = &info->tport;
...@@ -875,7 +876,7 @@ static int set_serial_info(struct m68k_serial * info, ...@@ -875,7 +876,7 @@ static int set_serial_info(struct m68k_serial * info,
port->closing_wait = new_serial.closing_wait; port->closing_wait = new_serial.closing_wait;
check_and_exit: check_and_exit:
retval = startup(info); retval = startup(info, tty);
return retval; return retval;
} }
...@@ -961,7 +962,7 @@ static int rs_ioctl(struct tty_struct *tty, ...@@ -961,7 +962,7 @@ static int rs_ioctl(struct tty_struct *tty,
return get_serial_info(info, return get_serial_info(info,
(struct serial_struct *) arg); (struct serial_struct *) arg);
case TIOCSSERIAL: case TIOCSSERIAL:
return set_serial_info(info, return set_serial_info(info, tty,
(struct serial_struct *) arg); (struct serial_struct *) arg);
case TIOCSERGETLSR: /* Get line status register */ case TIOCSERGETLSR: /* Get line status register */
return get_lsr_info(info, (unsigned int *) arg); return get_lsr_info(info, (unsigned int *) arg);
...@@ -980,7 +981,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) ...@@ -980,7 +981,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
{ {
struct m68k_serial *info = (struct m68k_serial *)tty->driver_data; struct m68k_serial *info = (struct m68k_serial *)tty->driver_data;
change_speed(info); change_speed(info, tty);
if ((old_termios->c_cflag & CRTSCTS) && if ((old_termios->c_cflag & CRTSCTS) &&
!(tty->termios->c_cflag & CRTSCTS)) { !(tty->termios->c_cflag & CRTSCTS)) {
...@@ -1056,7 +1057,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) ...@@ -1056,7 +1057,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
uart->ustcnt &= ~USTCNT_RXEN; uart->ustcnt &= ~USTCNT_RXEN;
uart->ustcnt &= ~(USTCNT_RXEN | USTCNT_RX_INTR_MASK); uart->ustcnt &= ~(USTCNT_RXEN | USTCNT_RX_INTR_MASK);
shutdown(info); shutdown(info, tty);
rs_flush_buffer(tty); rs_flush_buffer(tty);
tty_ldisc_flush(tty); tty_ldisc_flush(tty);
...@@ -1094,7 +1095,7 @@ void rs_hangup(struct tty_struct *tty) ...@@ -1094,7 +1095,7 @@ void rs_hangup(struct tty_struct *tty)
return; return;
rs_flush_buffer(tty); rs_flush_buffer(tty);
shutdown(info); shutdown(info, tty);
info->tport.count = 0; info->tport.count = 0;
info->tport.flags &= ~ASYNC_NORMAL_ACTIVE; info->tport.flags &= ~ASYNC_NORMAL_ACTIVE;
info->tty = NULL; info->tty = NULL;
...@@ -1214,7 +1215,7 @@ int rs_open(struct tty_struct *tty, struct file * filp) ...@@ -1214,7 +1215,7 @@ int rs_open(struct tty_struct *tty, struct file * filp)
/* /*
* Start up serial port * Start up serial port
*/ */
retval = startup(info); retval = startup(info, tty);
if (retval) if (retval)
return retval; return retval;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment