if (!is_imx1_uart(sport)) {
                temp = readl(sport->port.membase + UCR3);
 
-               /*
-                * The effect of RI and DCD differs depending on the UFCR_DCEDTE
-                * bit. In DCE mode they control the outputs, in DTE mode they
-                * enable the respective irqs. At least the DCD irq cannot be
-                * cleared on i.MX25 at least, so it's not usable and must be
-                * disabled. I don't have test hardware to check if RI has the
-                * same problem but I consider this likely so it's disabled for
-                * now, too.
-                */
-               temp |= IMX21_UCR3_RXDMUXSEL | UCR3_ADNIMP |
-                       UCR3_DTRDEN | UCR3_RI | UCR3_DCD;
+               temp |= UCR3_DTRDEN | UCR3_RI | UCR3_DCD;
 
                if (sport->dte_mode)
+                       /* disable broken interrupts */
                        temp &= ~(UCR3_RI | UCR3_DCD);
 
                writel(temp, sport->port.membase + UCR3);
 
        ufcr = readl(sport->port.membase + UFCR);
        ufcr = (ufcr & (~UFCR_RFDIV)) | UFCR_RFDIV_REG(div);
-       if (sport->dte_mode)
-               ufcr |= UFCR_DCEDTE;
        writel(ufcr, sport->port.membase + UFCR);
 
        writel(num, sport->port.membase + UBIR);
                 UCR1_TXMPTYEN | UCR1_RTSDEN);
        writel_relaxed(reg, sport->port.membase + UCR1);
 
+       if (!is_imx1_uart(sport) && sport->dte_mode) {
+               /*
+                * The DCEDTE bit changes the direction of DSR, DCD, DTR and RI
+                * and influences if UCR3_RI and UCR3_DCD changes the level of RI
+                * and DCD (when they are outputs) or enables the respective
+                * irqs. So set this bit early, i.e. before requesting irqs.
+                */
+               writel(UFCR_DCEDTE, sport->port.membase + UFCR);
+
+               /*
+                * Disable UCR3_RI and UCR3_DCD irqs. They are also not
+                * enabled later because they cannot be cleared
+                * (confirmed on i.MX25) which makes them unusable.
+                */
+               writel(IMX21_UCR3_RXDMUXSEL | UCR3_ADNIMP | UCR3_DSR,
+                      sport->port.membase + UCR3);
+
+       } else {
+               writel(0, sport->port.membase + UFCR);
+       }
+
        clk_disable_unprepare(sport->clk_ipg);
 
        /*