Skip to content

Commit 6df765d

Browse files
Uwe Kleine-Königgregkh
authored andcommitted
serial: imx: ensure UCR3 and UFCR are setup correctly
Commit e61c38d ("serial: imx: setup DCEDTE early and ensure DCD and RI irqs to be off") has a flaw: While UCR3 and UFCR were modified using read-modify-write before it switched to write register values independent of the previous state. That's a good idea in principle (and that's why I did it) but needs more care. This patch reinstates read-modify-write for UFCR and for UCR3 ensures that RXDMUXSEL and ADNIMP are set for post imx1. Fixes: e61c38d ("serial: imx: setup DCEDTE early and ensure DCD and RI irqs to be off") Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Acked-by: Mika Penttilä <mika.penttila@nextfour.com> Tested-by: Mika Penttilä <mika.penttila@nextfour.com> Acked-by: Steve Twiss <stwiss.opensource@diasemi.com> Tested-by: Steve Twiss <stwiss.opensource@diasemi.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 46e3813 commit 6df765d

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

drivers/tty/serial/imx.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,7 +2184,9 @@ static int serial_imx_probe(struct platform_device *pdev)
21842184
* and DCD (when they are outputs) or enables the respective
21852185
* irqs. So set this bit early, i.e. before requesting irqs.
21862186
*/
2187-
writel(UFCR_DCEDTE, sport->port.membase + UFCR);
2187+
reg = readl(sport->port.membase + UFCR);
2188+
if (!(reg & UFCR_DCEDTE))
2189+
writel(reg | UFCR_DCEDTE, sport->port.membase + UFCR);
21882190

21892191
/*
21902192
* Disable UCR3_RI and UCR3_DCD irqs. They are also not
@@ -2195,7 +2197,15 @@ static int serial_imx_probe(struct platform_device *pdev)
21952197
sport->port.membase + UCR3);
21962198

21972199
} else {
2198-
writel(0, sport->port.membase + UFCR);
2200+
unsigned long ucr3 = UCR3_DSR;
2201+
2202+
reg = readl(sport->port.membase + UFCR);
2203+
if (reg & UFCR_DCEDTE)
2204+
writel(reg & ~UFCR_DCEDTE, sport->port.membase + UFCR);
2205+
2206+
if (!is_imx1_uart(sport))
2207+
ucr3 |= IMX21_UCR3_RXDMUXSEL | UCR3_ADNIMP;
2208+
writel(ucr3, sport->port.membase + UCR3);
21992209
}
22002210

22012211
clk_disable_unprepare(sport->clk_ipg);

0 commit comments

Comments
 (0)