]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/tty/serial/amba-pl011.c
tty: pl011: Avoid spuriously stuck-off interrupts
[mirror_ubuntu-bionic-kernel.git] / drivers / tty / serial / amba-pl011.c
index 04af8de8617e3b05ef734a9bdc7ef0297faf3b2e..7ad4aac3abaf81846ae6c6806cac270d954a1fd8 100644 (file)
@@ -1731,10 +1731,26 @@ static int pl011_allocate_irq(struct uart_amba_port *uap)
  */
 static void pl011_enable_interrupts(struct uart_amba_port *uap)
 {
+       unsigned int i;
+
        spin_lock_irq(&uap->port.lock);
 
        /* Clear out any spuriously appearing RX interrupts */
        pl011_write(UART011_RTIS | UART011_RXIS, uap, REG_ICR);
+
+       /*
+        * RXIS is asserted only when the RX FIFO transitions from below
+        * to above the trigger threshold.  If the RX FIFO is already
+        * full to the threshold this can't happen and RXIS will now be
+        * stuck off.  Drain the RX FIFO explicitly to fix this:
+        */
+       for (i = 0; i < uap->fifosize * 2; ++i) {
+               if (pl011_read(uap, REG_FR) & UART01x_FR_RXFE)
+                       break;
+
+               pl011_read(uap, REG_DR);
+       }
+
        uap->im = UART011_RTIM;
        if (!pl011_dma_rx_running(uap))
                uap->im |= UART011_RXIM;