resource_size_t bar_data[3];
        u8 config_base;
        struct serial_private *priv = pci_get_drvdata(dev);
-       struct uart_8250_port *port;
 
        if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) ||
                        !(pci_resource_flags(dev, 4) & IORESOURCE_IO) ||
 
                pci_write_config_byte(dev, config_base + 0x06, dev->irq);
 
-               if (priv) {
-                       /* re-apply RS232/485 mode when
-                        * pciserial_resume_ports()
-                        */
-                       port = serial8250_get_port(priv->line[i]);
-                       uart_rs485_config(&port->port);
-               } else {
+               if (!priv) {
                        /* First init without port data
                         * force init to RS232 Mode
                         */
 
 static int serial8250_em485_init(struct uart_8250_port *p)
 {
        if (p->em485)
-               return 0;
+               goto deassert_rts;
 
        p->em485 = kmalloc(sizeof(struct uart_8250_em485), GFP_ATOMIC);
        if (!p->em485)
        p->em485->active_timer = NULL;
        p->em485->tx_stopped = true;
 
-       p->rs485_stop_tx(p);
+deassert_rts:
+       if (p->em485->tx_stopped)
+               p->rs485_stop_tx(p);
 
        return 0;
 }
 
 static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
 {
+       if (port->rs485.flags & SER_RS485_ENABLED)
+               return;
+
        if (port->set_mctrl)
                port->set_mctrl(port, mctrl);
        else
        if (flags & UART_CONFIG_TYPE)
                autoconfig(up);
 
-       if (port->rs485.flags & SER_RS485_ENABLED)
-               uart_rs485_config(port);
-
        /* if access method is AU, it is a 16550 with a quirk */
        if (port->type == PORT_16550A && port->iotype == UPIO_AU)
                up->bugs |= UART_BUG_NOMSR;
 
        if (ret)
                goto failed_reset;
 
-       ret = uart_add_one_port(&lpuart_reg, &sport->port);
-       if (ret)
-               goto failed_attach_port;
-
        ret = uart_get_rs485_mode(&sport->port);
        if (ret)
                goto failed_get_rs485;
 
-       uart_rs485_config(&sport->port);
+       ret = uart_add_one_port(&lpuart_reg, &sport->port);
+       if (ret)
+               goto failed_attach_port;
 
        ret = devm_request_irq(&pdev->dev, sport->port.irq, handler, 0,
                                DRIVER_NAME, sport);
        return 0;
 
 failed_irq_request:
-failed_get_rs485:
        uart_remove_one_port(&lpuart_reg, &sport->port);
 failed_attach_port:
+failed_get_rs485:
 failed_reset:
        lpuart_disable_clks(sport);
        return ret;
 
 {
        *ucr2 &= ~(UCR2_CTSC | UCR2_CTS);
 
-       sport->port.mctrl |= TIOCM_RTS;
-       mctrl_gpio_set(sport->gpios, sport->port.mctrl);
+       mctrl_gpio_set(sport->gpios, sport->port.mctrl | TIOCM_RTS);
 }
 
 /* called with port.lock taken and irqs caller dependent */
        *ucr2 &= ~UCR2_CTSC;
        *ucr2 |= UCR2_CTS;
 
-       sport->port.mctrl &= ~TIOCM_RTS;
-       mctrl_gpio_set(sport->gpios, sport->port.mctrl);
+       mctrl_gpio_set(sport->gpios, sport->port.mctrl & ~TIOCM_RTS);
 }
 
 static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec)
                dev_err(&pdev->dev,
                        "low-active RTS not possible when receiver is off, enabling receiver\n");
 
-       uart_rs485_config(&sport->port);
-
        /* Disable interrupts before requesting them */
        ucr1 = imx_uart_readl(sport, UCR1);
        ucr1 &= ~(UCR1_ADEN | UCR1_TRDYEN | UCR1_IDEN | UCR1_RRDYEN | UCR1_RTSDEN);
 
        unsigned long flags;
        unsigned int old;
 
-       if (port->rs485.flags & SER_RS485_ENABLED) {
-               set &= ~TIOCM_RTS;
-               clear &= ~TIOCM_RTS;
-       }
-
        spin_lock_irqsave(&port->lock, flags);
        old = port->mctrl;
        port->mctrl = (old & ~clear) | set;
-       if (old != port->mctrl)
+       if (old != port->mctrl && !(port->rs485.flags & SER_RS485_ENABLED))
                port->ops->set_mctrl(port, port->mctrl);
        spin_unlock_irqrestore(&port->lock, flags);
 }
                                 !!(rs485->flags & SER_RS485_TERMINATE_BUS));
 }
 
-int uart_rs485_config(struct uart_port *port)
+static int uart_rs485_config(struct uart_port *port)
 {
        struct serial_rs485 *rs485 = &port->rs485;
        int ret;
 
        return ret;
 }
-EXPORT_SYMBOL_GPL(uart_rs485_config);
 
 static int uart_get_rs485_config(struct uart_port *port,
                         struct serial_rs485 __user *rs485)
 
        spin_lock_irqsave(&port->lock, flags);
        ret = port->rs485_config(port, &tty->termios, &rs485);
-       if (!ret)
+       if (!ret) {
                port->rs485 = rs485;
+
+               /* Reset RTS and other mctrl lines when disabling RS485 */
+               if (!(rs485.flags & SER_RS485_ENABLED))
+                       port->ops->set_mctrl(port, port->mctrl);
+       }
        spin_unlock_irqrestore(&port->lock, flags);
        if (ret)
                return ret;
 
                spin_lock_irq(&uport->lock);
                ops->stop_tx(uport);
-               ops->set_mctrl(uport, 0);
+               if (!(uport->rs485.flags & SER_RS485_ENABLED))
+                       ops->set_mctrl(uport, 0);
                /* save mctrl so it can be restored on resume */
                mctrl = uport->mctrl;
                uport->mctrl = 0;
 
                uart_change_pm(state, UART_PM_STATE_ON);
                spin_lock_irq(&uport->lock);
-               ops->set_mctrl(uport, 0);
+               if (!(uport->rs485.flags & SER_RS485_ENABLED))
+                       ops->set_mctrl(uport, 0);
                spin_unlock_irq(&uport->lock);
                if (console_suspend_enabled || !uart_console(uport)) {
                        /* Protected by port mutex for now */
                                if (tty)
                                        uart_change_speed(tty, state, NULL);
                                spin_lock_irq(&uport->lock);
-                               ops->set_mctrl(uport, uport->mctrl);
+                               if (!(uport->rs485.flags & SER_RS485_ENABLED))
+                                       ops->set_mctrl(uport, uport->mctrl);
+                               else
+                                       uart_rs485_config(uport);
                                ops->start_tx(uport);
                                spin_unlock_irq(&uport->lock);
                                tty_port_set_initialized(port, 1);
                 */
                spin_lock_irqsave(&port->lock, flags);
                port->mctrl &= TIOCM_DTR;
-               if (port->rs485.flags & SER_RS485_ENABLED &&
-                   !(port->rs485.flags & SER_RS485_RTS_AFTER_SEND))
-                       port->mctrl |= TIOCM_RTS;
-               port->ops->set_mctrl(port, port->mctrl);
+               if (!(port->rs485.flags & SER_RS485_ENABLED))
+                       port->ops->set_mctrl(port, port->mctrl);
+               else
+                       uart_rs485_config(port);
                spin_unlock_irqrestore(&port->lock, flags);
 
                /*