diff options
Diffstat (limited to 'target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch')
-rw-r--r-- | target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch b/target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch new file mode 100644 index 0000000000..e25436b8ee --- /dev/null +++ b/target/linux/pxa/patches-2.6.21/024-bugfix-serial-register-status.patch @@ -0,0 +1,69 @@ +Index: linux-2.6.21gum/drivers/serial/pxa.c +=================================================================== +--- linux-2.6.21gum.orig/drivers/serial/pxa.c ++++ linux-2.6.21gum/drivers/serial/pxa.c +@@ -57,6 +57,8 @@ struct uart_pxa_port { + unsigned int lsr_break_flag; + unsigned int cken; + char *name; ++ unsigned int msr; ++ unsigned int lsr; + }; + + static inline unsigned int serial_in(struct uart_pxa_port *up, int offset) +@@ -159,6 +161,7 @@ static inline void receive_chars(struct + + ignore_char: + *status = serial_in(up, UART_LSR); ++ up->lsr = *status; + } while ((*status & UART_LSR_DR) && (max_count-- > 0)); + tty_flip_buffer_push(tty); + } +@@ -211,7 +214,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; + +@@ -242,6 +245,7 @@ static inline irqreturn_t serial_pxa_irq + //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); + check_modem_status(up); +@@ -258,7 +262,7 @@ 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 = up->lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0; + spin_unlock_irqrestore(&up->port.lock, flags); + + return ret; +@@ -270,7 +274,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) +@@ -400,10 +404,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; + } |