u32 cntl;
 };
 
-static void bcm2835aux_rs485_start_tx(struct uart_8250_port *up)
+static void bcm2835aux_rs485_start_tx(struct uart_8250_port *up, bool toggle_ier)
 {
        if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX)) {
                struct bcm2835aux_data *data = dev_get_drvdata(up->port.dev);
                serial8250_out_MCR(up, UART_MCR_RTS);
 }
 
-static void bcm2835aux_rs485_stop_tx(struct uart_8250_port *up)
+static void bcm2835aux_rs485_stop_tx(struct uart_8250_port *up, bool toggle_ier)
 {
        if (up->port.rs485.flags & SER_RS485_RTS_AFTER_SEND)
                serial8250_out_MCR(up, 0);
 
 
 deassert_rts:
        if (p->em485->tx_stopped)
-               p->rs485_stop_tx(p);
+               p->rs485_stop_tx(p, true);
 
        return 0;
 }
 /**
  * serial8250_em485_stop_tx() - generic ->rs485_stop_tx() callback
  * @p: uart 8250 port
+ * @toggle_ier: true to allow enabling receive interrupts
  *
  * Generic callback usable by 8250 uart drivers to stop rs485 transmission.
  */
-void serial8250_em485_stop_tx(struct uart_8250_port *p)
+void serial8250_em485_stop_tx(struct uart_8250_port *p, bool toggle_ier)
 {
        unsigned char mcr = serial8250_in_MCR(p);
 
        if (!(p->port.rs485.flags & SER_RS485_RX_DURING_TX)) {
                serial8250_clear_and_reinit_fifos(p);
 
-               p->ier |= UART_IER_RLSI | UART_IER_RDI;
-               serial_port_out(&p->port, UART_IER, p->ier);
+               if (toggle_ier) {
+                       p->ier |= UART_IER_RLSI | UART_IER_RDI;
+                       serial_port_out(&p->port, UART_IER, p->ier);
+               }
        }
 }
 EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx);
        serial8250_rpm_get(p);
        uart_port_lock_irqsave(&p->port, &flags);
        if (em485->active_timer == &em485->stop_tx_timer) {
-               p->rs485_stop_tx(p);
+               p->rs485_stop_tx(p, true);
                em485->active_timer = NULL;
                em485->tx_stopped = true;
        }
                em485->active_timer = &em485->stop_tx_timer;
                hrtimer_start(&em485->stop_tx_timer, ns_to_ktime(stop_delay), HRTIMER_MODE_REL);
        } else {
-               p->rs485_stop_tx(p);
+               p->rs485_stop_tx(p, true);
                em485->active_timer = NULL;
                em485->tx_stopped = true;
        }
 /**
  * serial8250_em485_start_tx() - generic ->rs485_start_tx() callback
  * @up: uart 8250 port
+ * @toggle_ier: true to allow disabling receive interrupts
  *
  * Generic callback usable by 8250 uart drivers to start rs485 transmission.
  * Assumes that setting the RTS bit in the MCR register means RTS is high.
  * stoppable by disabling the UART_IER_RDI interrupt.  (Some chips set the
  * UART_LSR_DR bit even when UART_IER_RDI is disabled, foiling this approach.)
  */
-void serial8250_em485_start_tx(struct uart_8250_port *up)
+void serial8250_em485_start_tx(struct uart_8250_port *up, bool toggle_ier)
 {
        unsigned char mcr = serial8250_in_MCR(up);
 
-       if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX))
+       if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX) && toggle_ier)
                serial8250_stop_rx(&up->port);
 
        if (up->port.rs485.flags & SER_RS485_RTS_ON_SEND)
        if (em485->tx_stopped) {
                em485->tx_stopped = false;
 
-               up->rs485_start_tx(up);
+               up->rs485_start_tx(up, true);
 
                if (up->port.rs485.delay_rts_before_send > 0) {
                        em485->active_timer = &em485->start_tx_timer;
 
        if (em485) {
                if (em485->tx_stopped)
-                       up->rs485_start_tx(up);
+                       up->rs485_start_tx(up, false);
                mdelay(port->rs485.delay_rts_before_send);
        }
 
        if (em485) {
                mdelay(port->rs485.delay_rts_after_send);
                if (em485->tx_stopped)
-                       up->rs485_stop_tx(up);
+                       up->rs485_stop_tx(up, false);
        }
 
        serial_port_out(port, UART_IER, ier);