static void lpuart32_break_ctl(struct uart_port *port, int break_state)
 {
-       unsigned long temp;
+       unsigned long temp, modem;
+       struct tty_struct *tty;
+       unsigned int cflag = 0;
+
+       tty = tty_port_tty_get(&port->state->port);
+       if (tty) {
+               cflag = tty->termios.c_cflag;
+               tty_kref_put(tty);
+       }
 
        temp = lpuart32_read(port, UARTCTRL) & ~UARTCTRL_SBK;
+       modem = lpuart32_read(port, UARTMODIR);
 
-       if (break_state != 0)
+       if (break_state != 0) {
                temp |= UARTCTRL_SBK;
+               /*
+                * LPUART CTS has higher priority than SBK, need to disable CTS before
+                * asserting SBK to avoid any interference if flow control is enabled.
+                */
+               if (cflag & CRTSCTS && modem & UARTMODIR_TXCTSE)
+                       lpuart32_write(port, modem & ~UARTMODIR_TXCTSE, UARTMODIR);
+       } else {
+               /* Re-enable the CTS when break off. */
+               if (cflag & CRTSCTS && !(modem & UARTMODIR_TXCTSE))
+                       lpuart32_write(port, modem | UARTMODIR_TXCTSE, UARTMODIR);
+       }
 
        lpuart32_write(port, temp, UARTCTRL);
 }