sdio_uart: use tty_port
Add a tty_port object to the sdio uart. For the moment just begin using the tty field of the port, as this is the critical one to clean up. Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
e707c35cbb
commit
b5849b1a82
|
@ -73,6 +73,7 @@ struct uart_icount {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sdio_uart_port {
|
struct sdio_uart_port {
|
||||||
|
struct tty_port port;
|
||||||
struct kref kref;
|
struct kref kref;
|
||||||
struct tty_struct *tty;
|
struct tty_struct *tty;
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
|
@ -172,7 +173,7 @@ static void sdio_uart_port_remove(struct sdio_uart_port *port)
|
||||||
port->func = NULL;
|
port->func = NULL;
|
||||||
mutex_unlock(&port->func_lock);
|
mutex_unlock(&port->func_lock);
|
||||||
if (port->opened)
|
if (port->opened)
|
||||||
tty_hangup(port->tty);
|
tty_hangup(port->port.tty);
|
||||||
mutex_unlock(&port->open_lock);
|
mutex_unlock(&port->open_lock);
|
||||||
sdio_release_irq(func);
|
sdio_release_irq(func);
|
||||||
sdio_disable_func(func);
|
sdio_disable_func(func);
|
||||||
|
@ -391,7 +392,7 @@ static void sdio_uart_stop_rx(struct sdio_uart_port *port)
|
||||||
static void sdio_uart_receive_chars(struct sdio_uart_port *port,
|
static void sdio_uart_receive_chars(struct sdio_uart_port *port,
|
||||||
unsigned int *status)
|
unsigned int *status)
|
||||||
{
|
{
|
||||||
struct tty_struct *tty = port->tty;
|
struct tty_struct *tty = port->port.tty;
|
||||||
unsigned int ch, flag;
|
unsigned int ch, flag;
|
||||||
int max_count = 256;
|
int max_count = 256;
|
||||||
|
|
||||||
|
@ -446,6 +447,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
|
||||||
{
|
{
|
||||||
struct circ_buf *xmit = &port->xmit;
|
struct circ_buf *xmit = &port->xmit;
|
||||||
int count;
|
int count;
|
||||||
|
struct tty_struct *tty = port->port.tty;
|
||||||
|
|
||||||
if (port->x_char) {
|
if (port->x_char) {
|
||||||
sdio_out(port, UART_TX, port->x_char);
|
sdio_out(port, UART_TX, port->x_char);
|
||||||
|
@ -453,7 +455,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
|
||||||
port->x_char = 0;
|
port->x_char = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (circ_empty(xmit) || port->tty->stopped || port->tty->hw_stopped) {
|
if (circ_empty(xmit) || tty->stopped || tty->hw_stopped) {
|
||||||
sdio_uart_stop_tx(port);
|
sdio_uart_stop_tx(port);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -468,7 +470,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
|
||||||
} while (--count > 0);
|
} while (--count > 0);
|
||||||
|
|
||||||
if (circ_chars_pending(xmit) < WAKEUP_CHARS)
|
if (circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||||
tty_wakeup(port->tty);
|
tty_wakeup(tty);
|
||||||
|
|
||||||
if (circ_empty(xmit))
|
if (circ_empty(xmit))
|
||||||
sdio_uart_stop_tx(port);
|
sdio_uart_stop_tx(port);
|
||||||
|
@ -477,6 +479,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
|
||||||
static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
|
static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
struct tty_struct *tty = port->port.tty;
|
||||||
|
|
||||||
status = sdio_in(port, UART_MSR);
|
status = sdio_in(port, UART_MSR);
|
||||||
|
|
||||||
|
@ -491,17 +494,17 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
|
||||||
port->icount.dcd++;
|
port->icount.dcd++;
|
||||||
if (status & UART_MSR_DCTS) {
|
if (status & UART_MSR_DCTS) {
|
||||||
port->icount.cts++;
|
port->icount.cts++;
|
||||||
if (port->tty->termios->c_cflag & CRTSCTS) {
|
if (tty->termios->c_cflag & CRTSCTS) {
|
||||||
int cts = (status & UART_MSR_CTS);
|
int cts = (status & UART_MSR_CTS);
|
||||||
if (port->tty->hw_stopped) {
|
if (tty->hw_stopped) {
|
||||||
if (cts) {
|
if (cts) {
|
||||||
port->tty->hw_stopped = 0;
|
tty->hw_stopped = 0;
|
||||||
sdio_uart_start_tx(port);
|
sdio_uart_start_tx(port);
|
||||||
tty_wakeup(port->tty);
|
tty_wakeup(tty);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!cts) {
|
if (!cts) {
|
||||||
port->tty->hw_stopped = 1;
|
tty->hw_stopped = 1;
|
||||||
sdio_uart_stop_tx(port);
|
sdio_uart_stop_tx(port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -546,12 +549,13 @@ static int sdio_uart_startup(struct sdio_uart_port *port)
|
||||||
{
|
{
|
||||||
unsigned long page;
|
unsigned long page;
|
||||||
int ret;
|
int ret;
|
||||||
|
struct tty_struct *tty = port->port.tty;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the TTY IO error marker - we will only clear this
|
* Set the TTY IO error marker - we will only clear this
|
||||||
* once we have successfully opened the port.
|
* once we have successfully opened the port.
|
||||||
*/
|
*/
|
||||||
set_bit(TTY_IO_ERROR, &port->tty->flags);
|
set_bit(TTY_IO_ERROR, &tty->flags);
|
||||||
|
|
||||||
/* Initialise and allocate the transmit buffer. */
|
/* Initialise and allocate the transmit buffer. */
|
||||||
page = __get_free_page(GFP_KERNEL);
|
page = __get_free_page(GFP_KERNEL);
|
||||||
|
@ -595,14 +599,14 @@ static int sdio_uart_startup(struct sdio_uart_port *port)
|
||||||
port->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE;
|
port->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE;
|
||||||
port->mctrl = TIOCM_OUT2;
|
port->mctrl = TIOCM_OUT2;
|
||||||
|
|
||||||
sdio_uart_change_speed(port, port->tty->termios, NULL);
|
sdio_uart_change_speed(port, tty->termios, NULL);
|
||||||
|
|
||||||
if (port->tty->termios->c_cflag & CBAUD)
|
if (tty->termios->c_cflag & CBAUD)
|
||||||
sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
|
sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
|
||||||
|
|
||||||
if (port->tty->termios->c_cflag & CRTSCTS)
|
if (tty->termios->c_cflag & CRTSCTS)
|
||||||
if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS))
|
if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS))
|
||||||
port->tty->hw_stopped = 1;
|
tty->hw_stopped = 1;
|
||||||
|
|
||||||
clear_bit(TTY_IO_ERROR, &port->tty->flags);
|
clear_bit(TTY_IO_ERROR, &port->tty->flags);
|
||||||
|
|
||||||
|
@ -634,7 +638,7 @@ static void sdio_uart_shutdown(struct sdio_uart_port *port)
|
||||||
/* TODO: wait here for TX FIFO to drain */
|
/* TODO: wait here for TX FIFO to drain */
|
||||||
|
|
||||||
/* Turn off DTR and RTS early. */
|
/* Turn off DTR and RTS early. */
|
||||||
if (port->tty->termios->c_cflag & HUPCL)
|
if (port->port.tty->termios->c_cflag & HUPCL)
|
||||||
sdio_uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
|
sdio_uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
|
||||||
|
|
||||||
/* Disable interrupts from this port */
|
/* Disable interrupts from this port */
|
||||||
|
@ -684,11 +688,11 @@ static int sdio_uart_open(struct tty_struct *tty, struct file *filp)
|
||||||
|
|
||||||
if (!port->opened) {
|
if (!port->opened) {
|
||||||
tty->driver_data = port;
|
tty->driver_data = port;
|
||||||
port->tty = tty;
|
port->port.tty = tty;
|
||||||
ret = sdio_uart_startup(port);
|
ret = sdio_uart_startup(port);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
tty->driver_data = NULL;
|
tty->driver_data = NULL;
|
||||||
port->tty = NULL;
|
port->port.tty = NULL;
|
||||||
mutex_unlock(&port->open_lock);
|
mutex_unlock(&port->open_lock);
|
||||||
sdio_uart_port_put(port);
|
sdio_uart_port_put(port);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -723,7 +727,7 @@ static void sdio_uart_close(struct tty_struct *tty, struct file * filp)
|
||||||
tty->closing = 1;
|
tty->closing = 1;
|
||||||
sdio_uart_shutdown(port);
|
sdio_uart_shutdown(port);
|
||||||
tty_ldisc_flush(tty);
|
tty_ldisc_flush(tty);
|
||||||
port->tty = NULL;
|
port->port.tty = NULL;
|
||||||
tty->driver_data = NULL;
|
tty->driver_data = NULL;
|
||||||
tty->closing = 0;
|
tty->closing = 0;
|
||||||
}
|
}
|
||||||
|
@ -1068,6 +1072,7 @@ static int sdio_uart_probe(struct sdio_func *func,
|
||||||
|
|
||||||
port->func = func;
|
port->func = func;
|
||||||
sdio_set_drvdata(func, port);
|
sdio_set_drvdata(func, port);
|
||||||
|
tty_port_init(&port->port);
|
||||||
|
|
||||||
ret = sdio_uart_add_port(port);
|
ret = sdio_uart_add_port(port);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
Loading…
Reference in a new issue