diff options
Diffstat (limited to 'recipes/linux/linux-gumstix-2.6.15/bugfix-serial-register-status.patch')
-rw-r--r-- | recipes/linux/linux-gumstix-2.6.15/bugfix-serial-register-status.patch | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/recipes/linux/linux-gumstix-2.6.15/bugfix-serial-register-status.patch b/recipes/linux/linux-gumstix-2.6.15/bugfix-serial-register-status.patch new file mode 100644 index 0000000000..fcef7c27c3 --- /dev/null +++ b/recipes/linux/linux-gumstix-2.6.15/bugfix-serial-register-status.patch @@ -0,0 +1,70 @@ +Index: linux-2.6.15gum/drivers/serial/pxa.c +=================================================================== +--- linux-2.6.15gum.orig/drivers/serial/pxa.c ++++ linux-2.6.15gum/drivers/serial/pxa.c +@@ -58,6 +58,8 @@ struct uart_pxa_port { + unsigned int lsr_break_flag; + unsigned int cken; + char *name; ++ unsigned int msr; //djf ++ unsigned int lsr; //djf + }; + + static inline unsigned int serial_in(struct uart_pxa_port *up, int offset) +@@ -169,6 +171,7 @@ receive_chars(struct uart_pxa_port *up, + + ignore_char: + *status = serial_in(up, UART_LSR); ++ up->lsr = *status; + } while ((*status & UART_LSR_DR) && (max_count-- > 0)); + tty_flip_buffer_push(tty); + } +@@ -221,7 +224,7 @@ static inline void check_modem_status(st + int status; + + status = serial_in(up, UART_MSR); +- ++ up->msr = status; + if ((status & UART_MSR_ANY_DELTA) == 0) + return; + +@@ -253,6 +256,7 @@ serial_pxa_irq(int irq, void *dev_id, st + //printk(KERN_WARNING "serial_pxa_irq: odd -- interrupt triggered, but no interrupt in IIR: %08x\n",iir); + } + lsr = serial_in(up, UART_LSR); ++ up->lsr = lsr; + if (lsr & UART_LSR_DR) + receive_chars(up, &lsr, regs); + check_modem_status(up); +@@ -269,7 +273,8 @@ static unsigned int serial_pxa_tx_empty( + unsigned int ret; + + spin_lock_irqsave(&up->port.lock, flags); +- ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; ++ //ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; ++ ret = up->lsr * UART_LSR_TEMT ? TIOCSER_TEMT : 0; + spin_unlock_irqrestore(&up->port.lock, flags); + + return ret; +@@ -281,7 +286,7 @@ static unsigned int serial_pxa_get_mctrl + unsigned char status; + unsigned int ret; + +- status = serial_in(up, UART_MSR); ++ status = up->msr; + + ret = 0; + if (status & UART_MSR_DCD) +@@ -411,10 +416,10 @@ static int serial_pxa_startup(struct uar + /* + * And clear the interrupt registers again for luck. + */ +- (void) serial_in(up, UART_LSR); ++ up->lsr = serial_in(up, UART_LSR); + (void) serial_in(up, UART_RX); + (void) serial_in(up, UART_IIR); +- (void) serial_in(up, UART_MSR); ++ up->msr = serial_in(up, UART_MSR); + + return 0; + } |