diff options
Diffstat (limited to 'drivers/serial/imx.c')
| -rw-r--r-- | drivers/serial/imx.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 01a8726a3f97..4c985e6b3784 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
| @@ -124,7 +124,7 @@ static void imx_timeout(unsigned long data) | |||
| 124 | /* | 124 | /* |
| 125 | * interrupts disabled on entry | 125 | * interrupts disabled on entry |
| 126 | */ | 126 | */ |
| 127 | static void imx_stop_tx(struct uart_port *port, unsigned int tty_stop) | 127 | static void imx_stop_tx(struct uart_port *port) |
| 128 | { | 128 | { |
| 129 | struct imx_port *sport = (struct imx_port *)port; | 129 | struct imx_port *sport = (struct imx_port *)port; |
| 130 | UCR1((u32)sport->port.membase) &= ~UCR1_TXMPTYEN; | 130 | UCR1((u32)sport->port.membase) &= ~UCR1_TXMPTYEN; |
| @@ -165,13 +165,13 @@ static inline void imx_transmit_buffer(struct imx_port *sport) | |||
| 165 | } while (!(UTS((u32)sport->port.membase) & UTS_TXFULL)); | 165 | } while (!(UTS((u32)sport->port.membase) & UTS_TXFULL)); |
| 166 | 166 | ||
| 167 | if (uart_circ_empty(xmit)) | 167 | if (uart_circ_empty(xmit)) |
| 168 | imx_stop_tx(&sport->port, 0); | 168 | imx_stop_tx(&sport->port); |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | /* | 171 | /* |
| 172 | * interrupts disabled on entry | 172 | * interrupts disabled on entry |
| 173 | */ | 173 | */ |
| 174 | static void imx_start_tx(struct uart_port *port, unsigned int tty_start) | 174 | static void imx_start_tx(struct uart_port *port) |
| 175 | { | 175 | { |
| 176 | struct imx_port *sport = (struct imx_port *)port; | 176 | struct imx_port *sport = (struct imx_port *)port; |
| 177 | 177 | ||
| @@ -196,7 +196,7 @@ static irqreturn_t imx_txint(int irq, void *dev_id, struct pt_regs *regs) | |||
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) { | 198 | if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) { |
| 199 | imx_stop_tx(&sport->port, 0); | 199 | imx_stop_tx(&sport->port); |
| 200 | goto out; | 200 | goto out; |
| 201 | } | 201 | } |
| 202 | 202 | ||
| @@ -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 | /* |
