struct uart_port *port = dev_id;
        struct omap8250_priv *priv = port->private_data;
        struct uart_8250_port *up = up_to_u8250p(port);
-       unsigned int iir;
+       unsigned int iir, lsr;
        int ret;
 
 #ifdef CONFIG_SERIAL_8250_DMA
 #endif
 
        serial8250_rpm_get(up);
+       lsr = serial_port_in(port, UART_LSR);
        iir = serial_port_in(port, UART_IIR);
        ret = serial8250_handle_irq(port, iir);
 
                serial_port_in(port, UART_RX);
        }
 
+       /* Stop processing interrupts on input overrun */
+       if ((lsr & UART_LSR_OE) && up->overrun_backoff_time_ms > 0) {
+               unsigned long delay;
+
+               up->ier = port->serial_in(port, UART_IER);
+               if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) {
+                       port->ops->stop_rx(port);
+               } else {
+                       /* Keep restarting the timer until
+                        * the input overrun subsides.
+                        */
+                       cancel_delayed_work(&up->overrun_backoff);
+               }
+
+               delay = msecs_to_jiffies(up->overrun_backoff_time_ms);
+               schedule_delayed_work(&up->overrun_backoff, delay);
+       }
+
        serial8250_rpm_put(up);
 
        return IRQ_RETVAL(ret);
                }
        }
 
+       if (of_property_read_u32(np, "overrun-throttle-ms",
+                                &up.overrun_backoff_time_ms) != 0)
+               up.overrun_backoff_time_ms = 0;
+
        priv->wakeirq = irq_of_parse_and_map(np, 1);
 
        pdata = of_device_get_match_data(&pdev->dev);