git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6
[pandora-kernel.git]
/
drivers
/
serial
/
8250.c
diff --git
a/drivers/serial/8250.c
b/drivers/serial/8250.c
index
0995430
..
10c2daa
100644
(file)
--- a/
drivers/serial/8250.c
+++ b/
drivers/serial/8250.c
@@
-299,6
+299,7
@@
static inline int map_8250_out_reg(struct uart_8250_port *up, int offset)
static unsigned int serial_in(struct uart_8250_port *up, int offset)
{
static unsigned int serial_in(struct uart_8250_port *up, int offset)
{
+ unsigned int tmp;
offset = map_8250_in_reg(up, offset) << up->port.regshift;
switch (up->port.iotype) {
offset = map_8250_in_reg(up, offset) << up->port.regshift;
switch (up->port.iotype) {
@@
-317,6
+318,13
@@
static unsigned int serial_in(struct uart_8250_port *up, int offset)
return __raw_readl(up->port.membase + offset);
#endif
return __raw_readl(up->port.membase + offset);
#endif
+ case UPIO_TSI:
+ if (offset == UART_IIR) {
+ tmp = readl(up->port.membase + (UART_IIR & ~3));
+ return (tmp >> 16) & 0xff; /* UART_IIR % 4 == 2 */
+ } else
+ return readb(up->port.membase + offset);
+
default:
return inb(up->port.iobase + offset);
}
default:
return inb(up->port.iobase + offset);
}
@@
-346,6
+354,10
@@
serial_out(struct uart_8250_port *up, int offset, int value)
__raw_writel(value, up->port.membase + offset);
break;
#endif
__raw_writel(value, up->port.membase + offset);
break;
#endif
+ case UPIO_TSI:
+ if (!((offset == UART_IER) && (value & UART_IER_UUE)))
+ writeb(value, up->port.membase + offset);
+ break;
default:
outb(value, up->port.iobase + offset);
default:
outb(value, up->port.iobase + offset);
@@
-2240,10
+2252,14
@@
serial8250_console_write(struct console *co, const char *s, unsigned int count)
touch_nmi_watchdog();
touch_nmi_watchdog();
- if (oops_in_progress) {
- locked = spin_trylock_irqsave(&up->port.lock, flags);
+ local_irq_save(flags);
+ if (up->port.sysrq) {
+ /* serial8250_handle_port() already took the lock */
+ locked = 0;
+ } else if (oops_in_progress) {
+ locked = spin_trylock(&up->port.lock);
} else
} else
- spin_lock
_irqsave(&up->port.lock, flags
);
+ spin_lock
(&up->port.lock
);
/*
* First save the IER then disable the interrupts
/*
* First save the IER then disable the interrupts
@@
-2265,7
+2281,8
@@
serial8250_console_write(struct console *co, const char *s, unsigned int count)
serial_out(up, UART_IER, ier);
if (locked)
serial_out(up, UART_IER, ier);
if (locked)
- spin_unlock_irqrestore(&up->port.lock, flags);
+ spin_unlock(&up->port.lock);
+ local_irq_restore(flags);
}
static int serial8250_console_setup(struct console *co, char *options)
}
static int serial8250_console_setup(struct console *co, char *options)