Work around some errata in the pxa serial code (copied from motorolas 2.4.x tree) Index: linux-2.6.20.7/drivers/serial/pxa.c =================================================================== --- linux-2.6.20.7.orig/drivers/serial/pxa.c 2007-04-21 13:57:46.000000000 -0300 +++ linux-2.6.20.7/drivers/serial/pxa.c 2007-04-21 14:05:03.000000000 -0300 @@ -29,6 +29,10 @@ #define SUPPORT_SYSRQ #endif +#define pxa_buggy_port(x) ({ \ + int cpu_ver; asm("mrc%? p15, 0, %0, c0, c0" : "=r" (cpu_ver)); \ + ((x) == PORT_PXA && (cpu_ver & ~1) == 0x69052100); }) + #include #include #include @@ -195,7 +199,7 @@ if (uart_circ_empty(xmit)) serial_pxa_stop_tx(&up->port); } - +static inline irqreturn_t serial_pxa_irq(int, void *); static void serial_pxa_start_tx(struct uart_port *port) { struct uart_pxa_port *up = (struct uart_pxa_port *)port; @@ -203,6 +207,8 @@ if (!(up->ier & UART_IER_THRI)) { up->ier |= UART_IER_THRI; serial_out(up, UART_IER, up->ier); + if (pxa_buggy_port(up->port.type)) + serial_pxa_irq(up->port.irq, NULL); } } @@ -298,6 +304,9 @@ mcr |= up->mcr; + if (pxa_buggy_port(up->port.type) && up->port.irq != 0) + mcr ^= UART_MCR_OUT2; + serial_out(up, UART_MCR, mcr); }