|
@@ -1317,19 +1317,10 @@ static int imx_startup(struct uart_port *port)
|
|
if (!is_imx1_uart(sport)) {
|
|
if (!is_imx1_uart(sport)) {
|
|
temp = readl(sport->port.membase + UCR3);
|
|
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)
|
|
if (sport->dte_mode)
|
|
|
|
+ /* disable broken interrupts */
|
|
temp &= ~(UCR3_RI | UCR3_DCD);
|
|
temp &= ~(UCR3_RI | UCR3_DCD);
|
|
|
|
|
|
writel(temp, sport->port.membase + UCR3);
|
|
writel(temp, sport->port.membase + UCR3);
|
|
@@ -1584,8 +1575,6 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
|
|
|
ufcr = readl(sport->port.membase + UFCR);
|
|
ufcr = readl(sport->port.membase + UFCR);
|
|
ufcr = (ufcr & (~UFCR_RFDIV)) | UFCR_RFDIV_REG(div);
|
|
ufcr = (ufcr & (~UFCR_RFDIV)) | UFCR_RFDIV_REG(div);
|
|
- if (sport->dte_mode)
|
|
|
|
- ufcr |= UFCR_DCEDTE;
|
|
|
|
writel(ufcr, sport->port.membase + UFCR);
|
|
writel(ufcr, sport->port.membase + UFCR);
|
|
|
|
|
|
writel(num, sport->port.membase + UBIR);
|
|
writel(num, sport->port.membase + UBIR);
|
|
@@ -2153,6 +2142,27 @@ static int serial_imx_probe(struct platform_device *pdev)
|
|
UCR1_TXMPTYEN | UCR1_RTSDEN);
|
|
UCR1_TXMPTYEN | UCR1_RTSDEN);
|
|
writel_relaxed(reg, sport->port.membase + UCR1);
|
|
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);
|
|
clk_disable_unprepare(sport->clk_ipg);
|
|
|
|
|
|
/*
|
|
/*
|