serial: samsung: add support for manual RTS setting

The Samsung serial driver currently does not support setting the
RTS pin with an ioctl(TIOCMSET) call. This patch adds this support.

Changes in v2:
 - Preserve the RTS pin's manual setting  in set_termios() also when
   enabling CRTSCTS.

Signed-off-by: José Miguel Gonçalves <jose.goncalves@inov.pt>
Reviewed-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
José Miguel Gonçalves 2013-09-18 16:52:49 +01:00 committed by Greg Kroah-Hartman
parent 4190390ad2
commit 2d1e5a4896
1 changed files with 17 additions and 3 deletions

View File

@ -407,7 +407,14 @@ static unsigned int s3c24xx_serial_get_mctrl(struct uart_port *port)
static void s3c24xx_serial_set_mctrl(struct uart_port *port, unsigned int mctrl) static void s3c24xx_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
{ {
/* todo - possibly remove AFC and do manual CTS */ unsigned int umcon = rd_regl(port, S3C2410_UMCON);
if (mctrl & TIOCM_RTS)
umcon |= S3C2410_UMCOM_RTS_LOW;
else
umcon &= ~S3C2410_UMCOM_RTS_LOW;
wr_regl(port, S3C2410_UMCON, umcon);
} }
static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state) static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
@ -774,8 +781,6 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
if (termios->c_cflag & CSTOPB) if (termios->c_cflag & CSTOPB)
ulcon |= S3C2410_LCON_STOPB; ulcon |= S3C2410_LCON_STOPB;
umcon = (termios->c_cflag & CRTSCTS) ? S3C2410_UMCOM_AFC : 0;
if (termios->c_cflag & PARENB) { if (termios->c_cflag & PARENB) {
if (termios->c_cflag & PARODD) if (termios->c_cflag & PARODD)
ulcon |= S3C2410_LCON_PODD; ulcon |= S3C2410_LCON_PODD;
@ -792,6 +797,15 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
wr_regl(port, S3C2410_ULCON, ulcon); wr_regl(port, S3C2410_ULCON, ulcon);
wr_regl(port, S3C2410_UBRDIV, quot); wr_regl(port, S3C2410_UBRDIV, quot);
umcon = rd_regl(port, S3C2410_UMCON);
if (termios->c_cflag & CRTSCTS) {
umcon |= S3C2410_UMCOM_AFC;
/* Disable RTS when RX FIFO contains 63 bytes */
umcon &= ~S3C2412_UMCON_AFC_8;
} else {
umcon &= ~S3C2410_UMCOM_AFC;
}
wr_regl(port, S3C2410_UMCON, umcon); wr_regl(port, S3C2410_UMCON, umcon);
if (ourport->info->has_divslot) if (ourport->info->has_divslot)