Commit 7f729ccf authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/home/rmk/linux-2.6-serial

parents cbc74951 ee31b337
...@@ -999,6 +999,9 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) ...@@ -999,6 +999,9 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
serial_outp(up, UART_MCR, save_mcr); serial_outp(up, UART_MCR, save_mcr);
serial8250_clear_fifos(up); serial8250_clear_fifos(up);
(void)serial_in(up, UART_RX); (void)serial_in(up, UART_RX);
if (up->capabilities & UART_CAP_UUE)
serial_outp(up, UART_IER, UART_IER_UUE);
else
serial_outp(up, UART_IER, 0); serial_outp(up, UART_IER, 0);
out: out:
......
...@@ -323,6 +323,8 @@ static const struct pnp_device_id pnp_dev_table[] = { ...@@ -323,6 +323,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
{ "USR9180", 0 }, { "USR9180", 0 },
/* U.S. Robotics 56K Voice INT PnP*/ /* U.S. Robotics 56K Voice INT PnP*/
{ "USR9190", 0 }, { "USR9190", 0 },
/* HP Compaq Tablet PC tc1100 Wacom tablet */
{ "WACF005", 0 },
/* Rockwell's (PORALiNK) 33600 INT PNP */ /* Rockwell's (PORALiNK) 33600 INT PNP */
{ "WCI0003", 0 }, { "WCI0003", 0 },
/* Unkown PnP modems */ /* Unkown PnP modems */
......
...@@ -645,9 +645,9 @@ static void __init dz_init_ports(void) ...@@ -645,9 +645,9 @@ static void __init dz_init_ports(void)
if (mips_machtype == MACH_DS23100 || if (mips_machtype == MACH_DS23100 ||
mips_machtype == MACH_DS5100) mips_machtype == MACH_DS5100)
base = (unsigned long) KN01_DZ11_BASE; base = CKSEG1ADDR(KN01_SLOT_BASE + KN01_DZ11);
else else
base = (unsigned long) KN02_DZ11_BASE; base = CKSEG1ADDR(KN02_SLOT_BASE + KN02_DZ11);
for (i = 0, dport = dz_ports; i < DZ_NB_PORT; i++, dport++) { for (i = 0, dport = dz_ports; i < DZ_NB_PORT; i++, dport++) {
spin_lock_init(&dport->port.lock); spin_lock_init(&dport->port.lock);
......
...@@ -725,7 +725,7 @@ mpc52xx_uart_probe(struct platform_device *dev) ...@@ -725,7 +725,7 @@ mpc52xx_uart_probe(struct platform_device *dev)
int i, idx, ret; int i, idx, ret;
/* Check validity & presence */ /* Check validity & presence */
idx = pdev->id; idx = dev->id;
if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM) if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM)
return -EINVAL; return -EINVAL;
...@@ -748,7 +748,7 @@ mpc52xx_uart_probe(struct platform_device *dev) ...@@ -748,7 +748,7 @@ mpc52xx_uart_probe(struct platform_device *dev)
port->ops = &mpc52xx_uart_ops; port->ops = &mpc52xx_uart_ops;
/* Search for IRQ and mapbase */ /* Search for IRQ and mapbase */
for (i=0 ; i<pdev->num_resources ; i++, res++) { for (i=0 ; i<dev->num_resources ; i++, res++) {
if (res->flags & IORESOURCE_MEM) if (res->flags & IORESOURCE_MEM)
port->mapbase = res->start; port->mapbase = res->start;
else if (res->flags & IORESOURCE_IRQ) else if (res->flags & IORESOURCE_IRQ)
......
...@@ -156,7 +156,7 @@ static void sa1100_stop_tx(struct uart_port *port) ...@@ -156,7 +156,7 @@ static void sa1100_stop_tx(struct uart_port *port)
} }
/* /*
* interrupts may not be disabled on entry * port locked and interrupts disabled
*/ */
static void sa1100_start_tx(struct uart_port *port) static void sa1100_start_tx(struct uart_port *port)
{ {
...@@ -164,11 +164,9 @@ static void sa1100_start_tx(struct uart_port *port) ...@@ -164,11 +164,9 @@ static void sa1100_start_tx(struct uart_port *port)
unsigned long flags; unsigned long flags;
u32 utcr3; u32 utcr3;
spin_lock_irqsave(&sport->port.lock, flags);
utcr3 = UART_GET_UTCR3(sport); utcr3 = UART_GET_UTCR3(sport);
sport->port.read_status_mask |= UTSR0_TO_SM(UTSR0_TFS); sport->port.read_status_mask |= UTSR0_TO_SM(UTSR0_TFS);
UART_PUT_UTCR3(sport, utcr3 | UTCR3_TIE); UART_PUT_UTCR3(sport, utcr3 | UTCR3_TIE);
spin_unlock_irqrestore(&sport->port.lock, flags);
} }
/* /*
......
...@@ -209,8 +209,14 @@ static void uart_shutdown(struct uart_state *state) ...@@ -209,8 +209,14 @@ static void uart_shutdown(struct uart_state *state)
struct uart_info *info = state->info; struct uart_info *info = state->info;
struct uart_port *port = state->port; struct uart_port *port = state->port;
if (!(info->flags & UIF_INITIALIZED)) /*
return; * Set the TTY IO error marker
*/
if (info->tty)
set_bit(TTY_IO_ERROR, &info->tty->flags);
if (info->flags & UIF_INITIALIZED) {
info->flags &= ~UIF_INITIALIZED;
/* /*
* Turn off DTR and RTS early. * Turn off DTR and RTS early.
...@@ -236,6 +242,12 @@ static void uart_shutdown(struct uart_state *state) ...@@ -236,6 +242,12 @@ static void uart_shutdown(struct uart_state *state)
* Ensure that the IRQ handler isn't running on another CPU. * Ensure that the IRQ handler isn't running on another CPU.
*/ */
synchronize_irq(port->irq); synchronize_irq(port->irq);
}
/*
* kill off our tasklet
*/
tasklet_kill(&info->tlet);
/* /*
* Free the transmit buffer page. * Free the transmit buffer page.
...@@ -244,15 +256,6 @@ static void uart_shutdown(struct uart_state *state) ...@@ -244,15 +256,6 @@ static void uart_shutdown(struct uart_state *state)
free_page((unsigned long)info->xmit.buf); free_page((unsigned long)info->xmit.buf);
info->xmit.buf = NULL; info->xmit.buf = NULL;
} }
/*
* kill off our tasklet
*/
tasklet_kill(&info->tlet);
if (info->tty)
set_bit(TTY_IO_ERROR, &info->tty->flags);
info->flags &= ~UIF_INITIALIZED;
} }
/** /**
...@@ -1928,14 +1931,25 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) ...@@ -1928,14 +1931,25 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port)
if (state->info && state->info->flags & UIF_INITIALIZED) { if (state->info && state->info->flags & UIF_INITIALIZED) {
struct uart_ops *ops = port->ops; struct uart_ops *ops = port->ops;
int ret;
ops->set_mctrl(port, 0); ops->set_mctrl(port, 0);
ops->startup(port); ret = ops->startup(port);
if (ret == 0) {
uart_change_speed(state, NULL); uart_change_speed(state, NULL);
spin_lock_irq(&port->lock); spin_lock_irq(&port->lock);
ops->set_mctrl(port, port->mctrl); ops->set_mctrl(port, port->mctrl);
ops->start_tx(port); ops->start_tx(port);
spin_unlock_irq(&port->lock); spin_unlock_irq(&port->lock);
} else {
/*
* Failed to resume - maybe hardware went away?
* Clear the "initialized" flag so we won't try
* to call the low level drivers shutdown method.
*/
state->info->flags &= ~UIF_INITIALIZED;
uart_shutdown(state);
}
} }
up(&state->sem); up(&state->sem);
......
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