diff options
Diffstat (limited to 'drivers/serial/imx.c')
-rw-r--r-- | drivers/serial/imx.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 8861bcf84adf..4c985e6b3784 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -291,13 +291,31 @@ static unsigned int imx_tx_empty(struct uart_port *port) | |||
291 | return USR2((u32)sport->port.membase) & USR2_TXDC ? TIOCSER_TEMT : 0; | 291 | return USR2((u32)sport->port.membase) & USR2_TXDC ? TIOCSER_TEMT : 0; |
292 | } | 292 | } |
293 | 293 | ||
294 | /* | ||
295 | * We have a modem side uart, so the meanings of RTS and CTS are inverted. | ||
296 | */ | ||
294 | static unsigned int imx_get_mctrl(struct uart_port *port) | 297 | static unsigned int imx_get_mctrl(struct uart_port *port) |
295 | { | 298 | { |
296 | return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; | 299 | struct imx_port *sport = (struct imx_port *)port; |
300 | unsigned int tmp = TIOCM_DSR | TIOCM_CAR; | ||
301 | |||
302 | if (USR1((u32)sport->port.membase) & USR1_RTSS) | ||
303 | tmp |= TIOCM_CTS; | ||
304 | |||
305 | if (UCR2((u32)sport->port.membase) & UCR2_CTS) | ||
306 | tmp |= TIOCM_RTS; | ||
307 | |||
308 | return tmp; | ||
297 | } | 309 | } |
298 | 310 | ||
299 | static void imx_set_mctrl(struct uart_port *port, unsigned int mctrl) | 311 | static void imx_set_mctrl(struct uart_port *port, unsigned int mctrl) |
300 | { | 312 | { |
313 | struct imx_port *sport = (struct imx_port *)port; | ||
314 | |||
315 | if (mctrl & TIOCM_RTS) | ||
316 | UCR2((u32)sport->port.membase) |= UCR2_CTS; | ||
317 | else | ||
318 | UCR2((u32)sport->port.membase) &= ~UCR2_CTS; | ||
301 | } | 319 | } |
302 | 320 | ||
303 | /* | 321 | /* |