Merge tag 'v3.10.76' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / tty / serial / 8250 / 8250_dw.c
index 86281fa5dcc327424e3ca9a3115e8032874c6147..9f3666c233b328951fbffc3d72105cce94627025 100644 (file)
@@ -116,8 +116,8 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
 {
        struct dw8250_data *d = p->private_data;
 
-       if (offset == UART_MCR)
-               d->last_mcr = value;
+       if (offset == UART_LCR)
+               d->last_lcr = value;
 
        writel(value, p->membase + (offset << p->regshift));
 
@@ -140,20 +140,22 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
 
 static unsigned int dw8250_serial_in32(struct uart_port *p, int offset)
 {
-       unsigned int value = readl(p->membase + (offset << p->regshift));
+       offset <<= p->regshift;
 
-       return dw8250_modify_msr(p, offset, value);
+       return readl(p->membase + offset);
 }
 
 static int dw8250_handle_irq(struct uart_port *p)
 {
+       struct dw8250_data *d = p->private_data;
        unsigned int iir = p->serial_in(p, UART_IIR);
 
        if (serial8250_handle_irq(p, iir)) {
                return 1;
        } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
-               /* Clear the USR */
+               /* Clear the USR and write the LCR again. */
                (void)p->serial_in(p, DW_UART_USR);
+               p->serial_out(p, UART_LCR, d->last_lcr);
 
                return 1;
        }